diff --git a/css/css2.css b/css/css2.css
new file mode 100644
index 0000000..8e0d0f5
--- /dev/null
+++ b/css/css2.css
@@ -0,0 +1,6496 @@
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRKoKIyQ4.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIYKIyQ4.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIIKIyQ4.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRLoKI.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRKoKIyQ4.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIYKIyQ4.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIIKIyQ4.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRLoKI.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRKoKIyQ4.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIYKIyQ4.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIIKIyQ4.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRLoKI.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRKoKIyQ4.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIYKIyQ4.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIIKIyQ4.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRLoKI.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRKoKIyQ4.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIYKIyQ4.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIIKIyQ4.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRLoKI.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kqWWbghq.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kq6Wbghq.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kq-Wbghq.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kqGWbg.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kqWWbghq.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kq6Wbghq.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kq-Wbghq.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kqGWbg.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kqWWbghq.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kq6Wbghq.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kq-Wbghq.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kqGWbg.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
diff --git a/index-2.php b/index-2.php
index 865ac65..98b43f5 100644
--- a/index-2.php
+++ b/index-2.php
@@ -209,16 +209,25 @@
// 扫描research目录下的HTML文件并提取标题
$researchDir = __DIR__ . '/research';
$htmlFiles = glob($researchDir . '/*.html');
-
- if (!empty($htmlFiles)) {
- foreach ($htmlFiles as $file) {
- $fileName = basename($file);
- $filePath = 'research/' . $fileName;
+
+ // 新增:扫描子目录中的index.html文件
+ $subDirs = glob($researchDir . '/*', GLOB_ONLYDIR);
+ foreach ($subDirs as $dir) {
+ $indexFile = $dir . '/index.html';
+ if (file_exists($indexFile)) {
+ $htmlFiles[] = $indexFile;
+ }
+ }
- // 读取文件内容
- $content = file_get_contents($file);
+ if (!empty($htmlFiles)) {
+ foreach ($htmlFiles as $file) {
+ $fileName = basename($file);
+ $filePath = str_replace(__DIR__ . '/', '', $file);
- // 提取title标签内容
+ // 读取文件内容
+ $content = file_get_contents($file);
+
+ // 提取title标签内容
preg_match('/
(.*?)<\/title>/i', $content, $matches);
$title = !empty($matches[1]) ? $matches[1] : $fileName;
@@ -229,12 +238,7 @@
' . htmlspecialchars($title) . '
';
}
- // 输出链接
- echo '
-
- 新闻联播深度分析报告 2025年1-10月
- ';
+
} else {
echo '
暂无研究报告
@@ -243,6 +247,34 @@
?>
+
+
+
+
+
+
+
以下是最新的市场研究报告,点击可查看详情。
+
+
+
+
diff --git a/research/js/3.4.16.js b/libai/3.4.16.js
similarity index 100%
rename from research/js/3.4.16.js
rename to libai/3.4.16.js
diff --git a/research/js/all.min.css b/libai/all.min.css
similarity index 100%
rename from research/js/all.min.css
rename to libai/all.min.css
diff --git a/libai/anime.min.js b/libai/anime.min.js
new file mode 100644
index 0000000..7696a5b
--- /dev/null
+++ b/libai/anime.min.js
@@ -0,0 +1,8 @@
+/*
+ * anime.js v3.2.1
+ * (c) 2020 Julian Garnier
+ * Released under the MIT license
+ * animejs.com
+ */
+
+!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):n.anime=e()}(this,function(){"use strict";var n={update:null,begin:null,loopBegin:null,changeBegin:null,change:null,changeComplete:null,loopComplete:null,complete:null,loop:1,direction:"normal",autoplay:!0,timelineOffset:0},e={duration:1e3,delay:0,endDelay:0,easing:"easeOutElastic(1, .5)",round:0},t=["translateX","translateY","translateZ","rotate","rotateX","rotateY","rotateZ","scale","scaleX","scaleY","scaleZ","skew","skewX","skewY","perspective","matrix","matrix3d"],r={CSS:{},springs:{}};function a(n,e,t){return Math.min(Math.max(n,e),t)}function o(n,e){return n.indexOf(e)>-1}function u(n,e){return n.apply(null,e)}var i={arr:function(n){return Array.isArray(n)},obj:function(n){return o(Object.prototype.toString.call(n),"Object")},pth:function(n){return i.obj(n)&&n.hasOwnProperty("totalLength")},svg:function(n){return n instanceof SVGElement},inp:function(n){return n instanceof HTMLInputElement},dom:function(n){return n.nodeType||i.svg(n)},str:function(n){return"string"==typeof n},fnc:function(n){return"function"==typeof n},und:function(n){return void 0===n},nil:function(n){return i.und(n)||null===n},hex:function(n){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(n)},rgb:function(n){return/^rgb/.test(n)},hsl:function(n){return/^hsl/.test(n)},col:function(n){return i.hex(n)||i.rgb(n)||i.hsl(n)},key:function(t){return!n.hasOwnProperty(t)&&!e.hasOwnProperty(t)&&"targets"!==t&&"keyframes"!==t}};function c(n){var e=/\(([^)]+)\)/.exec(n);return e?e[1].split(",").map(function(n){return parseFloat(n)}):[]}function s(n,e){var t=c(n),o=a(i.und(t[0])?1:t[0],.1,100),u=a(i.und(t[1])?100:t[1],.1,100),s=a(i.und(t[2])?10:t[2],.1,100),f=a(i.und(t[3])?0:t[3],.1,100),l=Math.sqrt(u/o),d=s/(2*Math.sqrt(u*o)),p=d<1?l*Math.sqrt(1-d*d):0,v=1,h=d<1?(d*l-f)/p:-f+l;function g(n){var t=e?e*n/1e3:n;return t=d<1?Math.exp(-t*d*l)*(v*Math.cos(p*t)+h*Math.sin(p*t)):(v+h*t)*Math.exp(-t*l),0===n||1===n?n:1-t}return e?g:function(){var e=r.springs[n];if(e)return e;for(var t=0,a=0;;)if(1===g(t+=1/6)){if(++a>=16)break}else a=0;var o=t*(1/6)*1e3;return r.springs[n]=o,o}}function f(n){return void 0===n&&(n=10),function(e){return Math.ceil(a(e,1e-6,1)*n)*(1/n)}}var l,d,p=function(){var n=11,e=1/(n-1);function t(n,e){return 1-3*e+3*n}function r(n,e){return 3*e-6*n}function a(n){return 3*n}function o(n,e,o){return((t(e,o)*n+r(e,o))*n+a(e))*n}function u(n,e,o){return 3*t(e,o)*n*n+2*r(e,o)*n+a(e)}return function(t,r,a,i){if(0<=t&&t<=1&&0<=a&&a<=1){var c=new Float32Array(n);if(t!==r||a!==i)for(var s=0;s=.001?function(n,e,t,r){for(var a=0;a<4;++a){var i=u(e,t,r);if(0===i)return e;e-=(o(e,t,r)-n)/i}return e}(r,l,t,a):0===d?l:function(n,e,t,r,a){for(var u,i,c=0;(u=o(i=e+(t-e)/2,r,a)-n)>0?t=i:e=i,Math.abs(u)>1e-7&&++c<10;);return i}(r,i,i+e,t,a)}}}(),v=(l={linear:function(){return function(n){return n}}},d={Sine:function(){return function(n){return 1-Math.cos(n*Math.PI/2)}},Circ:function(){return function(n){return 1-Math.sqrt(1-n*n)}},Back:function(){return function(n){return n*n*(3*n-2)}},Bounce:function(){return function(n){for(var e,t=4;n<((e=Math.pow(2,--t))-1)/11;);return 1/Math.pow(4,3-t)-7.5625*Math.pow((3*e-2)/22-n,2)}},Elastic:function(n,e){void 0===n&&(n=1),void 0===e&&(e=.5);var t=a(n,1,10),r=a(e,.1,2);return function(n){return 0===n||1===n?n:-t*Math.pow(2,10*(n-1))*Math.sin((n-1-r/(2*Math.PI)*Math.asin(1/t))*(2*Math.PI)/r)}}},["Quad","Cubic","Quart","Quint","Expo"].forEach(function(n,e){d[n]=function(){return function(n){return Math.pow(n,e+2)}}}),Object.keys(d).forEach(function(n){var e=d[n];l["easeIn"+n]=e,l["easeOut"+n]=function(n,t){return function(r){return 1-e(n,t)(1-r)}},l["easeInOut"+n]=function(n,t){return function(r){return r<.5?e(n,t)(2*r)/2:1-e(n,t)(-2*r+2)/2}},l["easeOutIn"+n]=function(n,t){return function(r){return r<.5?(1-e(n,t)(1-2*r))/2:(e(n,t)(2*r-1)+1)/2}}}),l);function h(n,e){if(i.fnc(n))return n;var t=n.split("(")[0],r=v[t],a=c(n);switch(t){case"spring":return s(n,e);case"cubicBezier":return u(p,a);case"steps":return u(f,a);default:return u(r,a)}}function g(n){try{return document.querySelectorAll(n)}catch(n){return}}function m(n,e){for(var t=n.length,r=arguments.length>=2?arguments[1]:void 0,a=[],o=0;o1&&(t-=1),t<1/6?n+6*(e-n)*t:t<.5?e:t<2/3?n+(e-n)*(2/3-t)*6:n}if(0==u)e=t=r=i;else{var f=i<.5?i*(1+u):i+u-i*u,l=2*i-f;e=s(l,f,o+1/3),t=s(l,f,o),r=s(l,f,o-1/3)}return"rgba("+255*e+","+255*t+","+255*r+","+c+")"}(n):void 0;var e,t,r,a}function C(n){var e=/[+-]?\d*\.?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(n);if(e)return e[1]}function P(n,e){return i.fnc(n)?n(e.target,e.id,e.total):n}function I(n,e){return n.getAttribute(e)}function D(n,e,t){if(M([t,"deg","rad","turn"],C(e)))return e;var a=r.CSS[e+t];if(!i.und(a))return a;var o=document.createElement(n.tagName),u=n.parentNode&&n.parentNode!==document?n.parentNode:document.body;u.appendChild(o),o.style.position="absolute",o.style.width=100+t;var c=100/o.offsetWidth;u.removeChild(o);var s=c*parseFloat(e);return r.CSS[e+t]=s,s}function B(n,e,t){if(e in n.style){var r=e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase(),a=n.style[e]||getComputedStyle(n).getPropertyValue(r)||"0";return t?D(n,a,t):a}}function T(n,e){return i.dom(n)&&!i.inp(n)&&(!i.nil(I(n,e))||i.svg(n)&&n[e])?"attribute":i.dom(n)&&M(t,e)?"transform":i.dom(n)&&"transform"!==e&&B(n,e)?"css":null!=n[e]?"object":void 0}function E(n){if(i.dom(n)){for(var e,t=n.style.transform||"",r=/(\w+)\(([^)]*)\)/g,a=new Map;e=r.exec(t);)a.set(e[1],e[2]);return a}}function F(n,e,t,r){var a,u=o(e,"scale")?1:0+(o(a=e,"translate")||"perspective"===a?"px":o(a,"rotate")||o(a,"skew")?"deg":void 0),i=E(n).get(e)||u;return t&&(t.transforms.list.set(e,i),t.transforms.last=e),r?D(n,i,r):i}function A(n,e,t,r){switch(T(n,e)){case"transform":return F(n,e,r,t);case"css":return B(n,e,t);case"attribute":return I(n,e);default:return n[e]||0}}function N(n,e){var t=/^(\*=|\+=|-=)/.exec(n);if(!t)return n;var r=C(n)||0,a=parseFloat(e),o=parseFloat(n.replace(t[0],""));switch(t[0][0]){case"+":return a+o+r;case"-":return a-o+r;case"*":return a*o+r}}function S(n,e){if(i.col(n))return O(n);if(/\s/g.test(n))return n;var t=C(n),r=t?n.substr(0,n.length-t.length):n;return e?r+e:r}function L(n,e){return Math.sqrt(Math.pow(e.x-n.x,2)+Math.pow(e.y-n.y,2))}function j(n){for(var e,t=n.points,r=0,a=0;a0&&(r+=L(e,o)),e=o}return r}function q(n){if(n.getTotalLength)return n.getTotalLength();switch(n.tagName.toLowerCase()){case"circle":return o=n,2*Math.PI*I(o,"r");case"rect":return 2*I(a=n,"width")+2*I(a,"height");case"line":return L({x:I(r=n,"x1"),y:I(r,"y1")},{x:I(r,"x2"),y:I(r,"y2")});case"polyline":return j(n);case"polygon":return t=(e=n).points,j(e)+L(t.getItem(t.numberOfItems-1),t.getItem(0))}var e,t,r,a,o}function H(n,e){var t=e||{},r=t.el||function(n){for(var e=n.parentNode;i.svg(e)&&i.svg(e.parentNode);)e=e.parentNode;return e}(n),a=r.getBoundingClientRect(),o=I(r,"viewBox"),u=a.width,c=a.height,s=t.viewBox||(o?o.split(" "):[0,0,u,c]);return{el:r,viewBox:s,x:s[0]/1,y:s[1]/1,w:u,h:c,vW:s[2],vH:s[3]}}function V(n,e,t){function r(t){void 0===t&&(t=0);var r=e+t>=1?e+t:0;return n.el.getPointAtLength(r)}var a=H(n.el,n.svg),o=r(),u=r(-1),i=r(1),c=t?1:a.w/a.vW,s=t?1:a.h/a.vH;switch(n.property){case"x":return(o.x-a.x)*c;case"y":return(o.y-a.y)*s;case"angle":return 180*Math.atan2(i.y-u.y,i.x-u.x)/Math.PI}}function $(n,e){var t=/[+-]?\d*\.?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/g,r=S(i.pth(n)?n.totalLength:n,e)+"";return{original:r,numbers:r.match(t)?r.match(t).map(Number):[0],strings:i.str(n)||e?r.split(t):[]}}function W(n){return m(n?y(i.arr(n)?n.map(b):b(n)):[],function(n,e,t){return t.indexOf(n)===e})}function X(n){var e=W(n);return e.map(function(n,t){return{target:n,id:t,total:e.length,transforms:{list:E(n)}}})}function Y(n,e){var t=x(e);if(/^spring/.test(t.easing)&&(t.duration=s(t.easing)),i.arr(n)){var r=n.length;2===r&&!i.obj(n[0])?n={value:n}:i.fnc(e.duration)||(t.duration=e.duration/r)}var a=i.arr(n)?n:[n];return a.map(function(n,t){var r=i.obj(n)&&!i.pth(n)?n:{value:n};return i.und(r.delay)&&(r.delay=t?0:e.delay),i.und(r.endDelay)&&(r.endDelay=t===a.length-1?e.endDelay:0),r}).map(function(n){return k(n,t)})}function Z(n,e){var t=[],r=e.keyframes;for(var a in r&&(e=k(function(n){for(var e=m(y(n.map(function(n){return Object.keys(n)})),function(n){return i.key(n)}).reduce(function(n,e){return n.indexOf(e)<0&&n.push(e),n},[]),t={},r=function(r){var a=e[r];t[a]=n.map(function(n){var e={};for(var t in n)i.key(t)?t==a&&(e.value=n[t]):e[t]=n[t];return e})},a=0;a0?requestAnimationFrame(e):void 0}return"undefined"!=typeof document&&document.addEventListener("visibilitychange",function(){en.suspendWhenDocumentHidden&&(nn()?n=cancelAnimationFrame(n):(K.forEach(function(n){return n._onDocumentVisibility()}),U()))}),function(){n||nn()&&en.suspendWhenDocumentHidden||!(K.length>0)||(n=requestAnimationFrame(e))}}();function nn(){return!!document&&document.hidden}function en(t){void 0===t&&(t={});var r,o=0,u=0,i=0,c=0,s=null;function f(n){var e=window.Promise&&new Promise(function(n){return s=n});return n.finished=e,e}var l,d,p,v,h,g,y,b,M=(d=w(n,l=t),p=w(e,l),v=Z(p,l),h=X(l.targets),g=_(h,v),y=R(g,p),b=J,J++,k(d,{id:b,children:[],animatables:h,animations:g,duration:y.duration,delay:y.delay,endDelay:y.endDelay}));f(M);function x(){var n=M.direction;"alternate"!==n&&(M.direction="normal"!==n?"normal":"reverse"),M.reversed=!M.reversed,r.forEach(function(n){return n.reversed=M.reversed})}function O(n){return M.reversed?M.duration-n:n}function C(){o=0,u=O(M.currentTime)*(1/en.speed)}function P(n,e){e&&e.seek(n-e.timelineOffset)}function I(n){for(var e=0,t=M.animations,r=t.length;e2||(b=Math.round(b*p)/p)),v.push(b)}var k=d.length;if(k){g=d[0];for(var O=0;O0&&(M.began=!0,D("begin")),!M.loopBegan&&M.currentTime>0&&(M.loopBegan=!0,D("loopBegin")),d<=t&&0!==M.currentTime&&I(0),(d>=l&&M.currentTime!==e||!e)&&I(e),d>t&&d=e&&(u=0,M.remaining&&!0!==M.remaining&&M.remaining--,M.remaining?(o=i,D("loopComplete"),M.loopBegan=!1,"alternate"===M.direction&&x()):(M.paused=!0,M.completed||(M.completed=!0,D("loopComplete"),D("complete"),!M.passThrough&&"Promise"in window&&(s(),f(M)))))}return M.reset=function(){var n=M.direction;M.passThrough=!1,M.currentTime=0,M.progress=0,M.paused=!0,M.began=!1,M.loopBegan=!1,M.changeBegan=!1,M.completed=!1,M.changeCompleted=!1,M.reversePlayback=!1,M.reversed="reverse"===n,M.remaining=M.loop,r=M.children;for(var e=c=r.length;e--;)M.children[e].reset();(M.reversed&&!0!==M.loop||"alternate"===n&&1===M.loop)&&M.remaining++,I(M.reversed?M.duration:0)},M._onDocumentVisibility=C,M.set=function(n,e){return z(n,e),M},M.tick=function(n){i=n,o||(o=i),B((i+(u-o))*en.speed)},M.seek=function(n){B(O(n))},M.pause=function(){M.paused=!0,C()},M.play=function(){M.paused&&(M.completed&&M.reset(),M.paused=!1,K.push(M),C(),U())},M.reverse=function(){x(),M.completed=!M.reversed,C()},M.restart=function(){M.reset(),M.play()},M.remove=function(n){rn(W(n),M)},M.reset(),M.autoplay&&M.play(),M}function tn(n,e){for(var t=e.length;t--;)M(n,e[t].animatable.target)&&e.splice(t,1)}function rn(n,e){var t=e.animations,r=e.children;tn(n,t);for(var a=r.length;a--;){var o=r[a],u=o.animations;tn(n,u),u.length||o.children.length||r.splice(a,1)}t.length||r.length||e.pause()}return en.version="3.2.1",en.speed=1,en.suspendWhenDocumentHidden=!0,en.running=K,en.remove=function(n){for(var e=W(n),t=K.length;t--;)rn(e,K[t])},en.get=A,en.set=z,en.convertPx=D,en.path=function(n,e){var t=i.str(n)?g(n)[0]:n,r=e||100;return function(n){return{property:n,el:t,svg:H(t),totalLength:q(t)*(r/100)}}},en.setDashoffset=function(n){var e=q(n);return n.setAttribute("stroke-dasharray",e),e},en.stagger=function(n,e){void 0===e&&(e={});var t=e.direction||"normal",r=e.easing?h(e.easing):null,a=e.grid,o=e.axis,u=e.from||0,c="first"===u,s="center"===u,f="last"===u,l=i.arr(n),d=l?parseFloat(n[0]):parseFloat(n),p=l?parseFloat(n[1]):0,v=C(l?n[1]:n)||0,g=e.start||0+(l?d:0),m=[],y=0;return function(n,e,i){if(c&&(u=0),s&&(u=(i-1)/2),f&&(u=i-1),!m.length){for(var h=0;h-1&&K.splice(o,1);for(var s=0;s li {
+ position: relative; }
+
+.fa-li {
+ left: calc(-1 * var(--fa-li-width, 2em));
+ position: absolute;
+ text-align: center;
+ width: var(--fa-li-width, 2em);
+ line-height: inherit; }
+
+.fa-border {
+ border-color: var(--fa-border-color, #eee);
+ border-radius: var(--fa-border-radius, 0.1em);
+ border-style: var(--fa-border-style, solid);
+ border-width: var(--fa-border-width, 0.08em);
+ padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); }
+
+.fa-pull-left {
+ float: left;
+ margin-right: var(--fa-pull-margin, 0.3em); }
+
+.fa-pull-right {
+ float: right;
+ margin-left: var(--fa-pull-margin, 0.3em); }
+
+.fa-beat {
+ animation-name: fa-beat;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, ease-in-out); }
+
+.fa-bounce {
+ animation-name: fa-bounce;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
+
+.fa-fade {
+ animation-name: fa-fade;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
+
+.fa-beat-fade {
+ animation-name: fa-beat-fade;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
+
+.fa-flip {
+ animation-name: fa-flip;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, ease-in-out); }
+
+.fa-shake {
+ animation-name: fa-shake;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, linear); }
+
+.fa-spin {
+ animation-name: fa-spin;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 2s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, linear); }
+
+.fa-spin-reverse {
+ --fa-animation-direction: reverse; }
+
+.fa-pulse,
+.fa-spin-pulse {
+ animation-name: fa-spin;
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, steps(8)); }
+
+@media (prefers-reduced-motion: reduce) {
+ .fa-beat,
+ .fa-bounce,
+ .fa-fade,
+ .fa-beat-fade,
+ .fa-flip,
+ .fa-pulse,
+ .fa-shake,
+ .fa-spin,
+ .fa-spin-pulse {
+ animation-delay: -1ms;
+ animation-duration: 1ms;
+ animation-iteration-count: 1;
+ transition-delay: 0s;
+ transition-duration: 0s; } }
+
+@keyframes fa-beat {
+ 0%, 90% {
+ transform: scale(1); }
+ 45% {
+ transform: scale(var(--fa-beat-scale, 1.25)); } }
+
+@keyframes fa-bounce {
+ 0% {
+ transform: scale(1, 1) translateY(0); }
+ 10% {
+ transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
+ 30% {
+ transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
+ 50% {
+ transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
+ 57% {
+ transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
+ 64% {
+ transform: scale(1, 1) translateY(0); }
+ 100% {
+ transform: scale(1, 1) translateY(0); } }
+
+@keyframes fa-fade {
+ 50% {
+ opacity: var(--fa-fade-opacity, 0.4); } }
+
+@keyframes fa-beat-fade {
+ 0%, 100% {
+ opacity: var(--fa-beat-fade-opacity, 0.4);
+ transform: scale(1); }
+ 50% {
+ opacity: 1;
+ transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
+
+@keyframes fa-flip {
+ 50% {
+ transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
+
+@keyframes fa-shake {
+ 0% {
+ transform: rotate(-15deg); }
+ 4% {
+ transform: rotate(15deg); }
+ 8%, 24% {
+ transform: rotate(-18deg); }
+ 12%, 28% {
+ transform: rotate(18deg); }
+ 16% {
+ transform: rotate(-22deg); }
+ 20% {
+ transform: rotate(22deg); }
+ 32% {
+ transform: rotate(-12deg); }
+ 36% {
+ transform: rotate(12deg); }
+ 40%, 100% {
+ transform: rotate(0deg); } }
+
+@keyframes fa-spin {
+ 0% {
+ transform: rotate(0deg); }
+ 100% {
+ transform: rotate(360deg); } }
+
+.fa-rotate-90 {
+ transform: rotate(90deg); }
+
+.fa-rotate-180 {
+ transform: rotate(180deg); }
+
+.fa-rotate-270 {
+ transform: rotate(270deg); }
+
+.fa-flip-horizontal {
+ transform: scale(-1, 1); }
+
+.fa-flip-vertical {
+ transform: scale(1, -1); }
+
+.fa-flip-both,
+.fa-flip-horizontal.fa-flip-vertical {
+ transform: scale(-1, -1); }
+
+.fa-rotate-by {
+ transform: rotate(var(--fa-rotate-angle, 0)); }
+
+.fa-stack {
+ display: inline-block;
+ height: 2em;
+ line-height: 2em;
+ position: relative;
+ vertical-align: middle;
+ width: 2.5em; }
+
+.fa-stack-1x,
+.fa-stack-2x {
+ left: 0;
+ position: absolute;
+ text-align: center;
+ width: 100%;
+ z-index: var(--fa-stack-z-index, auto); }
+
+.fa-stack-1x {
+ line-height: inherit; }
+
+.fa-stack-2x {
+ font-size: 2em; }
+
+.fa-inverse {
+ color: var(--fa-inverse, #fff); }
+
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+readers do not read off random characters that represent icons */
+
+.fa-0 {
+ --fa: "\30"; }
+
+.fa-1 {
+ --fa: "\31"; }
+
+.fa-2 {
+ --fa: "\32"; }
+
+.fa-3 {
+ --fa: "\33"; }
+
+.fa-4 {
+ --fa: "\34"; }
+
+.fa-5 {
+ --fa: "\35"; }
+
+.fa-6 {
+ --fa: "\36"; }
+
+.fa-7 {
+ --fa: "\37"; }
+
+.fa-8 {
+ --fa: "\38"; }
+
+.fa-9 {
+ --fa: "\39"; }
+
+.fa-fill-drip {
+ --fa: "\f576"; }
+
+.fa-arrows-to-circle {
+ --fa: "\e4bd"; }
+
+.fa-circle-chevron-right {
+ --fa: "\f138"; }
+
+.fa-chevron-circle-right {
+ --fa: "\f138"; }
+
+.fa-at {
+ --fa: "\40"; }
+
+.fa-trash-can {
+ --fa: "\f2ed"; }
+
+.fa-trash-alt {
+ --fa: "\f2ed"; }
+
+.fa-text-height {
+ --fa: "\f034"; }
+
+.fa-user-xmark {
+ --fa: "\f235"; }
+
+.fa-user-times {
+ --fa: "\f235"; }
+
+.fa-stethoscope {
+ --fa: "\f0f1"; }
+
+.fa-message {
+ --fa: "\f27a"; }
+
+.fa-comment-alt {
+ --fa: "\f27a"; }
+
+.fa-info {
+ --fa: "\f129"; }
+
+.fa-down-left-and-up-right-to-center {
+ --fa: "\f422"; }
+
+.fa-compress-alt {
+ --fa: "\f422"; }
+
+.fa-explosion {
+ --fa: "\e4e9"; }
+
+.fa-file-lines {
+ --fa: "\f15c"; }
+
+.fa-file-alt {
+ --fa: "\f15c"; }
+
+.fa-file-text {
+ --fa: "\f15c"; }
+
+.fa-wave-square {
+ --fa: "\f83e"; }
+
+.fa-ring {
+ --fa: "\f70b"; }
+
+.fa-building-un {
+ --fa: "\e4d9"; }
+
+.fa-dice-three {
+ --fa: "\f527"; }
+
+.fa-calendar-days {
+ --fa: "\f073"; }
+
+.fa-calendar-alt {
+ --fa: "\f073"; }
+
+.fa-anchor-circle-check {
+ --fa: "\e4aa"; }
+
+.fa-building-circle-arrow-right {
+ --fa: "\e4d1"; }
+
+.fa-volleyball {
+ --fa: "\f45f"; }
+
+.fa-volleyball-ball {
+ --fa: "\f45f"; }
+
+.fa-arrows-up-to-line {
+ --fa: "\e4c2"; }
+
+.fa-sort-down {
+ --fa: "\f0dd"; }
+
+.fa-sort-desc {
+ --fa: "\f0dd"; }
+
+.fa-circle-minus {
+ --fa: "\f056"; }
+
+.fa-minus-circle {
+ --fa: "\f056"; }
+
+.fa-door-open {
+ --fa: "\f52b"; }
+
+.fa-right-from-bracket {
+ --fa: "\f2f5"; }
+
+.fa-sign-out-alt {
+ --fa: "\f2f5"; }
+
+.fa-atom {
+ --fa: "\f5d2"; }
+
+.fa-soap {
+ --fa: "\e06e"; }
+
+.fa-icons {
+ --fa: "\f86d"; }
+
+.fa-heart-music-camera-bolt {
+ --fa: "\f86d"; }
+
+.fa-microphone-lines-slash {
+ --fa: "\f539"; }
+
+.fa-microphone-alt-slash {
+ --fa: "\f539"; }
+
+.fa-bridge-circle-check {
+ --fa: "\e4c9"; }
+
+.fa-pump-medical {
+ --fa: "\e06a"; }
+
+.fa-fingerprint {
+ --fa: "\f577"; }
+
+.fa-hand-point-right {
+ --fa: "\f0a4"; }
+
+.fa-magnifying-glass-location {
+ --fa: "\f689"; }
+
+.fa-search-location {
+ --fa: "\f689"; }
+
+.fa-forward-step {
+ --fa: "\f051"; }
+
+.fa-step-forward {
+ --fa: "\f051"; }
+
+.fa-face-smile-beam {
+ --fa: "\f5b8"; }
+
+.fa-smile-beam {
+ --fa: "\f5b8"; }
+
+.fa-flag-checkered {
+ --fa: "\f11e"; }
+
+.fa-football {
+ --fa: "\f44e"; }
+
+.fa-football-ball {
+ --fa: "\f44e"; }
+
+.fa-school-circle-exclamation {
+ --fa: "\e56c"; }
+
+.fa-crop {
+ --fa: "\f125"; }
+
+.fa-angles-down {
+ --fa: "\f103"; }
+
+.fa-angle-double-down {
+ --fa: "\f103"; }
+
+.fa-users-rectangle {
+ --fa: "\e594"; }
+
+.fa-people-roof {
+ --fa: "\e537"; }
+
+.fa-people-line {
+ --fa: "\e534"; }
+
+.fa-beer-mug-empty {
+ --fa: "\f0fc"; }
+
+.fa-beer {
+ --fa: "\f0fc"; }
+
+.fa-diagram-predecessor {
+ --fa: "\e477"; }
+
+.fa-arrow-up-long {
+ --fa: "\f176"; }
+
+.fa-long-arrow-up {
+ --fa: "\f176"; }
+
+.fa-fire-flame-simple {
+ --fa: "\f46a"; }
+
+.fa-burn {
+ --fa: "\f46a"; }
+
+.fa-person {
+ --fa: "\f183"; }
+
+.fa-male {
+ --fa: "\f183"; }
+
+.fa-laptop {
+ --fa: "\f109"; }
+
+.fa-file-csv {
+ --fa: "\f6dd"; }
+
+.fa-menorah {
+ --fa: "\f676"; }
+
+.fa-truck-plane {
+ --fa: "\e58f"; }
+
+.fa-record-vinyl {
+ --fa: "\f8d9"; }
+
+.fa-face-grin-stars {
+ --fa: "\f587"; }
+
+.fa-grin-stars {
+ --fa: "\f587"; }
+
+.fa-bong {
+ --fa: "\f55c"; }
+
+.fa-spaghetti-monster-flying {
+ --fa: "\f67b"; }
+
+.fa-pastafarianism {
+ --fa: "\f67b"; }
+
+.fa-arrow-down-up-across-line {
+ --fa: "\e4af"; }
+
+.fa-spoon {
+ --fa: "\f2e5"; }
+
+.fa-utensil-spoon {
+ --fa: "\f2e5"; }
+
+.fa-jar-wheat {
+ --fa: "\e517"; }
+
+.fa-envelopes-bulk {
+ --fa: "\f674"; }
+
+.fa-mail-bulk {
+ --fa: "\f674"; }
+
+.fa-file-circle-exclamation {
+ --fa: "\e4eb"; }
+
+.fa-circle-h {
+ --fa: "\f47e"; }
+
+.fa-hospital-symbol {
+ --fa: "\f47e"; }
+
+.fa-pager {
+ --fa: "\f815"; }
+
+.fa-address-book {
+ --fa: "\f2b9"; }
+
+.fa-contact-book {
+ --fa: "\f2b9"; }
+
+.fa-strikethrough {
+ --fa: "\f0cc"; }
+
+.fa-k {
+ --fa: "\4b"; }
+
+.fa-landmark-flag {
+ --fa: "\e51c"; }
+
+.fa-pencil {
+ --fa: "\f303"; }
+
+.fa-pencil-alt {
+ --fa: "\f303"; }
+
+.fa-backward {
+ --fa: "\f04a"; }
+
+.fa-caret-right {
+ --fa: "\f0da"; }
+
+.fa-comments {
+ --fa: "\f086"; }
+
+.fa-paste {
+ --fa: "\f0ea"; }
+
+.fa-file-clipboard {
+ --fa: "\f0ea"; }
+
+.fa-code-pull-request {
+ --fa: "\e13c"; }
+
+.fa-clipboard-list {
+ --fa: "\f46d"; }
+
+.fa-truck-ramp-box {
+ --fa: "\f4de"; }
+
+.fa-truck-loading {
+ --fa: "\f4de"; }
+
+.fa-user-check {
+ --fa: "\f4fc"; }
+
+.fa-vial-virus {
+ --fa: "\e597"; }
+
+.fa-sheet-plastic {
+ --fa: "\e571"; }
+
+.fa-blog {
+ --fa: "\f781"; }
+
+.fa-user-ninja {
+ --fa: "\f504"; }
+
+.fa-person-arrow-up-from-line {
+ --fa: "\e539"; }
+
+.fa-scroll-torah {
+ --fa: "\f6a0"; }
+
+.fa-torah {
+ --fa: "\f6a0"; }
+
+.fa-broom-ball {
+ --fa: "\f458"; }
+
+.fa-quidditch {
+ --fa: "\f458"; }
+
+.fa-quidditch-broom-ball {
+ --fa: "\f458"; }
+
+.fa-toggle-off {
+ --fa: "\f204"; }
+
+.fa-box-archive {
+ --fa: "\f187"; }
+
+.fa-archive {
+ --fa: "\f187"; }
+
+.fa-person-drowning {
+ --fa: "\e545"; }
+
+.fa-arrow-down-9-1 {
+ --fa: "\f886"; }
+
+.fa-sort-numeric-desc {
+ --fa: "\f886"; }
+
+.fa-sort-numeric-down-alt {
+ --fa: "\f886"; }
+
+.fa-face-grin-tongue-squint {
+ --fa: "\f58a"; }
+
+.fa-grin-tongue-squint {
+ --fa: "\f58a"; }
+
+.fa-spray-can {
+ --fa: "\f5bd"; }
+
+.fa-truck-monster {
+ --fa: "\f63b"; }
+
+.fa-w {
+ --fa: "\57"; }
+
+.fa-earth-africa {
+ --fa: "\f57c"; }
+
+.fa-globe-africa {
+ --fa: "\f57c"; }
+
+.fa-rainbow {
+ --fa: "\f75b"; }
+
+.fa-circle-notch {
+ --fa: "\f1ce"; }
+
+.fa-tablet-screen-button {
+ --fa: "\f3fa"; }
+
+.fa-tablet-alt {
+ --fa: "\f3fa"; }
+
+.fa-paw {
+ --fa: "\f1b0"; }
+
+.fa-cloud {
+ --fa: "\f0c2"; }
+
+.fa-trowel-bricks {
+ --fa: "\e58a"; }
+
+.fa-face-flushed {
+ --fa: "\f579"; }
+
+.fa-flushed {
+ --fa: "\f579"; }
+
+.fa-hospital-user {
+ --fa: "\f80d"; }
+
+.fa-tent-arrow-left-right {
+ --fa: "\e57f"; }
+
+.fa-gavel {
+ --fa: "\f0e3"; }
+
+.fa-legal {
+ --fa: "\f0e3"; }
+
+.fa-binoculars {
+ --fa: "\f1e5"; }
+
+.fa-microphone-slash {
+ --fa: "\f131"; }
+
+.fa-box-tissue {
+ --fa: "\e05b"; }
+
+.fa-motorcycle {
+ --fa: "\f21c"; }
+
+.fa-bell-concierge {
+ --fa: "\f562"; }
+
+.fa-concierge-bell {
+ --fa: "\f562"; }
+
+.fa-pen-ruler {
+ --fa: "\f5ae"; }
+
+.fa-pencil-ruler {
+ --fa: "\f5ae"; }
+
+.fa-people-arrows {
+ --fa: "\e068"; }
+
+.fa-people-arrows-left-right {
+ --fa: "\e068"; }
+
+.fa-mars-and-venus-burst {
+ --fa: "\e523"; }
+
+.fa-square-caret-right {
+ --fa: "\f152"; }
+
+.fa-caret-square-right {
+ --fa: "\f152"; }
+
+.fa-scissors {
+ --fa: "\f0c4"; }
+
+.fa-cut {
+ --fa: "\f0c4"; }
+
+.fa-sun-plant-wilt {
+ --fa: "\e57a"; }
+
+.fa-toilets-portable {
+ --fa: "\e584"; }
+
+.fa-hockey-puck {
+ --fa: "\f453"; }
+
+.fa-table {
+ --fa: "\f0ce"; }
+
+.fa-magnifying-glass-arrow-right {
+ --fa: "\e521"; }
+
+.fa-tachograph-digital {
+ --fa: "\f566"; }
+
+.fa-digital-tachograph {
+ --fa: "\f566"; }
+
+.fa-users-slash {
+ --fa: "\e073"; }
+
+.fa-clover {
+ --fa: "\e139"; }
+
+.fa-reply {
+ --fa: "\f3e5"; }
+
+.fa-mail-reply {
+ --fa: "\f3e5"; }
+
+.fa-star-and-crescent {
+ --fa: "\f699"; }
+
+.fa-house-fire {
+ --fa: "\e50c"; }
+
+.fa-square-minus {
+ --fa: "\f146"; }
+
+.fa-minus-square {
+ --fa: "\f146"; }
+
+.fa-helicopter {
+ --fa: "\f533"; }
+
+.fa-compass {
+ --fa: "\f14e"; }
+
+.fa-square-caret-down {
+ --fa: "\f150"; }
+
+.fa-caret-square-down {
+ --fa: "\f150"; }
+
+.fa-file-circle-question {
+ --fa: "\e4ef"; }
+
+.fa-laptop-code {
+ --fa: "\f5fc"; }
+
+.fa-swatchbook {
+ --fa: "\f5c3"; }
+
+.fa-prescription-bottle {
+ --fa: "\f485"; }
+
+.fa-bars {
+ --fa: "\f0c9"; }
+
+.fa-navicon {
+ --fa: "\f0c9"; }
+
+.fa-people-group {
+ --fa: "\e533"; }
+
+.fa-hourglass-end {
+ --fa: "\f253"; }
+
+.fa-hourglass-3 {
+ --fa: "\f253"; }
+
+.fa-heart-crack {
+ --fa: "\f7a9"; }
+
+.fa-heart-broken {
+ --fa: "\f7a9"; }
+
+.fa-square-up-right {
+ --fa: "\f360"; }
+
+.fa-external-link-square-alt {
+ --fa: "\f360"; }
+
+.fa-face-kiss-beam {
+ --fa: "\f597"; }
+
+.fa-kiss-beam {
+ --fa: "\f597"; }
+
+.fa-film {
+ --fa: "\f008"; }
+
+.fa-ruler-horizontal {
+ --fa: "\f547"; }
+
+.fa-people-robbery {
+ --fa: "\e536"; }
+
+.fa-lightbulb {
+ --fa: "\f0eb"; }
+
+.fa-caret-left {
+ --fa: "\f0d9"; }
+
+.fa-circle-exclamation {
+ --fa: "\f06a"; }
+
+.fa-exclamation-circle {
+ --fa: "\f06a"; }
+
+.fa-school-circle-xmark {
+ --fa: "\e56d"; }
+
+.fa-arrow-right-from-bracket {
+ --fa: "\f08b"; }
+
+.fa-sign-out {
+ --fa: "\f08b"; }
+
+.fa-circle-chevron-down {
+ --fa: "\f13a"; }
+
+.fa-chevron-circle-down {
+ --fa: "\f13a"; }
+
+.fa-unlock-keyhole {
+ --fa: "\f13e"; }
+
+.fa-unlock-alt {
+ --fa: "\f13e"; }
+
+.fa-cloud-showers-heavy {
+ --fa: "\f740"; }
+
+.fa-headphones-simple {
+ --fa: "\f58f"; }
+
+.fa-headphones-alt {
+ --fa: "\f58f"; }
+
+.fa-sitemap {
+ --fa: "\f0e8"; }
+
+.fa-circle-dollar-to-slot {
+ --fa: "\f4b9"; }
+
+.fa-donate {
+ --fa: "\f4b9"; }
+
+.fa-memory {
+ --fa: "\f538"; }
+
+.fa-road-spikes {
+ --fa: "\e568"; }
+
+.fa-fire-burner {
+ --fa: "\e4f1"; }
+
+.fa-flag {
+ --fa: "\f024"; }
+
+.fa-hanukiah {
+ --fa: "\f6e6"; }
+
+.fa-feather {
+ --fa: "\f52d"; }
+
+.fa-volume-low {
+ --fa: "\f027"; }
+
+.fa-volume-down {
+ --fa: "\f027"; }
+
+.fa-comment-slash {
+ --fa: "\f4b3"; }
+
+.fa-cloud-sun-rain {
+ --fa: "\f743"; }
+
+.fa-compress {
+ --fa: "\f066"; }
+
+.fa-wheat-awn {
+ --fa: "\e2cd"; }
+
+.fa-wheat-alt {
+ --fa: "\e2cd"; }
+
+.fa-ankh {
+ --fa: "\f644"; }
+
+.fa-hands-holding-child {
+ --fa: "\e4fa"; }
+
+.fa-asterisk {
+ --fa: "\2a"; }
+
+.fa-square-check {
+ --fa: "\f14a"; }
+
+.fa-check-square {
+ --fa: "\f14a"; }
+
+.fa-peseta-sign {
+ --fa: "\e221"; }
+
+.fa-heading {
+ --fa: "\f1dc"; }
+
+.fa-header {
+ --fa: "\f1dc"; }
+
+.fa-ghost {
+ --fa: "\f6e2"; }
+
+.fa-list {
+ --fa: "\f03a"; }
+
+.fa-list-squares {
+ --fa: "\f03a"; }
+
+.fa-square-phone-flip {
+ --fa: "\f87b"; }
+
+.fa-phone-square-alt {
+ --fa: "\f87b"; }
+
+.fa-cart-plus {
+ --fa: "\f217"; }
+
+.fa-gamepad {
+ --fa: "\f11b"; }
+
+.fa-circle-dot {
+ --fa: "\f192"; }
+
+.fa-dot-circle {
+ --fa: "\f192"; }
+
+.fa-face-dizzy {
+ --fa: "\f567"; }
+
+.fa-dizzy {
+ --fa: "\f567"; }
+
+.fa-egg {
+ --fa: "\f7fb"; }
+
+.fa-house-medical-circle-xmark {
+ --fa: "\e513"; }
+
+.fa-campground {
+ --fa: "\f6bb"; }
+
+.fa-folder-plus {
+ --fa: "\f65e"; }
+
+.fa-futbol {
+ --fa: "\f1e3"; }
+
+.fa-futbol-ball {
+ --fa: "\f1e3"; }
+
+.fa-soccer-ball {
+ --fa: "\f1e3"; }
+
+.fa-paintbrush {
+ --fa: "\f1fc"; }
+
+.fa-paint-brush {
+ --fa: "\f1fc"; }
+
+.fa-lock {
+ --fa: "\f023"; }
+
+.fa-gas-pump {
+ --fa: "\f52f"; }
+
+.fa-hot-tub-person {
+ --fa: "\f593"; }
+
+.fa-hot-tub {
+ --fa: "\f593"; }
+
+.fa-map-location {
+ --fa: "\f59f"; }
+
+.fa-map-marked {
+ --fa: "\f59f"; }
+
+.fa-house-flood-water {
+ --fa: "\e50e"; }
+
+.fa-tree {
+ --fa: "\f1bb"; }
+
+.fa-bridge-lock {
+ --fa: "\e4cc"; }
+
+.fa-sack-dollar {
+ --fa: "\f81d"; }
+
+.fa-pen-to-square {
+ --fa: "\f044"; }
+
+.fa-edit {
+ --fa: "\f044"; }
+
+.fa-car-side {
+ --fa: "\f5e4"; }
+
+.fa-share-nodes {
+ --fa: "\f1e0"; }
+
+.fa-share-alt {
+ --fa: "\f1e0"; }
+
+.fa-heart-circle-minus {
+ --fa: "\e4ff"; }
+
+.fa-hourglass-half {
+ --fa: "\f252"; }
+
+.fa-hourglass-2 {
+ --fa: "\f252"; }
+
+.fa-microscope {
+ --fa: "\f610"; }
+
+.fa-sink {
+ --fa: "\e06d"; }
+
+.fa-bag-shopping {
+ --fa: "\f290"; }
+
+.fa-shopping-bag {
+ --fa: "\f290"; }
+
+.fa-arrow-down-z-a {
+ --fa: "\f881"; }
+
+.fa-sort-alpha-desc {
+ --fa: "\f881"; }
+
+.fa-sort-alpha-down-alt {
+ --fa: "\f881"; }
+
+.fa-mitten {
+ --fa: "\f7b5"; }
+
+.fa-person-rays {
+ --fa: "\e54d"; }
+
+.fa-users {
+ --fa: "\f0c0"; }
+
+.fa-eye-slash {
+ --fa: "\f070"; }
+
+.fa-flask-vial {
+ --fa: "\e4f3"; }
+
+.fa-hand {
+ --fa: "\f256"; }
+
+.fa-hand-paper {
+ --fa: "\f256"; }
+
+.fa-om {
+ --fa: "\f679"; }
+
+.fa-worm {
+ --fa: "\e599"; }
+
+.fa-house-circle-xmark {
+ --fa: "\e50b"; }
+
+.fa-plug {
+ --fa: "\f1e6"; }
+
+.fa-chevron-up {
+ --fa: "\f077"; }
+
+.fa-hand-spock {
+ --fa: "\f259"; }
+
+.fa-stopwatch {
+ --fa: "\f2f2"; }
+
+.fa-face-kiss {
+ --fa: "\f596"; }
+
+.fa-kiss {
+ --fa: "\f596"; }
+
+.fa-bridge-circle-xmark {
+ --fa: "\e4cb"; }
+
+.fa-face-grin-tongue {
+ --fa: "\f589"; }
+
+.fa-grin-tongue {
+ --fa: "\f589"; }
+
+.fa-chess-bishop {
+ --fa: "\f43a"; }
+
+.fa-face-grin-wink {
+ --fa: "\f58c"; }
+
+.fa-grin-wink {
+ --fa: "\f58c"; }
+
+.fa-ear-deaf {
+ --fa: "\f2a4"; }
+
+.fa-deaf {
+ --fa: "\f2a4"; }
+
+.fa-deafness {
+ --fa: "\f2a4"; }
+
+.fa-hard-of-hearing {
+ --fa: "\f2a4"; }
+
+.fa-road-circle-check {
+ --fa: "\e564"; }
+
+.fa-dice-five {
+ --fa: "\f523"; }
+
+.fa-square-rss {
+ --fa: "\f143"; }
+
+.fa-rss-square {
+ --fa: "\f143"; }
+
+.fa-land-mine-on {
+ --fa: "\e51b"; }
+
+.fa-i-cursor {
+ --fa: "\f246"; }
+
+.fa-stamp {
+ --fa: "\f5bf"; }
+
+.fa-stairs {
+ --fa: "\e289"; }
+
+.fa-i {
+ --fa: "\49"; }
+
+.fa-hryvnia-sign {
+ --fa: "\f6f2"; }
+
+.fa-hryvnia {
+ --fa: "\f6f2"; }
+
+.fa-pills {
+ --fa: "\f484"; }
+
+.fa-face-grin-wide {
+ --fa: "\f581"; }
+
+.fa-grin-alt {
+ --fa: "\f581"; }
+
+.fa-tooth {
+ --fa: "\f5c9"; }
+
+.fa-v {
+ --fa: "\56"; }
+
+.fa-bangladeshi-taka-sign {
+ --fa: "\e2e6"; }
+
+.fa-bicycle {
+ --fa: "\f206"; }
+
+.fa-staff-snake {
+ --fa: "\e579"; }
+
+.fa-rod-asclepius {
+ --fa: "\e579"; }
+
+.fa-rod-snake {
+ --fa: "\e579"; }
+
+.fa-staff-aesculapius {
+ --fa: "\e579"; }
+
+.fa-head-side-cough-slash {
+ --fa: "\e062"; }
+
+.fa-truck-medical {
+ --fa: "\f0f9"; }
+
+.fa-ambulance {
+ --fa: "\f0f9"; }
+
+.fa-wheat-awn-circle-exclamation {
+ --fa: "\e598"; }
+
+.fa-snowman {
+ --fa: "\f7d0"; }
+
+.fa-mortar-pestle {
+ --fa: "\f5a7"; }
+
+.fa-road-barrier {
+ --fa: "\e562"; }
+
+.fa-school {
+ --fa: "\f549"; }
+
+.fa-igloo {
+ --fa: "\f7ae"; }
+
+.fa-joint {
+ --fa: "\f595"; }
+
+.fa-angle-right {
+ --fa: "\f105"; }
+
+.fa-horse {
+ --fa: "\f6f0"; }
+
+.fa-q {
+ --fa: "\51"; }
+
+.fa-g {
+ --fa: "\47"; }
+
+.fa-notes-medical {
+ --fa: "\f481"; }
+
+.fa-temperature-half {
+ --fa: "\f2c9"; }
+
+.fa-temperature-2 {
+ --fa: "\f2c9"; }
+
+.fa-thermometer-2 {
+ --fa: "\f2c9"; }
+
+.fa-thermometer-half {
+ --fa: "\f2c9"; }
+
+.fa-dong-sign {
+ --fa: "\e169"; }
+
+.fa-capsules {
+ --fa: "\f46b"; }
+
+.fa-poo-storm {
+ --fa: "\f75a"; }
+
+.fa-poo-bolt {
+ --fa: "\f75a"; }
+
+.fa-face-frown-open {
+ --fa: "\f57a"; }
+
+.fa-frown-open {
+ --fa: "\f57a"; }
+
+.fa-hand-point-up {
+ --fa: "\f0a6"; }
+
+.fa-money-bill {
+ --fa: "\f0d6"; }
+
+.fa-bookmark {
+ --fa: "\f02e"; }
+
+.fa-align-justify {
+ --fa: "\f039"; }
+
+.fa-umbrella-beach {
+ --fa: "\f5ca"; }
+
+.fa-helmet-un {
+ --fa: "\e503"; }
+
+.fa-bullseye {
+ --fa: "\f140"; }
+
+.fa-bacon {
+ --fa: "\f7e5"; }
+
+.fa-hand-point-down {
+ --fa: "\f0a7"; }
+
+.fa-arrow-up-from-bracket {
+ --fa: "\e09a"; }
+
+.fa-folder {
+ --fa: "\f07b"; }
+
+.fa-folder-blank {
+ --fa: "\f07b"; }
+
+.fa-file-waveform {
+ --fa: "\f478"; }
+
+.fa-file-medical-alt {
+ --fa: "\f478"; }
+
+.fa-radiation {
+ --fa: "\f7b9"; }
+
+.fa-chart-simple {
+ --fa: "\e473"; }
+
+.fa-mars-stroke {
+ --fa: "\f229"; }
+
+.fa-vial {
+ --fa: "\f492"; }
+
+.fa-gauge {
+ --fa: "\f624"; }
+
+.fa-dashboard {
+ --fa: "\f624"; }
+
+.fa-gauge-med {
+ --fa: "\f624"; }
+
+.fa-tachometer-alt-average {
+ --fa: "\f624"; }
+
+.fa-wand-magic-sparkles {
+ --fa: "\e2ca"; }
+
+.fa-magic-wand-sparkles {
+ --fa: "\e2ca"; }
+
+.fa-e {
+ --fa: "\45"; }
+
+.fa-pen-clip {
+ --fa: "\f305"; }
+
+.fa-pen-alt {
+ --fa: "\f305"; }
+
+.fa-bridge-circle-exclamation {
+ --fa: "\e4ca"; }
+
+.fa-user {
+ --fa: "\f007"; }
+
+.fa-school-circle-check {
+ --fa: "\e56b"; }
+
+.fa-dumpster {
+ --fa: "\f793"; }
+
+.fa-van-shuttle {
+ --fa: "\f5b6"; }
+
+.fa-shuttle-van {
+ --fa: "\f5b6"; }
+
+.fa-building-user {
+ --fa: "\e4da"; }
+
+.fa-square-caret-left {
+ --fa: "\f191"; }
+
+.fa-caret-square-left {
+ --fa: "\f191"; }
+
+.fa-highlighter {
+ --fa: "\f591"; }
+
+.fa-key {
+ --fa: "\f084"; }
+
+.fa-bullhorn {
+ --fa: "\f0a1"; }
+
+.fa-globe {
+ --fa: "\f0ac"; }
+
+.fa-synagogue {
+ --fa: "\f69b"; }
+
+.fa-person-half-dress {
+ --fa: "\e548"; }
+
+.fa-road-bridge {
+ --fa: "\e563"; }
+
+.fa-location-arrow {
+ --fa: "\f124"; }
+
+.fa-c {
+ --fa: "\43"; }
+
+.fa-tablet-button {
+ --fa: "\f10a"; }
+
+.fa-building-lock {
+ --fa: "\e4d6"; }
+
+.fa-pizza-slice {
+ --fa: "\f818"; }
+
+.fa-money-bill-wave {
+ --fa: "\f53a"; }
+
+.fa-chart-area {
+ --fa: "\f1fe"; }
+
+.fa-area-chart {
+ --fa: "\f1fe"; }
+
+.fa-house-flag {
+ --fa: "\e50d"; }
+
+.fa-person-circle-minus {
+ --fa: "\e540"; }
+
+.fa-ban {
+ --fa: "\f05e"; }
+
+.fa-cancel {
+ --fa: "\f05e"; }
+
+.fa-camera-rotate {
+ --fa: "\e0d8"; }
+
+.fa-spray-can-sparkles {
+ --fa: "\f5d0"; }
+
+.fa-air-freshener {
+ --fa: "\f5d0"; }
+
+.fa-star {
+ --fa: "\f005"; }
+
+.fa-repeat {
+ --fa: "\f363"; }
+
+.fa-cross {
+ --fa: "\f654"; }
+
+.fa-box {
+ --fa: "\f466"; }
+
+.fa-venus-mars {
+ --fa: "\f228"; }
+
+.fa-arrow-pointer {
+ --fa: "\f245"; }
+
+.fa-mouse-pointer {
+ --fa: "\f245"; }
+
+.fa-maximize {
+ --fa: "\f31e"; }
+
+.fa-expand-arrows-alt {
+ --fa: "\f31e"; }
+
+.fa-charging-station {
+ --fa: "\f5e7"; }
+
+.fa-shapes {
+ --fa: "\f61f"; }
+
+.fa-triangle-circle-square {
+ --fa: "\f61f"; }
+
+.fa-shuffle {
+ --fa: "\f074"; }
+
+.fa-random {
+ --fa: "\f074"; }
+
+.fa-person-running {
+ --fa: "\f70c"; }
+
+.fa-running {
+ --fa: "\f70c"; }
+
+.fa-mobile-retro {
+ --fa: "\e527"; }
+
+.fa-grip-lines-vertical {
+ --fa: "\f7a5"; }
+
+.fa-spider {
+ --fa: "\f717"; }
+
+.fa-hands-bound {
+ --fa: "\e4f9"; }
+
+.fa-file-invoice-dollar {
+ --fa: "\f571"; }
+
+.fa-plane-circle-exclamation {
+ --fa: "\e556"; }
+
+.fa-x-ray {
+ --fa: "\f497"; }
+
+.fa-spell-check {
+ --fa: "\f891"; }
+
+.fa-slash {
+ --fa: "\f715"; }
+
+.fa-computer-mouse {
+ --fa: "\f8cc"; }
+
+.fa-mouse {
+ --fa: "\f8cc"; }
+
+.fa-arrow-right-to-bracket {
+ --fa: "\f090"; }
+
+.fa-sign-in {
+ --fa: "\f090"; }
+
+.fa-shop-slash {
+ --fa: "\e070"; }
+
+.fa-store-alt-slash {
+ --fa: "\e070"; }
+
+.fa-server {
+ --fa: "\f233"; }
+
+.fa-virus-covid-slash {
+ --fa: "\e4a9"; }
+
+.fa-shop-lock {
+ --fa: "\e4a5"; }
+
+.fa-hourglass-start {
+ --fa: "\f251"; }
+
+.fa-hourglass-1 {
+ --fa: "\f251"; }
+
+.fa-blender-phone {
+ --fa: "\f6b6"; }
+
+.fa-building-wheat {
+ --fa: "\e4db"; }
+
+.fa-person-breastfeeding {
+ --fa: "\e53a"; }
+
+.fa-right-to-bracket {
+ --fa: "\f2f6"; }
+
+.fa-sign-in-alt {
+ --fa: "\f2f6"; }
+
+.fa-venus {
+ --fa: "\f221"; }
+
+.fa-passport {
+ --fa: "\f5ab"; }
+
+.fa-thumbtack-slash {
+ --fa: "\e68f"; }
+
+.fa-thumb-tack-slash {
+ --fa: "\e68f"; }
+
+.fa-heart-pulse {
+ --fa: "\f21e"; }
+
+.fa-heartbeat {
+ --fa: "\f21e"; }
+
+.fa-people-carry-box {
+ --fa: "\f4ce"; }
+
+.fa-people-carry {
+ --fa: "\f4ce"; }
+
+.fa-temperature-high {
+ --fa: "\f769"; }
+
+.fa-microchip {
+ --fa: "\f2db"; }
+
+.fa-crown {
+ --fa: "\f521"; }
+
+.fa-weight-hanging {
+ --fa: "\f5cd"; }
+
+.fa-xmarks-lines {
+ --fa: "\e59a"; }
+
+.fa-file-prescription {
+ --fa: "\f572"; }
+
+.fa-weight-scale {
+ --fa: "\f496"; }
+
+.fa-weight {
+ --fa: "\f496"; }
+
+.fa-user-group {
+ --fa: "\f500"; }
+
+.fa-user-friends {
+ --fa: "\f500"; }
+
+.fa-arrow-up-a-z {
+ --fa: "\f15e"; }
+
+.fa-sort-alpha-up {
+ --fa: "\f15e"; }
+
+.fa-chess-knight {
+ --fa: "\f441"; }
+
+.fa-face-laugh-squint {
+ --fa: "\f59b"; }
+
+.fa-laugh-squint {
+ --fa: "\f59b"; }
+
+.fa-wheelchair {
+ --fa: "\f193"; }
+
+.fa-circle-arrow-up {
+ --fa: "\f0aa"; }
+
+.fa-arrow-circle-up {
+ --fa: "\f0aa"; }
+
+.fa-toggle-on {
+ --fa: "\f205"; }
+
+.fa-person-walking {
+ --fa: "\f554"; }
+
+.fa-walking {
+ --fa: "\f554"; }
+
+.fa-l {
+ --fa: "\4c"; }
+
+.fa-fire {
+ --fa: "\f06d"; }
+
+.fa-bed-pulse {
+ --fa: "\f487"; }
+
+.fa-procedures {
+ --fa: "\f487"; }
+
+.fa-shuttle-space {
+ --fa: "\f197"; }
+
+.fa-space-shuttle {
+ --fa: "\f197"; }
+
+.fa-face-laugh {
+ --fa: "\f599"; }
+
+.fa-laugh {
+ --fa: "\f599"; }
+
+.fa-folder-open {
+ --fa: "\f07c"; }
+
+.fa-heart-circle-plus {
+ --fa: "\e500"; }
+
+.fa-code-fork {
+ --fa: "\e13b"; }
+
+.fa-city {
+ --fa: "\f64f"; }
+
+.fa-microphone-lines {
+ --fa: "\f3c9"; }
+
+.fa-microphone-alt {
+ --fa: "\f3c9"; }
+
+.fa-pepper-hot {
+ --fa: "\f816"; }
+
+.fa-unlock {
+ --fa: "\f09c"; }
+
+.fa-colon-sign {
+ --fa: "\e140"; }
+
+.fa-headset {
+ --fa: "\f590"; }
+
+.fa-store-slash {
+ --fa: "\e071"; }
+
+.fa-road-circle-xmark {
+ --fa: "\e566"; }
+
+.fa-user-minus {
+ --fa: "\f503"; }
+
+.fa-mars-stroke-up {
+ --fa: "\f22a"; }
+
+.fa-mars-stroke-v {
+ --fa: "\f22a"; }
+
+.fa-champagne-glasses {
+ --fa: "\f79f"; }
+
+.fa-glass-cheers {
+ --fa: "\f79f"; }
+
+.fa-clipboard {
+ --fa: "\f328"; }
+
+.fa-house-circle-exclamation {
+ --fa: "\e50a"; }
+
+.fa-file-arrow-up {
+ --fa: "\f574"; }
+
+.fa-file-upload {
+ --fa: "\f574"; }
+
+.fa-wifi {
+ --fa: "\f1eb"; }
+
+.fa-wifi-3 {
+ --fa: "\f1eb"; }
+
+.fa-wifi-strong {
+ --fa: "\f1eb"; }
+
+.fa-bath {
+ --fa: "\f2cd"; }
+
+.fa-bathtub {
+ --fa: "\f2cd"; }
+
+.fa-underline {
+ --fa: "\f0cd"; }
+
+.fa-user-pen {
+ --fa: "\f4ff"; }
+
+.fa-user-edit {
+ --fa: "\f4ff"; }
+
+.fa-signature {
+ --fa: "\f5b7"; }
+
+.fa-stroopwafel {
+ --fa: "\f551"; }
+
+.fa-bold {
+ --fa: "\f032"; }
+
+.fa-anchor-lock {
+ --fa: "\e4ad"; }
+
+.fa-building-ngo {
+ --fa: "\e4d7"; }
+
+.fa-manat-sign {
+ --fa: "\e1d5"; }
+
+.fa-not-equal {
+ --fa: "\f53e"; }
+
+.fa-border-top-left {
+ --fa: "\f853"; }
+
+.fa-border-style {
+ --fa: "\f853"; }
+
+.fa-map-location-dot {
+ --fa: "\f5a0"; }
+
+.fa-map-marked-alt {
+ --fa: "\f5a0"; }
+
+.fa-jedi {
+ --fa: "\f669"; }
+
+.fa-square-poll-vertical {
+ --fa: "\f681"; }
+
+.fa-poll {
+ --fa: "\f681"; }
+
+.fa-mug-hot {
+ --fa: "\f7b6"; }
+
+.fa-car-battery {
+ --fa: "\f5df"; }
+
+.fa-battery-car {
+ --fa: "\f5df"; }
+
+.fa-gift {
+ --fa: "\f06b"; }
+
+.fa-dice-two {
+ --fa: "\f528"; }
+
+.fa-chess-queen {
+ --fa: "\f445"; }
+
+.fa-glasses {
+ --fa: "\f530"; }
+
+.fa-chess-board {
+ --fa: "\f43c"; }
+
+.fa-building-circle-check {
+ --fa: "\e4d2"; }
+
+.fa-person-chalkboard {
+ --fa: "\e53d"; }
+
+.fa-mars-stroke-right {
+ --fa: "\f22b"; }
+
+.fa-mars-stroke-h {
+ --fa: "\f22b"; }
+
+.fa-hand-back-fist {
+ --fa: "\f255"; }
+
+.fa-hand-rock {
+ --fa: "\f255"; }
+
+.fa-square-caret-up {
+ --fa: "\f151"; }
+
+.fa-caret-square-up {
+ --fa: "\f151"; }
+
+.fa-cloud-showers-water {
+ --fa: "\e4e4"; }
+
+.fa-chart-bar {
+ --fa: "\f080"; }
+
+.fa-bar-chart {
+ --fa: "\f080"; }
+
+.fa-hands-bubbles {
+ --fa: "\e05e"; }
+
+.fa-hands-wash {
+ --fa: "\e05e"; }
+
+.fa-less-than-equal {
+ --fa: "\f537"; }
+
+.fa-train {
+ --fa: "\f238"; }
+
+.fa-eye-low-vision {
+ --fa: "\f2a8"; }
+
+.fa-low-vision {
+ --fa: "\f2a8"; }
+
+.fa-crow {
+ --fa: "\f520"; }
+
+.fa-sailboat {
+ --fa: "\e445"; }
+
+.fa-window-restore {
+ --fa: "\f2d2"; }
+
+.fa-square-plus {
+ --fa: "\f0fe"; }
+
+.fa-plus-square {
+ --fa: "\f0fe"; }
+
+.fa-torii-gate {
+ --fa: "\f6a1"; }
+
+.fa-frog {
+ --fa: "\f52e"; }
+
+.fa-bucket {
+ --fa: "\e4cf"; }
+
+.fa-image {
+ --fa: "\f03e"; }
+
+.fa-microphone {
+ --fa: "\f130"; }
+
+.fa-cow {
+ --fa: "\f6c8"; }
+
+.fa-caret-up {
+ --fa: "\f0d8"; }
+
+.fa-screwdriver {
+ --fa: "\f54a"; }
+
+.fa-folder-closed {
+ --fa: "\e185"; }
+
+.fa-house-tsunami {
+ --fa: "\e515"; }
+
+.fa-square-nfi {
+ --fa: "\e576"; }
+
+.fa-arrow-up-from-ground-water {
+ --fa: "\e4b5"; }
+
+.fa-martini-glass {
+ --fa: "\f57b"; }
+
+.fa-glass-martini-alt {
+ --fa: "\f57b"; }
+
+.fa-square-binary {
+ --fa: "\e69b"; }
+
+.fa-rotate-left {
+ --fa: "\f2ea"; }
+
+.fa-rotate-back {
+ --fa: "\f2ea"; }
+
+.fa-rotate-backward {
+ --fa: "\f2ea"; }
+
+.fa-undo-alt {
+ --fa: "\f2ea"; }
+
+.fa-table-columns {
+ --fa: "\f0db"; }
+
+.fa-columns {
+ --fa: "\f0db"; }
+
+.fa-lemon {
+ --fa: "\f094"; }
+
+.fa-head-side-mask {
+ --fa: "\e063"; }
+
+.fa-handshake {
+ --fa: "\f2b5"; }
+
+.fa-gem {
+ --fa: "\f3a5"; }
+
+.fa-dolly {
+ --fa: "\f472"; }
+
+.fa-dolly-box {
+ --fa: "\f472"; }
+
+.fa-smoking {
+ --fa: "\f48d"; }
+
+.fa-minimize {
+ --fa: "\f78c"; }
+
+.fa-compress-arrows-alt {
+ --fa: "\f78c"; }
+
+.fa-monument {
+ --fa: "\f5a6"; }
+
+.fa-snowplow {
+ --fa: "\f7d2"; }
+
+.fa-angles-right {
+ --fa: "\f101"; }
+
+.fa-angle-double-right {
+ --fa: "\f101"; }
+
+.fa-cannabis {
+ --fa: "\f55f"; }
+
+.fa-circle-play {
+ --fa: "\f144"; }
+
+.fa-play-circle {
+ --fa: "\f144"; }
+
+.fa-tablets {
+ --fa: "\f490"; }
+
+.fa-ethernet {
+ --fa: "\f796"; }
+
+.fa-euro-sign {
+ --fa: "\f153"; }
+
+.fa-eur {
+ --fa: "\f153"; }
+
+.fa-euro {
+ --fa: "\f153"; }
+
+.fa-chair {
+ --fa: "\f6c0"; }
+
+.fa-circle-check {
+ --fa: "\f058"; }
+
+.fa-check-circle {
+ --fa: "\f058"; }
+
+.fa-circle-stop {
+ --fa: "\f28d"; }
+
+.fa-stop-circle {
+ --fa: "\f28d"; }
+
+.fa-compass-drafting {
+ --fa: "\f568"; }
+
+.fa-drafting-compass {
+ --fa: "\f568"; }
+
+.fa-plate-wheat {
+ --fa: "\e55a"; }
+
+.fa-icicles {
+ --fa: "\f7ad"; }
+
+.fa-person-shelter {
+ --fa: "\e54f"; }
+
+.fa-neuter {
+ --fa: "\f22c"; }
+
+.fa-id-badge {
+ --fa: "\f2c1"; }
+
+.fa-marker {
+ --fa: "\f5a1"; }
+
+.fa-face-laugh-beam {
+ --fa: "\f59a"; }
+
+.fa-laugh-beam {
+ --fa: "\f59a"; }
+
+.fa-helicopter-symbol {
+ --fa: "\e502"; }
+
+.fa-universal-access {
+ --fa: "\f29a"; }
+
+.fa-circle-chevron-up {
+ --fa: "\f139"; }
+
+.fa-chevron-circle-up {
+ --fa: "\f139"; }
+
+.fa-lari-sign {
+ --fa: "\e1c8"; }
+
+.fa-volcano {
+ --fa: "\f770"; }
+
+.fa-person-walking-dashed-line-arrow-right {
+ --fa: "\e553"; }
+
+.fa-sterling-sign {
+ --fa: "\f154"; }
+
+.fa-gbp {
+ --fa: "\f154"; }
+
+.fa-pound-sign {
+ --fa: "\f154"; }
+
+.fa-viruses {
+ --fa: "\e076"; }
+
+.fa-square-person-confined {
+ --fa: "\e577"; }
+
+.fa-user-tie {
+ --fa: "\f508"; }
+
+.fa-arrow-down-long {
+ --fa: "\f175"; }
+
+.fa-long-arrow-down {
+ --fa: "\f175"; }
+
+.fa-tent-arrow-down-to-line {
+ --fa: "\e57e"; }
+
+.fa-certificate {
+ --fa: "\f0a3"; }
+
+.fa-reply-all {
+ --fa: "\f122"; }
+
+.fa-mail-reply-all {
+ --fa: "\f122"; }
+
+.fa-suitcase {
+ --fa: "\f0f2"; }
+
+.fa-person-skating {
+ --fa: "\f7c5"; }
+
+.fa-skating {
+ --fa: "\f7c5"; }
+
+.fa-filter-circle-dollar {
+ --fa: "\f662"; }
+
+.fa-funnel-dollar {
+ --fa: "\f662"; }
+
+.fa-camera-retro {
+ --fa: "\f083"; }
+
+.fa-circle-arrow-down {
+ --fa: "\f0ab"; }
+
+.fa-arrow-circle-down {
+ --fa: "\f0ab"; }
+
+.fa-file-import {
+ --fa: "\f56f"; }
+
+.fa-arrow-right-to-file {
+ --fa: "\f56f"; }
+
+.fa-square-arrow-up-right {
+ --fa: "\f14c"; }
+
+.fa-external-link-square {
+ --fa: "\f14c"; }
+
+.fa-box-open {
+ --fa: "\f49e"; }
+
+.fa-scroll {
+ --fa: "\f70e"; }
+
+.fa-spa {
+ --fa: "\f5bb"; }
+
+.fa-location-pin-lock {
+ --fa: "\e51f"; }
+
+.fa-pause {
+ --fa: "\f04c"; }
+
+.fa-hill-avalanche {
+ --fa: "\e507"; }
+
+.fa-temperature-empty {
+ --fa: "\f2cb"; }
+
+.fa-temperature-0 {
+ --fa: "\f2cb"; }
+
+.fa-thermometer-0 {
+ --fa: "\f2cb"; }
+
+.fa-thermometer-empty {
+ --fa: "\f2cb"; }
+
+.fa-bomb {
+ --fa: "\f1e2"; }
+
+.fa-registered {
+ --fa: "\f25d"; }
+
+.fa-address-card {
+ --fa: "\f2bb"; }
+
+.fa-contact-card {
+ --fa: "\f2bb"; }
+
+.fa-vcard {
+ --fa: "\f2bb"; }
+
+.fa-scale-unbalanced-flip {
+ --fa: "\f516"; }
+
+.fa-balance-scale-right {
+ --fa: "\f516"; }
+
+.fa-subscript {
+ --fa: "\f12c"; }
+
+.fa-diamond-turn-right {
+ --fa: "\f5eb"; }
+
+.fa-directions {
+ --fa: "\f5eb"; }
+
+.fa-burst {
+ --fa: "\e4dc"; }
+
+.fa-house-laptop {
+ --fa: "\e066"; }
+
+.fa-laptop-house {
+ --fa: "\e066"; }
+
+.fa-face-tired {
+ --fa: "\f5c8"; }
+
+.fa-tired {
+ --fa: "\f5c8"; }
+
+.fa-money-bills {
+ --fa: "\e1f3"; }
+
+.fa-smog {
+ --fa: "\f75f"; }
+
+.fa-crutch {
+ --fa: "\f7f7"; }
+
+.fa-cloud-arrow-up {
+ --fa: "\f0ee"; }
+
+.fa-cloud-upload {
+ --fa: "\f0ee"; }
+
+.fa-cloud-upload-alt {
+ --fa: "\f0ee"; }
+
+.fa-palette {
+ --fa: "\f53f"; }
+
+.fa-arrows-turn-right {
+ --fa: "\e4c0"; }
+
+.fa-vest {
+ --fa: "\e085"; }
+
+.fa-ferry {
+ --fa: "\e4ea"; }
+
+.fa-arrows-down-to-people {
+ --fa: "\e4b9"; }
+
+.fa-seedling {
+ --fa: "\f4d8"; }
+
+.fa-sprout {
+ --fa: "\f4d8"; }
+
+.fa-left-right {
+ --fa: "\f337"; }
+
+.fa-arrows-alt-h {
+ --fa: "\f337"; }
+
+.fa-boxes-packing {
+ --fa: "\e4c7"; }
+
+.fa-circle-arrow-left {
+ --fa: "\f0a8"; }
+
+.fa-arrow-circle-left {
+ --fa: "\f0a8"; }
+
+.fa-group-arrows-rotate {
+ --fa: "\e4f6"; }
+
+.fa-bowl-food {
+ --fa: "\e4c6"; }
+
+.fa-candy-cane {
+ --fa: "\f786"; }
+
+.fa-arrow-down-wide-short {
+ --fa: "\f160"; }
+
+.fa-sort-amount-asc {
+ --fa: "\f160"; }
+
+.fa-sort-amount-down {
+ --fa: "\f160"; }
+
+.fa-cloud-bolt {
+ --fa: "\f76c"; }
+
+.fa-thunderstorm {
+ --fa: "\f76c"; }
+
+.fa-text-slash {
+ --fa: "\f87d"; }
+
+.fa-remove-format {
+ --fa: "\f87d"; }
+
+.fa-face-smile-wink {
+ --fa: "\f4da"; }
+
+.fa-smile-wink {
+ --fa: "\f4da"; }
+
+.fa-file-word {
+ --fa: "\f1c2"; }
+
+.fa-file-powerpoint {
+ --fa: "\f1c4"; }
+
+.fa-arrows-left-right {
+ --fa: "\f07e"; }
+
+.fa-arrows-h {
+ --fa: "\f07e"; }
+
+.fa-house-lock {
+ --fa: "\e510"; }
+
+.fa-cloud-arrow-down {
+ --fa: "\f0ed"; }
+
+.fa-cloud-download {
+ --fa: "\f0ed"; }
+
+.fa-cloud-download-alt {
+ --fa: "\f0ed"; }
+
+.fa-children {
+ --fa: "\e4e1"; }
+
+.fa-chalkboard {
+ --fa: "\f51b"; }
+
+.fa-blackboard {
+ --fa: "\f51b"; }
+
+.fa-user-large-slash {
+ --fa: "\f4fa"; }
+
+.fa-user-alt-slash {
+ --fa: "\f4fa"; }
+
+.fa-envelope-open {
+ --fa: "\f2b6"; }
+
+.fa-handshake-simple-slash {
+ --fa: "\e05f"; }
+
+.fa-handshake-alt-slash {
+ --fa: "\e05f"; }
+
+.fa-mattress-pillow {
+ --fa: "\e525"; }
+
+.fa-guarani-sign {
+ --fa: "\e19a"; }
+
+.fa-arrows-rotate {
+ --fa: "\f021"; }
+
+.fa-refresh {
+ --fa: "\f021"; }
+
+.fa-sync {
+ --fa: "\f021"; }
+
+.fa-fire-extinguisher {
+ --fa: "\f134"; }
+
+.fa-cruzeiro-sign {
+ --fa: "\e152"; }
+
+.fa-greater-than-equal {
+ --fa: "\f532"; }
+
+.fa-shield-halved {
+ --fa: "\f3ed"; }
+
+.fa-shield-alt {
+ --fa: "\f3ed"; }
+
+.fa-book-atlas {
+ --fa: "\f558"; }
+
+.fa-atlas {
+ --fa: "\f558"; }
+
+.fa-virus {
+ --fa: "\e074"; }
+
+.fa-envelope-circle-check {
+ --fa: "\e4e8"; }
+
+.fa-layer-group {
+ --fa: "\f5fd"; }
+
+.fa-arrows-to-dot {
+ --fa: "\e4be"; }
+
+.fa-archway {
+ --fa: "\f557"; }
+
+.fa-heart-circle-check {
+ --fa: "\e4fd"; }
+
+.fa-house-chimney-crack {
+ --fa: "\f6f1"; }
+
+.fa-house-damage {
+ --fa: "\f6f1"; }
+
+.fa-file-zipper {
+ --fa: "\f1c6"; }
+
+.fa-file-archive {
+ --fa: "\f1c6"; }
+
+.fa-square {
+ --fa: "\f0c8"; }
+
+.fa-martini-glass-empty {
+ --fa: "\f000"; }
+
+.fa-glass-martini {
+ --fa: "\f000"; }
+
+.fa-couch {
+ --fa: "\f4b8"; }
+
+.fa-cedi-sign {
+ --fa: "\e0df"; }
+
+.fa-italic {
+ --fa: "\f033"; }
+
+.fa-table-cells-column-lock {
+ --fa: "\e678"; }
+
+.fa-church {
+ --fa: "\f51d"; }
+
+.fa-comments-dollar {
+ --fa: "\f653"; }
+
+.fa-democrat {
+ --fa: "\f747"; }
+
+.fa-z {
+ --fa: "\5a"; }
+
+.fa-person-skiing {
+ --fa: "\f7c9"; }
+
+.fa-skiing {
+ --fa: "\f7c9"; }
+
+.fa-road-lock {
+ --fa: "\e567"; }
+
+.fa-a {
+ --fa: "\41"; }
+
+.fa-temperature-arrow-down {
+ --fa: "\e03f"; }
+
+.fa-temperature-down {
+ --fa: "\e03f"; }
+
+.fa-feather-pointed {
+ --fa: "\f56b"; }
+
+.fa-feather-alt {
+ --fa: "\f56b"; }
+
+.fa-p {
+ --fa: "\50"; }
+
+.fa-snowflake {
+ --fa: "\f2dc"; }
+
+.fa-newspaper {
+ --fa: "\f1ea"; }
+
+.fa-rectangle-ad {
+ --fa: "\f641"; }
+
+.fa-ad {
+ --fa: "\f641"; }
+
+.fa-circle-arrow-right {
+ --fa: "\f0a9"; }
+
+.fa-arrow-circle-right {
+ --fa: "\f0a9"; }
+
+.fa-filter-circle-xmark {
+ --fa: "\e17b"; }
+
+.fa-locust {
+ --fa: "\e520"; }
+
+.fa-sort {
+ --fa: "\f0dc"; }
+
+.fa-unsorted {
+ --fa: "\f0dc"; }
+
+.fa-list-ol {
+ --fa: "\f0cb"; }
+
+.fa-list-1-2 {
+ --fa: "\f0cb"; }
+
+.fa-list-numeric {
+ --fa: "\f0cb"; }
+
+.fa-person-dress-burst {
+ --fa: "\e544"; }
+
+.fa-money-check-dollar {
+ --fa: "\f53d"; }
+
+.fa-money-check-alt {
+ --fa: "\f53d"; }
+
+.fa-vector-square {
+ --fa: "\f5cb"; }
+
+.fa-bread-slice {
+ --fa: "\f7ec"; }
+
+.fa-language {
+ --fa: "\f1ab"; }
+
+.fa-face-kiss-wink-heart {
+ --fa: "\f598"; }
+
+.fa-kiss-wink-heart {
+ --fa: "\f598"; }
+
+.fa-filter {
+ --fa: "\f0b0"; }
+
+.fa-question {
+ --fa: "\3f"; }
+
+.fa-file-signature {
+ --fa: "\f573"; }
+
+.fa-up-down-left-right {
+ --fa: "\f0b2"; }
+
+.fa-arrows-alt {
+ --fa: "\f0b2"; }
+
+.fa-house-chimney-user {
+ --fa: "\e065"; }
+
+.fa-hand-holding-heart {
+ --fa: "\f4be"; }
+
+.fa-puzzle-piece {
+ --fa: "\f12e"; }
+
+.fa-money-check {
+ --fa: "\f53c"; }
+
+.fa-star-half-stroke {
+ --fa: "\f5c0"; }
+
+.fa-star-half-alt {
+ --fa: "\f5c0"; }
+
+.fa-code {
+ --fa: "\f121"; }
+
+.fa-whiskey-glass {
+ --fa: "\f7a0"; }
+
+.fa-glass-whiskey {
+ --fa: "\f7a0"; }
+
+.fa-building-circle-exclamation {
+ --fa: "\e4d3"; }
+
+.fa-magnifying-glass-chart {
+ --fa: "\e522"; }
+
+.fa-arrow-up-right-from-square {
+ --fa: "\f08e"; }
+
+.fa-external-link {
+ --fa: "\f08e"; }
+
+.fa-cubes-stacked {
+ --fa: "\e4e6"; }
+
+.fa-won-sign {
+ --fa: "\f159"; }
+
+.fa-krw {
+ --fa: "\f159"; }
+
+.fa-won {
+ --fa: "\f159"; }
+
+.fa-virus-covid {
+ --fa: "\e4a8"; }
+
+.fa-austral-sign {
+ --fa: "\e0a9"; }
+
+.fa-f {
+ --fa: "\46"; }
+
+.fa-leaf {
+ --fa: "\f06c"; }
+
+.fa-road {
+ --fa: "\f018"; }
+
+.fa-taxi {
+ --fa: "\f1ba"; }
+
+.fa-cab {
+ --fa: "\f1ba"; }
+
+.fa-person-circle-plus {
+ --fa: "\e541"; }
+
+.fa-chart-pie {
+ --fa: "\f200"; }
+
+.fa-pie-chart {
+ --fa: "\f200"; }
+
+.fa-bolt-lightning {
+ --fa: "\e0b7"; }
+
+.fa-sack-xmark {
+ --fa: "\e56a"; }
+
+.fa-file-excel {
+ --fa: "\f1c3"; }
+
+.fa-file-contract {
+ --fa: "\f56c"; }
+
+.fa-fish-fins {
+ --fa: "\e4f2"; }
+
+.fa-building-flag {
+ --fa: "\e4d5"; }
+
+.fa-face-grin-beam {
+ --fa: "\f582"; }
+
+.fa-grin-beam {
+ --fa: "\f582"; }
+
+.fa-object-ungroup {
+ --fa: "\f248"; }
+
+.fa-poop {
+ --fa: "\f619"; }
+
+.fa-location-pin {
+ --fa: "\f041"; }
+
+.fa-map-marker {
+ --fa: "\f041"; }
+
+.fa-kaaba {
+ --fa: "\f66b"; }
+
+.fa-toilet-paper {
+ --fa: "\f71e"; }
+
+.fa-helmet-safety {
+ --fa: "\f807"; }
+
+.fa-hard-hat {
+ --fa: "\f807"; }
+
+.fa-hat-hard {
+ --fa: "\f807"; }
+
+.fa-eject {
+ --fa: "\f052"; }
+
+.fa-circle-right {
+ --fa: "\f35a"; }
+
+.fa-arrow-alt-circle-right {
+ --fa: "\f35a"; }
+
+.fa-plane-circle-check {
+ --fa: "\e555"; }
+
+.fa-face-rolling-eyes {
+ --fa: "\f5a5"; }
+
+.fa-meh-rolling-eyes {
+ --fa: "\f5a5"; }
+
+.fa-object-group {
+ --fa: "\f247"; }
+
+.fa-chart-line {
+ --fa: "\f201"; }
+
+.fa-line-chart {
+ --fa: "\f201"; }
+
+.fa-mask-ventilator {
+ --fa: "\e524"; }
+
+.fa-arrow-right {
+ --fa: "\f061"; }
+
+.fa-signs-post {
+ --fa: "\f277"; }
+
+.fa-map-signs {
+ --fa: "\f277"; }
+
+.fa-cash-register {
+ --fa: "\f788"; }
+
+.fa-person-circle-question {
+ --fa: "\e542"; }
+
+.fa-h {
+ --fa: "\48"; }
+
+.fa-tarp {
+ --fa: "\e57b"; }
+
+.fa-screwdriver-wrench {
+ --fa: "\f7d9"; }
+
+.fa-tools {
+ --fa: "\f7d9"; }
+
+.fa-arrows-to-eye {
+ --fa: "\e4bf"; }
+
+.fa-plug-circle-bolt {
+ --fa: "\e55b"; }
+
+.fa-heart {
+ --fa: "\f004"; }
+
+.fa-mars-and-venus {
+ --fa: "\f224"; }
+
+.fa-house-user {
+ --fa: "\e1b0"; }
+
+.fa-home-user {
+ --fa: "\e1b0"; }
+
+.fa-dumpster-fire {
+ --fa: "\f794"; }
+
+.fa-house-crack {
+ --fa: "\e3b1"; }
+
+.fa-martini-glass-citrus {
+ --fa: "\f561"; }
+
+.fa-cocktail {
+ --fa: "\f561"; }
+
+.fa-face-surprise {
+ --fa: "\f5c2"; }
+
+.fa-surprise {
+ --fa: "\f5c2"; }
+
+.fa-bottle-water {
+ --fa: "\e4c5"; }
+
+.fa-circle-pause {
+ --fa: "\f28b"; }
+
+.fa-pause-circle {
+ --fa: "\f28b"; }
+
+.fa-toilet-paper-slash {
+ --fa: "\e072"; }
+
+.fa-apple-whole {
+ --fa: "\f5d1"; }
+
+.fa-apple-alt {
+ --fa: "\f5d1"; }
+
+.fa-kitchen-set {
+ --fa: "\e51a"; }
+
+.fa-r {
+ --fa: "\52"; }
+
+.fa-temperature-quarter {
+ --fa: "\f2ca"; }
+
+.fa-temperature-1 {
+ --fa: "\f2ca"; }
+
+.fa-thermometer-1 {
+ --fa: "\f2ca"; }
+
+.fa-thermometer-quarter {
+ --fa: "\f2ca"; }
+
+.fa-cube {
+ --fa: "\f1b2"; }
+
+.fa-bitcoin-sign {
+ --fa: "\e0b4"; }
+
+.fa-shield-dog {
+ --fa: "\e573"; }
+
+.fa-solar-panel {
+ --fa: "\f5ba"; }
+
+.fa-lock-open {
+ --fa: "\f3c1"; }
+
+.fa-elevator {
+ --fa: "\e16d"; }
+
+.fa-money-bill-transfer {
+ --fa: "\e528"; }
+
+.fa-money-bill-trend-up {
+ --fa: "\e529"; }
+
+.fa-house-flood-water-circle-arrow-right {
+ --fa: "\e50f"; }
+
+.fa-square-poll-horizontal {
+ --fa: "\f682"; }
+
+.fa-poll-h {
+ --fa: "\f682"; }
+
+.fa-circle {
+ --fa: "\f111"; }
+
+.fa-backward-fast {
+ --fa: "\f049"; }
+
+.fa-fast-backward {
+ --fa: "\f049"; }
+
+.fa-recycle {
+ --fa: "\f1b8"; }
+
+.fa-user-astronaut {
+ --fa: "\f4fb"; }
+
+.fa-plane-slash {
+ --fa: "\e069"; }
+
+.fa-trademark {
+ --fa: "\f25c"; }
+
+.fa-basketball {
+ --fa: "\f434"; }
+
+.fa-basketball-ball {
+ --fa: "\f434"; }
+
+.fa-satellite-dish {
+ --fa: "\f7c0"; }
+
+.fa-circle-up {
+ --fa: "\f35b"; }
+
+.fa-arrow-alt-circle-up {
+ --fa: "\f35b"; }
+
+.fa-mobile-screen-button {
+ --fa: "\f3cd"; }
+
+.fa-mobile-alt {
+ --fa: "\f3cd"; }
+
+.fa-volume-high {
+ --fa: "\f028"; }
+
+.fa-volume-up {
+ --fa: "\f028"; }
+
+.fa-users-rays {
+ --fa: "\e593"; }
+
+.fa-wallet {
+ --fa: "\f555"; }
+
+.fa-clipboard-check {
+ --fa: "\f46c"; }
+
+.fa-file-audio {
+ --fa: "\f1c7"; }
+
+.fa-burger {
+ --fa: "\f805"; }
+
+.fa-hamburger {
+ --fa: "\f805"; }
+
+.fa-wrench {
+ --fa: "\f0ad"; }
+
+.fa-bugs {
+ --fa: "\e4d0"; }
+
+.fa-rupee-sign {
+ --fa: "\f156"; }
+
+.fa-rupee {
+ --fa: "\f156"; }
+
+.fa-file-image {
+ --fa: "\f1c5"; }
+
+.fa-circle-question {
+ --fa: "\f059"; }
+
+.fa-question-circle {
+ --fa: "\f059"; }
+
+.fa-plane-departure {
+ --fa: "\f5b0"; }
+
+.fa-handshake-slash {
+ --fa: "\e060"; }
+
+.fa-book-bookmark {
+ --fa: "\e0bb"; }
+
+.fa-code-branch {
+ --fa: "\f126"; }
+
+.fa-hat-cowboy {
+ --fa: "\f8c0"; }
+
+.fa-bridge {
+ --fa: "\e4c8"; }
+
+.fa-phone-flip {
+ --fa: "\f879"; }
+
+.fa-phone-alt {
+ --fa: "\f879"; }
+
+.fa-truck-front {
+ --fa: "\e2b7"; }
+
+.fa-cat {
+ --fa: "\f6be"; }
+
+.fa-anchor-circle-exclamation {
+ --fa: "\e4ab"; }
+
+.fa-truck-field {
+ --fa: "\e58d"; }
+
+.fa-route {
+ --fa: "\f4d7"; }
+
+.fa-clipboard-question {
+ --fa: "\e4e3"; }
+
+.fa-panorama {
+ --fa: "\e209"; }
+
+.fa-comment-medical {
+ --fa: "\f7f5"; }
+
+.fa-teeth-open {
+ --fa: "\f62f"; }
+
+.fa-file-circle-minus {
+ --fa: "\e4ed"; }
+
+.fa-tags {
+ --fa: "\f02c"; }
+
+.fa-wine-glass {
+ --fa: "\f4e3"; }
+
+.fa-forward-fast {
+ --fa: "\f050"; }
+
+.fa-fast-forward {
+ --fa: "\f050"; }
+
+.fa-face-meh-blank {
+ --fa: "\f5a4"; }
+
+.fa-meh-blank {
+ --fa: "\f5a4"; }
+
+.fa-square-parking {
+ --fa: "\f540"; }
+
+.fa-parking {
+ --fa: "\f540"; }
+
+.fa-house-signal {
+ --fa: "\e012"; }
+
+.fa-bars-progress {
+ --fa: "\f828"; }
+
+.fa-tasks-alt {
+ --fa: "\f828"; }
+
+.fa-faucet-drip {
+ --fa: "\e006"; }
+
+.fa-cart-flatbed {
+ --fa: "\f474"; }
+
+.fa-dolly-flatbed {
+ --fa: "\f474"; }
+
+.fa-ban-smoking {
+ --fa: "\f54d"; }
+
+.fa-smoking-ban {
+ --fa: "\f54d"; }
+
+.fa-terminal {
+ --fa: "\f120"; }
+
+.fa-mobile-button {
+ --fa: "\f10b"; }
+
+.fa-house-medical-flag {
+ --fa: "\e514"; }
+
+.fa-basket-shopping {
+ --fa: "\f291"; }
+
+.fa-shopping-basket {
+ --fa: "\f291"; }
+
+.fa-tape {
+ --fa: "\f4db"; }
+
+.fa-bus-simple {
+ --fa: "\f55e"; }
+
+.fa-bus-alt {
+ --fa: "\f55e"; }
+
+.fa-eye {
+ --fa: "\f06e"; }
+
+.fa-face-sad-cry {
+ --fa: "\f5b3"; }
+
+.fa-sad-cry {
+ --fa: "\f5b3"; }
+
+.fa-audio-description {
+ --fa: "\f29e"; }
+
+.fa-person-military-to-person {
+ --fa: "\e54c"; }
+
+.fa-file-shield {
+ --fa: "\e4f0"; }
+
+.fa-user-slash {
+ --fa: "\f506"; }
+
+.fa-pen {
+ --fa: "\f304"; }
+
+.fa-tower-observation {
+ --fa: "\e586"; }
+
+.fa-file-code {
+ --fa: "\f1c9"; }
+
+.fa-signal {
+ --fa: "\f012"; }
+
+.fa-signal-5 {
+ --fa: "\f012"; }
+
+.fa-signal-perfect {
+ --fa: "\f012"; }
+
+.fa-bus {
+ --fa: "\f207"; }
+
+.fa-heart-circle-xmark {
+ --fa: "\e501"; }
+
+.fa-house-chimney {
+ --fa: "\e3af"; }
+
+.fa-home-lg {
+ --fa: "\e3af"; }
+
+.fa-window-maximize {
+ --fa: "\f2d0"; }
+
+.fa-face-frown {
+ --fa: "\f119"; }
+
+.fa-frown {
+ --fa: "\f119"; }
+
+.fa-prescription {
+ --fa: "\f5b1"; }
+
+.fa-shop {
+ --fa: "\f54f"; }
+
+.fa-store-alt {
+ --fa: "\f54f"; }
+
+.fa-floppy-disk {
+ --fa: "\f0c7"; }
+
+.fa-save {
+ --fa: "\f0c7"; }
+
+.fa-vihara {
+ --fa: "\f6a7"; }
+
+.fa-scale-unbalanced {
+ --fa: "\f515"; }
+
+.fa-balance-scale-left {
+ --fa: "\f515"; }
+
+.fa-sort-up {
+ --fa: "\f0de"; }
+
+.fa-sort-asc {
+ --fa: "\f0de"; }
+
+.fa-comment-dots {
+ --fa: "\f4ad"; }
+
+.fa-commenting {
+ --fa: "\f4ad"; }
+
+.fa-plant-wilt {
+ --fa: "\e5aa"; }
+
+.fa-diamond {
+ --fa: "\f219"; }
+
+.fa-face-grin-squint {
+ --fa: "\f585"; }
+
+.fa-grin-squint {
+ --fa: "\f585"; }
+
+.fa-hand-holding-dollar {
+ --fa: "\f4c0"; }
+
+.fa-hand-holding-usd {
+ --fa: "\f4c0"; }
+
+.fa-chart-diagram {
+ --fa: "\e695"; }
+
+.fa-bacterium {
+ --fa: "\e05a"; }
+
+.fa-hand-pointer {
+ --fa: "\f25a"; }
+
+.fa-drum-steelpan {
+ --fa: "\f56a"; }
+
+.fa-hand-scissors {
+ --fa: "\f257"; }
+
+.fa-hands-praying {
+ --fa: "\f684"; }
+
+.fa-praying-hands {
+ --fa: "\f684"; }
+
+.fa-arrow-rotate-right {
+ --fa: "\f01e"; }
+
+.fa-arrow-right-rotate {
+ --fa: "\f01e"; }
+
+.fa-arrow-rotate-forward {
+ --fa: "\f01e"; }
+
+.fa-redo {
+ --fa: "\f01e"; }
+
+.fa-biohazard {
+ --fa: "\f780"; }
+
+.fa-location-crosshairs {
+ --fa: "\f601"; }
+
+.fa-location {
+ --fa: "\f601"; }
+
+.fa-mars-double {
+ --fa: "\f227"; }
+
+.fa-child-dress {
+ --fa: "\e59c"; }
+
+.fa-users-between-lines {
+ --fa: "\e591"; }
+
+.fa-lungs-virus {
+ --fa: "\e067"; }
+
+.fa-face-grin-tears {
+ --fa: "\f588"; }
+
+.fa-grin-tears {
+ --fa: "\f588"; }
+
+.fa-phone {
+ --fa: "\f095"; }
+
+.fa-calendar-xmark {
+ --fa: "\f273"; }
+
+.fa-calendar-times {
+ --fa: "\f273"; }
+
+.fa-child-reaching {
+ --fa: "\e59d"; }
+
+.fa-head-side-virus {
+ --fa: "\e064"; }
+
+.fa-user-gear {
+ --fa: "\f4fe"; }
+
+.fa-user-cog {
+ --fa: "\f4fe"; }
+
+.fa-arrow-up-1-9 {
+ --fa: "\f163"; }
+
+.fa-sort-numeric-up {
+ --fa: "\f163"; }
+
+.fa-door-closed {
+ --fa: "\f52a"; }
+
+.fa-shield-virus {
+ --fa: "\e06c"; }
+
+.fa-dice-six {
+ --fa: "\f526"; }
+
+.fa-mosquito-net {
+ --fa: "\e52c"; }
+
+.fa-file-fragment {
+ --fa: "\e697"; }
+
+.fa-bridge-water {
+ --fa: "\e4ce"; }
+
+.fa-person-booth {
+ --fa: "\f756"; }
+
+.fa-text-width {
+ --fa: "\f035"; }
+
+.fa-hat-wizard {
+ --fa: "\f6e8"; }
+
+.fa-pen-fancy {
+ --fa: "\f5ac"; }
+
+.fa-person-digging {
+ --fa: "\f85e"; }
+
+.fa-digging {
+ --fa: "\f85e"; }
+
+.fa-trash {
+ --fa: "\f1f8"; }
+
+.fa-gauge-simple {
+ --fa: "\f629"; }
+
+.fa-gauge-simple-med {
+ --fa: "\f629"; }
+
+.fa-tachometer-average {
+ --fa: "\f629"; }
+
+.fa-book-medical {
+ --fa: "\f7e6"; }
+
+.fa-poo {
+ --fa: "\f2fe"; }
+
+.fa-quote-right {
+ --fa: "\f10e"; }
+
+.fa-quote-right-alt {
+ --fa: "\f10e"; }
+
+.fa-shirt {
+ --fa: "\f553"; }
+
+.fa-t-shirt {
+ --fa: "\f553"; }
+
+.fa-tshirt {
+ --fa: "\f553"; }
+
+.fa-cubes {
+ --fa: "\f1b3"; }
+
+.fa-divide {
+ --fa: "\f529"; }
+
+.fa-tenge-sign {
+ --fa: "\f7d7"; }
+
+.fa-tenge {
+ --fa: "\f7d7"; }
+
+.fa-headphones {
+ --fa: "\f025"; }
+
+.fa-hands-holding {
+ --fa: "\f4c2"; }
+
+.fa-hands-clapping {
+ --fa: "\e1a8"; }
+
+.fa-republican {
+ --fa: "\f75e"; }
+
+.fa-arrow-left {
+ --fa: "\f060"; }
+
+.fa-person-circle-xmark {
+ --fa: "\e543"; }
+
+.fa-ruler {
+ --fa: "\f545"; }
+
+.fa-align-left {
+ --fa: "\f036"; }
+
+.fa-dice-d6 {
+ --fa: "\f6d1"; }
+
+.fa-restroom {
+ --fa: "\f7bd"; }
+
+.fa-j {
+ --fa: "\4a"; }
+
+.fa-users-viewfinder {
+ --fa: "\e595"; }
+
+.fa-file-video {
+ --fa: "\f1c8"; }
+
+.fa-up-right-from-square {
+ --fa: "\f35d"; }
+
+.fa-external-link-alt {
+ --fa: "\f35d"; }
+
+.fa-table-cells {
+ --fa: "\f00a"; }
+
+.fa-th {
+ --fa: "\f00a"; }
+
+.fa-file-pdf {
+ --fa: "\f1c1"; }
+
+.fa-book-bible {
+ --fa: "\f647"; }
+
+.fa-bible {
+ --fa: "\f647"; }
+
+.fa-o {
+ --fa: "\4f"; }
+
+.fa-suitcase-medical {
+ --fa: "\f0fa"; }
+
+.fa-medkit {
+ --fa: "\f0fa"; }
+
+.fa-user-secret {
+ --fa: "\f21b"; }
+
+.fa-otter {
+ --fa: "\f700"; }
+
+.fa-person-dress {
+ --fa: "\f182"; }
+
+.fa-female {
+ --fa: "\f182"; }
+
+.fa-comment-dollar {
+ --fa: "\f651"; }
+
+.fa-business-time {
+ --fa: "\f64a"; }
+
+.fa-briefcase-clock {
+ --fa: "\f64a"; }
+
+.fa-table-cells-large {
+ --fa: "\f009"; }
+
+.fa-th-large {
+ --fa: "\f009"; }
+
+.fa-book-tanakh {
+ --fa: "\f827"; }
+
+.fa-tanakh {
+ --fa: "\f827"; }
+
+.fa-phone-volume {
+ --fa: "\f2a0"; }
+
+.fa-volume-control-phone {
+ --fa: "\f2a0"; }
+
+.fa-hat-cowboy-side {
+ --fa: "\f8c1"; }
+
+.fa-clipboard-user {
+ --fa: "\f7f3"; }
+
+.fa-child {
+ --fa: "\f1ae"; }
+
+.fa-lira-sign {
+ --fa: "\f195"; }
+
+.fa-satellite {
+ --fa: "\f7bf"; }
+
+.fa-plane-lock {
+ --fa: "\e558"; }
+
+.fa-tag {
+ --fa: "\f02b"; }
+
+.fa-comment {
+ --fa: "\f075"; }
+
+.fa-cake-candles {
+ --fa: "\f1fd"; }
+
+.fa-birthday-cake {
+ --fa: "\f1fd"; }
+
+.fa-cake {
+ --fa: "\f1fd"; }
+
+.fa-envelope {
+ --fa: "\f0e0"; }
+
+.fa-angles-up {
+ --fa: "\f102"; }
+
+.fa-angle-double-up {
+ --fa: "\f102"; }
+
+.fa-paperclip {
+ --fa: "\f0c6"; }
+
+.fa-arrow-right-to-city {
+ --fa: "\e4b3"; }
+
+.fa-ribbon {
+ --fa: "\f4d6"; }
+
+.fa-lungs {
+ --fa: "\f604"; }
+
+.fa-arrow-up-9-1 {
+ --fa: "\f887"; }
+
+.fa-sort-numeric-up-alt {
+ --fa: "\f887"; }
+
+.fa-litecoin-sign {
+ --fa: "\e1d3"; }
+
+.fa-border-none {
+ --fa: "\f850"; }
+
+.fa-circle-nodes {
+ --fa: "\e4e2"; }
+
+.fa-parachute-box {
+ --fa: "\f4cd"; }
+
+.fa-indent {
+ --fa: "\f03c"; }
+
+.fa-truck-field-un {
+ --fa: "\e58e"; }
+
+.fa-hourglass {
+ --fa: "\f254"; }
+
+.fa-hourglass-empty {
+ --fa: "\f254"; }
+
+.fa-mountain {
+ --fa: "\f6fc"; }
+
+.fa-user-doctor {
+ --fa: "\f0f0"; }
+
+.fa-user-md {
+ --fa: "\f0f0"; }
+
+.fa-circle-info {
+ --fa: "\f05a"; }
+
+.fa-info-circle {
+ --fa: "\f05a"; }
+
+.fa-cloud-meatball {
+ --fa: "\f73b"; }
+
+.fa-camera {
+ --fa: "\f030"; }
+
+.fa-camera-alt {
+ --fa: "\f030"; }
+
+.fa-square-virus {
+ --fa: "\e578"; }
+
+.fa-meteor {
+ --fa: "\f753"; }
+
+.fa-car-on {
+ --fa: "\e4dd"; }
+
+.fa-sleigh {
+ --fa: "\f7cc"; }
+
+.fa-arrow-down-1-9 {
+ --fa: "\f162"; }
+
+.fa-sort-numeric-asc {
+ --fa: "\f162"; }
+
+.fa-sort-numeric-down {
+ --fa: "\f162"; }
+
+.fa-hand-holding-droplet {
+ --fa: "\f4c1"; }
+
+.fa-hand-holding-water {
+ --fa: "\f4c1"; }
+
+.fa-water {
+ --fa: "\f773"; }
+
+.fa-calendar-check {
+ --fa: "\f274"; }
+
+.fa-braille {
+ --fa: "\f2a1"; }
+
+.fa-prescription-bottle-medical {
+ --fa: "\f486"; }
+
+.fa-prescription-bottle-alt {
+ --fa: "\f486"; }
+
+.fa-landmark {
+ --fa: "\f66f"; }
+
+.fa-truck {
+ --fa: "\f0d1"; }
+
+.fa-crosshairs {
+ --fa: "\f05b"; }
+
+.fa-person-cane {
+ --fa: "\e53c"; }
+
+.fa-tent {
+ --fa: "\e57d"; }
+
+.fa-vest-patches {
+ --fa: "\e086"; }
+
+.fa-check-double {
+ --fa: "\f560"; }
+
+.fa-arrow-down-a-z {
+ --fa: "\f15d"; }
+
+.fa-sort-alpha-asc {
+ --fa: "\f15d"; }
+
+.fa-sort-alpha-down {
+ --fa: "\f15d"; }
+
+.fa-money-bill-wheat {
+ --fa: "\e52a"; }
+
+.fa-cookie {
+ --fa: "\f563"; }
+
+.fa-arrow-rotate-left {
+ --fa: "\f0e2"; }
+
+.fa-arrow-left-rotate {
+ --fa: "\f0e2"; }
+
+.fa-arrow-rotate-back {
+ --fa: "\f0e2"; }
+
+.fa-arrow-rotate-backward {
+ --fa: "\f0e2"; }
+
+.fa-undo {
+ --fa: "\f0e2"; }
+
+.fa-hard-drive {
+ --fa: "\f0a0"; }
+
+.fa-hdd {
+ --fa: "\f0a0"; }
+
+.fa-face-grin-squint-tears {
+ --fa: "\f586"; }
+
+.fa-grin-squint-tears {
+ --fa: "\f586"; }
+
+.fa-dumbbell {
+ --fa: "\f44b"; }
+
+.fa-rectangle-list {
+ --fa: "\f022"; }
+
+.fa-list-alt {
+ --fa: "\f022"; }
+
+.fa-tarp-droplet {
+ --fa: "\e57c"; }
+
+.fa-house-medical-circle-check {
+ --fa: "\e511"; }
+
+.fa-person-skiing-nordic {
+ --fa: "\f7ca"; }
+
+.fa-skiing-nordic {
+ --fa: "\f7ca"; }
+
+.fa-calendar-plus {
+ --fa: "\f271"; }
+
+.fa-plane-arrival {
+ --fa: "\f5af"; }
+
+.fa-circle-left {
+ --fa: "\f359"; }
+
+.fa-arrow-alt-circle-left {
+ --fa: "\f359"; }
+
+.fa-train-subway {
+ --fa: "\f239"; }
+
+.fa-subway {
+ --fa: "\f239"; }
+
+.fa-chart-gantt {
+ --fa: "\e0e4"; }
+
+.fa-indian-rupee-sign {
+ --fa: "\e1bc"; }
+
+.fa-indian-rupee {
+ --fa: "\e1bc"; }
+
+.fa-inr {
+ --fa: "\e1bc"; }
+
+.fa-crop-simple {
+ --fa: "\f565"; }
+
+.fa-crop-alt {
+ --fa: "\f565"; }
+
+.fa-money-bill-1 {
+ --fa: "\f3d1"; }
+
+.fa-money-bill-alt {
+ --fa: "\f3d1"; }
+
+.fa-left-long {
+ --fa: "\f30a"; }
+
+.fa-long-arrow-alt-left {
+ --fa: "\f30a"; }
+
+.fa-dna {
+ --fa: "\f471"; }
+
+.fa-virus-slash {
+ --fa: "\e075"; }
+
+.fa-minus {
+ --fa: "\f068"; }
+
+.fa-subtract {
+ --fa: "\f068"; }
+
+.fa-chess {
+ --fa: "\f439"; }
+
+.fa-arrow-left-long {
+ --fa: "\f177"; }
+
+.fa-long-arrow-left {
+ --fa: "\f177"; }
+
+.fa-plug-circle-check {
+ --fa: "\e55c"; }
+
+.fa-street-view {
+ --fa: "\f21d"; }
+
+.fa-franc-sign {
+ --fa: "\e18f"; }
+
+.fa-volume-off {
+ --fa: "\f026"; }
+
+.fa-hands-asl-interpreting {
+ --fa: "\f2a3"; }
+
+.fa-american-sign-language-interpreting {
+ --fa: "\f2a3"; }
+
+.fa-asl-interpreting {
+ --fa: "\f2a3"; }
+
+.fa-hands-american-sign-language-interpreting {
+ --fa: "\f2a3"; }
+
+.fa-gear {
+ --fa: "\f013"; }
+
+.fa-cog {
+ --fa: "\f013"; }
+
+.fa-droplet-slash {
+ --fa: "\f5c7"; }
+
+.fa-tint-slash {
+ --fa: "\f5c7"; }
+
+.fa-mosque {
+ --fa: "\f678"; }
+
+.fa-mosquito {
+ --fa: "\e52b"; }
+
+.fa-star-of-david {
+ --fa: "\f69a"; }
+
+.fa-person-military-rifle {
+ --fa: "\e54b"; }
+
+.fa-cart-shopping {
+ --fa: "\f07a"; }
+
+.fa-shopping-cart {
+ --fa: "\f07a"; }
+
+.fa-vials {
+ --fa: "\f493"; }
+
+.fa-plug-circle-plus {
+ --fa: "\e55f"; }
+
+.fa-place-of-worship {
+ --fa: "\f67f"; }
+
+.fa-grip-vertical {
+ --fa: "\f58e"; }
+
+.fa-hexagon-nodes {
+ --fa: "\e699"; }
+
+.fa-arrow-turn-up {
+ --fa: "\f148"; }
+
+.fa-level-up {
+ --fa: "\f148"; }
+
+.fa-u {
+ --fa: "\55"; }
+
+.fa-square-root-variable {
+ --fa: "\f698"; }
+
+.fa-square-root-alt {
+ --fa: "\f698"; }
+
+.fa-clock {
+ --fa: "\f017"; }
+
+.fa-clock-four {
+ --fa: "\f017"; }
+
+.fa-backward-step {
+ --fa: "\f048"; }
+
+.fa-step-backward {
+ --fa: "\f048"; }
+
+.fa-pallet {
+ --fa: "\f482"; }
+
+.fa-faucet {
+ --fa: "\e005"; }
+
+.fa-baseball-bat-ball {
+ --fa: "\f432"; }
+
+.fa-s {
+ --fa: "\53"; }
+
+.fa-timeline {
+ --fa: "\e29c"; }
+
+.fa-keyboard {
+ --fa: "\f11c"; }
+
+.fa-caret-down {
+ --fa: "\f0d7"; }
+
+.fa-house-chimney-medical {
+ --fa: "\f7f2"; }
+
+.fa-clinic-medical {
+ --fa: "\f7f2"; }
+
+.fa-temperature-three-quarters {
+ --fa: "\f2c8"; }
+
+.fa-temperature-3 {
+ --fa: "\f2c8"; }
+
+.fa-thermometer-3 {
+ --fa: "\f2c8"; }
+
+.fa-thermometer-three-quarters {
+ --fa: "\f2c8"; }
+
+.fa-mobile-screen {
+ --fa: "\f3cf"; }
+
+.fa-mobile-android-alt {
+ --fa: "\f3cf"; }
+
+.fa-plane-up {
+ --fa: "\e22d"; }
+
+.fa-piggy-bank {
+ --fa: "\f4d3"; }
+
+.fa-battery-half {
+ --fa: "\f242"; }
+
+.fa-battery-3 {
+ --fa: "\f242"; }
+
+.fa-mountain-city {
+ --fa: "\e52e"; }
+
+.fa-coins {
+ --fa: "\f51e"; }
+
+.fa-khanda {
+ --fa: "\f66d"; }
+
+.fa-sliders {
+ --fa: "\f1de"; }
+
+.fa-sliders-h {
+ --fa: "\f1de"; }
+
+.fa-folder-tree {
+ --fa: "\f802"; }
+
+.fa-network-wired {
+ --fa: "\f6ff"; }
+
+.fa-map-pin {
+ --fa: "\f276"; }
+
+.fa-hamsa {
+ --fa: "\f665"; }
+
+.fa-cent-sign {
+ --fa: "\e3f5"; }
+
+.fa-flask {
+ --fa: "\f0c3"; }
+
+.fa-person-pregnant {
+ --fa: "\e31e"; }
+
+.fa-wand-sparkles {
+ --fa: "\f72b"; }
+
+.fa-ellipsis-vertical {
+ --fa: "\f142"; }
+
+.fa-ellipsis-v {
+ --fa: "\f142"; }
+
+.fa-ticket {
+ --fa: "\f145"; }
+
+.fa-power-off {
+ --fa: "\f011"; }
+
+.fa-right-long {
+ --fa: "\f30b"; }
+
+.fa-long-arrow-alt-right {
+ --fa: "\f30b"; }
+
+.fa-flag-usa {
+ --fa: "\f74d"; }
+
+.fa-laptop-file {
+ --fa: "\e51d"; }
+
+.fa-tty {
+ --fa: "\f1e4"; }
+
+.fa-teletype {
+ --fa: "\f1e4"; }
+
+.fa-diagram-next {
+ --fa: "\e476"; }
+
+.fa-person-rifle {
+ --fa: "\e54e"; }
+
+.fa-house-medical-circle-exclamation {
+ --fa: "\e512"; }
+
+.fa-closed-captioning {
+ --fa: "\f20a"; }
+
+.fa-person-hiking {
+ --fa: "\f6ec"; }
+
+.fa-hiking {
+ --fa: "\f6ec"; }
+
+.fa-venus-double {
+ --fa: "\f226"; }
+
+.fa-images {
+ --fa: "\f302"; }
+
+.fa-calculator {
+ --fa: "\f1ec"; }
+
+.fa-people-pulling {
+ --fa: "\e535"; }
+
+.fa-n {
+ --fa: "\4e"; }
+
+.fa-cable-car {
+ --fa: "\f7da"; }
+
+.fa-tram {
+ --fa: "\f7da"; }
+
+.fa-cloud-rain {
+ --fa: "\f73d"; }
+
+.fa-building-circle-xmark {
+ --fa: "\e4d4"; }
+
+.fa-ship {
+ --fa: "\f21a"; }
+
+.fa-arrows-down-to-line {
+ --fa: "\e4b8"; }
+
+.fa-download {
+ --fa: "\f019"; }
+
+.fa-face-grin {
+ --fa: "\f580"; }
+
+.fa-grin {
+ --fa: "\f580"; }
+
+.fa-delete-left {
+ --fa: "\f55a"; }
+
+.fa-backspace {
+ --fa: "\f55a"; }
+
+.fa-eye-dropper {
+ --fa: "\f1fb"; }
+
+.fa-eye-dropper-empty {
+ --fa: "\f1fb"; }
+
+.fa-eyedropper {
+ --fa: "\f1fb"; }
+
+.fa-file-circle-check {
+ --fa: "\e5a0"; }
+
+.fa-forward {
+ --fa: "\f04e"; }
+
+.fa-mobile {
+ --fa: "\f3ce"; }
+
+.fa-mobile-android {
+ --fa: "\f3ce"; }
+
+.fa-mobile-phone {
+ --fa: "\f3ce"; }
+
+.fa-face-meh {
+ --fa: "\f11a"; }
+
+.fa-meh {
+ --fa: "\f11a"; }
+
+.fa-align-center {
+ --fa: "\f037"; }
+
+.fa-book-skull {
+ --fa: "\f6b7"; }
+
+.fa-book-dead {
+ --fa: "\f6b7"; }
+
+.fa-id-card {
+ --fa: "\f2c2"; }
+
+.fa-drivers-license {
+ --fa: "\f2c2"; }
+
+.fa-outdent {
+ --fa: "\f03b"; }
+
+.fa-dedent {
+ --fa: "\f03b"; }
+
+.fa-heart-circle-exclamation {
+ --fa: "\e4fe"; }
+
+.fa-house {
+ --fa: "\f015"; }
+
+.fa-home {
+ --fa: "\f015"; }
+
+.fa-home-alt {
+ --fa: "\f015"; }
+
+.fa-home-lg-alt {
+ --fa: "\f015"; }
+
+.fa-calendar-week {
+ --fa: "\f784"; }
+
+.fa-laptop-medical {
+ --fa: "\f812"; }
+
+.fa-b {
+ --fa: "\42"; }
+
+.fa-file-medical {
+ --fa: "\f477"; }
+
+.fa-dice-one {
+ --fa: "\f525"; }
+
+.fa-kiwi-bird {
+ --fa: "\f535"; }
+
+.fa-arrow-right-arrow-left {
+ --fa: "\f0ec"; }
+
+.fa-exchange {
+ --fa: "\f0ec"; }
+
+.fa-rotate-right {
+ --fa: "\f2f9"; }
+
+.fa-redo-alt {
+ --fa: "\f2f9"; }
+
+.fa-rotate-forward {
+ --fa: "\f2f9"; }
+
+.fa-utensils {
+ --fa: "\f2e7"; }
+
+.fa-cutlery {
+ --fa: "\f2e7"; }
+
+.fa-arrow-up-wide-short {
+ --fa: "\f161"; }
+
+.fa-sort-amount-up {
+ --fa: "\f161"; }
+
+.fa-mill-sign {
+ --fa: "\e1ed"; }
+
+.fa-bowl-rice {
+ --fa: "\e2eb"; }
+
+.fa-skull {
+ --fa: "\f54c"; }
+
+.fa-tower-broadcast {
+ --fa: "\f519"; }
+
+.fa-broadcast-tower {
+ --fa: "\f519"; }
+
+.fa-truck-pickup {
+ --fa: "\f63c"; }
+
+.fa-up-long {
+ --fa: "\f30c"; }
+
+.fa-long-arrow-alt-up {
+ --fa: "\f30c"; }
+
+.fa-stop {
+ --fa: "\f04d"; }
+
+.fa-code-merge {
+ --fa: "\f387"; }
+
+.fa-upload {
+ --fa: "\f093"; }
+
+.fa-hurricane {
+ --fa: "\f751"; }
+
+.fa-mound {
+ --fa: "\e52d"; }
+
+.fa-toilet-portable {
+ --fa: "\e583"; }
+
+.fa-compact-disc {
+ --fa: "\f51f"; }
+
+.fa-file-arrow-down {
+ --fa: "\f56d"; }
+
+.fa-file-download {
+ --fa: "\f56d"; }
+
+.fa-caravan {
+ --fa: "\f8ff"; }
+
+.fa-shield-cat {
+ --fa: "\e572"; }
+
+.fa-bolt {
+ --fa: "\f0e7"; }
+
+.fa-zap {
+ --fa: "\f0e7"; }
+
+.fa-glass-water {
+ --fa: "\e4f4"; }
+
+.fa-oil-well {
+ --fa: "\e532"; }
+
+.fa-vault {
+ --fa: "\e2c5"; }
+
+.fa-mars {
+ --fa: "\f222"; }
+
+.fa-toilet {
+ --fa: "\f7d8"; }
+
+.fa-plane-circle-xmark {
+ --fa: "\e557"; }
+
+.fa-yen-sign {
+ --fa: "\f157"; }
+
+.fa-cny {
+ --fa: "\f157"; }
+
+.fa-jpy {
+ --fa: "\f157"; }
+
+.fa-rmb {
+ --fa: "\f157"; }
+
+.fa-yen {
+ --fa: "\f157"; }
+
+.fa-ruble-sign {
+ --fa: "\f158"; }
+
+.fa-rouble {
+ --fa: "\f158"; }
+
+.fa-rub {
+ --fa: "\f158"; }
+
+.fa-ruble {
+ --fa: "\f158"; }
+
+.fa-sun {
+ --fa: "\f185"; }
+
+.fa-guitar {
+ --fa: "\f7a6"; }
+
+.fa-face-laugh-wink {
+ --fa: "\f59c"; }
+
+.fa-laugh-wink {
+ --fa: "\f59c"; }
+
+.fa-horse-head {
+ --fa: "\f7ab"; }
+
+.fa-bore-hole {
+ --fa: "\e4c3"; }
+
+.fa-industry {
+ --fa: "\f275"; }
+
+.fa-circle-down {
+ --fa: "\f358"; }
+
+.fa-arrow-alt-circle-down {
+ --fa: "\f358"; }
+
+.fa-arrows-turn-to-dots {
+ --fa: "\e4c1"; }
+
+.fa-florin-sign {
+ --fa: "\e184"; }
+
+.fa-arrow-down-short-wide {
+ --fa: "\f884"; }
+
+.fa-sort-amount-desc {
+ --fa: "\f884"; }
+
+.fa-sort-amount-down-alt {
+ --fa: "\f884"; }
+
+.fa-less-than {
+ --fa: "\3c"; }
+
+.fa-angle-down {
+ --fa: "\f107"; }
+
+.fa-car-tunnel {
+ --fa: "\e4de"; }
+
+.fa-head-side-cough {
+ --fa: "\e061"; }
+
+.fa-grip-lines {
+ --fa: "\f7a4"; }
+
+.fa-thumbs-down {
+ --fa: "\f165"; }
+
+.fa-user-lock {
+ --fa: "\f502"; }
+
+.fa-arrow-right-long {
+ --fa: "\f178"; }
+
+.fa-long-arrow-right {
+ --fa: "\f178"; }
+
+.fa-anchor-circle-xmark {
+ --fa: "\e4ac"; }
+
+.fa-ellipsis {
+ --fa: "\f141"; }
+
+.fa-ellipsis-h {
+ --fa: "\f141"; }
+
+.fa-chess-pawn {
+ --fa: "\f443"; }
+
+.fa-kit-medical {
+ --fa: "\f479"; }
+
+.fa-first-aid {
+ --fa: "\f479"; }
+
+.fa-person-through-window {
+ --fa: "\e5a9"; }
+
+.fa-toolbox {
+ --fa: "\f552"; }
+
+.fa-hands-holding-circle {
+ --fa: "\e4fb"; }
+
+.fa-bug {
+ --fa: "\f188"; }
+
+.fa-credit-card {
+ --fa: "\f09d"; }
+
+.fa-credit-card-alt {
+ --fa: "\f09d"; }
+
+.fa-car {
+ --fa: "\f1b9"; }
+
+.fa-automobile {
+ --fa: "\f1b9"; }
+
+.fa-hand-holding-hand {
+ --fa: "\e4f7"; }
+
+.fa-book-open-reader {
+ --fa: "\f5da"; }
+
+.fa-book-reader {
+ --fa: "\f5da"; }
+
+.fa-mountain-sun {
+ --fa: "\e52f"; }
+
+.fa-arrows-left-right-to-line {
+ --fa: "\e4ba"; }
+
+.fa-dice-d20 {
+ --fa: "\f6cf"; }
+
+.fa-truck-droplet {
+ --fa: "\e58c"; }
+
+.fa-file-circle-xmark {
+ --fa: "\e5a1"; }
+
+.fa-temperature-arrow-up {
+ --fa: "\e040"; }
+
+.fa-temperature-up {
+ --fa: "\e040"; }
+
+.fa-medal {
+ --fa: "\f5a2"; }
+
+.fa-bed {
+ --fa: "\f236"; }
+
+.fa-square-h {
+ --fa: "\f0fd"; }
+
+.fa-h-square {
+ --fa: "\f0fd"; }
+
+.fa-podcast {
+ --fa: "\f2ce"; }
+
+.fa-temperature-full {
+ --fa: "\f2c7"; }
+
+.fa-temperature-4 {
+ --fa: "\f2c7"; }
+
+.fa-thermometer-4 {
+ --fa: "\f2c7"; }
+
+.fa-thermometer-full {
+ --fa: "\f2c7"; }
+
+.fa-bell {
+ --fa: "\f0f3"; }
+
+.fa-superscript {
+ --fa: "\f12b"; }
+
+.fa-plug-circle-xmark {
+ --fa: "\e560"; }
+
+.fa-star-of-life {
+ --fa: "\f621"; }
+
+.fa-phone-slash {
+ --fa: "\f3dd"; }
+
+.fa-paint-roller {
+ --fa: "\f5aa"; }
+
+.fa-handshake-angle {
+ --fa: "\f4c4"; }
+
+.fa-hands-helping {
+ --fa: "\f4c4"; }
+
+.fa-location-dot {
+ --fa: "\f3c5"; }
+
+.fa-map-marker-alt {
+ --fa: "\f3c5"; }
+
+.fa-file {
+ --fa: "\f15b"; }
+
+.fa-greater-than {
+ --fa: "\3e"; }
+
+.fa-person-swimming {
+ --fa: "\f5c4"; }
+
+.fa-swimmer {
+ --fa: "\f5c4"; }
+
+.fa-arrow-down {
+ --fa: "\f063"; }
+
+.fa-droplet {
+ --fa: "\f043"; }
+
+.fa-tint {
+ --fa: "\f043"; }
+
+.fa-eraser {
+ --fa: "\f12d"; }
+
+.fa-earth-americas {
+ --fa: "\f57d"; }
+
+.fa-earth {
+ --fa: "\f57d"; }
+
+.fa-earth-america {
+ --fa: "\f57d"; }
+
+.fa-globe-americas {
+ --fa: "\f57d"; }
+
+.fa-person-burst {
+ --fa: "\e53b"; }
+
+.fa-dove {
+ --fa: "\f4ba"; }
+
+.fa-battery-empty {
+ --fa: "\f244"; }
+
+.fa-battery-0 {
+ --fa: "\f244"; }
+
+.fa-socks {
+ --fa: "\f696"; }
+
+.fa-inbox {
+ --fa: "\f01c"; }
+
+.fa-section {
+ --fa: "\e447"; }
+
+.fa-gauge-high {
+ --fa: "\f625"; }
+
+.fa-tachometer-alt {
+ --fa: "\f625"; }
+
+.fa-tachometer-alt-fast {
+ --fa: "\f625"; }
+
+.fa-envelope-open-text {
+ --fa: "\f658"; }
+
+.fa-hospital {
+ --fa: "\f0f8"; }
+
+.fa-hospital-alt {
+ --fa: "\f0f8"; }
+
+.fa-hospital-wide {
+ --fa: "\f0f8"; }
+
+.fa-wine-bottle {
+ --fa: "\f72f"; }
+
+.fa-chess-rook {
+ --fa: "\f447"; }
+
+.fa-bars-staggered {
+ --fa: "\f550"; }
+
+.fa-reorder {
+ --fa: "\f550"; }
+
+.fa-stream {
+ --fa: "\f550"; }
+
+.fa-dharmachakra {
+ --fa: "\f655"; }
+
+.fa-hotdog {
+ --fa: "\f80f"; }
+
+.fa-person-walking-with-cane {
+ --fa: "\f29d"; }
+
+.fa-blind {
+ --fa: "\f29d"; }
+
+.fa-drum {
+ --fa: "\f569"; }
+
+.fa-ice-cream {
+ --fa: "\f810"; }
+
+.fa-heart-circle-bolt {
+ --fa: "\e4fc"; }
+
+.fa-fax {
+ --fa: "\f1ac"; }
+
+.fa-paragraph {
+ --fa: "\f1dd"; }
+
+.fa-check-to-slot {
+ --fa: "\f772"; }
+
+.fa-vote-yea {
+ --fa: "\f772"; }
+
+.fa-star-half {
+ --fa: "\f089"; }
+
+.fa-boxes-stacked {
+ --fa: "\f468"; }
+
+.fa-boxes {
+ --fa: "\f468"; }
+
+.fa-boxes-alt {
+ --fa: "\f468"; }
+
+.fa-link {
+ --fa: "\f0c1"; }
+
+.fa-chain {
+ --fa: "\f0c1"; }
+
+.fa-ear-listen {
+ --fa: "\f2a2"; }
+
+.fa-assistive-listening-systems {
+ --fa: "\f2a2"; }
+
+.fa-tree-city {
+ --fa: "\e587"; }
+
+.fa-play {
+ --fa: "\f04b"; }
+
+.fa-font {
+ --fa: "\f031"; }
+
+.fa-table-cells-row-lock {
+ --fa: "\e67a"; }
+
+.fa-rupiah-sign {
+ --fa: "\e23d"; }
+
+.fa-magnifying-glass {
+ --fa: "\f002"; }
+
+.fa-search {
+ --fa: "\f002"; }
+
+.fa-table-tennis-paddle-ball {
+ --fa: "\f45d"; }
+
+.fa-ping-pong-paddle-ball {
+ --fa: "\f45d"; }
+
+.fa-table-tennis {
+ --fa: "\f45d"; }
+
+.fa-person-dots-from-line {
+ --fa: "\f470"; }
+
+.fa-diagnoses {
+ --fa: "\f470"; }
+
+.fa-trash-can-arrow-up {
+ --fa: "\f82a"; }
+
+.fa-trash-restore-alt {
+ --fa: "\f82a"; }
+
+.fa-naira-sign {
+ --fa: "\e1f6"; }
+
+.fa-cart-arrow-down {
+ --fa: "\f218"; }
+
+.fa-walkie-talkie {
+ --fa: "\f8ef"; }
+
+.fa-file-pen {
+ --fa: "\f31c"; }
+
+.fa-file-edit {
+ --fa: "\f31c"; }
+
+.fa-receipt {
+ --fa: "\f543"; }
+
+.fa-square-pen {
+ --fa: "\f14b"; }
+
+.fa-pen-square {
+ --fa: "\f14b"; }
+
+.fa-pencil-square {
+ --fa: "\f14b"; }
+
+.fa-suitcase-rolling {
+ --fa: "\f5c1"; }
+
+.fa-person-circle-exclamation {
+ --fa: "\e53f"; }
+
+.fa-chevron-down {
+ --fa: "\f078"; }
+
+.fa-battery-full {
+ --fa: "\f240"; }
+
+.fa-battery {
+ --fa: "\f240"; }
+
+.fa-battery-5 {
+ --fa: "\f240"; }
+
+.fa-skull-crossbones {
+ --fa: "\f714"; }
+
+.fa-code-compare {
+ --fa: "\e13a"; }
+
+.fa-list-ul {
+ --fa: "\f0ca"; }
+
+.fa-list-dots {
+ --fa: "\f0ca"; }
+
+.fa-school-lock {
+ --fa: "\e56f"; }
+
+.fa-tower-cell {
+ --fa: "\e585"; }
+
+.fa-down-long {
+ --fa: "\f309"; }
+
+.fa-long-arrow-alt-down {
+ --fa: "\f309"; }
+
+.fa-ranking-star {
+ --fa: "\e561"; }
+
+.fa-chess-king {
+ --fa: "\f43f"; }
+
+.fa-person-harassing {
+ --fa: "\e549"; }
+
+.fa-brazilian-real-sign {
+ --fa: "\e46c"; }
+
+.fa-landmark-dome {
+ --fa: "\f752"; }
+
+.fa-landmark-alt {
+ --fa: "\f752"; }
+
+.fa-arrow-up {
+ --fa: "\f062"; }
+
+.fa-tv {
+ --fa: "\f26c"; }
+
+.fa-television {
+ --fa: "\f26c"; }
+
+.fa-tv-alt {
+ --fa: "\f26c"; }
+
+.fa-shrimp {
+ --fa: "\e448"; }
+
+.fa-list-check {
+ --fa: "\f0ae"; }
+
+.fa-tasks {
+ --fa: "\f0ae"; }
+
+.fa-jug-detergent {
+ --fa: "\e519"; }
+
+.fa-circle-user {
+ --fa: "\f2bd"; }
+
+.fa-user-circle {
+ --fa: "\f2bd"; }
+
+.fa-user-shield {
+ --fa: "\f505"; }
+
+.fa-wind {
+ --fa: "\f72e"; }
+
+.fa-car-burst {
+ --fa: "\f5e1"; }
+
+.fa-car-crash {
+ --fa: "\f5e1"; }
+
+.fa-y {
+ --fa: "\59"; }
+
+.fa-person-snowboarding {
+ --fa: "\f7ce"; }
+
+.fa-snowboarding {
+ --fa: "\f7ce"; }
+
+.fa-truck-fast {
+ --fa: "\f48b"; }
+
+.fa-shipping-fast {
+ --fa: "\f48b"; }
+
+.fa-fish {
+ --fa: "\f578"; }
+
+.fa-user-graduate {
+ --fa: "\f501"; }
+
+.fa-circle-half-stroke {
+ --fa: "\f042"; }
+
+.fa-adjust {
+ --fa: "\f042"; }
+
+.fa-clapperboard {
+ --fa: "\e131"; }
+
+.fa-circle-radiation {
+ --fa: "\f7ba"; }
+
+.fa-radiation-alt {
+ --fa: "\f7ba"; }
+
+.fa-baseball {
+ --fa: "\f433"; }
+
+.fa-baseball-ball {
+ --fa: "\f433"; }
+
+.fa-jet-fighter-up {
+ --fa: "\e518"; }
+
+.fa-diagram-project {
+ --fa: "\f542"; }
+
+.fa-project-diagram {
+ --fa: "\f542"; }
+
+.fa-copy {
+ --fa: "\f0c5"; }
+
+.fa-volume-xmark {
+ --fa: "\f6a9"; }
+
+.fa-volume-mute {
+ --fa: "\f6a9"; }
+
+.fa-volume-times {
+ --fa: "\f6a9"; }
+
+.fa-hand-sparkles {
+ --fa: "\e05d"; }
+
+.fa-grip {
+ --fa: "\f58d"; }
+
+.fa-grip-horizontal {
+ --fa: "\f58d"; }
+
+.fa-share-from-square {
+ --fa: "\f14d"; }
+
+.fa-share-square {
+ --fa: "\f14d"; }
+
+.fa-child-combatant {
+ --fa: "\e4e0"; }
+
+.fa-child-rifle {
+ --fa: "\e4e0"; }
+
+.fa-gun {
+ --fa: "\e19b"; }
+
+.fa-square-phone {
+ --fa: "\f098"; }
+
+.fa-phone-square {
+ --fa: "\f098"; }
+
+.fa-plus {
+ --fa: "\2b"; }
+
+.fa-add {
+ --fa: "\2b"; }
+
+.fa-expand {
+ --fa: "\f065"; }
+
+.fa-computer {
+ --fa: "\e4e5"; }
+
+.fa-xmark {
+ --fa: "\f00d"; }
+
+.fa-close {
+ --fa: "\f00d"; }
+
+.fa-multiply {
+ --fa: "\f00d"; }
+
+.fa-remove {
+ --fa: "\f00d"; }
+
+.fa-times {
+ --fa: "\f00d"; }
+
+.fa-arrows-up-down-left-right {
+ --fa: "\f047"; }
+
+.fa-arrows {
+ --fa: "\f047"; }
+
+.fa-chalkboard-user {
+ --fa: "\f51c"; }
+
+.fa-chalkboard-teacher {
+ --fa: "\f51c"; }
+
+.fa-peso-sign {
+ --fa: "\e222"; }
+
+.fa-building-shield {
+ --fa: "\e4d8"; }
+
+.fa-baby {
+ --fa: "\f77c"; }
+
+.fa-users-line {
+ --fa: "\e592"; }
+
+.fa-quote-left {
+ --fa: "\f10d"; }
+
+.fa-quote-left-alt {
+ --fa: "\f10d"; }
+
+.fa-tractor {
+ --fa: "\f722"; }
+
+.fa-trash-arrow-up {
+ --fa: "\f829"; }
+
+.fa-trash-restore {
+ --fa: "\f829"; }
+
+.fa-arrow-down-up-lock {
+ --fa: "\e4b0"; }
+
+.fa-lines-leaning {
+ --fa: "\e51e"; }
+
+.fa-ruler-combined {
+ --fa: "\f546"; }
+
+.fa-copyright {
+ --fa: "\f1f9"; }
+
+.fa-equals {
+ --fa: "\3d"; }
+
+.fa-blender {
+ --fa: "\f517"; }
+
+.fa-teeth {
+ --fa: "\f62e"; }
+
+.fa-shekel-sign {
+ --fa: "\f20b"; }
+
+.fa-ils {
+ --fa: "\f20b"; }
+
+.fa-shekel {
+ --fa: "\f20b"; }
+
+.fa-sheqel {
+ --fa: "\f20b"; }
+
+.fa-sheqel-sign {
+ --fa: "\f20b"; }
+
+.fa-map {
+ --fa: "\f279"; }
+
+.fa-rocket {
+ --fa: "\f135"; }
+
+.fa-photo-film {
+ --fa: "\f87c"; }
+
+.fa-photo-video {
+ --fa: "\f87c"; }
+
+.fa-folder-minus {
+ --fa: "\f65d"; }
+
+.fa-hexagon-nodes-bolt {
+ --fa: "\e69a"; }
+
+.fa-store {
+ --fa: "\f54e"; }
+
+.fa-arrow-trend-up {
+ --fa: "\e098"; }
+
+.fa-plug-circle-minus {
+ --fa: "\e55e"; }
+
+.fa-sign-hanging {
+ --fa: "\f4d9"; }
+
+.fa-sign {
+ --fa: "\f4d9"; }
+
+.fa-bezier-curve {
+ --fa: "\f55b"; }
+
+.fa-bell-slash {
+ --fa: "\f1f6"; }
+
+.fa-tablet {
+ --fa: "\f3fb"; }
+
+.fa-tablet-android {
+ --fa: "\f3fb"; }
+
+.fa-school-flag {
+ --fa: "\e56e"; }
+
+.fa-fill {
+ --fa: "\f575"; }
+
+.fa-angle-up {
+ --fa: "\f106"; }
+
+.fa-drumstick-bite {
+ --fa: "\f6d7"; }
+
+.fa-holly-berry {
+ --fa: "\f7aa"; }
+
+.fa-chevron-left {
+ --fa: "\f053"; }
+
+.fa-bacteria {
+ --fa: "\e059"; }
+
+.fa-hand-lizard {
+ --fa: "\f258"; }
+
+.fa-notdef {
+ --fa: "\e1fe"; }
+
+.fa-disease {
+ --fa: "\f7fa"; }
+
+.fa-briefcase-medical {
+ --fa: "\f469"; }
+
+.fa-genderless {
+ --fa: "\f22d"; }
+
+.fa-chevron-right {
+ --fa: "\f054"; }
+
+.fa-retweet {
+ --fa: "\f079"; }
+
+.fa-car-rear {
+ --fa: "\f5de"; }
+
+.fa-car-alt {
+ --fa: "\f5de"; }
+
+.fa-pump-soap {
+ --fa: "\e06b"; }
+
+.fa-video-slash {
+ --fa: "\f4e2"; }
+
+.fa-battery-quarter {
+ --fa: "\f243"; }
+
+.fa-battery-2 {
+ --fa: "\f243"; }
+
+.fa-radio {
+ --fa: "\f8d7"; }
+
+.fa-baby-carriage {
+ --fa: "\f77d"; }
+
+.fa-carriage-baby {
+ --fa: "\f77d"; }
+
+.fa-traffic-light {
+ --fa: "\f637"; }
+
+.fa-thermometer {
+ --fa: "\f491"; }
+
+.fa-vr-cardboard {
+ --fa: "\f729"; }
+
+.fa-hand-middle-finger {
+ --fa: "\f806"; }
+
+.fa-percent {
+ --fa: "\25"; }
+
+.fa-percentage {
+ --fa: "\25"; }
+
+.fa-truck-moving {
+ --fa: "\f4df"; }
+
+.fa-glass-water-droplet {
+ --fa: "\e4f5"; }
+
+.fa-display {
+ --fa: "\e163"; }
+
+.fa-face-smile {
+ --fa: "\f118"; }
+
+.fa-smile {
+ --fa: "\f118"; }
+
+.fa-thumbtack {
+ --fa: "\f08d"; }
+
+.fa-thumb-tack {
+ --fa: "\f08d"; }
+
+.fa-trophy {
+ --fa: "\f091"; }
+
+.fa-person-praying {
+ --fa: "\f683"; }
+
+.fa-pray {
+ --fa: "\f683"; }
+
+.fa-hammer {
+ --fa: "\f6e3"; }
+
+.fa-hand-peace {
+ --fa: "\f25b"; }
+
+.fa-rotate {
+ --fa: "\f2f1"; }
+
+.fa-sync-alt {
+ --fa: "\f2f1"; }
+
+.fa-spinner {
+ --fa: "\f110"; }
+
+.fa-robot {
+ --fa: "\f544"; }
+
+.fa-peace {
+ --fa: "\f67c"; }
+
+.fa-gears {
+ --fa: "\f085"; }
+
+.fa-cogs {
+ --fa: "\f085"; }
+
+.fa-warehouse {
+ --fa: "\f494"; }
+
+.fa-arrow-up-right-dots {
+ --fa: "\e4b7"; }
+
+.fa-splotch {
+ --fa: "\f5bc"; }
+
+.fa-face-grin-hearts {
+ --fa: "\f584"; }
+
+.fa-grin-hearts {
+ --fa: "\f584"; }
+
+.fa-dice-four {
+ --fa: "\f524"; }
+
+.fa-sim-card {
+ --fa: "\f7c4"; }
+
+.fa-transgender {
+ --fa: "\f225"; }
+
+.fa-transgender-alt {
+ --fa: "\f225"; }
+
+.fa-mercury {
+ --fa: "\f223"; }
+
+.fa-arrow-turn-down {
+ --fa: "\f149"; }
+
+.fa-level-down {
+ --fa: "\f149"; }
+
+.fa-person-falling-burst {
+ --fa: "\e547"; }
+
+.fa-award {
+ --fa: "\f559"; }
+
+.fa-ticket-simple {
+ --fa: "\f3ff"; }
+
+.fa-ticket-alt {
+ --fa: "\f3ff"; }
+
+.fa-building {
+ --fa: "\f1ad"; }
+
+.fa-angles-left {
+ --fa: "\f100"; }
+
+.fa-angle-double-left {
+ --fa: "\f100"; }
+
+.fa-qrcode {
+ --fa: "\f029"; }
+
+.fa-clock-rotate-left {
+ --fa: "\f1da"; }
+
+.fa-history {
+ --fa: "\f1da"; }
+
+.fa-face-grin-beam-sweat {
+ --fa: "\f583"; }
+
+.fa-grin-beam-sweat {
+ --fa: "\f583"; }
+
+.fa-file-export {
+ --fa: "\f56e"; }
+
+.fa-arrow-right-from-file {
+ --fa: "\f56e"; }
+
+.fa-shield {
+ --fa: "\f132"; }
+
+.fa-shield-blank {
+ --fa: "\f132"; }
+
+.fa-arrow-up-short-wide {
+ --fa: "\f885"; }
+
+.fa-sort-amount-up-alt {
+ --fa: "\f885"; }
+
+.fa-comment-nodes {
+ --fa: "\e696"; }
+
+.fa-house-medical {
+ --fa: "\e3b2"; }
+
+.fa-golf-ball-tee {
+ --fa: "\f450"; }
+
+.fa-golf-ball {
+ --fa: "\f450"; }
+
+.fa-circle-chevron-left {
+ --fa: "\f137"; }
+
+.fa-chevron-circle-left {
+ --fa: "\f137"; }
+
+.fa-house-chimney-window {
+ --fa: "\e00d"; }
+
+.fa-pen-nib {
+ --fa: "\f5ad"; }
+
+.fa-tent-arrow-turn-left {
+ --fa: "\e580"; }
+
+.fa-tents {
+ --fa: "\e582"; }
+
+.fa-wand-magic {
+ --fa: "\f0d0"; }
+
+.fa-magic {
+ --fa: "\f0d0"; }
+
+.fa-dog {
+ --fa: "\f6d3"; }
+
+.fa-carrot {
+ --fa: "\f787"; }
+
+.fa-moon {
+ --fa: "\f186"; }
+
+.fa-wine-glass-empty {
+ --fa: "\f5ce"; }
+
+.fa-wine-glass-alt {
+ --fa: "\f5ce"; }
+
+.fa-cheese {
+ --fa: "\f7ef"; }
+
+.fa-yin-yang {
+ --fa: "\f6ad"; }
+
+.fa-music {
+ --fa: "\f001"; }
+
+.fa-code-commit {
+ --fa: "\f386"; }
+
+.fa-temperature-low {
+ --fa: "\f76b"; }
+
+.fa-person-biking {
+ --fa: "\f84a"; }
+
+.fa-biking {
+ --fa: "\f84a"; }
+
+.fa-broom {
+ --fa: "\f51a"; }
+
+.fa-shield-heart {
+ --fa: "\e574"; }
+
+.fa-gopuram {
+ --fa: "\f664"; }
+
+.fa-earth-oceania {
+ --fa: "\e47b"; }
+
+.fa-globe-oceania {
+ --fa: "\e47b"; }
+
+.fa-square-xmark {
+ --fa: "\f2d3"; }
+
+.fa-times-square {
+ --fa: "\f2d3"; }
+
+.fa-xmark-square {
+ --fa: "\f2d3"; }
+
+.fa-hashtag {
+ --fa: "\23"; }
+
+.fa-up-right-and-down-left-from-center {
+ --fa: "\f424"; }
+
+.fa-expand-alt {
+ --fa: "\f424"; }
+
+.fa-oil-can {
+ --fa: "\f613"; }
+
+.fa-t {
+ --fa: "\54"; }
+
+.fa-hippo {
+ --fa: "\f6ed"; }
+
+.fa-chart-column {
+ --fa: "\e0e3"; }
+
+.fa-infinity {
+ --fa: "\f534"; }
+
+.fa-vial-circle-check {
+ --fa: "\e596"; }
+
+.fa-person-arrow-down-to-line {
+ --fa: "\e538"; }
+
+.fa-voicemail {
+ --fa: "\f897"; }
+
+.fa-fan {
+ --fa: "\f863"; }
+
+.fa-person-walking-luggage {
+ --fa: "\e554"; }
+
+.fa-up-down {
+ --fa: "\f338"; }
+
+.fa-arrows-alt-v {
+ --fa: "\f338"; }
+
+.fa-cloud-moon-rain {
+ --fa: "\f73c"; }
+
+.fa-calendar {
+ --fa: "\f133"; }
+
+.fa-trailer {
+ --fa: "\e041"; }
+
+.fa-bahai {
+ --fa: "\f666"; }
+
+.fa-haykal {
+ --fa: "\f666"; }
+
+.fa-sd-card {
+ --fa: "\f7c2"; }
+
+.fa-dragon {
+ --fa: "\f6d5"; }
+
+.fa-shoe-prints {
+ --fa: "\f54b"; }
+
+.fa-circle-plus {
+ --fa: "\f055"; }
+
+.fa-plus-circle {
+ --fa: "\f055"; }
+
+.fa-face-grin-tongue-wink {
+ --fa: "\f58b"; }
+
+.fa-grin-tongue-wink {
+ --fa: "\f58b"; }
+
+.fa-hand-holding {
+ --fa: "\f4bd"; }
+
+.fa-plug-circle-exclamation {
+ --fa: "\e55d"; }
+
+.fa-link-slash {
+ --fa: "\f127"; }
+
+.fa-chain-broken {
+ --fa: "\f127"; }
+
+.fa-chain-slash {
+ --fa: "\f127"; }
+
+.fa-unlink {
+ --fa: "\f127"; }
+
+.fa-clone {
+ --fa: "\f24d"; }
+
+.fa-person-walking-arrow-loop-left {
+ --fa: "\e551"; }
+
+.fa-arrow-up-z-a {
+ --fa: "\f882"; }
+
+.fa-sort-alpha-up-alt {
+ --fa: "\f882"; }
+
+.fa-fire-flame-curved {
+ --fa: "\f7e4"; }
+
+.fa-fire-alt {
+ --fa: "\f7e4"; }
+
+.fa-tornado {
+ --fa: "\f76f"; }
+
+.fa-file-circle-plus {
+ --fa: "\e494"; }
+
+.fa-book-quran {
+ --fa: "\f687"; }
+
+.fa-quran {
+ --fa: "\f687"; }
+
+.fa-anchor {
+ --fa: "\f13d"; }
+
+.fa-border-all {
+ --fa: "\f84c"; }
+
+.fa-face-angry {
+ --fa: "\f556"; }
+
+.fa-angry {
+ --fa: "\f556"; }
+
+.fa-cookie-bite {
+ --fa: "\f564"; }
+
+.fa-arrow-trend-down {
+ --fa: "\e097"; }
+
+.fa-rss {
+ --fa: "\f09e"; }
+
+.fa-feed {
+ --fa: "\f09e"; }
+
+.fa-draw-polygon {
+ --fa: "\f5ee"; }
+
+.fa-scale-balanced {
+ --fa: "\f24e"; }
+
+.fa-balance-scale {
+ --fa: "\f24e"; }
+
+.fa-gauge-simple-high {
+ --fa: "\f62a"; }
+
+.fa-tachometer {
+ --fa: "\f62a"; }
+
+.fa-tachometer-fast {
+ --fa: "\f62a"; }
+
+.fa-shower {
+ --fa: "\f2cc"; }
+
+.fa-desktop {
+ --fa: "\f390"; }
+
+.fa-desktop-alt {
+ --fa: "\f390"; }
+
+.fa-m {
+ --fa: "\4d"; }
+
+.fa-table-list {
+ --fa: "\f00b"; }
+
+.fa-th-list {
+ --fa: "\f00b"; }
+
+.fa-comment-sms {
+ --fa: "\f7cd"; }
+
+.fa-sms {
+ --fa: "\f7cd"; }
+
+.fa-book {
+ --fa: "\f02d"; }
+
+.fa-user-plus {
+ --fa: "\f234"; }
+
+.fa-check {
+ --fa: "\f00c"; }
+
+.fa-battery-three-quarters {
+ --fa: "\f241"; }
+
+.fa-battery-4 {
+ --fa: "\f241"; }
+
+.fa-house-circle-check {
+ --fa: "\e509"; }
+
+.fa-angle-left {
+ --fa: "\f104"; }
+
+.fa-diagram-successor {
+ --fa: "\e47a"; }
+
+.fa-truck-arrow-right {
+ --fa: "\e58b"; }
+
+.fa-arrows-split-up-and-left {
+ --fa: "\e4bc"; }
+
+.fa-hand-fist {
+ --fa: "\f6de"; }
+
+.fa-fist-raised {
+ --fa: "\f6de"; }
+
+.fa-cloud-moon {
+ --fa: "\f6c3"; }
+
+.fa-briefcase {
+ --fa: "\f0b1"; }
+
+.fa-person-falling {
+ --fa: "\e546"; }
+
+.fa-image-portrait {
+ --fa: "\f3e0"; }
+
+.fa-portrait {
+ --fa: "\f3e0"; }
+
+.fa-user-tag {
+ --fa: "\f507"; }
+
+.fa-rug {
+ --fa: "\e569"; }
+
+.fa-earth-europe {
+ --fa: "\f7a2"; }
+
+.fa-globe-europe {
+ --fa: "\f7a2"; }
+
+.fa-cart-flatbed-suitcase {
+ --fa: "\f59d"; }
+
+.fa-luggage-cart {
+ --fa: "\f59d"; }
+
+.fa-rectangle-xmark {
+ --fa: "\f410"; }
+
+.fa-rectangle-times {
+ --fa: "\f410"; }
+
+.fa-times-rectangle {
+ --fa: "\f410"; }
+
+.fa-window-close {
+ --fa: "\f410"; }
+
+.fa-baht-sign {
+ --fa: "\e0ac"; }
+
+.fa-book-open {
+ --fa: "\f518"; }
+
+.fa-book-journal-whills {
+ --fa: "\f66a"; }
+
+.fa-journal-whills {
+ --fa: "\f66a"; }
+
+.fa-handcuffs {
+ --fa: "\e4f8"; }
+
+.fa-triangle-exclamation {
+ --fa: "\f071"; }
+
+.fa-exclamation-triangle {
+ --fa: "\f071"; }
+
+.fa-warning {
+ --fa: "\f071"; }
+
+.fa-database {
+ --fa: "\f1c0"; }
+
+.fa-share {
+ --fa: "\f064"; }
+
+.fa-mail-forward {
+ --fa: "\f064"; }
+
+.fa-bottle-droplet {
+ --fa: "\e4c4"; }
+
+.fa-mask-face {
+ --fa: "\e1d7"; }
+
+.fa-hill-rockslide {
+ --fa: "\e508"; }
+
+.fa-right-left {
+ --fa: "\f362"; }
+
+.fa-exchange-alt {
+ --fa: "\f362"; }
+
+.fa-paper-plane {
+ --fa: "\f1d8"; }
+
+.fa-road-circle-exclamation {
+ --fa: "\e565"; }
+
+.fa-dungeon {
+ --fa: "\f6d9"; }
+
+.fa-align-right {
+ --fa: "\f038"; }
+
+.fa-money-bill-1-wave {
+ --fa: "\f53b"; }
+
+.fa-money-bill-wave-alt {
+ --fa: "\f53b"; }
+
+.fa-life-ring {
+ --fa: "\f1cd"; }
+
+.fa-hands {
+ --fa: "\f2a7"; }
+
+.fa-sign-language {
+ --fa: "\f2a7"; }
+
+.fa-signing {
+ --fa: "\f2a7"; }
+
+.fa-calendar-day {
+ --fa: "\f783"; }
+
+.fa-water-ladder {
+ --fa: "\f5c5"; }
+
+.fa-ladder-water {
+ --fa: "\f5c5"; }
+
+.fa-swimming-pool {
+ --fa: "\f5c5"; }
+
+.fa-arrows-up-down {
+ --fa: "\f07d"; }
+
+.fa-arrows-v {
+ --fa: "\f07d"; }
+
+.fa-face-grimace {
+ --fa: "\f57f"; }
+
+.fa-grimace {
+ --fa: "\f57f"; }
+
+.fa-wheelchair-move {
+ --fa: "\e2ce"; }
+
+.fa-wheelchair-alt {
+ --fa: "\e2ce"; }
+
+.fa-turn-down {
+ --fa: "\f3be"; }
+
+.fa-level-down-alt {
+ --fa: "\f3be"; }
+
+.fa-person-walking-arrow-right {
+ --fa: "\e552"; }
+
+.fa-square-envelope {
+ --fa: "\f199"; }
+
+.fa-envelope-square {
+ --fa: "\f199"; }
+
+.fa-dice {
+ --fa: "\f522"; }
+
+.fa-bowling-ball {
+ --fa: "\f436"; }
+
+.fa-brain {
+ --fa: "\f5dc"; }
+
+.fa-bandage {
+ --fa: "\f462"; }
+
+.fa-band-aid {
+ --fa: "\f462"; }
+
+.fa-calendar-minus {
+ --fa: "\f272"; }
+
+.fa-circle-xmark {
+ --fa: "\f057"; }
+
+.fa-times-circle {
+ --fa: "\f057"; }
+
+.fa-xmark-circle {
+ --fa: "\f057"; }
+
+.fa-gifts {
+ --fa: "\f79c"; }
+
+.fa-hotel {
+ --fa: "\f594"; }
+
+.fa-earth-asia {
+ --fa: "\f57e"; }
+
+.fa-globe-asia {
+ --fa: "\f57e"; }
+
+.fa-id-card-clip {
+ --fa: "\f47f"; }
+
+.fa-id-card-alt {
+ --fa: "\f47f"; }
+
+.fa-magnifying-glass-plus {
+ --fa: "\f00e"; }
+
+.fa-search-plus {
+ --fa: "\f00e"; }
+
+.fa-thumbs-up {
+ --fa: "\f164"; }
+
+.fa-user-clock {
+ --fa: "\f4fd"; }
+
+.fa-hand-dots {
+ --fa: "\f461"; }
+
+.fa-allergies {
+ --fa: "\f461"; }
+
+.fa-file-invoice {
+ --fa: "\f570"; }
+
+.fa-window-minimize {
+ --fa: "\f2d1"; }
+
+.fa-mug-saucer {
+ --fa: "\f0f4"; }
+
+.fa-coffee {
+ --fa: "\f0f4"; }
+
+.fa-brush {
+ --fa: "\f55d"; }
+
+.fa-file-half-dashed {
+ --fa: "\e698"; }
+
+.fa-mask {
+ --fa: "\f6fa"; }
+
+.fa-magnifying-glass-minus {
+ --fa: "\f010"; }
+
+.fa-search-minus {
+ --fa: "\f010"; }
+
+.fa-ruler-vertical {
+ --fa: "\f548"; }
+
+.fa-user-large {
+ --fa: "\f406"; }
+
+.fa-user-alt {
+ --fa: "\f406"; }
+
+.fa-train-tram {
+ --fa: "\e5b4"; }
+
+.fa-user-nurse {
+ --fa: "\f82f"; }
+
+.fa-syringe {
+ --fa: "\f48e"; }
+
+.fa-cloud-sun {
+ --fa: "\f6c4"; }
+
+.fa-stopwatch-20 {
+ --fa: "\e06f"; }
+
+.fa-square-full {
+ --fa: "\f45c"; }
+
+.fa-magnet {
+ --fa: "\f076"; }
+
+.fa-jar {
+ --fa: "\e516"; }
+
+.fa-note-sticky {
+ --fa: "\f249"; }
+
+.fa-sticky-note {
+ --fa: "\f249"; }
+
+.fa-bug-slash {
+ --fa: "\e490"; }
+
+.fa-arrow-up-from-water-pump {
+ --fa: "\e4b6"; }
+
+.fa-bone {
+ --fa: "\f5d7"; }
+
+.fa-table-cells-row-unlock {
+ --fa: "\e691"; }
+
+.fa-user-injured {
+ --fa: "\f728"; }
+
+.fa-face-sad-tear {
+ --fa: "\f5b4"; }
+
+.fa-sad-tear {
+ --fa: "\f5b4"; }
+
+.fa-plane {
+ --fa: "\f072"; }
+
+.fa-tent-arrows-down {
+ --fa: "\e581"; }
+
+.fa-exclamation {
+ --fa: "\21"; }
+
+.fa-arrows-spin {
+ --fa: "\e4bb"; }
+
+.fa-print {
+ --fa: "\f02f"; }
+
+.fa-turkish-lira-sign {
+ --fa: "\e2bb"; }
+
+.fa-try {
+ --fa: "\e2bb"; }
+
+.fa-turkish-lira {
+ --fa: "\e2bb"; }
+
+.fa-dollar-sign {
+ --fa: "\24"; }
+
+.fa-dollar {
+ --fa: "\24"; }
+
+.fa-usd {
+ --fa: "\24"; }
+
+.fa-x {
+ --fa: "\58"; }
+
+.fa-magnifying-glass-dollar {
+ --fa: "\f688"; }
+
+.fa-search-dollar {
+ --fa: "\f688"; }
+
+.fa-users-gear {
+ --fa: "\f509"; }
+
+.fa-users-cog {
+ --fa: "\f509"; }
+
+.fa-person-military-pointing {
+ --fa: "\e54a"; }
+
+.fa-building-columns {
+ --fa: "\f19c"; }
+
+.fa-bank {
+ --fa: "\f19c"; }
+
+.fa-institution {
+ --fa: "\f19c"; }
+
+.fa-museum {
+ --fa: "\f19c"; }
+
+.fa-university {
+ --fa: "\f19c"; }
+
+.fa-umbrella {
+ --fa: "\f0e9"; }
+
+.fa-trowel {
+ --fa: "\e589"; }
+
+.fa-d {
+ --fa: "\44"; }
+
+.fa-stapler {
+ --fa: "\e5af"; }
+
+.fa-masks-theater {
+ --fa: "\f630"; }
+
+.fa-theater-masks {
+ --fa: "\f630"; }
+
+.fa-kip-sign {
+ --fa: "\e1c4"; }
+
+.fa-hand-point-left {
+ --fa: "\f0a5"; }
+
+.fa-handshake-simple {
+ --fa: "\f4c6"; }
+
+.fa-handshake-alt {
+ --fa: "\f4c6"; }
+
+.fa-jet-fighter {
+ --fa: "\f0fb"; }
+
+.fa-fighter-jet {
+ --fa: "\f0fb"; }
+
+.fa-square-share-nodes {
+ --fa: "\f1e1"; }
+
+.fa-share-alt-square {
+ --fa: "\f1e1"; }
+
+.fa-barcode {
+ --fa: "\f02a"; }
+
+.fa-plus-minus {
+ --fa: "\e43c"; }
+
+.fa-video {
+ --fa: "\f03d"; }
+
+.fa-video-camera {
+ --fa: "\f03d"; }
+
+.fa-graduation-cap {
+ --fa: "\f19d"; }
+
+.fa-mortar-board {
+ --fa: "\f19d"; }
+
+.fa-hand-holding-medical {
+ --fa: "\e05c"; }
+
+.fa-person-circle-check {
+ --fa: "\e53e"; }
+
+.fa-turn-up {
+ --fa: "\f3bf"; }
+
+.fa-level-up-alt {
+ --fa: "\f3bf"; }
+
+.sr-only,
+.fa-sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0; }
+
+.sr-only-focusable:not(:focus),
+.fa-sr-only-focusable:not(:focus) {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0; }
+:root, :host {
+ --fa-style-family-brands: 'Font Awesome 6 Brands';
+ --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; }
+
+@font-face {
+ font-family: 'Font Awesome 6 Brands';
+ font-style: normal;
+ font-weight: 400;
+ font-display: block;
+ src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
+
+.fab,
+.fa-brands {
+ font-weight: 400; }
+
+.fa-monero {
+ --fa: "\f3d0"; }
+
+.fa-hooli {
+ --fa: "\f427"; }
+
+.fa-yelp {
+ --fa: "\f1e9"; }
+
+.fa-cc-visa {
+ --fa: "\f1f0"; }
+
+.fa-lastfm {
+ --fa: "\f202"; }
+
+.fa-shopware {
+ --fa: "\f5b5"; }
+
+.fa-creative-commons-nc {
+ --fa: "\f4e8"; }
+
+.fa-aws {
+ --fa: "\f375"; }
+
+.fa-redhat {
+ --fa: "\f7bc"; }
+
+.fa-yoast {
+ --fa: "\f2b1"; }
+
+.fa-cloudflare {
+ --fa: "\e07d"; }
+
+.fa-ups {
+ --fa: "\f7e0"; }
+
+.fa-pixiv {
+ --fa: "\e640"; }
+
+.fa-wpexplorer {
+ --fa: "\f2de"; }
+
+.fa-dyalog {
+ --fa: "\f399"; }
+
+.fa-bity {
+ --fa: "\f37a"; }
+
+.fa-stackpath {
+ --fa: "\f842"; }
+
+.fa-buysellads {
+ --fa: "\f20d"; }
+
+.fa-first-order {
+ --fa: "\f2b0"; }
+
+.fa-modx {
+ --fa: "\f285"; }
+
+.fa-guilded {
+ --fa: "\e07e"; }
+
+.fa-vnv {
+ --fa: "\f40b"; }
+
+.fa-square-js {
+ --fa: "\f3b9"; }
+
+.fa-js-square {
+ --fa: "\f3b9"; }
+
+.fa-microsoft {
+ --fa: "\f3ca"; }
+
+.fa-qq {
+ --fa: "\f1d6"; }
+
+.fa-orcid {
+ --fa: "\f8d2"; }
+
+.fa-java {
+ --fa: "\f4e4"; }
+
+.fa-invision {
+ --fa: "\f7b0"; }
+
+.fa-creative-commons-pd-alt {
+ --fa: "\f4ed"; }
+
+.fa-centercode {
+ --fa: "\f380"; }
+
+.fa-glide-g {
+ --fa: "\f2a6"; }
+
+.fa-drupal {
+ --fa: "\f1a9"; }
+
+.fa-jxl {
+ --fa: "\e67b"; }
+
+.fa-dart-lang {
+ --fa: "\e693"; }
+
+.fa-hire-a-helper {
+ --fa: "\f3b0"; }
+
+.fa-creative-commons-by {
+ --fa: "\f4e7"; }
+
+.fa-unity {
+ --fa: "\e049"; }
+
+.fa-whmcs {
+ --fa: "\f40d"; }
+
+.fa-rocketchat {
+ --fa: "\f3e8"; }
+
+.fa-vk {
+ --fa: "\f189"; }
+
+.fa-untappd {
+ --fa: "\f405"; }
+
+.fa-mailchimp {
+ --fa: "\f59e"; }
+
+.fa-css3-alt {
+ --fa: "\f38b"; }
+
+.fa-square-reddit {
+ --fa: "\f1a2"; }
+
+.fa-reddit-square {
+ --fa: "\f1a2"; }
+
+.fa-vimeo-v {
+ --fa: "\f27d"; }
+
+.fa-contao {
+ --fa: "\f26d"; }
+
+.fa-square-font-awesome {
+ --fa: "\e5ad"; }
+
+.fa-deskpro {
+ --fa: "\f38f"; }
+
+.fa-brave {
+ --fa: "\e63c"; }
+
+.fa-sistrix {
+ --fa: "\f3ee"; }
+
+.fa-square-instagram {
+ --fa: "\e055"; }
+
+.fa-instagram-square {
+ --fa: "\e055"; }
+
+.fa-battle-net {
+ --fa: "\f835"; }
+
+.fa-the-red-yeti {
+ --fa: "\f69d"; }
+
+.fa-square-hacker-news {
+ --fa: "\f3af"; }
+
+.fa-hacker-news-square {
+ --fa: "\f3af"; }
+
+.fa-edge {
+ --fa: "\f282"; }
+
+.fa-threads {
+ --fa: "\e618"; }
+
+.fa-napster {
+ --fa: "\f3d2"; }
+
+.fa-square-snapchat {
+ --fa: "\f2ad"; }
+
+.fa-snapchat-square {
+ --fa: "\f2ad"; }
+
+.fa-google-plus-g {
+ --fa: "\f0d5"; }
+
+.fa-artstation {
+ --fa: "\f77a"; }
+
+.fa-markdown {
+ --fa: "\f60f"; }
+
+.fa-sourcetree {
+ --fa: "\f7d3"; }
+
+.fa-google-plus {
+ --fa: "\f2b3"; }
+
+.fa-diaspora {
+ --fa: "\f791"; }
+
+.fa-foursquare {
+ --fa: "\f180"; }
+
+.fa-stack-overflow {
+ --fa: "\f16c"; }
+
+.fa-github-alt {
+ --fa: "\f113"; }
+
+.fa-phoenix-squadron {
+ --fa: "\f511"; }
+
+.fa-pagelines {
+ --fa: "\f18c"; }
+
+.fa-algolia {
+ --fa: "\f36c"; }
+
+.fa-red-river {
+ --fa: "\f3e3"; }
+
+.fa-creative-commons-sa {
+ --fa: "\f4ef"; }
+
+.fa-safari {
+ --fa: "\f267"; }
+
+.fa-google {
+ --fa: "\f1a0"; }
+
+.fa-square-font-awesome-stroke {
+ --fa: "\f35c"; }
+
+.fa-font-awesome-alt {
+ --fa: "\f35c"; }
+
+.fa-atlassian {
+ --fa: "\f77b"; }
+
+.fa-linkedin-in {
+ --fa: "\f0e1"; }
+
+.fa-digital-ocean {
+ --fa: "\f391"; }
+
+.fa-nimblr {
+ --fa: "\f5a8"; }
+
+.fa-chromecast {
+ --fa: "\f838"; }
+
+.fa-evernote {
+ --fa: "\f839"; }
+
+.fa-hacker-news {
+ --fa: "\f1d4"; }
+
+.fa-creative-commons-sampling {
+ --fa: "\f4f0"; }
+
+.fa-adversal {
+ --fa: "\f36a"; }
+
+.fa-creative-commons {
+ --fa: "\f25e"; }
+
+.fa-watchman-monitoring {
+ --fa: "\e087"; }
+
+.fa-fonticons {
+ --fa: "\f280"; }
+
+.fa-weixin {
+ --fa: "\f1d7"; }
+
+.fa-shirtsinbulk {
+ --fa: "\f214"; }
+
+.fa-codepen {
+ --fa: "\f1cb"; }
+
+.fa-git-alt {
+ --fa: "\f841"; }
+
+.fa-lyft {
+ --fa: "\f3c3"; }
+
+.fa-rev {
+ --fa: "\f5b2"; }
+
+.fa-windows {
+ --fa: "\f17a"; }
+
+.fa-wizards-of-the-coast {
+ --fa: "\f730"; }
+
+.fa-square-viadeo {
+ --fa: "\f2aa"; }
+
+.fa-viadeo-square {
+ --fa: "\f2aa"; }
+
+.fa-meetup {
+ --fa: "\f2e0"; }
+
+.fa-centos {
+ --fa: "\f789"; }
+
+.fa-adn {
+ --fa: "\f170"; }
+
+.fa-cloudsmith {
+ --fa: "\f384"; }
+
+.fa-opensuse {
+ --fa: "\e62b"; }
+
+.fa-pied-piper-alt {
+ --fa: "\f1a8"; }
+
+.fa-square-dribbble {
+ --fa: "\f397"; }
+
+.fa-dribbble-square {
+ --fa: "\f397"; }
+
+.fa-codiepie {
+ --fa: "\f284"; }
+
+.fa-node {
+ --fa: "\f419"; }
+
+.fa-mix {
+ --fa: "\f3cb"; }
+
+.fa-steam {
+ --fa: "\f1b6"; }
+
+.fa-cc-apple-pay {
+ --fa: "\f416"; }
+
+.fa-scribd {
+ --fa: "\f28a"; }
+
+.fa-debian {
+ --fa: "\e60b"; }
+
+.fa-openid {
+ --fa: "\f19b"; }
+
+.fa-instalod {
+ --fa: "\e081"; }
+
+.fa-files-pinwheel {
+ --fa: "\e69f"; }
+
+.fa-expeditedssl {
+ --fa: "\f23e"; }
+
+.fa-sellcast {
+ --fa: "\f2da"; }
+
+.fa-square-twitter {
+ --fa: "\f081"; }
+
+.fa-twitter-square {
+ --fa: "\f081"; }
+
+.fa-r-project {
+ --fa: "\f4f7"; }
+
+.fa-delicious {
+ --fa: "\f1a5"; }
+
+.fa-freebsd {
+ --fa: "\f3a4"; }
+
+.fa-vuejs {
+ --fa: "\f41f"; }
+
+.fa-accusoft {
+ --fa: "\f369"; }
+
+.fa-ioxhost {
+ --fa: "\f208"; }
+
+.fa-fonticons-fi {
+ --fa: "\f3a2"; }
+
+.fa-app-store {
+ --fa: "\f36f"; }
+
+.fa-cc-mastercard {
+ --fa: "\f1f1"; }
+
+.fa-itunes-note {
+ --fa: "\f3b5"; }
+
+.fa-golang {
+ --fa: "\e40f"; }
+
+.fa-kickstarter {
+ --fa: "\f3bb"; }
+
+.fa-square-kickstarter {
+ --fa: "\f3bb"; }
+
+.fa-grav {
+ --fa: "\f2d6"; }
+
+.fa-weibo {
+ --fa: "\f18a"; }
+
+.fa-uncharted {
+ --fa: "\e084"; }
+
+.fa-firstdraft {
+ --fa: "\f3a1"; }
+
+.fa-square-youtube {
+ --fa: "\f431"; }
+
+.fa-youtube-square {
+ --fa: "\f431"; }
+
+.fa-wikipedia-w {
+ --fa: "\f266"; }
+
+.fa-wpressr {
+ --fa: "\f3e4"; }
+
+.fa-rendact {
+ --fa: "\f3e4"; }
+
+.fa-angellist {
+ --fa: "\f209"; }
+
+.fa-galactic-republic {
+ --fa: "\f50c"; }
+
+.fa-nfc-directional {
+ --fa: "\e530"; }
+
+.fa-skype {
+ --fa: "\f17e"; }
+
+.fa-joget {
+ --fa: "\f3b7"; }
+
+.fa-fedora {
+ --fa: "\f798"; }
+
+.fa-stripe-s {
+ --fa: "\f42a"; }
+
+.fa-meta {
+ --fa: "\e49b"; }
+
+.fa-laravel {
+ --fa: "\f3bd"; }
+
+.fa-hotjar {
+ --fa: "\f3b1"; }
+
+.fa-bluetooth-b {
+ --fa: "\f294"; }
+
+.fa-square-letterboxd {
+ --fa: "\e62e"; }
+
+.fa-sticker-mule {
+ --fa: "\f3f7"; }
+
+.fa-creative-commons-zero {
+ --fa: "\f4f3"; }
+
+.fa-hips {
+ --fa: "\f452"; }
+
+.fa-css {
+ --fa: "\e6a2"; }
+
+.fa-behance {
+ --fa: "\f1b4"; }
+
+.fa-reddit {
+ --fa: "\f1a1"; }
+
+.fa-discord {
+ --fa: "\f392"; }
+
+.fa-chrome {
+ --fa: "\f268"; }
+
+.fa-app-store-ios {
+ --fa: "\f370"; }
+
+.fa-cc-discover {
+ --fa: "\f1f2"; }
+
+.fa-wpbeginner {
+ --fa: "\f297"; }
+
+.fa-confluence {
+ --fa: "\f78d"; }
+
+.fa-shoelace {
+ --fa: "\e60c"; }
+
+.fa-mdb {
+ --fa: "\f8ca"; }
+
+.fa-dochub {
+ --fa: "\f394"; }
+
+.fa-accessible-icon {
+ --fa: "\f368"; }
+
+.fa-ebay {
+ --fa: "\f4f4"; }
+
+.fa-amazon {
+ --fa: "\f270"; }
+
+.fa-unsplash {
+ --fa: "\e07c"; }
+
+.fa-yarn {
+ --fa: "\f7e3"; }
+
+.fa-square-steam {
+ --fa: "\f1b7"; }
+
+.fa-steam-square {
+ --fa: "\f1b7"; }
+
+.fa-500px {
+ --fa: "\f26e"; }
+
+.fa-square-vimeo {
+ --fa: "\f194"; }
+
+.fa-vimeo-square {
+ --fa: "\f194"; }
+
+.fa-asymmetrik {
+ --fa: "\f372"; }
+
+.fa-font-awesome {
+ --fa: "\f2b4"; }
+
+.fa-font-awesome-flag {
+ --fa: "\f2b4"; }
+
+.fa-font-awesome-logo-full {
+ --fa: "\f2b4"; }
+
+.fa-gratipay {
+ --fa: "\f184"; }
+
+.fa-apple {
+ --fa: "\f179"; }
+
+.fa-hive {
+ --fa: "\e07f"; }
+
+.fa-gitkraken {
+ --fa: "\f3a6"; }
+
+.fa-keybase {
+ --fa: "\f4f5"; }
+
+.fa-apple-pay {
+ --fa: "\f415"; }
+
+.fa-padlet {
+ --fa: "\e4a0"; }
+
+.fa-amazon-pay {
+ --fa: "\f42c"; }
+
+.fa-square-github {
+ --fa: "\f092"; }
+
+.fa-github-square {
+ --fa: "\f092"; }
+
+.fa-stumbleupon {
+ --fa: "\f1a4"; }
+
+.fa-fedex {
+ --fa: "\f797"; }
+
+.fa-phoenix-framework {
+ --fa: "\f3dc"; }
+
+.fa-shopify {
+ --fa: "\e057"; }
+
+.fa-neos {
+ --fa: "\f612"; }
+
+.fa-square-threads {
+ --fa: "\e619"; }
+
+.fa-hackerrank {
+ --fa: "\f5f7"; }
+
+.fa-researchgate {
+ --fa: "\f4f8"; }
+
+.fa-swift {
+ --fa: "\f8e1"; }
+
+.fa-angular {
+ --fa: "\f420"; }
+
+.fa-speakap {
+ --fa: "\f3f3"; }
+
+.fa-angrycreative {
+ --fa: "\f36e"; }
+
+.fa-y-combinator {
+ --fa: "\f23b"; }
+
+.fa-empire {
+ --fa: "\f1d1"; }
+
+.fa-envira {
+ --fa: "\f299"; }
+
+.fa-google-scholar {
+ --fa: "\e63b"; }
+
+.fa-square-gitlab {
+ --fa: "\e5ae"; }
+
+.fa-gitlab-square {
+ --fa: "\e5ae"; }
+
+.fa-studiovinari {
+ --fa: "\f3f8"; }
+
+.fa-pied-piper {
+ --fa: "\f2ae"; }
+
+.fa-wordpress {
+ --fa: "\f19a"; }
+
+.fa-product-hunt {
+ --fa: "\f288"; }
+
+.fa-firefox {
+ --fa: "\f269"; }
+
+.fa-linode {
+ --fa: "\f2b8"; }
+
+.fa-goodreads {
+ --fa: "\f3a8"; }
+
+.fa-square-odnoklassniki {
+ --fa: "\f264"; }
+
+.fa-odnoklassniki-square {
+ --fa: "\f264"; }
+
+.fa-jsfiddle {
+ --fa: "\f1cc"; }
+
+.fa-sith {
+ --fa: "\f512"; }
+
+.fa-themeisle {
+ --fa: "\f2b2"; }
+
+.fa-page4 {
+ --fa: "\f3d7"; }
+
+.fa-hashnode {
+ --fa: "\e499"; }
+
+.fa-react {
+ --fa: "\f41b"; }
+
+.fa-cc-paypal {
+ --fa: "\f1f4"; }
+
+.fa-squarespace {
+ --fa: "\f5be"; }
+
+.fa-cc-stripe {
+ --fa: "\f1f5"; }
+
+.fa-creative-commons-share {
+ --fa: "\f4f2"; }
+
+.fa-bitcoin {
+ --fa: "\f379"; }
+
+.fa-keycdn {
+ --fa: "\f3ba"; }
+
+.fa-opera {
+ --fa: "\f26a"; }
+
+.fa-itch-io {
+ --fa: "\f83a"; }
+
+.fa-umbraco {
+ --fa: "\f8e8"; }
+
+.fa-galactic-senate {
+ --fa: "\f50d"; }
+
+.fa-ubuntu {
+ --fa: "\f7df"; }
+
+.fa-draft2digital {
+ --fa: "\f396"; }
+
+.fa-stripe {
+ --fa: "\f429"; }
+
+.fa-houzz {
+ --fa: "\f27c"; }
+
+.fa-gg {
+ --fa: "\f260"; }
+
+.fa-dhl {
+ --fa: "\f790"; }
+
+.fa-square-pinterest {
+ --fa: "\f0d3"; }
+
+.fa-pinterest-square {
+ --fa: "\f0d3"; }
+
+.fa-xing {
+ --fa: "\f168"; }
+
+.fa-blackberry {
+ --fa: "\f37b"; }
+
+.fa-creative-commons-pd {
+ --fa: "\f4ec"; }
+
+.fa-playstation {
+ --fa: "\f3df"; }
+
+.fa-quinscape {
+ --fa: "\f459"; }
+
+.fa-less {
+ --fa: "\f41d"; }
+
+.fa-blogger-b {
+ --fa: "\f37d"; }
+
+.fa-opencart {
+ --fa: "\f23d"; }
+
+.fa-vine {
+ --fa: "\f1ca"; }
+
+.fa-signal-messenger {
+ --fa: "\e663"; }
+
+.fa-paypal {
+ --fa: "\f1ed"; }
+
+.fa-gitlab {
+ --fa: "\f296"; }
+
+.fa-typo3 {
+ --fa: "\f42b"; }
+
+.fa-reddit-alien {
+ --fa: "\f281"; }
+
+.fa-yahoo {
+ --fa: "\f19e"; }
+
+.fa-dailymotion {
+ --fa: "\e052"; }
+
+.fa-affiliatetheme {
+ --fa: "\f36b"; }
+
+.fa-pied-piper-pp {
+ --fa: "\f1a7"; }
+
+.fa-bootstrap {
+ --fa: "\f836"; }
+
+.fa-odnoklassniki {
+ --fa: "\f263"; }
+
+.fa-nfc-symbol {
+ --fa: "\e531"; }
+
+.fa-mintbit {
+ --fa: "\e62f"; }
+
+.fa-ethereum {
+ --fa: "\f42e"; }
+
+.fa-speaker-deck {
+ --fa: "\f83c"; }
+
+.fa-creative-commons-nc-eu {
+ --fa: "\f4e9"; }
+
+.fa-patreon {
+ --fa: "\f3d9"; }
+
+.fa-avianex {
+ --fa: "\f374"; }
+
+.fa-ello {
+ --fa: "\f5f1"; }
+
+.fa-gofore {
+ --fa: "\f3a7"; }
+
+.fa-bimobject {
+ --fa: "\f378"; }
+
+.fa-brave-reverse {
+ --fa: "\e63d"; }
+
+.fa-facebook-f {
+ --fa: "\f39e"; }
+
+.fa-square-google-plus {
+ --fa: "\f0d4"; }
+
+.fa-google-plus-square {
+ --fa: "\f0d4"; }
+
+.fa-web-awesome {
+ --fa: "\e682"; }
+
+.fa-mandalorian {
+ --fa: "\f50f"; }
+
+.fa-first-order-alt {
+ --fa: "\f50a"; }
+
+.fa-osi {
+ --fa: "\f41a"; }
+
+.fa-google-wallet {
+ --fa: "\f1ee"; }
+
+.fa-d-and-d-beyond {
+ --fa: "\f6ca"; }
+
+.fa-periscope {
+ --fa: "\f3da"; }
+
+.fa-fulcrum {
+ --fa: "\f50b"; }
+
+.fa-cloudscale {
+ --fa: "\f383"; }
+
+.fa-forumbee {
+ --fa: "\f211"; }
+
+.fa-mizuni {
+ --fa: "\f3cc"; }
+
+.fa-schlix {
+ --fa: "\f3ea"; }
+
+.fa-square-xing {
+ --fa: "\f169"; }
+
+.fa-xing-square {
+ --fa: "\f169"; }
+
+.fa-bandcamp {
+ --fa: "\f2d5"; }
+
+.fa-wpforms {
+ --fa: "\f298"; }
+
+.fa-cloudversify {
+ --fa: "\f385"; }
+
+.fa-usps {
+ --fa: "\f7e1"; }
+
+.fa-megaport {
+ --fa: "\f5a3"; }
+
+.fa-magento {
+ --fa: "\f3c4"; }
+
+.fa-spotify {
+ --fa: "\f1bc"; }
+
+.fa-optin-monster {
+ --fa: "\f23c"; }
+
+.fa-fly {
+ --fa: "\f417"; }
+
+.fa-square-bluesky {
+ --fa: "\e6a3"; }
+
+.fa-aviato {
+ --fa: "\f421"; }
+
+.fa-itunes {
+ --fa: "\f3b4"; }
+
+.fa-cuttlefish {
+ --fa: "\f38c"; }
+
+.fa-blogger {
+ --fa: "\f37c"; }
+
+.fa-flickr {
+ --fa: "\f16e"; }
+
+.fa-viber {
+ --fa: "\f409"; }
+
+.fa-soundcloud {
+ --fa: "\f1be"; }
+
+.fa-digg {
+ --fa: "\f1a6"; }
+
+.fa-tencent-weibo {
+ --fa: "\f1d5"; }
+
+.fa-letterboxd {
+ --fa: "\e62d"; }
+
+.fa-symfony {
+ --fa: "\f83d"; }
+
+.fa-maxcdn {
+ --fa: "\f136"; }
+
+.fa-etsy {
+ --fa: "\f2d7"; }
+
+.fa-facebook-messenger {
+ --fa: "\f39f"; }
+
+.fa-audible {
+ --fa: "\f373"; }
+
+.fa-think-peaks {
+ --fa: "\f731"; }
+
+.fa-bilibili {
+ --fa: "\e3d9"; }
+
+.fa-erlang {
+ --fa: "\f39d"; }
+
+.fa-x-twitter {
+ --fa: "\e61b"; }
+
+.fa-cotton-bureau {
+ --fa: "\f89e"; }
+
+.fa-dashcube {
+ --fa: "\f210"; }
+
+.fa-42-group {
+ --fa: "\e080"; }
+
+.fa-innosoft {
+ --fa: "\e080"; }
+
+.fa-stack-exchange {
+ --fa: "\f18d"; }
+
+.fa-elementor {
+ --fa: "\f430"; }
+
+.fa-square-pied-piper {
+ --fa: "\e01e"; }
+
+.fa-pied-piper-square {
+ --fa: "\e01e"; }
+
+.fa-creative-commons-nd {
+ --fa: "\f4eb"; }
+
+.fa-palfed {
+ --fa: "\f3d8"; }
+
+.fa-superpowers {
+ --fa: "\f2dd"; }
+
+.fa-resolving {
+ --fa: "\f3e7"; }
+
+.fa-xbox {
+ --fa: "\f412"; }
+
+.fa-square-web-awesome-stroke {
+ --fa: "\e684"; }
+
+.fa-searchengin {
+ --fa: "\f3eb"; }
+
+.fa-tiktok {
+ --fa: "\e07b"; }
+
+.fa-square-facebook {
+ --fa: "\f082"; }
+
+.fa-facebook-square {
+ --fa: "\f082"; }
+
+.fa-renren {
+ --fa: "\f18b"; }
+
+.fa-linux {
+ --fa: "\f17c"; }
+
+.fa-glide {
+ --fa: "\f2a5"; }
+
+.fa-linkedin {
+ --fa: "\f08c"; }
+
+.fa-hubspot {
+ --fa: "\f3b2"; }
+
+.fa-deploydog {
+ --fa: "\f38e"; }
+
+.fa-twitch {
+ --fa: "\f1e8"; }
+
+.fa-flutter {
+ --fa: "\e694"; }
+
+.fa-ravelry {
+ --fa: "\f2d9"; }
+
+.fa-mixer {
+ --fa: "\e056"; }
+
+.fa-square-lastfm {
+ --fa: "\f203"; }
+
+.fa-lastfm-square {
+ --fa: "\f203"; }
+
+.fa-vimeo {
+ --fa: "\f40a"; }
+
+.fa-mendeley {
+ --fa: "\f7b3"; }
+
+.fa-uniregistry {
+ --fa: "\f404"; }
+
+.fa-figma {
+ --fa: "\f799"; }
+
+.fa-creative-commons-remix {
+ --fa: "\f4ee"; }
+
+.fa-cc-amazon-pay {
+ --fa: "\f42d"; }
+
+.fa-dropbox {
+ --fa: "\f16b"; }
+
+.fa-instagram {
+ --fa: "\f16d"; }
+
+.fa-cmplid {
+ --fa: "\e360"; }
+
+.fa-upwork {
+ --fa: "\e641"; }
+
+.fa-facebook {
+ --fa: "\f09a"; }
+
+.fa-gripfire {
+ --fa: "\f3ac"; }
+
+.fa-jedi-order {
+ --fa: "\f50e"; }
+
+.fa-uikit {
+ --fa: "\f403"; }
+
+.fa-fort-awesome-alt {
+ --fa: "\f3a3"; }
+
+.fa-phabricator {
+ --fa: "\f3db"; }
+
+.fa-ussunnah {
+ --fa: "\f407"; }
+
+.fa-earlybirds {
+ --fa: "\f39a"; }
+
+.fa-trade-federation {
+ --fa: "\f513"; }
+
+.fa-autoprefixer {
+ --fa: "\f41c"; }
+
+.fa-whatsapp {
+ --fa: "\f232"; }
+
+.fa-square-upwork {
+ --fa: "\e67c"; }
+
+.fa-slideshare {
+ --fa: "\f1e7"; }
+
+.fa-google-play {
+ --fa: "\f3ab"; }
+
+.fa-viadeo {
+ --fa: "\f2a9"; }
+
+.fa-line {
+ --fa: "\f3c0"; }
+
+.fa-google-drive {
+ --fa: "\f3aa"; }
+
+.fa-servicestack {
+ --fa: "\f3ec"; }
+
+.fa-simplybuilt {
+ --fa: "\f215"; }
+
+.fa-bitbucket {
+ --fa: "\f171"; }
+
+.fa-imdb {
+ --fa: "\f2d8"; }
+
+.fa-deezer {
+ --fa: "\e077"; }
+
+.fa-raspberry-pi {
+ --fa: "\f7bb"; }
+
+.fa-jira {
+ --fa: "\f7b1"; }
+
+.fa-docker {
+ --fa: "\f395"; }
+
+.fa-screenpal {
+ --fa: "\e570"; }
+
+.fa-bluetooth {
+ --fa: "\f293"; }
+
+.fa-gitter {
+ --fa: "\f426"; }
+
+.fa-d-and-d {
+ --fa: "\f38d"; }
+
+.fa-microblog {
+ --fa: "\e01a"; }
+
+.fa-cc-diners-club {
+ --fa: "\f24c"; }
+
+.fa-gg-circle {
+ --fa: "\f261"; }
+
+.fa-pied-piper-hat {
+ --fa: "\f4e5"; }
+
+.fa-kickstarter-k {
+ --fa: "\f3bc"; }
+
+.fa-yandex {
+ --fa: "\f413"; }
+
+.fa-readme {
+ --fa: "\f4d5"; }
+
+.fa-html5 {
+ --fa: "\f13b"; }
+
+.fa-sellsy {
+ --fa: "\f213"; }
+
+.fa-square-web-awesome {
+ --fa: "\e683"; }
+
+.fa-sass {
+ --fa: "\f41e"; }
+
+.fa-wirsindhandwerk {
+ --fa: "\e2d0"; }
+
+.fa-wsh {
+ --fa: "\e2d0"; }
+
+.fa-buromobelexperte {
+ --fa: "\f37f"; }
+
+.fa-salesforce {
+ --fa: "\f83b"; }
+
+.fa-octopus-deploy {
+ --fa: "\e082"; }
+
+.fa-medapps {
+ --fa: "\f3c6"; }
+
+.fa-ns8 {
+ --fa: "\f3d5"; }
+
+.fa-pinterest-p {
+ --fa: "\f231"; }
+
+.fa-apper {
+ --fa: "\f371"; }
+
+.fa-fort-awesome {
+ --fa: "\f286"; }
+
+.fa-waze {
+ --fa: "\f83f"; }
+
+.fa-bluesky {
+ --fa: "\e671"; }
+
+.fa-cc-jcb {
+ --fa: "\f24b"; }
+
+.fa-snapchat {
+ --fa: "\f2ab"; }
+
+.fa-snapchat-ghost {
+ --fa: "\f2ab"; }
+
+.fa-fantasy-flight-games {
+ --fa: "\f6dc"; }
+
+.fa-rust {
+ --fa: "\e07a"; }
+
+.fa-wix {
+ --fa: "\f5cf"; }
+
+.fa-square-behance {
+ --fa: "\f1b5"; }
+
+.fa-behance-square {
+ --fa: "\f1b5"; }
+
+.fa-supple {
+ --fa: "\f3f9"; }
+
+.fa-webflow {
+ --fa: "\e65c"; }
+
+.fa-rebel {
+ --fa: "\f1d0"; }
+
+.fa-css3 {
+ --fa: "\f13c"; }
+
+.fa-staylinked {
+ --fa: "\f3f5"; }
+
+.fa-kaggle {
+ --fa: "\f5fa"; }
+
+.fa-space-awesome {
+ --fa: "\e5ac"; }
+
+.fa-deviantart {
+ --fa: "\f1bd"; }
+
+.fa-cpanel {
+ --fa: "\f388"; }
+
+.fa-goodreads-g {
+ --fa: "\f3a9"; }
+
+.fa-square-git {
+ --fa: "\f1d2"; }
+
+.fa-git-square {
+ --fa: "\f1d2"; }
+
+.fa-square-tumblr {
+ --fa: "\f174"; }
+
+.fa-tumblr-square {
+ --fa: "\f174"; }
+
+.fa-trello {
+ --fa: "\f181"; }
+
+.fa-creative-commons-nc-jp {
+ --fa: "\f4ea"; }
+
+.fa-get-pocket {
+ --fa: "\f265"; }
+
+.fa-perbyte {
+ --fa: "\e083"; }
+
+.fa-grunt {
+ --fa: "\f3ad"; }
+
+.fa-weebly {
+ --fa: "\f5cc"; }
+
+.fa-connectdevelop {
+ --fa: "\f20e"; }
+
+.fa-leanpub {
+ --fa: "\f212"; }
+
+.fa-black-tie {
+ --fa: "\f27e"; }
+
+.fa-themeco {
+ --fa: "\f5c6"; }
+
+.fa-python {
+ --fa: "\f3e2"; }
+
+.fa-android {
+ --fa: "\f17b"; }
+
+.fa-bots {
+ --fa: "\e340"; }
+
+.fa-free-code-camp {
+ --fa: "\f2c5"; }
+
+.fa-hornbill {
+ --fa: "\f592"; }
+
+.fa-js {
+ --fa: "\f3b8"; }
+
+.fa-ideal {
+ --fa: "\e013"; }
+
+.fa-git {
+ --fa: "\f1d3"; }
+
+.fa-dev {
+ --fa: "\f6cc"; }
+
+.fa-sketch {
+ --fa: "\f7c6"; }
+
+.fa-yandex-international {
+ --fa: "\f414"; }
+
+.fa-cc-amex {
+ --fa: "\f1f3"; }
+
+.fa-uber {
+ --fa: "\f402"; }
+
+.fa-github {
+ --fa: "\f09b"; }
+
+.fa-php {
+ --fa: "\f457"; }
+
+.fa-alipay {
+ --fa: "\f642"; }
+
+.fa-youtube {
+ --fa: "\f167"; }
+
+.fa-skyatlas {
+ --fa: "\f216"; }
+
+.fa-firefox-browser {
+ --fa: "\e007"; }
+
+.fa-replyd {
+ --fa: "\f3e6"; }
+
+.fa-suse {
+ --fa: "\f7d6"; }
+
+.fa-jenkins {
+ --fa: "\f3b6"; }
+
+.fa-twitter {
+ --fa: "\f099"; }
+
+.fa-rockrms {
+ --fa: "\f3e9"; }
+
+.fa-pinterest {
+ --fa: "\f0d2"; }
+
+.fa-buffer {
+ --fa: "\f837"; }
+
+.fa-npm {
+ --fa: "\f3d4"; }
+
+.fa-yammer {
+ --fa: "\f840"; }
+
+.fa-btc {
+ --fa: "\f15a"; }
+
+.fa-dribbble {
+ --fa: "\f17d"; }
+
+.fa-stumbleupon-circle {
+ --fa: "\f1a3"; }
+
+.fa-internet-explorer {
+ --fa: "\f26b"; }
+
+.fa-stubber {
+ --fa: "\e5c7"; }
+
+.fa-telegram {
+ --fa: "\f2c6"; }
+
+.fa-telegram-plane {
+ --fa: "\f2c6"; }
+
+.fa-old-republic {
+ --fa: "\f510"; }
+
+.fa-odysee {
+ --fa: "\e5c6"; }
+
+.fa-square-whatsapp {
+ --fa: "\f40c"; }
+
+.fa-whatsapp-square {
+ --fa: "\f40c"; }
+
+.fa-node-js {
+ --fa: "\f3d3"; }
+
+.fa-edge-legacy {
+ --fa: "\e078"; }
+
+.fa-slack {
+ --fa: "\f198"; }
+
+.fa-slack-hash {
+ --fa: "\f198"; }
+
+.fa-medrt {
+ --fa: "\f3c8"; }
+
+.fa-usb {
+ --fa: "\f287"; }
+
+.fa-tumblr {
+ --fa: "\f173"; }
+
+.fa-vaadin {
+ --fa: "\f408"; }
+
+.fa-quora {
+ --fa: "\f2c4"; }
+
+.fa-square-x-twitter {
+ --fa: "\e61a"; }
+
+.fa-reacteurope {
+ --fa: "\f75d"; }
+
+.fa-medium {
+ --fa: "\f23a"; }
+
+.fa-medium-m {
+ --fa: "\f23a"; }
+
+.fa-amilia {
+ --fa: "\f36d"; }
+
+.fa-mixcloud {
+ --fa: "\f289"; }
+
+.fa-flipboard {
+ --fa: "\f44d"; }
+
+.fa-viacoin {
+ --fa: "\f237"; }
+
+.fa-critical-role {
+ --fa: "\f6c9"; }
+
+.fa-sitrox {
+ --fa: "\e44a"; }
+
+.fa-discourse {
+ --fa: "\f393"; }
+
+.fa-joomla {
+ --fa: "\f1aa"; }
+
+.fa-mastodon {
+ --fa: "\f4f6"; }
+
+.fa-airbnb {
+ --fa: "\f834"; }
+
+.fa-wolf-pack-battalion {
+ --fa: "\f514"; }
+
+.fa-buy-n-large {
+ --fa: "\f8a6"; }
+
+.fa-gulp {
+ --fa: "\f3ae"; }
+
+.fa-creative-commons-sampling-plus {
+ --fa: "\f4f1"; }
+
+.fa-strava {
+ --fa: "\f428"; }
+
+.fa-ember {
+ --fa: "\f423"; }
+
+.fa-canadian-maple-leaf {
+ --fa: "\f785"; }
+
+.fa-teamspeak {
+ --fa: "\f4f9"; }
+
+.fa-pushed {
+ --fa: "\f3e1"; }
+
+.fa-wordpress-simple {
+ --fa: "\f411"; }
+
+.fa-nutritionix {
+ --fa: "\f3d6"; }
+
+.fa-wodu {
+ --fa: "\e088"; }
+
+.fa-google-pay {
+ --fa: "\e079"; }
+
+.fa-intercom {
+ --fa: "\f7af"; }
+
+.fa-zhihu {
+ --fa: "\f63f"; }
+
+.fa-korvue {
+ --fa: "\f42f"; }
+
+.fa-pix {
+ --fa: "\e43a"; }
+
+.fa-steam-symbol {
+ --fa: "\f3f6"; }
+:root, :host {
+ --fa-style-family-classic: 'Font Awesome 6 Free';
+ --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; }
+
+@font-face {
+ font-family: 'Font Awesome 6 Free';
+ font-style: normal;
+ font-weight: 400;
+ font-display: block;
+ src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }
+
+.far,
+.fa-regular {
+ font-weight: 400; }
+:root, :host {
+ --fa-style-family-classic: 'Font Awesome 6 Free';
+ --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; }
+
+@font-face {
+ font-family: 'Font Awesome 6 Free';
+ font-style: normal;
+ font-weight: 900;
+ font-display: block;
+ src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
+
+.fas,
+.fa-solid {
+ font-weight: 900; }
+@font-face {
+ font-family: 'Font Awesome 5 Brands';
+ font-display: block;
+ font-weight: 400;
+ src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
+
+@font-face {
+ font-family: 'Font Awesome 5 Free';
+ font-display: block;
+ font-weight: 900;
+ src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
+
+@font-face {
+ font-family: 'Font Awesome 5 Free';
+ font-display: block;
+ font-weight: 400;
+ src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }
+@font-face {
+ font-family: 'FontAwesome';
+ font-display: block;
+ src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
+
+@font-face {
+ font-family: 'FontAwesome';
+ font-display: block;
+ src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
+
+@font-face {
+ font-family: 'FontAwesome';
+ font-display: block;
+ src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype");
+ unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; }
+
+@font-face {
+ font-family: 'FontAwesome';
+ font-display: block;
+ src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype");
+ unicode-range: U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A; }
diff --git a/libai/fontawesome/all.min.css b/libai/fontawesome/all.min.css
new file mode 100644
index 0000000..29542ac
--- /dev/null
+++ b/libai/fontawesome/all.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-regular,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-brands:before,.fa-regular:before,.fa-solid:before,.fa:before,.fab:before,.far:before,.fas:before{content:var(--fa)}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}
+
+.fa-0{--fa:"\30"}.fa-1{--fa:"\31"}.fa-2{--fa:"\32"}.fa-3{--fa:"\33"}.fa-4{--fa:"\34"}.fa-5{--fa:"\35"}.fa-6{--fa:"\36"}.fa-7{--fa:"\37"}.fa-8{--fa:"\38"}.fa-9{--fa:"\39"}.fa-fill-drip{--fa:"\f576"}.fa-arrows-to-circle{--fa:"\e4bd"}.fa-chevron-circle-right,.fa-circle-chevron-right{--fa:"\f138"}.fa-at{--fa:"\40"}.fa-trash-alt,.fa-trash-can{--fa:"\f2ed"}.fa-text-height{--fa:"\f034"}.fa-user-times,.fa-user-xmark{--fa:"\f235"}.fa-stethoscope{--fa:"\f0f1"}.fa-comment-alt,.fa-message{--fa:"\f27a"}.fa-info{--fa:"\f129"}.fa-compress-alt,.fa-down-left-and-up-right-to-center{--fa:"\f422"}.fa-explosion{--fa:"\e4e9"}.fa-file-alt,.fa-file-lines,.fa-file-text{--fa:"\f15c"}.fa-wave-square{--fa:"\f83e"}.fa-ring{--fa:"\f70b"}.fa-building-un{--fa:"\e4d9"}.fa-dice-three{--fa:"\f527"}.fa-calendar-alt,.fa-calendar-days{--fa:"\f073"}.fa-anchor-circle-check{--fa:"\e4aa"}.fa-building-circle-arrow-right{--fa:"\e4d1"}.fa-volleyball,.fa-volleyball-ball{--fa:"\f45f"}.fa-arrows-up-to-line{--fa:"\e4c2"}.fa-sort-desc,.fa-sort-down{--fa:"\f0dd"}.fa-circle-minus,.fa-minus-circle{--fa:"\f056"}.fa-door-open{--fa:"\f52b"}.fa-right-from-bracket,.fa-sign-out-alt{--fa:"\f2f5"}.fa-atom{--fa:"\f5d2"}.fa-soap{--fa:"\e06e"}.fa-heart-music-camera-bolt,.fa-icons{--fa:"\f86d"}.fa-microphone-alt-slash,.fa-microphone-lines-slash{--fa:"\f539"}.fa-bridge-circle-check{--fa:"\e4c9"}.fa-pump-medical{--fa:"\e06a"}.fa-fingerprint{--fa:"\f577"}.fa-hand-point-right{--fa:"\f0a4"}.fa-magnifying-glass-location,.fa-search-location{--fa:"\f689"}.fa-forward-step,.fa-step-forward{--fa:"\f051"}.fa-face-smile-beam,.fa-smile-beam{--fa:"\f5b8"}.fa-flag-checkered{--fa:"\f11e"}.fa-football,.fa-football-ball{--fa:"\f44e"}.fa-school-circle-exclamation{--fa:"\e56c"}.fa-crop{--fa:"\f125"}.fa-angle-double-down,.fa-angles-down{--fa:"\f103"}.fa-users-rectangle{--fa:"\e594"}.fa-people-roof{--fa:"\e537"}.fa-people-line{--fa:"\e534"}.fa-beer,.fa-beer-mug-empty{--fa:"\f0fc"}.fa-diagram-predecessor{--fa:"\e477"}.fa-arrow-up-long,.fa-long-arrow-up{--fa:"\f176"}.fa-burn,.fa-fire-flame-simple{--fa:"\f46a"}.fa-male,.fa-person{--fa:"\f183"}.fa-laptop{--fa:"\f109"}.fa-file-csv{--fa:"\f6dd"}.fa-menorah{--fa:"\f676"}.fa-truck-plane{--fa:"\e58f"}.fa-record-vinyl{--fa:"\f8d9"}.fa-face-grin-stars,.fa-grin-stars{--fa:"\f587"}.fa-bong{--fa:"\f55c"}.fa-pastafarianism,.fa-spaghetti-monster-flying{--fa:"\f67b"}.fa-arrow-down-up-across-line{--fa:"\e4af"}.fa-spoon,.fa-utensil-spoon{--fa:"\f2e5"}.fa-jar-wheat{--fa:"\e517"}.fa-envelopes-bulk,.fa-mail-bulk{--fa:"\f674"}.fa-file-circle-exclamation{--fa:"\e4eb"}.fa-circle-h,.fa-hospital-symbol{--fa:"\f47e"}.fa-pager{--fa:"\f815"}.fa-address-book,.fa-contact-book{--fa:"\f2b9"}.fa-strikethrough{--fa:"\f0cc"}.fa-k{--fa:"\4b"}.fa-landmark-flag{--fa:"\e51c"}.fa-pencil,.fa-pencil-alt{--fa:"\f303"}.fa-backward{--fa:"\f04a"}.fa-caret-right{--fa:"\f0da"}.fa-comments{--fa:"\f086"}.fa-file-clipboard,.fa-paste{--fa:"\f0ea"}.fa-code-pull-request{--fa:"\e13c"}.fa-clipboard-list{--fa:"\f46d"}.fa-truck-loading,.fa-truck-ramp-box{--fa:"\f4de"}.fa-user-check{--fa:"\f4fc"}.fa-vial-virus{--fa:"\e597"}.fa-sheet-plastic{--fa:"\e571"}.fa-blog{--fa:"\f781"}.fa-user-ninja{--fa:"\f504"}.fa-person-arrow-up-from-line{--fa:"\e539"}.fa-scroll-torah,.fa-torah{--fa:"\f6a0"}.fa-broom-ball,.fa-quidditch,.fa-quidditch-broom-ball{--fa:"\f458"}.fa-toggle-off{--fa:"\f204"}.fa-archive,.fa-box-archive{--fa:"\f187"}.fa-person-drowning{--fa:"\e545"}.fa-arrow-down-9-1,.fa-sort-numeric-desc,.fa-sort-numeric-down-alt{--fa:"\f886"}.fa-face-grin-tongue-squint,.fa-grin-tongue-squint{--fa:"\f58a"}.fa-spray-can{--fa:"\f5bd"}.fa-truck-monster{--fa:"\f63b"}.fa-w{--fa:"\57"}.fa-earth-africa,.fa-globe-africa{--fa:"\f57c"}.fa-rainbow{--fa:"\f75b"}.fa-circle-notch{--fa:"\f1ce"}.fa-tablet-alt,.fa-tablet-screen-button{--fa:"\f3fa"}.fa-paw{--fa:"\f1b0"}.fa-cloud{--fa:"\f0c2"}.fa-trowel-bricks{--fa:"\e58a"}.fa-face-flushed,.fa-flushed{--fa:"\f579"}.fa-hospital-user{--fa:"\f80d"}.fa-tent-arrow-left-right{--fa:"\e57f"}.fa-gavel,.fa-legal{--fa:"\f0e3"}.fa-binoculars{--fa:"\f1e5"}.fa-microphone-slash{--fa:"\f131"}.fa-box-tissue{--fa:"\e05b"}.fa-motorcycle{--fa:"\f21c"}.fa-bell-concierge,.fa-concierge-bell{--fa:"\f562"}.fa-pen-ruler,.fa-pencil-ruler{--fa:"\f5ae"}.fa-people-arrows,.fa-people-arrows-left-right{--fa:"\e068"}.fa-mars-and-venus-burst{--fa:"\e523"}.fa-caret-square-right,.fa-square-caret-right{--fa:"\f152"}.fa-cut,.fa-scissors{--fa:"\f0c4"}.fa-sun-plant-wilt{--fa:"\e57a"}.fa-toilets-portable{--fa:"\e584"}.fa-hockey-puck{--fa:"\f453"}.fa-table{--fa:"\f0ce"}.fa-magnifying-glass-arrow-right{--fa:"\e521"}.fa-digital-tachograph,.fa-tachograph-digital{--fa:"\f566"}.fa-users-slash{--fa:"\e073"}.fa-clover{--fa:"\e139"}.fa-mail-reply,.fa-reply{--fa:"\f3e5"}.fa-star-and-crescent{--fa:"\f699"}.fa-house-fire{--fa:"\e50c"}.fa-minus-square,.fa-square-minus{--fa:"\f146"}.fa-helicopter{--fa:"\f533"}.fa-compass{--fa:"\f14e"}.fa-caret-square-down,.fa-square-caret-down{--fa:"\f150"}.fa-file-circle-question{--fa:"\e4ef"}.fa-laptop-code{--fa:"\f5fc"}.fa-swatchbook{--fa:"\f5c3"}.fa-prescription-bottle{--fa:"\f485"}.fa-bars,.fa-navicon{--fa:"\f0c9"}.fa-people-group{--fa:"\e533"}.fa-hourglass-3,.fa-hourglass-end{--fa:"\f253"}.fa-heart-broken,.fa-heart-crack{--fa:"\f7a9"}.fa-external-link-square-alt,.fa-square-up-right{--fa:"\f360"}.fa-face-kiss-beam,.fa-kiss-beam{--fa:"\f597"}.fa-film{--fa:"\f008"}.fa-ruler-horizontal{--fa:"\f547"}.fa-people-robbery{--fa:"\e536"}.fa-lightbulb{--fa:"\f0eb"}.fa-caret-left{--fa:"\f0d9"}.fa-circle-exclamation,.fa-exclamation-circle{--fa:"\f06a"}.fa-school-circle-xmark{--fa:"\e56d"}.fa-arrow-right-from-bracket,.fa-sign-out{--fa:"\f08b"}.fa-chevron-circle-down,.fa-circle-chevron-down{--fa:"\f13a"}.fa-unlock-alt,.fa-unlock-keyhole{--fa:"\f13e"}.fa-cloud-showers-heavy{--fa:"\f740"}.fa-headphones-alt,.fa-headphones-simple{--fa:"\f58f"}.fa-sitemap{--fa:"\f0e8"}.fa-circle-dollar-to-slot,.fa-donate{--fa:"\f4b9"}.fa-memory{--fa:"\f538"}.fa-road-spikes{--fa:"\e568"}.fa-fire-burner{--fa:"\e4f1"}.fa-flag{--fa:"\f024"}.fa-hanukiah{--fa:"\f6e6"}.fa-feather{--fa:"\f52d"}.fa-volume-down,.fa-volume-low{--fa:"\f027"}.fa-comment-slash{--fa:"\f4b3"}.fa-cloud-sun-rain{--fa:"\f743"}.fa-compress{--fa:"\f066"}.fa-wheat-alt,.fa-wheat-awn{--fa:"\e2cd"}.fa-ankh{--fa:"\f644"}.fa-hands-holding-child{--fa:"\e4fa"}.fa-asterisk{--fa:"\2a"}.fa-check-square,.fa-square-check{--fa:"\f14a"}.fa-peseta-sign{--fa:"\e221"}.fa-header,.fa-heading{--fa:"\f1dc"}.fa-ghost{--fa:"\f6e2"}.fa-list,.fa-list-squares{--fa:"\f03a"}.fa-phone-square-alt,.fa-square-phone-flip{--fa:"\f87b"}.fa-cart-plus{--fa:"\f217"}.fa-gamepad{--fa:"\f11b"}.fa-circle-dot,.fa-dot-circle{--fa:"\f192"}.fa-dizzy,.fa-face-dizzy{--fa:"\f567"}.fa-egg{--fa:"\f7fb"}.fa-house-medical-circle-xmark{--fa:"\e513"}.fa-campground{--fa:"\f6bb"}.fa-folder-plus{--fa:"\f65e"}.fa-futbol,.fa-futbol-ball,.fa-soccer-ball{--fa:"\f1e3"}.fa-paint-brush,.fa-paintbrush{--fa:"\f1fc"}.fa-lock{--fa:"\f023"}.fa-gas-pump{--fa:"\f52f"}.fa-hot-tub,.fa-hot-tub-person{--fa:"\f593"}.fa-map-location,.fa-map-marked{--fa:"\f59f"}.fa-house-flood-water{--fa:"\e50e"}.fa-tree{--fa:"\f1bb"}.fa-bridge-lock{--fa:"\e4cc"}.fa-sack-dollar{--fa:"\f81d"}.fa-edit,.fa-pen-to-square{--fa:"\f044"}.fa-car-side{--fa:"\f5e4"}.fa-share-alt,.fa-share-nodes{--fa:"\f1e0"}.fa-heart-circle-minus{--fa:"\e4ff"}.fa-hourglass-2,.fa-hourglass-half{--fa:"\f252"}.fa-microscope{--fa:"\f610"}.fa-sink{--fa:"\e06d"}.fa-bag-shopping,.fa-shopping-bag{--fa:"\f290"}.fa-arrow-down-z-a,.fa-sort-alpha-desc,.fa-sort-alpha-down-alt{--fa:"\f881"}.fa-mitten{--fa:"\f7b5"}.fa-person-rays{--fa:"\e54d"}.fa-users{--fa:"\f0c0"}.fa-eye-slash{--fa:"\f070"}.fa-flask-vial{--fa:"\e4f3"}.fa-hand,.fa-hand-paper{--fa:"\f256"}.fa-om{--fa:"\f679"}.fa-worm{--fa:"\e599"}.fa-house-circle-xmark{--fa:"\e50b"}.fa-plug{--fa:"\f1e6"}.fa-chevron-up{--fa:"\f077"}.fa-hand-spock{--fa:"\f259"}.fa-stopwatch{--fa:"\f2f2"}.fa-face-kiss,.fa-kiss{--fa:"\f596"}.fa-bridge-circle-xmark{--fa:"\e4cb"}.fa-face-grin-tongue,.fa-grin-tongue{--fa:"\f589"}.fa-chess-bishop{--fa:"\f43a"}.fa-face-grin-wink,.fa-grin-wink{--fa:"\f58c"}.fa-deaf,.fa-deafness,.fa-ear-deaf,.fa-hard-of-hearing{--fa:"\f2a4"}.fa-road-circle-check{--fa:"\e564"}.fa-dice-five{--fa:"\f523"}.fa-rss-square,.fa-square-rss{--fa:"\f143"}.fa-land-mine-on{--fa:"\e51b"}.fa-i-cursor{--fa:"\f246"}.fa-stamp{--fa:"\f5bf"}.fa-stairs{--fa:"\e289"}.fa-i{--fa:"\49"}.fa-hryvnia,.fa-hryvnia-sign{--fa:"\f6f2"}.fa-pills{--fa:"\f484"}.fa-face-grin-wide,.fa-grin-alt{--fa:"\f581"}.fa-tooth{--fa:"\f5c9"}.fa-v{--fa:"\56"}.fa-bangladeshi-taka-sign{--fa:"\e2e6"}.fa-bicycle{--fa:"\f206"}.fa-rod-asclepius,.fa-rod-snake,.fa-staff-aesculapius,.fa-staff-snake{--fa:"\e579"}.fa-head-side-cough-slash{--fa:"\e062"}.fa-ambulance,.fa-truck-medical{--fa:"\f0f9"}.fa-wheat-awn-circle-exclamation{--fa:"\e598"}.fa-snowman{--fa:"\f7d0"}.fa-mortar-pestle{--fa:"\f5a7"}.fa-road-barrier{--fa:"\e562"}.fa-school{--fa:"\f549"}.fa-igloo{--fa:"\f7ae"}.fa-joint{--fa:"\f595"}.fa-angle-right{--fa:"\f105"}.fa-horse{--fa:"\f6f0"}.fa-q{--fa:"\51"}.fa-g{--fa:"\47"}.fa-notes-medical{--fa:"\f481"}.fa-temperature-2,.fa-temperature-half,.fa-thermometer-2,.fa-thermometer-half{--fa:"\f2c9"}.fa-dong-sign{--fa:"\e169"}.fa-capsules{--fa:"\f46b"}.fa-poo-bolt,.fa-poo-storm{--fa:"\f75a"}.fa-face-frown-open,.fa-frown-open{--fa:"\f57a"}.fa-hand-point-up{--fa:"\f0a6"}.fa-money-bill{--fa:"\f0d6"}.fa-bookmark{--fa:"\f02e"}.fa-align-justify{--fa:"\f039"}.fa-umbrella-beach{--fa:"\f5ca"}.fa-helmet-un{--fa:"\e503"}.fa-bullseye{--fa:"\f140"}.fa-bacon{--fa:"\f7e5"}.fa-hand-point-down{--fa:"\f0a7"}.fa-arrow-up-from-bracket{--fa:"\e09a"}.fa-folder,.fa-folder-blank{--fa:"\f07b"}.fa-file-medical-alt,.fa-file-waveform{--fa:"\f478"}.fa-radiation{--fa:"\f7b9"}.fa-chart-simple{--fa:"\e473"}.fa-mars-stroke{--fa:"\f229"}.fa-vial{--fa:"\f492"}.fa-dashboard,.fa-gauge,.fa-gauge-med,.fa-tachometer-alt-average{--fa:"\f624"}.fa-magic-wand-sparkles,.fa-wand-magic-sparkles{--fa:"\e2ca"}.fa-e{--fa:"\45"}.fa-pen-alt,.fa-pen-clip{--fa:"\f305"}.fa-bridge-circle-exclamation{--fa:"\e4ca"}.fa-user{--fa:"\f007"}.fa-school-circle-check{--fa:"\e56b"}.fa-dumpster{--fa:"\f793"}.fa-shuttle-van,.fa-van-shuttle{--fa:"\f5b6"}.fa-building-user{--fa:"\e4da"}.fa-caret-square-left,.fa-square-caret-left{--fa:"\f191"}.fa-highlighter{--fa:"\f591"}.fa-key{--fa:"\f084"}.fa-bullhorn{--fa:"\f0a1"}.fa-globe{--fa:"\f0ac"}.fa-synagogue{--fa:"\f69b"}.fa-person-half-dress{--fa:"\e548"}.fa-road-bridge{--fa:"\e563"}.fa-location-arrow{--fa:"\f124"}.fa-c{--fa:"\43"}.fa-tablet-button{--fa:"\f10a"}.fa-building-lock{--fa:"\e4d6"}.fa-pizza-slice{--fa:"\f818"}.fa-money-bill-wave{--fa:"\f53a"}.fa-area-chart,.fa-chart-area{--fa:"\f1fe"}.fa-house-flag{--fa:"\e50d"}.fa-person-circle-minus{--fa:"\e540"}.fa-ban,.fa-cancel{--fa:"\f05e"}.fa-camera-rotate{--fa:"\e0d8"}.fa-air-freshener,.fa-spray-can-sparkles{--fa:"\f5d0"}.fa-star{--fa:"\f005"}.fa-repeat{--fa:"\f363"}.fa-cross{--fa:"\f654"}.fa-box{--fa:"\f466"}.fa-venus-mars{--fa:"\f228"}.fa-arrow-pointer,.fa-mouse-pointer{--fa:"\f245"}.fa-expand-arrows-alt,.fa-maximize{--fa:"\f31e"}.fa-charging-station{--fa:"\f5e7"}.fa-shapes,.fa-triangle-circle-square{--fa:"\f61f"}.fa-random,.fa-shuffle{--fa:"\f074"}.fa-person-running,.fa-running{--fa:"\f70c"}.fa-mobile-retro{--fa:"\e527"}.fa-grip-lines-vertical{--fa:"\f7a5"}.fa-spider{--fa:"\f717"}.fa-hands-bound{--fa:"\e4f9"}.fa-file-invoice-dollar{--fa:"\f571"}.fa-plane-circle-exclamation{--fa:"\e556"}.fa-x-ray{--fa:"\f497"}.fa-spell-check{--fa:"\f891"}.fa-slash{--fa:"\f715"}.fa-computer-mouse,.fa-mouse{--fa:"\f8cc"}.fa-arrow-right-to-bracket,.fa-sign-in{--fa:"\f090"}.fa-shop-slash,.fa-store-alt-slash{--fa:"\e070"}.fa-server{--fa:"\f233"}.fa-virus-covid-slash{--fa:"\e4a9"}.fa-shop-lock{--fa:"\e4a5"}.fa-hourglass-1,.fa-hourglass-start{--fa:"\f251"}.fa-blender-phone{--fa:"\f6b6"}.fa-building-wheat{--fa:"\e4db"}.fa-person-breastfeeding{--fa:"\e53a"}.fa-right-to-bracket,.fa-sign-in-alt{--fa:"\f2f6"}.fa-venus{--fa:"\f221"}.fa-passport{--fa:"\f5ab"}.fa-thumb-tack-slash,.fa-thumbtack-slash{--fa:"\e68f"}.fa-heart-pulse,.fa-heartbeat{--fa:"\f21e"}.fa-people-carry,.fa-people-carry-box{--fa:"\f4ce"}.fa-temperature-high{--fa:"\f769"}.fa-microchip{--fa:"\f2db"}.fa-crown{--fa:"\f521"}.fa-weight-hanging{--fa:"\f5cd"}.fa-xmarks-lines{--fa:"\e59a"}.fa-file-prescription{--fa:"\f572"}.fa-weight,.fa-weight-scale{--fa:"\f496"}.fa-user-friends,.fa-user-group{--fa:"\f500"}.fa-arrow-up-a-z,.fa-sort-alpha-up{--fa:"\f15e"}.fa-chess-knight{--fa:"\f441"}.fa-face-laugh-squint,.fa-laugh-squint{--fa:"\f59b"}.fa-wheelchair{--fa:"\f193"}.fa-arrow-circle-up,.fa-circle-arrow-up{--fa:"\f0aa"}.fa-toggle-on{--fa:"\f205"}.fa-person-walking,.fa-walking{--fa:"\f554"}.fa-l{--fa:"\4c"}.fa-fire{--fa:"\f06d"}.fa-bed-pulse,.fa-procedures{--fa:"\f487"}.fa-shuttle-space,.fa-space-shuttle{--fa:"\f197"}.fa-face-laugh,.fa-laugh{--fa:"\f599"}.fa-folder-open{--fa:"\f07c"}.fa-heart-circle-plus{--fa:"\e500"}.fa-code-fork{--fa:"\e13b"}.fa-city{--fa:"\f64f"}.fa-microphone-alt,.fa-microphone-lines{--fa:"\f3c9"}.fa-pepper-hot{--fa:"\f816"}.fa-unlock{--fa:"\f09c"}.fa-colon-sign{--fa:"\e140"}.fa-headset{--fa:"\f590"}.fa-store-slash{--fa:"\e071"}.fa-road-circle-xmark{--fa:"\e566"}.fa-user-minus{--fa:"\f503"}.fa-mars-stroke-up,.fa-mars-stroke-v{--fa:"\f22a"}.fa-champagne-glasses,.fa-glass-cheers{--fa:"\f79f"}.fa-clipboard{--fa:"\f328"}.fa-house-circle-exclamation{--fa:"\e50a"}.fa-file-arrow-up,.fa-file-upload{--fa:"\f574"}.fa-wifi,.fa-wifi-3,.fa-wifi-strong{--fa:"\f1eb"}.fa-bath,.fa-bathtub{--fa:"\f2cd"}.fa-underline{--fa:"\f0cd"}.fa-user-edit,.fa-user-pen{--fa:"\f4ff"}.fa-signature{--fa:"\f5b7"}.fa-stroopwafel{--fa:"\f551"}.fa-bold{--fa:"\f032"}.fa-anchor-lock{--fa:"\e4ad"}.fa-building-ngo{--fa:"\e4d7"}.fa-manat-sign{--fa:"\e1d5"}.fa-not-equal{--fa:"\f53e"}.fa-border-style,.fa-border-top-left{--fa:"\f853"}.fa-map-location-dot,.fa-map-marked-alt{--fa:"\f5a0"}.fa-jedi{--fa:"\f669"}.fa-poll,.fa-square-poll-vertical{--fa:"\f681"}.fa-mug-hot{--fa:"\f7b6"}.fa-battery-car,.fa-car-battery{--fa:"\f5df"}.fa-gift{--fa:"\f06b"}.fa-dice-two{--fa:"\f528"}.fa-chess-queen{--fa:"\f445"}.fa-glasses{--fa:"\f530"}.fa-chess-board{--fa:"\f43c"}.fa-building-circle-check{--fa:"\e4d2"}.fa-person-chalkboard{--fa:"\e53d"}.fa-mars-stroke-h,.fa-mars-stroke-right{--fa:"\f22b"}.fa-hand-back-fist,.fa-hand-rock{--fa:"\f255"}.fa-caret-square-up,.fa-square-caret-up{--fa:"\f151"}.fa-cloud-showers-water{--fa:"\e4e4"}.fa-bar-chart,.fa-chart-bar{--fa:"\f080"}.fa-hands-bubbles,.fa-hands-wash{--fa:"\e05e"}.fa-less-than-equal{--fa:"\f537"}.fa-train{--fa:"\f238"}.fa-eye-low-vision,.fa-low-vision{--fa:"\f2a8"}.fa-crow{--fa:"\f520"}.fa-sailboat{--fa:"\e445"}.fa-window-restore{--fa:"\f2d2"}.fa-plus-square,.fa-square-plus{--fa:"\f0fe"}.fa-torii-gate{--fa:"\f6a1"}.fa-frog{--fa:"\f52e"}.fa-bucket{--fa:"\e4cf"}.fa-image{--fa:"\f03e"}.fa-microphone{--fa:"\f130"}.fa-cow{--fa:"\f6c8"}.fa-caret-up{--fa:"\f0d8"}.fa-screwdriver{--fa:"\f54a"}.fa-folder-closed{--fa:"\e185"}.fa-house-tsunami{--fa:"\e515"}.fa-square-nfi{--fa:"\e576"}.fa-arrow-up-from-ground-water{--fa:"\e4b5"}.fa-glass-martini-alt,.fa-martini-glass{--fa:"\f57b"}.fa-square-binary{--fa:"\e69b"}.fa-rotate-back,.fa-rotate-backward,.fa-rotate-left,.fa-undo-alt{--fa:"\f2ea"}.fa-columns,.fa-table-columns{--fa:"\f0db"}.fa-lemon{--fa:"\f094"}.fa-head-side-mask{--fa:"\e063"}.fa-handshake{--fa:"\f2b5"}.fa-gem{--fa:"\f3a5"}.fa-dolly,.fa-dolly-box{--fa:"\f472"}.fa-smoking{--fa:"\f48d"}.fa-compress-arrows-alt,.fa-minimize{--fa:"\f78c"}.fa-monument{--fa:"\f5a6"}.fa-snowplow{--fa:"\f7d2"}.fa-angle-double-right,.fa-angles-right{--fa:"\f101"}.fa-cannabis{--fa:"\f55f"}.fa-circle-play,.fa-play-circle{--fa:"\f144"}.fa-tablets{--fa:"\f490"}.fa-ethernet{--fa:"\f796"}.fa-eur,.fa-euro,.fa-euro-sign{--fa:"\f153"}.fa-chair{--fa:"\f6c0"}.fa-check-circle,.fa-circle-check{--fa:"\f058"}.fa-circle-stop,.fa-stop-circle{--fa:"\f28d"}.fa-compass-drafting,.fa-drafting-compass{--fa:"\f568"}.fa-plate-wheat{--fa:"\e55a"}.fa-icicles{--fa:"\f7ad"}.fa-person-shelter{--fa:"\e54f"}.fa-neuter{--fa:"\f22c"}.fa-id-badge{--fa:"\f2c1"}.fa-marker{--fa:"\f5a1"}.fa-face-laugh-beam,.fa-laugh-beam{--fa:"\f59a"}.fa-helicopter-symbol{--fa:"\e502"}.fa-universal-access{--fa:"\f29a"}.fa-chevron-circle-up,.fa-circle-chevron-up{--fa:"\f139"}.fa-lari-sign{--fa:"\e1c8"}.fa-volcano{--fa:"\f770"}.fa-person-walking-dashed-line-arrow-right{--fa:"\e553"}.fa-gbp,.fa-pound-sign,.fa-sterling-sign{--fa:"\f154"}.fa-viruses{--fa:"\e076"}.fa-square-person-confined{--fa:"\e577"}.fa-user-tie{--fa:"\f508"}.fa-arrow-down-long,.fa-long-arrow-down{--fa:"\f175"}.fa-tent-arrow-down-to-line{--fa:"\e57e"}.fa-certificate{--fa:"\f0a3"}.fa-mail-reply-all,.fa-reply-all{--fa:"\f122"}.fa-suitcase{--fa:"\f0f2"}.fa-person-skating,.fa-skating{--fa:"\f7c5"}.fa-filter-circle-dollar,.fa-funnel-dollar{--fa:"\f662"}.fa-camera-retro{--fa:"\f083"}.fa-arrow-circle-down,.fa-circle-arrow-down{--fa:"\f0ab"}.fa-arrow-right-to-file,.fa-file-import{--fa:"\f56f"}.fa-external-link-square,.fa-square-arrow-up-right{--fa:"\f14c"}.fa-box-open{--fa:"\f49e"}.fa-scroll{--fa:"\f70e"}.fa-spa{--fa:"\f5bb"}.fa-location-pin-lock{--fa:"\e51f"}.fa-pause{--fa:"\f04c"}.fa-hill-avalanche{--fa:"\e507"}.fa-temperature-0,.fa-temperature-empty,.fa-thermometer-0,.fa-thermometer-empty{--fa:"\f2cb"}.fa-bomb{--fa:"\f1e2"}.fa-registered{--fa:"\f25d"}.fa-address-card,.fa-contact-card,.fa-vcard{--fa:"\f2bb"}.fa-balance-scale-right,.fa-scale-unbalanced-flip{--fa:"\f516"}.fa-subscript{--fa:"\f12c"}.fa-diamond-turn-right,.fa-directions{--fa:"\f5eb"}.fa-burst{--fa:"\e4dc"}.fa-house-laptop,.fa-laptop-house{--fa:"\e066"}.fa-face-tired,.fa-tired{--fa:"\f5c8"}.fa-money-bills{--fa:"\e1f3"}.fa-smog{--fa:"\f75f"}.fa-crutch{--fa:"\f7f7"}.fa-cloud-arrow-up,.fa-cloud-upload,.fa-cloud-upload-alt{--fa:"\f0ee"}.fa-palette{--fa:"\f53f"}.fa-arrows-turn-right{--fa:"\e4c0"}.fa-vest{--fa:"\e085"}.fa-ferry{--fa:"\e4ea"}.fa-arrows-down-to-people{--fa:"\e4b9"}.fa-seedling,.fa-sprout{--fa:"\f4d8"}.fa-arrows-alt-h,.fa-left-right{--fa:"\f337"}.fa-boxes-packing{--fa:"\e4c7"}.fa-arrow-circle-left,.fa-circle-arrow-left{--fa:"\f0a8"}.fa-group-arrows-rotate{--fa:"\e4f6"}.fa-bowl-food{--fa:"\e4c6"}.fa-candy-cane{--fa:"\f786"}.fa-arrow-down-wide-short,.fa-sort-amount-asc,.fa-sort-amount-down{--fa:"\f160"}.fa-cloud-bolt,.fa-thunderstorm{--fa:"\f76c"}.fa-remove-format,.fa-text-slash{--fa:"\f87d"}.fa-face-smile-wink,.fa-smile-wink{--fa:"\f4da"}.fa-file-word{--fa:"\f1c2"}.fa-file-powerpoint{--fa:"\f1c4"}.fa-arrows-h,.fa-arrows-left-right{--fa:"\f07e"}.fa-house-lock{--fa:"\e510"}.fa-cloud-arrow-down,.fa-cloud-download,.fa-cloud-download-alt{--fa:"\f0ed"}.fa-children{--fa:"\e4e1"}.fa-blackboard,.fa-chalkboard{--fa:"\f51b"}.fa-user-alt-slash,.fa-user-large-slash{--fa:"\f4fa"}.fa-envelope-open{--fa:"\f2b6"}.fa-handshake-alt-slash,.fa-handshake-simple-slash{--fa:"\e05f"}.fa-mattress-pillow{--fa:"\e525"}.fa-guarani-sign{--fa:"\e19a"}.fa-arrows-rotate,.fa-refresh,.fa-sync{--fa:"\f021"}.fa-fire-extinguisher{--fa:"\f134"}.fa-cruzeiro-sign{--fa:"\e152"}.fa-greater-than-equal{--fa:"\f532"}.fa-shield-alt,.fa-shield-halved{--fa:"\f3ed"}.fa-atlas,.fa-book-atlas{--fa:"\f558"}.fa-virus{--fa:"\e074"}.fa-envelope-circle-check{--fa:"\e4e8"}.fa-layer-group{--fa:"\f5fd"}.fa-arrows-to-dot{--fa:"\e4be"}.fa-archway{--fa:"\f557"}.fa-heart-circle-check{--fa:"\e4fd"}.fa-house-chimney-crack,.fa-house-damage{--fa:"\f6f1"}.fa-file-archive,.fa-file-zipper{--fa:"\f1c6"}.fa-square{--fa:"\f0c8"}.fa-glass-martini,.fa-martini-glass-empty{--fa:"\f000"}.fa-couch{--fa:"\f4b8"}.fa-cedi-sign{--fa:"\e0df"}.fa-italic{--fa:"\f033"}.fa-table-cells-column-lock{--fa:"\e678"}.fa-church{--fa:"\f51d"}.fa-comments-dollar{--fa:"\f653"}.fa-democrat{--fa:"\f747"}.fa-z{--fa:"\5a"}.fa-person-skiing,.fa-skiing{--fa:"\f7c9"}.fa-road-lock{--fa:"\e567"}.fa-a{--fa:"\41"}.fa-temperature-arrow-down,.fa-temperature-down{--fa:"\e03f"}.fa-feather-alt,.fa-feather-pointed{--fa:"\f56b"}.fa-p{--fa:"\50"}.fa-snowflake{--fa:"\f2dc"}.fa-newspaper{--fa:"\f1ea"}.fa-ad,.fa-rectangle-ad{--fa:"\f641"}.fa-arrow-circle-right,.fa-circle-arrow-right{--fa:"\f0a9"}.fa-filter-circle-xmark{--fa:"\e17b"}.fa-locust{--fa:"\e520"}.fa-sort,.fa-unsorted{--fa:"\f0dc"}.fa-list-1-2,.fa-list-numeric,.fa-list-ol{--fa:"\f0cb"}.fa-person-dress-burst{--fa:"\e544"}.fa-money-check-alt,.fa-money-check-dollar{--fa:"\f53d"}.fa-vector-square{--fa:"\f5cb"}.fa-bread-slice{--fa:"\f7ec"}.fa-language{--fa:"\f1ab"}.fa-face-kiss-wink-heart,.fa-kiss-wink-heart{--fa:"\f598"}.fa-filter{--fa:"\f0b0"}.fa-question{--fa:"\3f"}.fa-file-signature{--fa:"\f573"}.fa-arrows-alt,.fa-up-down-left-right{--fa:"\f0b2"}.fa-house-chimney-user{--fa:"\e065"}.fa-hand-holding-heart{--fa:"\f4be"}.fa-puzzle-piece{--fa:"\f12e"}.fa-money-check{--fa:"\f53c"}.fa-star-half-alt,.fa-star-half-stroke{--fa:"\f5c0"}.fa-code{--fa:"\f121"}.fa-glass-whiskey,.fa-whiskey-glass{--fa:"\f7a0"}.fa-building-circle-exclamation{--fa:"\e4d3"}.fa-magnifying-glass-chart{--fa:"\e522"}.fa-arrow-up-right-from-square,.fa-external-link{--fa:"\f08e"}.fa-cubes-stacked{--fa:"\e4e6"}.fa-krw,.fa-won,.fa-won-sign{--fa:"\f159"}.fa-virus-covid{--fa:"\e4a8"}.fa-austral-sign{--fa:"\e0a9"}.fa-f{--fa:"\46"}.fa-leaf{--fa:"\f06c"}.fa-road{--fa:"\f018"}.fa-cab,.fa-taxi{--fa:"\f1ba"}.fa-person-circle-plus{--fa:"\e541"}.fa-chart-pie,.fa-pie-chart{--fa:"\f200"}.fa-bolt-lightning{--fa:"\e0b7"}.fa-sack-xmark{--fa:"\e56a"}.fa-file-excel{--fa:"\f1c3"}.fa-file-contract{--fa:"\f56c"}.fa-fish-fins{--fa:"\e4f2"}.fa-building-flag{--fa:"\e4d5"}.fa-face-grin-beam,.fa-grin-beam{--fa:"\f582"}.fa-object-ungroup{--fa:"\f248"}.fa-poop{--fa:"\f619"}.fa-location-pin,.fa-map-marker{--fa:"\f041"}.fa-kaaba{--fa:"\f66b"}.fa-toilet-paper{--fa:"\f71e"}.fa-hard-hat,.fa-hat-hard,.fa-helmet-safety{--fa:"\f807"}.fa-eject{--fa:"\f052"}.fa-arrow-alt-circle-right,.fa-circle-right{--fa:"\f35a"}.fa-plane-circle-check{--fa:"\e555"}.fa-face-rolling-eyes,.fa-meh-rolling-eyes{--fa:"\f5a5"}.fa-object-group{--fa:"\f247"}.fa-chart-line,.fa-line-chart{--fa:"\f201"}.fa-mask-ventilator{--fa:"\e524"}.fa-arrow-right{--fa:"\f061"}.fa-map-signs,.fa-signs-post{--fa:"\f277"}.fa-cash-register{--fa:"\f788"}.fa-person-circle-question{--fa:"\e542"}.fa-h{--fa:"\48"}.fa-tarp{--fa:"\e57b"}.fa-screwdriver-wrench,.fa-tools{--fa:"\f7d9"}.fa-arrows-to-eye{--fa:"\e4bf"}.fa-plug-circle-bolt{--fa:"\e55b"}.fa-heart{--fa:"\f004"}.fa-mars-and-venus{--fa:"\f224"}.fa-home-user,.fa-house-user{--fa:"\e1b0"}.fa-dumpster-fire{--fa:"\f794"}.fa-house-crack{--fa:"\e3b1"}.fa-cocktail,.fa-martini-glass-citrus{--fa:"\f561"}.fa-face-surprise,.fa-surprise{--fa:"\f5c2"}.fa-bottle-water{--fa:"\e4c5"}.fa-circle-pause,.fa-pause-circle{--fa:"\f28b"}.fa-toilet-paper-slash{--fa:"\e072"}.fa-apple-alt,.fa-apple-whole{--fa:"\f5d1"}.fa-kitchen-set{--fa:"\e51a"}.fa-r{--fa:"\52"}.fa-temperature-1,.fa-temperature-quarter,.fa-thermometer-1,.fa-thermometer-quarter{--fa:"\f2ca"}.fa-cube{--fa:"\f1b2"}.fa-bitcoin-sign{--fa:"\e0b4"}.fa-shield-dog{--fa:"\e573"}.fa-solar-panel{--fa:"\f5ba"}.fa-lock-open{--fa:"\f3c1"}.fa-elevator{--fa:"\e16d"}.fa-money-bill-transfer{--fa:"\e528"}.fa-money-bill-trend-up{--fa:"\e529"}.fa-house-flood-water-circle-arrow-right{--fa:"\e50f"}.fa-poll-h,.fa-square-poll-horizontal{--fa:"\f682"}.fa-circle{--fa:"\f111"}.fa-backward-fast,.fa-fast-backward{--fa:"\f049"}.fa-recycle{--fa:"\f1b8"}.fa-user-astronaut{--fa:"\f4fb"}.fa-plane-slash{--fa:"\e069"}.fa-trademark{--fa:"\f25c"}.fa-basketball,.fa-basketball-ball{--fa:"\f434"}.fa-satellite-dish{--fa:"\f7c0"}.fa-arrow-alt-circle-up,.fa-circle-up{--fa:"\f35b"}.fa-mobile-alt,.fa-mobile-screen-button{--fa:"\f3cd"}.fa-volume-high,.fa-volume-up{--fa:"\f028"}.fa-users-rays{--fa:"\e593"}.fa-wallet{--fa:"\f555"}.fa-clipboard-check{--fa:"\f46c"}.fa-file-audio{--fa:"\f1c7"}.fa-burger,.fa-hamburger{--fa:"\f805"}.fa-wrench{--fa:"\f0ad"}.fa-bugs{--fa:"\e4d0"}.fa-rupee,.fa-rupee-sign{--fa:"\f156"}.fa-file-image{--fa:"\f1c5"}.fa-circle-question,.fa-question-circle{--fa:"\f059"}.fa-plane-departure{--fa:"\f5b0"}.fa-handshake-slash{--fa:"\e060"}.fa-book-bookmark{--fa:"\e0bb"}.fa-code-branch{--fa:"\f126"}.fa-hat-cowboy{--fa:"\f8c0"}.fa-bridge{--fa:"\e4c8"}.fa-phone-alt,.fa-phone-flip{--fa:"\f879"}.fa-truck-front{--fa:"\e2b7"}.fa-cat{--fa:"\f6be"}.fa-anchor-circle-exclamation{--fa:"\e4ab"}.fa-truck-field{--fa:"\e58d"}.fa-route{--fa:"\f4d7"}.fa-clipboard-question{--fa:"\e4e3"}.fa-panorama{--fa:"\e209"}.fa-comment-medical{--fa:"\f7f5"}.fa-teeth-open{--fa:"\f62f"}.fa-file-circle-minus{--fa:"\e4ed"}.fa-tags{--fa:"\f02c"}.fa-wine-glass{--fa:"\f4e3"}.fa-fast-forward,.fa-forward-fast{--fa:"\f050"}.fa-face-meh-blank,.fa-meh-blank{--fa:"\f5a4"}.fa-parking,.fa-square-parking{--fa:"\f540"}.fa-house-signal{--fa:"\e012"}.fa-bars-progress,.fa-tasks-alt{--fa:"\f828"}.fa-faucet-drip{--fa:"\e006"}.fa-cart-flatbed,.fa-dolly-flatbed{--fa:"\f474"}.fa-ban-smoking,.fa-smoking-ban{--fa:"\f54d"}.fa-terminal{--fa:"\f120"}.fa-mobile-button{--fa:"\f10b"}.fa-house-medical-flag{--fa:"\e514"}.fa-basket-shopping,.fa-shopping-basket{--fa:"\f291"}.fa-tape{--fa:"\f4db"}.fa-bus-alt,.fa-bus-simple{--fa:"\f55e"}.fa-eye{--fa:"\f06e"}.fa-face-sad-cry,.fa-sad-cry{--fa:"\f5b3"}.fa-audio-description{--fa:"\f29e"}.fa-person-military-to-person{--fa:"\e54c"}.fa-file-shield{--fa:"\e4f0"}.fa-user-slash{--fa:"\f506"}.fa-pen{--fa:"\f304"}.fa-tower-observation{--fa:"\e586"}.fa-file-code{--fa:"\f1c9"}.fa-signal,.fa-signal-5,.fa-signal-perfect{--fa:"\f012"}.fa-bus{--fa:"\f207"}.fa-heart-circle-xmark{--fa:"\e501"}.fa-home-lg,.fa-house-chimney{--fa:"\e3af"}.fa-window-maximize{--fa:"\f2d0"}.fa-face-frown,.fa-frown{--fa:"\f119"}.fa-prescription{--fa:"\f5b1"}.fa-shop,.fa-store-alt{--fa:"\f54f"}.fa-floppy-disk,.fa-save{--fa:"\f0c7"}.fa-vihara{--fa:"\f6a7"}.fa-balance-scale-left,.fa-scale-unbalanced{--fa:"\f515"}.fa-sort-asc,.fa-sort-up{--fa:"\f0de"}.fa-comment-dots,.fa-commenting{--fa:"\f4ad"}.fa-plant-wilt{--fa:"\e5aa"}.fa-diamond{--fa:"\f219"}.fa-face-grin-squint,.fa-grin-squint{--fa:"\f585"}.fa-hand-holding-dollar,.fa-hand-holding-usd{--fa:"\f4c0"}.fa-chart-diagram{--fa:"\e695"}.fa-bacterium{--fa:"\e05a"}.fa-hand-pointer{--fa:"\f25a"}.fa-drum-steelpan{--fa:"\f56a"}.fa-hand-scissors{--fa:"\f257"}.fa-hands-praying,.fa-praying-hands{--fa:"\f684"}.fa-arrow-right-rotate,.fa-arrow-rotate-forward,.fa-arrow-rotate-right,.fa-redo{--fa:"\f01e"}.fa-biohazard{--fa:"\f780"}.fa-location,.fa-location-crosshairs{--fa:"\f601"}.fa-mars-double{--fa:"\f227"}.fa-child-dress{--fa:"\e59c"}.fa-users-between-lines{--fa:"\e591"}.fa-lungs-virus{--fa:"\e067"}.fa-face-grin-tears,.fa-grin-tears{--fa:"\f588"}.fa-phone{--fa:"\f095"}.fa-calendar-times,.fa-calendar-xmark{--fa:"\f273"}.fa-child-reaching{--fa:"\e59d"}.fa-head-side-virus{--fa:"\e064"}.fa-user-cog,.fa-user-gear{--fa:"\f4fe"}.fa-arrow-up-1-9,.fa-sort-numeric-up{--fa:"\f163"}.fa-door-closed{--fa:"\f52a"}.fa-shield-virus{--fa:"\e06c"}.fa-dice-six{--fa:"\f526"}.fa-mosquito-net{--fa:"\e52c"}.fa-file-fragment{--fa:"\e697"}.fa-bridge-water{--fa:"\e4ce"}.fa-person-booth{--fa:"\f756"}.fa-text-width{--fa:"\f035"}.fa-hat-wizard{--fa:"\f6e8"}.fa-pen-fancy{--fa:"\f5ac"}.fa-digging,.fa-person-digging{--fa:"\f85e"}.fa-trash{--fa:"\f1f8"}.fa-gauge-simple,.fa-gauge-simple-med,.fa-tachometer-average{--fa:"\f629"}.fa-book-medical{--fa:"\f7e6"}.fa-poo{--fa:"\f2fe"}.fa-quote-right,.fa-quote-right-alt{--fa:"\f10e"}.fa-shirt,.fa-t-shirt,.fa-tshirt{--fa:"\f553"}.fa-cubes{--fa:"\f1b3"}.fa-divide{--fa:"\f529"}.fa-tenge,.fa-tenge-sign{--fa:"\f7d7"}.fa-headphones{--fa:"\f025"}.fa-hands-holding{--fa:"\f4c2"}.fa-hands-clapping{--fa:"\e1a8"}.fa-republican{--fa:"\f75e"}.fa-arrow-left{--fa:"\f060"}.fa-person-circle-xmark{--fa:"\e543"}.fa-ruler{--fa:"\f545"}.fa-align-left{--fa:"\f036"}.fa-dice-d6{--fa:"\f6d1"}.fa-restroom{--fa:"\f7bd"}.fa-j{--fa:"\4a"}.fa-users-viewfinder{--fa:"\e595"}.fa-file-video{--fa:"\f1c8"}.fa-external-link-alt,.fa-up-right-from-square{--fa:"\f35d"}.fa-table-cells,.fa-th{--fa:"\f00a"}.fa-file-pdf{--fa:"\f1c1"}.fa-bible,.fa-book-bible{--fa:"\f647"}.fa-o{--fa:"\4f"}.fa-medkit,.fa-suitcase-medical{--fa:"\f0fa"}.fa-user-secret{--fa:"\f21b"}.fa-otter{--fa:"\f700"}.fa-female,.fa-person-dress{--fa:"\f182"}.fa-comment-dollar{--fa:"\f651"}.fa-briefcase-clock,.fa-business-time{--fa:"\f64a"}.fa-table-cells-large,.fa-th-large{--fa:"\f009"}.fa-book-tanakh,.fa-tanakh{--fa:"\f827"}.fa-phone-volume,.fa-volume-control-phone{--fa:"\f2a0"}.fa-hat-cowboy-side{--fa:"\f8c1"}.fa-clipboard-user{--fa:"\f7f3"}.fa-child{--fa:"\f1ae"}.fa-lira-sign{--fa:"\f195"}.fa-satellite{--fa:"\f7bf"}.fa-plane-lock{--fa:"\e558"}.fa-tag{--fa:"\f02b"}.fa-comment{--fa:"\f075"}.fa-birthday-cake,.fa-cake,.fa-cake-candles{--fa:"\f1fd"}.fa-envelope{--fa:"\f0e0"}.fa-angle-double-up,.fa-angles-up{--fa:"\f102"}.fa-paperclip{--fa:"\f0c6"}.fa-arrow-right-to-city{--fa:"\e4b3"}.fa-ribbon{--fa:"\f4d6"}.fa-lungs{--fa:"\f604"}.fa-arrow-up-9-1,.fa-sort-numeric-up-alt{--fa:"\f887"}.fa-litecoin-sign{--fa:"\e1d3"}.fa-border-none{--fa:"\f850"}.fa-circle-nodes{--fa:"\e4e2"}.fa-parachute-box{--fa:"\f4cd"}.fa-indent{--fa:"\f03c"}.fa-truck-field-un{--fa:"\e58e"}.fa-hourglass,.fa-hourglass-empty{--fa:"\f254"}.fa-mountain{--fa:"\f6fc"}.fa-user-doctor,.fa-user-md{--fa:"\f0f0"}.fa-circle-info,.fa-info-circle{--fa:"\f05a"}.fa-cloud-meatball{--fa:"\f73b"}.fa-camera,.fa-camera-alt{--fa:"\f030"}.fa-square-virus{--fa:"\e578"}.fa-meteor{--fa:"\f753"}.fa-car-on{--fa:"\e4dd"}.fa-sleigh{--fa:"\f7cc"}.fa-arrow-down-1-9,.fa-sort-numeric-asc,.fa-sort-numeric-down{--fa:"\f162"}.fa-hand-holding-droplet,.fa-hand-holding-water{--fa:"\f4c1"}.fa-water{--fa:"\f773"}.fa-calendar-check{--fa:"\f274"}.fa-braille{--fa:"\f2a1"}.fa-prescription-bottle-alt,.fa-prescription-bottle-medical{--fa:"\f486"}.fa-landmark{--fa:"\f66f"}.fa-truck{--fa:"\f0d1"}.fa-crosshairs{--fa:"\f05b"}.fa-person-cane{--fa:"\e53c"}.fa-tent{--fa:"\e57d"}.fa-vest-patches{--fa:"\e086"}.fa-check-double{--fa:"\f560"}.fa-arrow-down-a-z,.fa-sort-alpha-asc,.fa-sort-alpha-down{--fa:"\f15d"}.fa-money-bill-wheat{--fa:"\e52a"}.fa-cookie{--fa:"\f563"}.fa-arrow-left-rotate,.fa-arrow-rotate-back,.fa-arrow-rotate-backward,.fa-arrow-rotate-left,.fa-undo{--fa:"\f0e2"}.fa-hard-drive,.fa-hdd{--fa:"\f0a0"}.fa-face-grin-squint-tears,.fa-grin-squint-tears{--fa:"\f586"}.fa-dumbbell{--fa:"\f44b"}.fa-list-alt,.fa-rectangle-list{--fa:"\f022"}.fa-tarp-droplet{--fa:"\e57c"}.fa-house-medical-circle-check{--fa:"\e511"}.fa-person-skiing-nordic,.fa-skiing-nordic{--fa:"\f7ca"}.fa-calendar-plus{--fa:"\f271"}.fa-plane-arrival{--fa:"\f5af"}.fa-arrow-alt-circle-left,.fa-circle-left{--fa:"\f359"}.fa-subway,.fa-train-subway{--fa:"\f239"}.fa-chart-gantt{--fa:"\e0e4"}.fa-indian-rupee,.fa-indian-rupee-sign,.fa-inr{--fa:"\e1bc"}.fa-crop-alt,.fa-crop-simple{--fa:"\f565"}.fa-money-bill-1,.fa-money-bill-alt{--fa:"\f3d1"}.fa-left-long,.fa-long-arrow-alt-left{--fa:"\f30a"}.fa-dna{--fa:"\f471"}.fa-virus-slash{--fa:"\e075"}.fa-minus,.fa-subtract{--fa:"\f068"}.fa-chess{--fa:"\f439"}.fa-arrow-left-long,.fa-long-arrow-left{--fa:"\f177"}.fa-plug-circle-check{--fa:"\e55c"}.fa-street-view{--fa:"\f21d"}.fa-franc-sign{--fa:"\e18f"}.fa-volume-off{--fa:"\f026"}.fa-american-sign-language-interpreting,.fa-asl-interpreting,.fa-hands-american-sign-language-interpreting,.fa-hands-asl-interpreting{--fa:"\f2a3"}.fa-cog,.fa-gear{--fa:"\f013"}.fa-droplet-slash,.fa-tint-slash{--fa:"\f5c7"}.fa-mosque{--fa:"\f678"}.fa-mosquito{--fa:"\e52b"}.fa-star-of-david{--fa:"\f69a"}.fa-person-military-rifle{--fa:"\e54b"}.fa-cart-shopping,.fa-shopping-cart{--fa:"\f07a"}.fa-vials{--fa:"\f493"}.fa-plug-circle-plus{--fa:"\e55f"}.fa-place-of-worship{--fa:"\f67f"}.fa-grip-vertical{--fa:"\f58e"}.fa-hexagon-nodes{--fa:"\e699"}.fa-arrow-turn-up,.fa-level-up{--fa:"\f148"}.fa-u{--fa:"\55"}.fa-square-root-alt,.fa-square-root-variable{--fa:"\f698"}.fa-clock,.fa-clock-four{--fa:"\f017"}.fa-backward-step,.fa-step-backward{--fa:"\f048"}.fa-pallet{--fa:"\f482"}.fa-faucet{--fa:"\e005"}.fa-baseball-bat-ball{--fa:"\f432"}.fa-s{--fa:"\53"}.fa-timeline{--fa:"\e29c"}.fa-keyboard{--fa:"\f11c"}.fa-caret-down{--fa:"\f0d7"}.fa-clinic-medical,.fa-house-chimney-medical{--fa:"\f7f2"}.fa-temperature-3,.fa-temperature-three-quarters,.fa-thermometer-3,.fa-thermometer-three-quarters{--fa:"\f2c8"}.fa-mobile-android-alt,.fa-mobile-screen{--fa:"\f3cf"}.fa-plane-up{--fa:"\e22d"}.fa-piggy-bank{--fa:"\f4d3"}.fa-battery-3,.fa-battery-half{--fa:"\f242"}.fa-mountain-city{--fa:"\e52e"}.fa-coins{--fa:"\f51e"}.fa-khanda{--fa:"\f66d"}.fa-sliders,.fa-sliders-h{--fa:"\f1de"}.fa-folder-tree{--fa:"\f802"}.fa-network-wired{--fa:"\f6ff"}.fa-map-pin{--fa:"\f276"}.fa-hamsa{--fa:"\f665"}.fa-cent-sign{--fa:"\e3f5"}.fa-flask{--fa:"\f0c3"}.fa-person-pregnant{--fa:"\e31e"}.fa-wand-sparkles{--fa:"\f72b"}.fa-ellipsis-v,.fa-ellipsis-vertical{--fa:"\f142"}.fa-ticket{--fa:"\f145"}.fa-power-off{--fa:"\f011"}.fa-long-arrow-alt-right,.fa-right-long{--fa:"\f30b"}.fa-flag-usa{--fa:"\f74d"}.fa-laptop-file{--fa:"\e51d"}.fa-teletype,.fa-tty{--fa:"\f1e4"}.fa-diagram-next{--fa:"\e476"}.fa-person-rifle{--fa:"\e54e"}.fa-house-medical-circle-exclamation{--fa:"\e512"}.fa-closed-captioning{--fa:"\f20a"}.fa-hiking,.fa-person-hiking{--fa:"\f6ec"}.fa-venus-double{--fa:"\f226"}.fa-images{--fa:"\f302"}.fa-calculator{--fa:"\f1ec"}.fa-people-pulling{--fa:"\e535"}.fa-n{--fa:"\4e"}.fa-cable-car,.fa-tram{--fa:"\f7da"}.fa-cloud-rain{--fa:"\f73d"}.fa-building-circle-xmark{--fa:"\e4d4"}.fa-ship{--fa:"\f21a"}.fa-arrows-down-to-line{--fa:"\e4b8"}.fa-download{--fa:"\f019"}.fa-face-grin,.fa-grin{--fa:"\f580"}.fa-backspace,.fa-delete-left{--fa:"\f55a"}.fa-eye-dropper,.fa-eye-dropper-empty,.fa-eyedropper{--fa:"\f1fb"}.fa-file-circle-check{--fa:"\e5a0"}.fa-forward{--fa:"\f04e"}.fa-mobile,.fa-mobile-android,.fa-mobile-phone{--fa:"\f3ce"}.fa-face-meh,.fa-meh{--fa:"\f11a"}.fa-align-center{--fa:"\f037"}.fa-book-dead,.fa-book-skull{--fa:"\f6b7"}.fa-drivers-license,.fa-id-card{--fa:"\f2c2"}.fa-dedent,.fa-outdent{--fa:"\f03b"}.fa-heart-circle-exclamation{--fa:"\e4fe"}.fa-home,.fa-home-alt,.fa-home-lg-alt,.fa-house{--fa:"\f015"}.fa-calendar-week{--fa:"\f784"}.fa-laptop-medical{--fa:"\f812"}.fa-b{--fa:"\42"}.fa-file-medical{--fa:"\f477"}.fa-dice-one{--fa:"\f525"}.fa-kiwi-bird{--fa:"\f535"}.fa-arrow-right-arrow-left,.fa-exchange{--fa:"\f0ec"}.fa-redo-alt,.fa-rotate-forward,.fa-rotate-right{--fa:"\f2f9"}.fa-cutlery,.fa-utensils{--fa:"\f2e7"}.fa-arrow-up-wide-short,.fa-sort-amount-up{--fa:"\f161"}.fa-mill-sign{--fa:"\e1ed"}.fa-bowl-rice{--fa:"\e2eb"}.fa-skull{--fa:"\f54c"}.fa-broadcast-tower,.fa-tower-broadcast{--fa:"\f519"}.fa-truck-pickup{--fa:"\f63c"}.fa-long-arrow-alt-up,.fa-up-long{--fa:"\f30c"}.fa-stop{--fa:"\f04d"}.fa-code-merge{--fa:"\f387"}.fa-upload{--fa:"\f093"}.fa-hurricane{--fa:"\f751"}.fa-mound{--fa:"\e52d"}.fa-toilet-portable{--fa:"\e583"}.fa-compact-disc{--fa:"\f51f"}.fa-file-arrow-down,.fa-file-download{--fa:"\f56d"}.fa-caravan{--fa:"\f8ff"}.fa-shield-cat{--fa:"\e572"}.fa-bolt,.fa-zap{--fa:"\f0e7"}.fa-glass-water{--fa:"\e4f4"}.fa-oil-well{--fa:"\e532"}.fa-vault{--fa:"\e2c5"}.fa-mars{--fa:"\f222"}.fa-toilet{--fa:"\f7d8"}.fa-plane-circle-xmark{--fa:"\e557"}.fa-cny,.fa-jpy,.fa-rmb,.fa-yen,.fa-yen-sign{--fa:"\f157"}.fa-rouble,.fa-rub,.fa-ruble,.fa-ruble-sign{--fa:"\f158"}.fa-sun{--fa:"\f185"}.fa-guitar{--fa:"\f7a6"}.fa-face-laugh-wink,.fa-laugh-wink{--fa:"\f59c"}.fa-horse-head{--fa:"\f7ab"}.fa-bore-hole{--fa:"\e4c3"}.fa-industry{--fa:"\f275"}.fa-arrow-alt-circle-down,.fa-circle-down{--fa:"\f358"}.fa-arrows-turn-to-dots{--fa:"\e4c1"}.fa-florin-sign{--fa:"\e184"}.fa-arrow-down-short-wide,.fa-sort-amount-desc,.fa-sort-amount-down-alt{--fa:"\f884"}.fa-less-than{--fa:"\3c"}.fa-angle-down{--fa:"\f107"}.fa-car-tunnel{--fa:"\e4de"}.fa-head-side-cough{--fa:"\e061"}.fa-grip-lines{--fa:"\f7a4"}.fa-thumbs-down{--fa:"\f165"}.fa-user-lock{--fa:"\f502"}.fa-arrow-right-long,.fa-long-arrow-right{--fa:"\f178"}.fa-anchor-circle-xmark{--fa:"\e4ac"}.fa-ellipsis,.fa-ellipsis-h{--fa:"\f141"}.fa-chess-pawn{--fa:"\f443"}.fa-first-aid,.fa-kit-medical{--fa:"\f479"}.fa-person-through-window{--fa:"\e5a9"}.fa-toolbox{--fa:"\f552"}.fa-hands-holding-circle{--fa:"\e4fb"}.fa-bug{--fa:"\f188"}.fa-credit-card,.fa-credit-card-alt{--fa:"\f09d"}.fa-automobile,.fa-car{--fa:"\f1b9"}.fa-hand-holding-hand{--fa:"\e4f7"}.fa-book-open-reader,.fa-book-reader{--fa:"\f5da"}.fa-mountain-sun{--fa:"\e52f"}.fa-arrows-left-right-to-line{--fa:"\e4ba"}.fa-dice-d20{--fa:"\f6cf"}.fa-truck-droplet{--fa:"\e58c"}.fa-file-circle-xmark{--fa:"\e5a1"}.fa-temperature-arrow-up,.fa-temperature-up{--fa:"\e040"}.fa-medal{--fa:"\f5a2"}.fa-bed{--fa:"\f236"}.fa-h-square,.fa-square-h{--fa:"\f0fd"}.fa-podcast{--fa:"\f2ce"}.fa-temperature-4,.fa-temperature-full,.fa-thermometer-4,.fa-thermometer-full{--fa:"\f2c7"}.fa-bell{--fa:"\f0f3"}.fa-superscript{--fa:"\f12b"}.fa-plug-circle-xmark{--fa:"\e560"}.fa-star-of-life{--fa:"\f621"}.fa-phone-slash{--fa:"\f3dd"}.fa-paint-roller{--fa:"\f5aa"}.fa-hands-helping,.fa-handshake-angle{--fa:"\f4c4"}.fa-location-dot,.fa-map-marker-alt{--fa:"\f3c5"}.fa-file{--fa:"\f15b"}.fa-greater-than{--fa:"\3e"}.fa-person-swimming,.fa-swimmer{--fa:"\f5c4"}.fa-arrow-down{--fa:"\f063"}.fa-droplet,.fa-tint{--fa:"\f043"}.fa-eraser{--fa:"\f12d"}.fa-earth,.fa-earth-america,.fa-earth-americas,.fa-globe-americas{--fa:"\f57d"}.fa-person-burst{--fa:"\e53b"}.fa-dove{--fa:"\f4ba"}.fa-battery-0,.fa-battery-empty{--fa:"\f244"}.fa-socks{--fa:"\f696"}.fa-inbox{--fa:"\f01c"}.fa-section{--fa:"\e447"}.fa-gauge-high,.fa-tachometer-alt,.fa-tachometer-alt-fast{--fa:"\f625"}.fa-envelope-open-text{--fa:"\f658"}.fa-hospital,.fa-hospital-alt,.fa-hospital-wide{--fa:"\f0f8"}.fa-wine-bottle{--fa:"\f72f"}.fa-chess-rook{--fa:"\f447"}.fa-bars-staggered,.fa-reorder,.fa-stream{--fa:"\f550"}.fa-dharmachakra{--fa:"\f655"}.fa-hotdog{--fa:"\f80f"}.fa-blind,.fa-person-walking-with-cane{--fa:"\f29d"}.fa-drum{--fa:"\f569"}.fa-ice-cream{--fa:"\f810"}.fa-heart-circle-bolt{--fa:"\e4fc"}.fa-fax{--fa:"\f1ac"}.fa-paragraph{--fa:"\f1dd"}.fa-check-to-slot,.fa-vote-yea{--fa:"\f772"}.fa-star-half{--fa:"\f089"}.fa-boxes,.fa-boxes-alt,.fa-boxes-stacked{--fa:"\f468"}.fa-chain,.fa-link{--fa:"\f0c1"}.fa-assistive-listening-systems,.fa-ear-listen{--fa:"\f2a2"}.fa-tree-city{--fa:"\e587"}.fa-play{--fa:"\f04b"}.fa-font{--fa:"\f031"}.fa-table-cells-row-lock{--fa:"\e67a"}.fa-rupiah-sign{--fa:"\e23d"}.fa-magnifying-glass,.fa-search{--fa:"\f002"}.fa-ping-pong-paddle-ball,.fa-table-tennis,.fa-table-tennis-paddle-ball{--fa:"\f45d"}.fa-diagnoses,.fa-person-dots-from-line{--fa:"\f470"}.fa-trash-can-arrow-up,.fa-trash-restore-alt{--fa:"\f82a"}.fa-naira-sign{--fa:"\e1f6"}.fa-cart-arrow-down{--fa:"\f218"}.fa-walkie-talkie{--fa:"\f8ef"}.fa-file-edit,.fa-file-pen{--fa:"\f31c"}.fa-receipt{--fa:"\f543"}.fa-pen-square,.fa-pencil-square,.fa-square-pen{--fa:"\f14b"}.fa-suitcase-rolling{--fa:"\f5c1"}.fa-person-circle-exclamation{--fa:"\e53f"}.fa-chevron-down{--fa:"\f078"}.fa-battery,.fa-battery-5,.fa-battery-full{--fa:"\f240"}.fa-skull-crossbones{--fa:"\f714"}.fa-code-compare{--fa:"\e13a"}.fa-list-dots,.fa-list-ul{--fa:"\f0ca"}.fa-school-lock{--fa:"\e56f"}.fa-tower-cell{--fa:"\e585"}.fa-down-long,.fa-long-arrow-alt-down{--fa:"\f309"}.fa-ranking-star{--fa:"\e561"}.fa-chess-king{--fa:"\f43f"}.fa-person-harassing{--fa:"\e549"}.fa-brazilian-real-sign{--fa:"\e46c"}.fa-landmark-alt,.fa-landmark-dome{--fa:"\f752"}.fa-arrow-up{--fa:"\f062"}.fa-television,.fa-tv,.fa-tv-alt{--fa:"\f26c"}.fa-shrimp{--fa:"\e448"}.fa-list-check,.fa-tasks{--fa:"\f0ae"}.fa-jug-detergent{--fa:"\e519"}.fa-circle-user,.fa-user-circle{--fa:"\f2bd"}.fa-user-shield{--fa:"\f505"}.fa-wind{--fa:"\f72e"}.fa-car-burst,.fa-car-crash{--fa:"\f5e1"}.fa-y{--fa:"\59"}.fa-person-snowboarding,.fa-snowboarding{--fa:"\f7ce"}.fa-shipping-fast,.fa-truck-fast{--fa:"\f48b"}.fa-fish{--fa:"\f578"}.fa-user-graduate{--fa:"\f501"}.fa-adjust,.fa-circle-half-stroke{--fa:"\f042"}.fa-clapperboard{--fa:"\e131"}.fa-circle-radiation,.fa-radiation-alt{--fa:"\f7ba"}.fa-baseball,.fa-baseball-ball{--fa:"\f433"}.fa-jet-fighter-up{--fa:"\e518"}.fa-diagram-project,.fa-project-diagram{--fa:"\f542"}.fa-copy{--fa:"\f0c5"}.fa-volume-mute,.fa-volume-times,.fa-volume-xmark{--fa:"\f6a9"}.fa-hand-sparkles{--fa:"\e05d"}.fa-grip,.fa-grip-horizontal{--fa:"\f58d"}.fa-share-from-square,.fa-share-square{--fa:"\f14d"}.fa-child-combatant,.fa-child-rifle{--fa:"\e4e0"}.fa-gun{--fa:"\e19b"}.fa-phone-square,.fa-square-phone{--fa:"\f098"}.fa-add,.fa-plus{--fa:"\2b"}.fa-expand{--fa:"\f065"}.fa-computer{--fa:"\e4e5"}.fa-close,.fa-multiply,.fa-remove,.fa-times,.fa-xmark{--fa:"\f00d"}.fa-arrows,.fa-arrows-up-down-left-right{--fa:"\f047"}.fa-chalkboard-teacher,.fa-chalkboard-user{--fa:"\f51c"}.fa-peso-sign{--fa:"\e222"}.fa-building-shield{--fa:"\e4d8"}.fa-baby{--fa:"\f77c"}.fa-users-line{--fa:"\e592"}.fa-quote-left,.fa-quote-left-alt{--fa:"\f10d"}.fa-tractor{--fa:"\f722"}.fa-trash-arrow-up,.fa-trash-restore{--fa:"\f829"}.fa-arrow-down-up-lock{--fa:"\e4b0"}.fa-lines-leaning{--fa:"\e51e"}.fa-ruler-combined{--fa:"\f546"}.fa-copyright{--fa:"\f1f9"}.fa-equals{--fa:"\3d"}.fa-blender{--fa:"\f517"}.fa-teeth{--fa:"\f62e"}.fa-ils,.fa-shekel,.fa-shekel-sign,.fa-sheqel,.fa-sheqel-sign{--fa:"\f20b"}.fa-map{--fa:"\f279"}.fa-rocket{--fa:"\f135"}.fa-photo-film,.fa-photo-video{--fa:"\f87c"}.fa-folder-minus{--fa:"\f65d"}.fa-hexagon-nodes-bolt{--fa:"\e69a"}.fa-store{--fa:"\f54e"}.fa-arrow-trend-up{--fa:"\e098"}.fa-plug-circle-minus{--fa:"\e55e"}.fa-sign,.fa-sign-hanging{--fa:"\f4d9"}.fa-bezier-curve{--fa:"\f55b"}.fa-bell-slash{--fa:"\f1f6"}.fa-tablet,.fa-tablet-android{--fa:"\f3fb"}.fa-school-flag{--fa:"\e56e"}.fa-fill{--fa:"\f575"}.fa-angle-up{--fa:"\f106"}.fa-drumstick-bite{--fa:"\f6d7"}.fa-holly-berry{--fa:"\f7aa"}.fa-chevron-left{--fa:"\f053"}.fa-bacteria{--fa:"\e059"}.fa-hand-lizard{--fa:"\f258"}.fa-notdef{--fa:"\e1fe"}.fa-disease{--fa:"\f7fa"}.fa-briefcase-medical{--fa:"\f469"}.fa-genderless{--fa:"\f22d"}.fa-chevron-right{--fa:"\f054"}.fa-retweet{--fa:"\f079"}.fa-car-alt,.fa-car-rear{--fa:"\f5de"}.fa-pump-soap{--fa:"\e06b"}.fa-video-slash{--fa:"\f4e2"}.fa-battery-2,.fa-battery-quarter{--fa:"\f243"}.fa-radio{--fa:"\f8d7"}.fa-baby-carriage,.fa-carriage-baby{--fa:"\f77d"}.fa-traffic-light{--fa:"\f637"}.fa-thermometer{--fa:"\f491"}.fa-vr-cardboard{--fa:"\f729"}.fa-hand-middle-finger{--fa:"\f806"}.fa-percent,.fa-percentage{--fa:"\25"}.fa-truck-moving{--fa:"\f4df"}.fa-glass-water-droplet{--fa:"\e4f5"}.fa-display{--fa:"\e163"}.fa-face-smile,.fa-smile{--fa:"\f118"}.fa-thumb-tack,.fa-thumbtack{--fa:"\f08d"}.fa-trophy{--fa:"\f091"}.fa-person-praying,.fa-pray{--fa:"\f683"}.fa-hammer{--fa:"\f6e3"}.fa-hand-peace{--fa:"\f25b"}.fa-rotate,.fa-sync-alt{--fa:"\f2f1"}.fa-spinner{--fa:"\f110"}.fa-robot{--fa:"\f544"}.fa-peace{--fa:"\f67c"}.fa-cogs,.fa-gears{--fa:"\f085"}.fa-warehouse{--fa:"\f494"}.fa-arrow-up-right-dots{--fa:"\e4b7"}.fa-splotch{--fa:"\f5bc"}.fa-face-grin-hearts,.fa-grin-hearts{--fa:"\f584"}.fa-dice-four{--fa:"\f524"}.fa-sim-card{--fa:"\f7c4"}.fa-transgender,.fa-transgender-alt{--fa:"\f225"}.fa-mercury{--fa:"\f223"}.fa-arrow-turn-down,.fa-level-down{--fa:"\f149"}.fa-person-falling-burst{--fa:"\e547"}.fa-award{--fa:"\f559"}.fa-ticket-alt,.fa-ticket-simple{--fa:"\f3ff"}.fa-building{--fa:"\f1ad"}.fa-angle-double-left,.fa-angles-left{--fa:"\f100"}.fa-qrcode{--fa:"\f029"}.fa-clock-rotate-left,.fa-history{--fa:"\f1da"}.fa-face-grin-beam-sweat,.fa-grin-beam-sweat{--fa:"\f583"}.fa-arrow-right-from-file,.fa-file-export{--fa:"\f56e"}.fa-shield,.fa-shield-blank{--fa:"\f132"}.fa-arrow-up-short-wide,.fa-sort-amount-up-alt{--fa:"\f885"}.fa-comment-nodes{--fa:"\e696"}.fa-house-medical{--fa:"\e3b2"}.fa-golf-ball,.fa-golf-ball-tee{--fa:"\f450"}.fa-chevron-circle-left,.fa-circle-chevron-left{--fa:"\f137"}.fa-house-chimney-window{--fa:"\e00d"}.fa-pen-nib{--fa:"\f5ad"}.fa-tent-arrow-turn-left{--fa:"\e580"}.fa-tents{--fa:"\e582"}.fa-magic,.fa-wand-magic{--fa:"\f0d0"}.fa-dog{--fa:"\f6d3"}.fa-carrot{--fa:"\f787"}.fa-moon{--fa:"\f186"}.fa-wine-glass-alt,.fa-wine-glass-empty{--fa:"\f5ce"}.fa-cheese{--fa:"\f7ef"}.fa-yin-yang{--fa:"\f6ad"}.fa-music{--fa:"\f001"}.fa-code-commit{--fa:"\f386"}.fa-temperature-low{--fa:"\f76b"}.fa-biking,.fa-person-biking{--fa:"\f84a"}.fa-broom{--fa:"\f51a"}.fa-shield-heart{--fa:"\e574"}.fa-gopuram{--fa:"\f664"}.fa-earth-oceania,.fa-globe-oceania{--fa:"\e47b"}.fa-square-xmark,.fa-times-square,.fa-xmark-square{--fa:"\f2d3"}.fa-hashtag{--fa:"\23"}.fa-expand-alt,.fa-up-right-and-down-left-from-center{--fa:"\f424"}.fa-oil-can{--fa:"\f613"}.fa-t{--fa:"\54"}.fa-hippo{--fa:"\f6ed"}.fa-chart-column{--fa:"\e0e3"}.fa-infinity{--fa:"\f534"}.fa-vial-circle-check{--fa:"\e596"}.fa-person-arrow-down-to-line{--fa:"\e538"}.fa-voicemail{--fa:"\f897"}.fa-fan{--fa:"\f863"}.fa-person-walking-luggage{--fa:"\e554"}.fa-arrows-alt-v,.fa-up-down{--fa:"\f338"}.fa-cloud-moon-rain{--fa:"\f73c"}.fa-calendar{--fa:"\f133"}.fa-trailer{--fa:"\e041"}.fa-bahai,.fa-haykal{--fa:"\f666"}.fa-sd-card{--fa:"\f7c2"}.fa-dragon{--fa:"\f6d5"}.fa-shoe-prints{--fa:"\f54b"}.fa-circle-plus,.fa-plus-circle{--fa:"\f055"}.fa-face-grin-tongue-wink,.fa-grin-tongue-wink{--fa:"\f58b"}.fa-hand-holding{--fa:"\f4bd"}.fa-plug-circle-exclamation{--fa:"\e55d"}.fa-chain-broken,.fa-chain-slash,.fa-link-slash,.fa-unlink{--fa:"\f127"}.fa-clone{--fa:"\f24d"}.fa-person-walking-arrow-loop-left{--fa:"\e551"}.fa-arrow-up-z-a,.fa-sort-alpha-up-alt{--fa:"\f882"}.fa-fire-alt,.fa-fire-flame-curved{--fa:"\f7e4"}.fa-tornado{--fa:"\f76f"}.fa-file-circle-plus{--fa:"\e494"}.fa-book-quran,.fa-quran{--fa:"\f687"}.fa-anchor{--fa:"\f13d"}.fa-border-all{--fa:"\f84c"}.fa-angry,.fa-face-angry{--fa:"\f556"}.fa-cookie-bite{--fa:"\f564"}.fa-arrow-trend-down{--fa:"\e097"}.fa-feed,.fa-rss{--fa:"\f09e"}.fa-draw-polygon{--fa:"\f5ee"}.fa-balance-scale,.fa-scale-balanced{--fa:"\f24e"}.fa-gauge-simple-high,.fa-tachometer,.fa-tachometer-fast{--fa:"\f62a"}.fa-shower{--fa:"\f2cc"}.fa-desktop,.fa-desktop-alt{--fa:"\f390"}.fa-m{--fa:"\4d"}.fa-table-list,.fa-th-list{--fa:"\f00b"}.fa-comment-sms,.fa-sms{--fa:"\f7cd"}.fa-book{--fa:"\f02d"}.fa-user-plus{--fa:"\f234"}.fa-check{--fa:"\f00c"}.fa-battery-4,.fa-battery-three-quarters{--fa:"\f241"}.fa-house-circle-check{--fa:"\e509"}.fa-angle-left{--fa:"\f104"}.fa-diagram-successor{--fa:"\e47a"}.fa-truck-arrow-right{--fa:"\e58b"}.fa-arrows-split-up-and-left{--fa:"\e4bc"}.fa-fist-raised,.fa-hand-fist{--fa:"\f6de"}.fa-cloud-moon{--fa:"\f6c3"}.fa-briefcase{--fa:"\f0b1"}.fa-person-falling{--fa:"\e546"}.fa-image-portrait,.fa-portrait{--fa:"\f3e0"}.fa-user-tag{--fa:"\f507"}.fa-rug{--fa:"\e569"}.fa-earth-europe,.fa-globe-europe{--fa:"\f7a2"}.fa-cart-flatbed-suitcase,.fa-luggage-cart{--fa:"\f59d"}.fa-rectangle-times,.fa-rectangle-xmark,.fa-times-rectangle,.fa-window-close{--fa:"\f410"}.fa-baht-sign{--fa:"\e0ac"}.fa-book-open{--fa:"\f518"}.fa-book-journal-whills,.fa-journal-whills{--fa:"\f66a"}.fa-handcuffs{--fa:"\e4f8"}.fa-exclamation-triangle,.fa-triangle-exclamation,.fa-warning{--fa:"\f071"}.fa-database{--fa:"\f1c0"}.fa-mail-forward,.fa-share{--fa:"\f064"}.fa-bottle-droplet{--fa:"\e4c4"}.fa-mask-face{--fa:"\e1d7"}.fa-hill-rockslide{--fa:"\e508"}.fa-exchange-alt,.fa-right-left{--fa:"\f362"}.fa-paper-plane{--fa:"\f1d8"}.fa-road-circle-exclamation{--fa:"\e565"}.fa-dungeon{--fa:"\f6d9"}.fa-align-right{--fa:"\f038"}.fa-money-bill-1-wave,.fa-money-bill-wave-alt{--fa:"\f53b"}.fa-life-ring{--fa:"\f1cd"}.fa-hands,.fa-sign-language,.fa-signing{--fa:"\f2a7"}.fa-calendar-day{--fa:"\f783"}.fa-ladder-water,.fa-swimming-pool,.fa-water-ladder{--fa:"\f5c5"}.fa-arrows-up-down,.fa-arrows-v{--fa:"\f07d"}.fa-face-grimace,.fa-grimace{--fa:"\f57f"}.fa-wheelchair-alt,.fa-wheelchair-move{--fa:"\e2ce"}.fa-level-down-alt,.fa-turn-down{--fa:"\f3be"}.fa-person-walking-arrow-right{--fa:"\e552"}.fa-envelope-square,.fa-square-envelope{--fa:"\f199"}.fa-dice{--fa:"\f522"}.fa-bowling-ball{--fa:"\f436"}.fa-brain{--fa:"\f5dc"}.fa-band-aid,.fa-bandage{--fa:"\f462"}.fa-calendar-minus{--fa:"\f272"}.fa-circle-xmark,.fa-times-circle,.fa-xmark-circle{--fa:"\f057"}.fa-gifts{--fa:"\f79c"}.fa-hotel{--fa:"\f594"}.fa-earth-asia,.fa-globe-asia{--fa:"\f57e"}.fa-id-card-alt,.fa-id-card-clip{--fa:"\f47f"}.fa-magnifying-glass-plus,.fa-search-plus{--fa:"\f00e"}.fa-thumbs-up{--fa:"\f164"}.fa-user-clock{--fa:"\f4fd"}.fa-allergies,.fa-hand-dots{--fa:"\f461"}.fa-file-invoice{--fa:"\f570"}.fa-window-minimize{--fa:"\f2d1"}.fa-coffee,.fa-mug-saucer{--fa:"\f0f4"}.fa-brush{--fa:"\f55d"}.fa-file-half-dashed{--fa:"\e698"}.fa-mask{--fa:"\f6fa"}.fa-magnifying-glass-minus,.fa-search-minus{--fa:"\f010"}.fa-ruler-vertical{--fa:"\f548"}.fa-user-alt,.fa-user-large{--fa:"\f406"}.fa-train-tram{--fa:"\e5b4"}.fa-user-nurse{--fa:"\f82f"}.fa-syringe{--fa:"\f48e"}.fa-cloud-sun{--fa:"\f6c4"}.fa-stopwatch-20{--fa:"\e06f"}.fa-square-full{--fa:"\f45c"}.fa-magnet{--fa:"\f076"}.fa-jar{--fa:"\e516"}.fa-note-sticky,.fa-sticky-note{--fa:"\f249"}.fa-bug-slash{--fa:"\e490"}.fa-arrow-up-from-water-pump{--fa:"\e4b6"}.fa-bone{--fa:"\f5d7"}.fa-table-cells-row-unlock{--fa:"\e691"}.fa-user-injured{--fa:"\f728"}.fa-face-sad-tear,.fa-sad-tear{--fa:"\f5b4"}.fa-plane{--fa:"\f072"}.fa-tent-arrows-down{--fa:"\e581"}.fa-exclamation{--fa:"\21"}.fa-arrows-spin{--fa:"\e4bb"}.fa-print{--fa:"\f02f"}.fa-try,.fa-turkish-lira,.fa-turkish-lira-sign{--fa:"\e2bb"}.fa-dollar,.fa-dollar-sign,.fa-usd{--fa:"\24"}.fa-x{--fa:"\58"}.fa-magnifying-glass-dollar,.fa-search-dollar{--fa:"\f688"}.fa-users-cog,.fa-users-gear{--fa:"\f509"}.fa-person-military-pointing{--fa:"\e54a"}.fa-bank,.fa-building-columns,.fa-institution,.fa-museum,.fa-university{--fa:"\f19c"}.fa-umbrella{--fa:"\f0e9"}.fa-trowel{--fa:"\e589"}.fa-d{--fa:"\44"}.fa-stapler{--fa:"\e5af"}.fa-masks-theater,.fa-theater-masks{--fa:"\f630"}.fa-kip-sign{--fa:"\e1c4"}.fa-hand-point-left{--fa:"\f0a5"}.fa-handshake-alt,.fa-handshake-simple{--fa:"\f4c6"}.fa-fighter-jet,.fa-jet-fighter{--fa:"\f0fb"}.fa-share-alt-square,.fa-square-share-nodes{--fa:"\f1e1"}.fa-barcode{--fa:"\f02a"}.fa-plus-minus{--fa:"\e43c"}.fa-video,.fa-video-camera{--fa:"\f03d"}.fa-graduation-cap,.fa-mortar-board{--fa:"\f19d"}.fa-hand-holding-medical{--fa:"\e05c"}.fa-person-circle-check{--fa:"\e53e"}.fa-level-up-alt,.fa-turn-up{--fa:"\f3bf"}
+.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero{--fa:"\f3d0"}.fa-hooli{--fa:"\f427"}.fa-yelp{--fa:"\f1e9"}.fa-cc-visa{--fa:"\f1f0"}.fa-lastfm{--fa:"\f202"}.fa-shopware{--fa:"\f5b5"}.fa-creative-commons-nc{--fa:"\f4e8"}.fa-aws{--fa:"\f375"}.fa-redhat{--fa:"\f7bc"}.fa-yoast{--fa:"\f2b1"}.fa-cloudflare{--fa:"\e07d"}.fa-ups{--fa:"\f7e0"}.fa-pixiv{--fa:"\e640"}.fa-wpexplorer{--fa:"\f2de"}.fa-dyalog{--fa:"\f399"}.fa-bity{--fa:"\f37a"}.fa-stackpath{--fa:"\f842"}.fa-buysellads{--fa:"\f20d"}.fa-first-order{--fa:"\f2b0"}.fa-modx{--fa:"\f285"}.fa-guilded{--fa:"\e07e"}.fa-vnv{--fa:"\f40b"}.fa-js-square,.fa-square-js{--fa:"\f3b9"}.fa-microsoft{--fa:"\f3ca"}.fa-qq{--fa:"\f1d6"}.fa-orcid{--fa:"\f8d2"}.fa-java{--fa:"\f4e4"}.fa-invision{--fa:"\f7b0"}.fa-creative-commons-pd-alt{--fa:"\f4ed"}.fa-centercode{--fa:"\f380"}.fa-glide-g{--fa:"\f2a6"}.fa-drupal{--fa:"\f1a9"}.fa-jxl{--fa:"\e67b"}.fa-dart-lang{--fa:"\e693"}.fa-hire-a-helper{--fa:"\f3b0"}.fa-creative-commons-by{--fa:"\f4e7"}.fa-unity{--fa:"\e049"}.fa-whmcs{--fa:"\f40d"}.fa-rocketchat{--fa:"\f3e8"}.fa-vk{--fa:"\f189"}.fa-untappd{--fa:"\f405"}.fa-mailchimp{--fa:"\f59e"}.fa-css3-alt{--fa:"\f38b"}.fa-reddit-square,.fa-square-reddit{--fa:"\f1a2"}.fa-vimeo-v{--fa:"\f27d"}.fa-contao{--fa:"\f26d"}.fa-square-font-awesome{--fa:"\e5ad"}.fa-deskpro{--fa:"\f38f"}.fa-brave{--fa:"\e63c"}.fa-sistrix{--fa:"\f3ee"}.fa-instagram-square,.fa-square-instagram{--fa:"\e055"}.fa-battle-net{--fa:"\f835"}.fa-the-red-yeti{--fa:"\f69d"}.fa-hacker-news-square,.fa-square-hacker-news{--fa:"\f3af"}.fa-edge{--fa:"\f282"}.fa-threads{--fa:"\e618"}.fa-napster{--fa:"\f3d2"}.fa-snapchat-square,.fa-square-snapchat{--fa:"\f2ad"}.fa-google-plus-g{--fa:"\f0d5"}.fa-artstation{--fa:"\f77a"}.fa-markdown{--fa:"\f60f"}.fa-sourcetree{--fa:"\f7d3"}.fa-google-plus{--fa:"\f2b3"}.fa-diaspora{--fa:"\f791"}.fa-foursquare{--fa:"\f180"}.fa-stack-overflow{--fa:"\f16c"}.fa-github-alt{--fa:"\f113"}.fa-phoenix-squadron{--fa:"\f511"}.fa-pagelines{--fa:"\f18c"}.fa-algolia{--fa:"\f36c"}.fa-red-river{--fa:"\f3e3"}.fa-creative-commons-sa{--fa:"\f4ef"}.fa-safari{--fa:"\f267"}.fa-google{--fa:"\f1a0"}.fa-font-awesome-alt,.fa-square-font-awesome-stroke{--fa:"\f35c"}.fa-atlassian{--fa:"\f77b"}.fa-linkedin-in{--fa:"\f0e1"}.fa-digital-ocean{--fa:"\f391"}.fa-nimblr{--fa:"\f5a8"}.fa-chromecast{--fa:"\f838"}.fa-evernote{--fa:"\f839"}.fa-hacker-news{--fa:"\f1d4"}.fa-creative-commons-sampling{--fa:"\f4f0"}.fa-adversal{--fa:"\f36a"}.fa-creative-commons{--fa:"\f25e"}.fa-watchman-monitoring{--fa:"\e087"}.fa-fonticons{--fa:"\f280"}.fa-weixin{--fa:"\f1d7"}.fa-shirtsinbulk{--fa:"\f214"}.fa-codepen{--fa:"\f1cb"}.fa-git-alt{--fa:"\f841"}.fa-lyft{--fa:"\f3c3"}.fa-rev{--fa:"\f5b2"}.fa-windows{--fa:"\f17a"}.fa-wizards-of-the-coast{--fa:"\f730"}.fa-square-viadeo,.fa-viadeo-square{--fa:"\f2aa"}.fa-meetup{--fa:"\f2e0"}.fa-centos{--fa:"\f789"}.fa-adn{--fa:"\f170"}.fa-cloudsmith{--fa:"\f384"}.fa-opensuse{--fa:"\e62b"}.fa-pied-piper-alt{--fa:"\f1a8"}.fa-dribbble-square,.fa-square-dribbble{--fa:"\f397"}.fa-codiepie{--fa:"\f284"}.fa-node{--fa:"\f419"}.fa-mix{--fa:"\f3cb"}.fa-steam{--fa:"\f1b6"}.fa-cc-apple-pay{--fa:"\f416"}.fa-scribd{--fa:"\f28a"}.fa-debian{--fa:"\e60b"}.fa-openid{--fa:"\f19b"}.fa-instalod{--fa:"\e081"}.fa-files-pinwheel{--fa:"\e69f"}.fa-expeditedssl{--fa:"\f23e"}.fa-sellcast{--fa:"\f2da"}.fa-square-twitter,.fa-twitter-square{--fa:"\f081"}.fa-r-project{--fa:"\f4f7"}.fa-delicious{--fa:"\f1a5"}.fa-freebsd{--fa:"\f3a4"}.fa-vuejs{--fa:"\f41f"}.fa-accusoft{--fa:"\f369"}.fa-ioxhost{--fa:"\f208"}.fa-fonticons-fi{--fa:"\f3a2"}.fa-app-store{--fa:"\f36f"}.fa-cc-mastercard{--fa:"\f1f1"}.fa-itunes-note{--fa:"\f3b5"}.fa-golang{--fa:"\e40f"}.fa-kickstarter,.fa-square-kickstarter{--fa:"\f3bb"}.fa-grav{--fa:"\f2d6"}.fa-weibo{--fa:"\f18a"}.fa-uncharted{--fa:"\e084"}.fa-firstdraft{--fa:"\f3a1"}.fa-square-youtube,.fa-youtube-square{--fa:"\f431"}.fa-wikipedia-w{--fa:"\f266"}.fa-rendact,.fa-wpressr{--fa:"\f3e4"}.fa-angellist{--fa:"\f209"}.fa-galactic-republic{--fa:"\f50c"}.fa-nfc-directional{--fa:"\e530"}.fa-skype{--fa:"\f17e"}.fa-joget{--fa:"\f3b7"}.fa-fedora{--fa:"\f798"}.fa-stripe-s{--fa:"\f42a"}.fa-meta{--fa:"\e49b"}.fa-laravel{--fa:"\f3bd"}.fa-hotjar{--fa:"\f3b1"}.fa-bluetooth-b{--fa:"\f294"}.fa-square-letterboxd{--fa:"\e62e"}.fa-sticker-mule{--fa:"\f3f7"}.fa-creative-commons-zero{--fa:"\f4f3"}.fa-hips{--fa:"\f452"}.fa-css{--fa:"\e6a2"}.fa-behance{--fa:"\f1b4"}.fa-reddit{--fa:"\f1a1"}.fa-discord{--fa:"\f392"}.fa-chrome{--fa:"\f268"}.fa-app-store-ios{--fa:"\f370"}.fa-cc-discover{--fa:"\f1f2"}.fa-wpbeginner{--fa:"\f297"}.fa-confluence{--fa:"\f78d"}.fa-shoelace{--fa:"\e60c"}.fa-mdb{--fa:"\f8ca"}.fa-dochub{--fa:"\f394"}.fa-accessible-icon{--fa:"\f368"}.fa-ebay{--fa:"\f4f4"}.fa-amazon{--fa:"\f270"}.fa-unsplash{--fa:"\e07c"}.fa-yarn{--fa:"\f7e3"}.fa-square-steam,.fa-steam-square{--fa:"\f1b7"}.fa-500px{--fa:"\f26e"}.fa-square-vimeo,.fa-vimeo-square{--fa:"\f194"}.fa-asymmetrik{--fa:"\f372"}.fa-font-awesome,.fa-font-awesome-flag,.fa-font-awesome-logo-full{--fa:"\f2b4"}.fa-gratipay{--fa:"\f184"}.fa-apple{--fa:"\f179"}.fa-hive{--fa:"\e07f"}.fa-gitkraken{--fa:"\f3a6"}.fa-keybase{--fa:"\f4f5"}.fa-apple-pay{--fa:"\f415"}.fa-padlet{--fa:"\e4a0"}.fa-amazon-pay{--fa:"\f42c"}.fa-github-square,.fa-square-github{--fa:"\f092"}.fa-stumbleupon{--fa:"\f1a4"}.fa-fedex{--fa:"\f797"}.fa-phoenix-framework{--fa:"\f3dc"}.fa-shopify{--fa:"\e057"}.fa-neos{--fa:"\f612"}.fa-square-threads{--fa:"\e619"}.fa-hackerrank{--fa:"\f5f7"}.fa-researchgate{--fa:"\f4f8"}.fa-swift{--fa:"\f8e1"}.fa-angular{--fa:"\f420"}.fa-speakap{--fa:"\f3f3"}.fa-angrycreative{--fa:"\f36e"}.fa-y-combinator{--fa:"\f23b"}.fa-empire{--fa:"\f1d1"}.fa-envira{--fa:"\f299"}.fa-google-scholar{--fa:"\e63b"}.fa-gitlab-square,.fa-square-gitlab{--fa:"\e5ae"}.fa-studiovinari{--fa:"\f3f8"}.fa-pied-piper{--fa:"\f2ae"}.fa-wordpress{--fa:"\f19a"}.fa-product-hunt{--fa:"\f288"}.fa-firefox{--fa:"\f269"}.fa-linode{--fa:"\f2b8"}.fa-goodreads{--fa:"\f3a8"}.fa-odnoklassniki-square,.fa-square-odnoklassniki{--fa:"\f264"}.fa-jsfiddle{--fa:"\f1cc"}.fa-sith{--fa:"\f512"}.fa-themeisle{--fa:"\f2b2"}.fa-page4{--fa:"\f3d7"}.fa-hashnode{--fa:"\e499"}.fa-react{--fa:"\f41b"}.fa-cc-paypal{--fa:"\f1f4"}.fa-squarespace{--fa:"\f5be"}.fa-cc-stripe{--fa:"\f1f5"}.fa-creative-commons-share{--fa:"\f4f2"}.fa-bitcoin{--fa:"\f379"}.fa-keycdn{--fa:"\f3ba"}.fa-opera{--fa:"\f26a"}.fa-itch-io{--fa:"\f83a"}.fa-umbraco{--fa:"\f8e8"}.fa-galactic-senate{--fa:"\f50d"}.fa-ubuntu{--fa:"\f7df"}.fa-draft2digital{--fa:"\f396"}.fa-stripe{--fa:"\f429"}.fa-houzz{--fa:"\f27c"}.fa-gg{--fa:"\f260"}.fa-dhl{--fa:"\f790"}.fa-pinterest-square,.fa-square-pinterest{--fa:"\f0d3"}.fa-xing{--fa:"\f168"}.fa-blackberry{--fa:"\f37b"}.fa-creative-commons-pd{--fa:"\f4ec"}.fa-playstation{--fa:"\f3df"}.fa-quinscape{--fa:"\f459"}.fa-less{--fa:"\f41d"}.fa-blogger-b{--fa:"\f37d"}.fa-opencart{--fa:"\f23d"}.fa-vine{--fa:"\f1ca"}.fa-signal-messenger{--fa:"\e663"}.fa-paypal{--fa:"\f1ed"}.fa-gitlab{--fa:"\f296"}.fa-typo3{--fa:"\f42b"}.fa-reddit-alien{--fa:"\f281"}.fa-yahoo{--fa:"\f19e"}.fa-dailymotion{--fa:"\e052"}.fa-affiliatetheme{--fa:"\f36b"}.fa-pied-piper-pp{--fa:"\f1a7"}.fa-bootstrap{--fa:"\f836"}.fa-odnoklassniki{--fa:"\f263"}.fa-nfc-symbol{--fa:"\e531"}.fa-mintbit{--fa:"\e62f"}.fa-ethereum{--fa:"\f42e"}.fa-speaker-deck{--fa:"\f83c"}.fa-creative-commons-nc-eu{--fa:"\f4e9"}.fa-patreon{--fa:"\f3d9"}.fa-avianex{--fa:"\f374"}.fa-ello{--fa:"\f5f1"}.fa-gofore{--fa:"\f3a7"}.fa-bimobject{--fa:"\f378"}.fa-brave-reverse{--fa:"\e63d"}.fa-facebook-f{--fa:"\f39e"}.fa-google-plus-square,.fa-square-google-plus{--fa:"\f0d4"}.fa-web-awesome{--fa:"\e682"}.fa-mandalorian{--fa:"\f50f"}.fa-first-order-alt{--fa:"\f50a"}.fa-osi{--fa:"\f41a"}.fa-google-wallet{--fa:"\f1ee"}.fa-d-and-d-beyond{--fa:"\f6ca"}.fa-periscope{--fa:"\f3da"}.fa-fulcrum{--fa:"\f50b"}.fa-cloudscale{--fa:"\f383"}.fa-forumbee{--fa:"\f211"}.fa-mizuni{--fa:"\f3cc"}.fa-schlix{--fa:"\f3ea"}.fa-square-xing,.fa-xing-square{--fa:"\f169"}.fa-bandcamp{--fa:"\f2d5"}.fa-wpforms{--fa:"\f298"}.fa-cloudversify{--fa:"\f385"}.fa-usps{--fa:"\f7e1"}.fa-megaport{--fa:"\f5a3"}.fa-magento{--fa:"\f3c4"}.fa-spotify{--fa:"\f1bc"}.fa-optin-monster{--fa:"\f23c"}.fa-fly{--fa:"\f417"}.fa-square-bluesky{--fa:"\e6a3"}.fa-aviato{--fa:"\f421"}.fa-itunes{--fa:"\f3b4"}.fa-cuttlefish{--fa:"\f38c"}.fa-blogger{--fa:"\f37c"}.fa-flickr{--fa:"\f16e"}.fa-viber{--fa:"\f409"}.fa-soundcloud{--fa:"\f1be"}.fa-digg{--fa:"\f1a6"}.fa-tencent-weibo{--fa:"\f1d5"}.fa-letterboxd{--fa:"\e62d"}.fa-symfony{--fa:"\f83d"}.fa-maxcdn{--fa:"\f136"}.fa-etsy{--fa:"\f2d7"}.fa-facebook-messenger{--fa:"\f39f"}.fa-audible{--fa:"\f373"}.fa-think-peaks{--fa:"\f731"}.fa-bilibili{--fa:"\e3d9"}.fa-erlang{--fa:"\f39d"}.fa-x-twitter{--fa:"\e61b"}.fa-cotton-bureau{--fa:"\f89e"}.fa-dashcube{--fa:"\f210"}.fa-42-group,.fa-innosoft{--fa:"\e080"}.fa-stack-exchange{--fa:"\f18d"}.fa-elementor{--fa:"\f430"}.fa-pied-piper-square,.fa-square-pied-piper{--fa:"\e01e"}.fa-creative-commons-nd{--fa:"\f4eb"}.fa-palfed{--fa:"\f3d8"}.fa-superpowers{--fa:"\f2dd"}.fa-resolving{--fa:"\f3e7"}.fa-xbox{--fa:"\f412"}.fa-square-web-awesome-stroke{--fa:"\e684"}.fa-searchengin{--fa:"\f3eb"}.fa-tiktok{--fa:"\e07b"}.fa-facebook-square,.fa-square-facebook{--fa:"\f082"}.fa-renren{--fa:"\f18b"}.fa-linux{--fa:"\f17c"}.fa-glide{--fa:"\f2a5"}.fa-linkedin{--fa:"\f08c"}.fa-hubspot{--fa:"\f3b2"}.fa-deploydog{--fa:"\f38e"}.fa-twitch{--fa:"\f1e8"}.fa-flutter{--fa:"\e694"}.fa-ravelry{--fa:"\f2d9"}.fa-mixer{--fa:"\e056"}.fa-lastfm-square,.fa-square-lastfm{--fa:"\f203"}.fa-vimeo{--fa:"\f40a"}.fa-mendeley{--fa:"\f7b3"}.fa-uniregistry{--fa:"\f404"}.fa-figma{--fa:"\f799"}.fa-creative-commons-remix{--fa:"\f4ee"}.fa-cc-amazon-pay{--fa:"\f42d"}.fa-dropbox{--fa:"\f16b"}.fa-instagram{--fa:"\f16d"}.fa-cmplid{--fa:"\e360"}.fa-upwork{--fa:"\e641"}.fa-facebook{--fa:"\f09a"}.fa-gripfire{--fa:"\f3ac"}.fa-jedi-order{--fa:"\f50e"}.fa-uikit{--fa:"\f403"}.fa-fort-awesome-alt{--fa:"\f3a3"}.fa-phabricator{--fa:"\f3db"}.fa-ussunnah{--fa:"\f407"}.fa-earlybirds{--fa:"\f39a"}.fa-trade-federation{--fa:"\f513"}.fa-autoprefixer{--fa:"\f41c"}.fa-whatsapp{--fa:"\f232"}.fa-square-upwork{--fa:"\e67c"}.fa-slideshare{--fa:"\f1e7"}.fa-google-play{--fa:"\f3ab"}.fa-viadeo{--fa:"\f2a9"}.fa-line{--fa:"\f3c0"}.fa-google-drive{--fa:"\f3aa"}.fa-servicestack{--fa:"\f3ec"}.fa-simplybuilt{--fa:"\f215"}.fa-bitbucket{--fa:"\f171"}.fa-imdb{--fa:"\f2d8"}.fa-deezer{--fa:"\e077"}.fa-raspberry-pi{--fa:"\f7bb"}.fa-jira{--fa:"\f7b1"}.fa-docker{--fa:"\f395"}.fa-screenpal{--fa:"\e570"}.fa-bluetooth{--fa:"\f293"}.fa-gitter{--fa:"\f426"}.fa-d-and-d{--fa:"\f38d"}.fa-microblog{--fa:"\e01a"}.fa-cc-diners-club{--fa:"\f24c"}.fa-gg-circle{--fa:"\f261"}.fa-pied-piper-hat{--fa:"\f4e5"}.fa-kickstarter-k{--fa:"\f3bc"}.fa-yandex{--fa:"\f413"}.fa-readme{--fa:"\f4d5"}.fa-html5{--fa:"\f13b"}.fa-sellsy{--fa:"\f213"}.fa-square-web-awesome{--fa:"\e683"}.fa-sass{--fa:"\f41e"}.fa-wirsindhandwerk,.fa-wsh{--fa:"\e2d0"}.fa-buromobelexperte{--fa:"\f37f"}.fa-salesforce{--fa:"\f83b"}.fa-octopus-deploy{--fa:"\e082"}.fa-medapps{--fa:"\f3c6"}.fa-ns8{--fa:"\f3d5"}.fa-pinterest-p{--fa:"\f231"}.fa-apper{--fa:"\f371"}.fa-fort-awesome{--fa:"\f286"}.fa-waze{--fa:"\f83f"}.fa-bluesky{--fa:"\e671"}.fa-cc-jcb{--fa:"\f24b"}.fa-snapchat,.fa-snapchat-ghost{--fa:"\f2ab"}.fa-fantasy-flight-games{--fa:"\f6dc"}.fa-rust{--fa:"\e07a"}.fa-wix{--fa:"\f5cf"}.fa-behance-square,.fa-square-behance{--fa:"\f1b5"}.fa-supple{--fa:"\f3f9"}.fa-webflow{--fa:"\e65c"}.fa-rebel{--fa:"\f1d0"}.fa-css3{--fa:"\f13c"}.fa-staylinked{--fa:"\f3f5"}.fa-kaggle{--fa:"\f5fa"}.fa-space-awesome{--fa:"\e5ac"}.fa-deviantart{--fa:"\f1bd"}.fa-cpanel{--fa:"\f388"}.fa-goodreads-g{--fa:"\f3a9"}.fa-git-square,.fa-square-git{--fa:"\f1d2"}.fa-square-tumblr,.fa-tumblr-square{--fa:"\f174"}.fa-trello{--fa:"\f181"}.fa-creative-commons-nc-jp{--fa:"\f4ea"}.fa-get-pocket{--fa:"\f265"}.fa-perbyte{--fa:"\e083"}.fa-grunt{--fa:"\f3ad"}.fa-weebly{--fa:"\f5cc"}.fa-connectdevelop{--fa:"\f20e"}.fa-leanpub{--fa:"\f212"}.fa-black-tie{--fa:"\f27e"}.fa-themeco{--fa:"\f5c6"}.fa-python{--fa:"\f3e2"}.fa-android{--fa:"\f17b"}.fa-bots{--fa:"\e340"}.fa-free-code-camp{--fa:"\f2c5"}.fa-hornbill{--fa:"\f592"}.fa-js{--fa:"\f3b8"}.fa-ideal{--fa:"\e013"}.fa-git{--fa:"\f1d3"}.fa-dev{--fa:"\f6cc"}.fa-sketch{--fa:"\f7c6"}.fa-yandex-international{--fa:"\f414"}.fa-cc-amex{--fa:"\f1f3"}.fa-uber{--fa:"\f402"}.fa-github{--fa:"\f09b"}.fa-php{--fa:"\f457"}.fa-alipay{--fa:"\f642"}.fa-youtube{--fa:"\f167"}.fa-skyatlas{--fa:"\f216"}.fa-firefox-browser{--fa:"\e007"}.fa-replyd{--fa:"\f3e6"}.fa-suse{--fa:"\f7d6"}.fa-jenkins{--fa:"\f3b6"}.fa-twitter{--fa:"\f099"}.fa-rockrms{--fa:"\f3e9"}.fa-pinterest{--fa:"\f0d2"}.fa-buffer{--fa:"\f837"}.fa-npm{--fa:"\f3d4"}.fa-yammer{--fa:"\f840"}.fa-btc{--fa:"\f15a"}.fa-dribbble{--fa:"\f17d"}.fa-stumbleupon-circle{--fa:"\f1a3"}.fa-internet-explorer{--fa:"\f26b"}.fa-stubber{--fa:"\e5c7"}.fa-telegram,.fa-telegram-plane{--fa:"\f2c6"}.fa-old-republic{--fa:"\f510"}.fa-odysee{--fa:"\e5c6"}.fa-square-whatsapp,.fa-whatsapp-square{--fa:"\f40c"}.fa-node-js{--fa:"\f3d3"}.fa-edge-legacy{--fa:"\e078"}.fa-slack,.fa-slack-hash{--fa:"\f198"}.fa-medrt{--fa:"\f3c8"}.fa-usb{--fa:"\f287"}.fa-tumblr{--fa:"\f173"}.fa-vaadin{--fa:"\f408"}.fa-quora{--fa:"\f2c4"}.fa-square-x-twitter{--fa:"\e61a"}.fa-reacteurope{--fa:"\f75d"}.fa-medium,.fa-medium-m{--fa:"\f23a"}.fa-amilia{--fa:"\f36d"}.fa-mixcloud{--fa:"\f289"}.fa-flipboard{--fa:"\f44d"}.fa-viacoin{--fa:"\f237"}.fa-critical-role{--fa:"\f6c9"}.fa-sitrox{--fa:"\e44a"}.fa-discourse{--fa:"\f393"}.fa-joomla{--fa:"\f1aa"}.fa-mastodon{--fa:"\f4f6"}.fa-airbnb{--fa:"\f834"}.fa-wolf-pack-battalion{--fa:"\f514"}.fa-buy-n-large{--fa:"\f8a6"}.fa-gulp{--fa:"\f3ae"}.fa-creative-commons-sampling-plus{--fa:"\f4f1"}.fa-strava{--fa:"\f428"}.fa-ember{--fa:"\f423"}.fa-canadian-maple-leaf{--fa:"\f785"}.fa-teamspeak{--fa:"\f4f9"}.fa-pushed{--fa:"\f3e1"}.fa-wordpress-simple{--fa:"\f411"}.fa-nutritionix{--fa:"\f3d6"}.fa-wodu{--fa:"\e088"}.fa-google-pay{--fa:"\e079"}.fa-intercom{--fa:"\f7af"}.fa-zhihu{--fa:"\f63f"}.fa-korvue{--fa:"\f42f"}.fa-pix{--fa:"\e43a"}.fa-steam-symbol{--fa:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
\ No newline at end of file
diff --git a/libai/fontawesome/brands.css b/libai/fontawesome/brands.css
new file mode 100644
index 0000000..8ae2f76
--- /dev/null
+++ b/libai/fontawesome/brands.css
@@ -0,0 +1,1609 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+:root, :host {
+ --fa-style-family-brands: 'Font Awesome 6 Brands';
+ --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; }
+
+@font-face {
+ font-family: 'Font Awesome 6 Brands';
+ font-style: normal;
+ font-weight: 400;
+ font-display: block;
+ src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
+
+.fab,
+.fa-brands {
+ font-weight: 400; }
+
+.fa-monero {
+ --fa: "\f3d0"; }
+
+.fa-hooli {
+ --fa: "\f427"; }
+
+.fa-yelp {
+ --fa: "\f1e9"; }
+
+.fa-cc-visa {
+ --fa: "\f1f0"; }
+
+.fa-lastfm {
+ --fa: "\f202"; }
+
+.fa-shopware {
+ --fa: "\f5b5"; }
+
+.fa-creative-commons-nc {
+ --fa: "\f4e8"; }
+
+.fa-aws {
+ --fa: "\f375"; }
+
+.fa-redhat {
+ --fa: "\f7bc"; }
+
+.fa-yoast {
+ --fa: "\f2b1"; }
+
+.fa-cloudflare {
+ --fa: "\e07d"; }
+
+.fa-ups {
+ --fa: "\f7e0"; }
+
+.fa-pixiv {
+ --fa: "\e640"; }
+
+.fa-wpexplorer {
+ --fa: "\f2de"; }
+
+.fa-dyalog {
+ --fa: "\f399"; }
+
+.fa-bity {
+ --fa: "\f37a"; }
+
+.fa-stackpath {
+ --fa: "\f842"; }
+
+.fa-buysellads {
+ --fa: "\f20d"; }
+
+.fa-first-order {
+ --fa: "\f2b0"; }
+
+.fa-modx {
+ --fa: "\f285"; }
+
+.fa-guilded {
+ --fa: "\e07e"; }
+
+.fa-vnv {
+ --fa: "\f40b"; }
+
+.fa-square-js {
+ --fa: "\f3b9"; }
+
+.fa-js-square {
+ --fa: "\f3b9"; }
+
+.fa-microsoft {
+ --fa: "\f3ca"; }
+
+.fa-qq {
+ --fa: "\f1d6"; }
+
+.fa-orcid {
+ --fa: "\f8d2"; }
+
+.fa-java {
+ --fa: "\f4e4"; }
+
+.fa-invision {
+ --fa: "\f7b0"; }
+
+.fa-creative-commons-pd-alt {
+ --fa: "\f4ed"; }
+
+.fa-centercode {
+ --fa: "\f380"; }
+
+.fa-glide-g {
+ --fa: "\f2a6"; }
+
+.fa-drupal {
+ --fa: "\f1a9"; }
+
+.fa-jxl {
+ --fa: "\e67b"; }
+
+.fa-dart-lang {
+ --fa: "\e693"; }
+
+.fa-hire-a-helper {
+ --fa: "\f3b0"; }
+
+.fa-creative-commons-by {
+ --fa: "\f4e7"; }
+
+.fa-unity {
+ --fa: "\e049"; }
+
+.fa-whmcs {
+ --fa: "\f40d"; }
+
+.fa-rocketchat {
+ --fa: "\f3e8"; }
+
+.fa-vk {
+ --fa: "\f189"; }
+
+.fa-untappd {
+ --fa: "\f405"; }
+
+.fa-mailchimp {
+ --fa: "\f59e"; }
+
+.fa-css3-alt {
+ --fa: "\f38b"; }
+
+.fa-square-reddit {
+ --fa: "\f1a2"; }
+
+.fa-reddit-square {
+ --fa: "\f1a2"; }
+
+.fa-vimeo-v {
+ --fa: "\f27d"; }
+
+.fa-contao {
+ --fa: "\f26d"; }
+
+.fa-square-font-awesome {
+ --fa: "\e5ad"; }
+
+.fa-deskpro {
+ --fa: "\f38f"; }
+
+.fa-brave {
+ --fa: "\e63c"; }
+
+.fa-sistrix {
+ --fa: "\f3ee"; }
+
+.fa-square-instagram {
+ --fa: "\e055"; }
+
+.fa-instagram-square {
+ --fa: "\e055"; }
+
+.fa-battle-net {
+ --fa: "\f835"; }
+
+.fa-the-red-yeti {
+ --fa: "\f69d"; }
+
+.fa-square-hacker-news {
+ --fa: "\f3af"; }
+
+.fa-hacker-news-square {
+ --fa: "\f3af"; }
+
+.fa-edge {
+ --fa: "\f282"; }
+
+.fa-threads {
+ --fa: "\e618"; }
+
+.fa-napster {
+ --fa: "\f3d2"; }
+
+.fa-square-snapchat {
+ --fa: "\f2ad"; }
+
+.fa-snapchat-square {
+ --fa: "\f2ad"; }
+
+.fa-google-plus-g {
+ --fa: "\f0d5"; }
+
+.fa-artstation {
+ --fa: "\f77a"; }
+
+.fa-markdown {
+ --fa: "\f60f"; }
+
+.fa-sourcetree {
+ --fa: "\f7d3"; }
+
+.fa-google-plus {
+ --fa: "\f2b3"; }
+
+.fa-diaspora {
+ --fa: "\f791"; }
+
+.fa-foursquare {
+ --fa: "\f180"; }
+
+.fa-stack-overflow {
+ --fa: "\f16c"; }
+
+.fa-github-alt {
+ --fa: "\f113"; }
+
+.fa-phoenix-squadron {
+ --fa: "\f511"; }
+
+.fa-pagelines {
+ --fa: "\f18c"; }
+
+.fa-algolia {
+ --fa: "\f36c"; }
+
+.fa-red-river {
+ --fa: "\f3e3"; }
+
+.fa-creative-commons-sa {
+ --fa: "\f4ef"; }
+
+.fa-safari {
+ --fa: "\f267"; }
+
+.fa-google {
+ --fa: "\f1a0"; }
+
+.fa-square-font-awesome-stroke {
+ --fa: "\f35c"; }
+
+.fa-font-awesome-alt {
+ --fa: "\f35c"; }
+
+.fa-atlassian {
+ --fa: "\f77b"; }
+
+.fa-linkedin-in {
+ --fa: "\f0e1"; }
+
+.fa-digital-ocean {
+ --fa: "\f391"; }
+
+.fa-nimblr {
+ --fa: "\f5a8"; }
+
+.fa-chromecast {
+ --fa: "\f838"; }
+
+.fa-evernote {
+ --fa: "\f839"; }
+
+.fa-hacker-news {
+ --fa: "\f1d4"; }
+
+.fa-creative-commons-sampling {
+ --fa: "\f4f0"; }
+
+.fa-adversal {
+ --fa: "\f36a"; }
+
+.fa-creative-commons {
+ --fa: "\f25e"; }
+
+.fa-watchman-monitoring {
+ --fa: "\e087"; }
+
+.fa-fonticons {
+ --fa: "\f280"; }
+
+.fa-weixin {
+ --fa: "\f1d7"; }
+
+.fa-shirtsinbulk {
+ --fa: "\f214"; }
+
+.fa-codepen {
+ --fa: "\f1cb"; }
+
+.fa-git-alt {
+ --fa: "\f841"; }
+
+.fa-lyft {
+ --fa: "\f3c3"; }
+
+.fa-rev {
+ --fa: "\f5b2"; }
+
+.fa-windows {
+ --fa: "\f17a"; }
+
+.fa-wizards-of-the-coast {
+ --fa: "\f730"; }
+
+.fa-square-viadeo {
+ --fa: "\f2aa"; }
+
+.fa-viadeo-square {
+ --fa: "\f2aa"; }
+
+.fa-meetup {
+ --fa: "\f2e0"; }
+
+.fa-centos {
+ --fa: "\f789"; }
+
+.fa-adn {
+ --fa: "\f170"; }
+
+.fa-cloudsmith {
+ --fa: "\f384"; }
+
+.fa-opensuse {
+ --fa: "\e62b"; }
+
+.fa-pied-piper-alt {
+ --fa: "\f1a8"; }
+
+.fa-square-dribbble {
+ --fa: "\f397"; }
+
+.fa-dribbble-square {
+ --fa: "\f397"; }
+
+.fa-codiepie {
+ --fa: "\f284"; }
+
+.fa-node {
+ --fa: "\f419"; }
+
+.fa-mix {
+ --fa: "\f3cb"; }
+
+.fa-steam {
+ --fa: "\f1b6"; }
+
+.fa-cc-apple-pay {
+ --fa: "\f416"; }
+
+.fa-scribd {
+ --fa: "\f28a"; }
+
+.fa-debian {
+ --fa: "\e60b"; }
+
+.fa-openid {
+ --fa: "\f19b"; }
+
+.fa-instalod {
+ --fa: "\e081"; }
+
+.fa-files-pinwheel {
+ --fa: "\e69f"; }
+
+.fa-expeditedssl {
+ --fa: "\f23e"; }
+
+.fa-sellcast {
+ --fa: "\f2da"; }
+
+.fa-square-twitter {
+ --fa: "\f081"; }
+
+.fa-twitter-square {
+ --fa: "\f081"; }
+
+.fa-r-project {
+ --fa: "\f4f7"; }
+
+.fa-delicious {
+ --fa: "\f1a5"; }
+
+.fa-freebsd {
+ --fa: "\f3a4"; }
+
+.fa-vuejs {
+ --fa: "\f41f"; }
+
+.fa-accusoft {
+ --fa: "\f369"; }
+
+.fa-ioxhost {
+ --fa: "\f208"; }
+
+.fa-fonticons-fi {
+ --fa: "\f3a2"; }
+
+.fa-app-store {
+ --fa: "\f36f"; }
+
+.fa-cc-mastercard {
+ --fa: "\f1f1"; }
+
+.fa-itunes-note {
+ --fa: "\f3b5"; }
+
+.fa-golang {
+ --fa: "\e40f"; }
+
+.fa-kickstarter {
+ --fa: "\f3bb"; }
+
+.fa-square-kickstarter {
+ --fa: "\f3bb"; }
+
+.fa-grav {
+ --fa: "\f2d6"; }
+
+.fa-weibo {
+ --fa: "\f18a"; }
+
+.fa-uncharted {
+ --fa: "\e084"; }
+
+.fa-firstdraft {
+ --fa: "\f3a1"; }
+
+.fa-square-youtube {
+ --fa: "\f431"; }
+
+.fa-youtube-square {
+ --fa: "\f431"; }
+
+.fa-wikipedia-w {
+ --fa: "\f266"; }
+
+.fa-wpressr {
+ --fa: "\f3e4"; }
+
+.fa-rendact {
+ --fa: "\f3e4"; }
+
+.fa-angellist {
+ --fa: "\f209"; }
+
+.fa-galactic-republic {
+ --fa: "\f50c"; }
+
+.fa-nfc-directional {
+ --fa: "\e530"; }
+
+.fa-skype {
+ --fa: "\f17e"; }
+
+.fa-joget {
+ --fa: "\f3b7"; }
+
+.fa-fedora {
+ --fa: "\f798"; }
+
+.fa-stripe-s {
+ --fa: "\f42a"; }
+
+.fa-meta {
+ --fa: "\e49b"; }
+
+.fa-laravel {
+ --fa: "\f3bd"; }
+
+.fa-hotjar {
+ --fa: "\f3b1"; }
+
+.fa-bluetooth-b {
+ --fa: "\f294"; }
+
+.fa-square-letterboxd {
+ --fa: "\e62e"; }
+
+.fa-sticker-mule {
+ --fa: "\f3f7"; }
+
+.fa-creative-commons-zero {
+ --fa: "\f4f3"; }
+
+.fa-hips {
+ --fa: "\f452"; }
+
+.fa-css {
+ --fa: "\e6a2"; }
+
+.fa-behance {
+ --fa: "\f1b4"; }
+
+.fa-reddit {
+ --fa: "\f1a1"; }
+
+.fa-discord {
+ --fa: "\f392"; }
+
+.fa-chrome {
+ --fa: "\f268"; }
+
+.fa-app-store-ios {
+ --fa: "\f370"; }
+
+.fa-cc-discover {
+ --fa: "\f1f2"; }
+
+.fa-wpbeginner {
+ --fa: "\f297"; }
+
+.fa-confluence {
+ --fa: "\f78d"; }
+
+.fa-shoelace {
+ --fa: "\e60c"; }
+
+.fa-mdb {
+ --fa: "\f8ca"; }
+
+.fa-dochub {
+ --fa: "\f394"; }
+
+.fa-accessible-icon {
+ --fa: "\f368"; }
+
+.fa-ebay {
+ --fa: "\f4f4"; }
+
+.fa-amazon {
+ --fa: "\f270"; }
+
+.fa-unsplash {
+ --fa: "\e07c"; }
+
+.fa-yarn {
+ --fa: "\f7e3"; }
+
+.fa-square-steam {
+ --fa: "\f1b7"; }
+
+.fa-steam-square {
+ --fa: "\f1b7"; }
+
+.fa-500px {
+ --fa: "\f26e"; }
+
+.fa-square-vimeo {
+ --fa: "\f194"; }
+
+.fa-vimeo-square {
+ --fa: "\f194"; }
+
+.fa-asymmetrik {
+ --fa: "\f372"; }
+
+.fa-font-awesome {
+ --fa: "\f2b4"; }
+
+.fa-font-awesome-flag {
+ --fa: "\f2b4"; }
+
+.fa-font-awesome-logo-full {
+ --fa: "\f2b4"; }
+
+.fa-gratipay {
+ --fa: "\f184"; }
+
+.fa-apple {
+ --fa: "\f179"; }
+
+.fa-hive {
+ --fa: "\e07f"; }
+
+.fa-gitkraken {
+ --fa: "\f3a6"; }
+
+.fa-keybase {
+ --fa: "\f4f5"; }
+
+.fa-apple-pay {
+ --fa: "\f415"; }
+
+.fa-padlet {
+ --fa: "\e4a0"; }
+
+.fa-amazon-pay {
+ --fa: "\f42c"; }
+
+.fa-square-github {
+ --fa: "\f092"; }
+
+.fa-github-square {
+ --fa: "\f092"; }
+
+.fa-stumbleupon {
+ --fa: "\f1a4"; }
+
+.fa-fedex {
+ --fa: "\f797"; }
+
+.fa-phoenix-framework {
+ --fa: "\f3dc"; }
+
+.fa-shopify {
+ --fa: "\e057"; }
+
+.fa-neos {
+ --fa: "\f612"; }
+
+.fa-square-threads {
+ --fa: "\e619"; }
+
+.fa-hackerrank {
+ --fa: "\f5f7"; }
+
+.fa-researchgate {
+ --fa: "\f4f8"; }
+
+.fa-swift {
+ --fa: "\f8e1"; }
+
+.fa-angular {
+ --fa: "\f420"; }
+
+.fa-speakap {
+ --fa: "\f3f3"; }
+
+.fa-angrycreative {
+ --fa: "\f36e"; }
+
+.fa-y-combinator {
+ --fa: "\f23b"; }
+
+.fa-empire {
+ --fa: "\f1d1"; }
+
+.fa-envira {
+ --fa: "\f299"; }
+
+.fa-google-scholar {
+ --fa: "\e63b"; }
+
+.fa-square-gitlab {
+ --fa: "\e5ae"; }
+
+.fa-gitlab-square {
+ --fa: "\e5ae"; }
+
+.fa-studiovinari {
+ --fa: "\f3f8"; }
+
+.fa-pied-piper {
+ --fa: "\f2ae"; }
+
+.fa-wordpress {
+ --fa: "\f19a"; }
+
+.fa-product-hunt {
+ --fa: "\f288"; }
+
+.fa-firefox {
+ --fa: "\f269"; }
+
+.fa-linode {
+ --fa: "\f2b8"; }
+
+.fa-goodreads {
+ --fa: "\f3a8"; }
+
+.fa-square-odnoklassniki {
+ --fa: "\f264"; }
+
+.fa-odnoklassniki-square {
+ --fa: "\f264"; }
+
+.fa-jsfiddle {
+ --fa: "\f1cc"; }
+
+.fa-sith {
+ --fa: "\f512"; }
+
+.fa-themeisle {
+ --fa: "\f2b2"; }
+
+.fa-page4 {
+ --fa: "\f3d7"; }
+
+.fa-hashnode {
+ --fa: "\e499"; }
+
+.fa-react {
+ --fa: "\f41b"; }
+
+.fa-cc-paypal {
+ --fa: "\f1f4"; }
+
+.fa-squarespace {
+ --fa: "\f5be"; }
+
+.fa-cc-stripe {
+ --fa: "\f1f5"; }
+
+.fa-creative-commons-share {
+ --fa: "\f4f2"; }
+
+.fa-bitcoin {
+ --fa: "\f379"; }
+
+.fa-keycdn {
+ --fa: "\f3ba"; }
+
+.fa-opera {
+ --fa: "\f26a"; }
+
+.fa-itch-io {
+ --fa: "\f83a"; }
+
+.fa-umbraco {
+ --fa: "\f8e8"; }
+
+.fa-galactic-senate {
+ --fa: "\f50d"; }
+
+.fa-ubuntu {
+ --fa: "\f7df"; }
+
+.fa-draft2digital {
+ --fa: "\f396"; }
+
+.fa-stripe {
+ --fa: "\f429"; }
+
+.fa-houzz {
+ --fa: "\f27c"; }
+
+.fa-gg {
+ --fa: "\f260"; }
+
+.fa-dhl {
+ --fa: "\f790"; }
+
+.fa-square-pinterest {
+ --fa: "\f0d3"; }
+
+.fa-pinterest-square {
+ --fa: "\f0d3"; }
+
+.fa-xing {
+ --fa: "\f168"; }
+
+.fa-blackberry {
+ --fa: "\f37b"; }
+
+.fa-creative-commons-pd {
+ --fa: "\f4ec"; }
+
+.fa-playstation {
+ --fa: "\f3df"; }
+
+.fa-quinscape {
+ --fa: "\f459"; }
+
+.fa-less {
+ --fa: "\f41d"; }
+
+.fa-blogger-b {
+ --fa: "\f37d"; }
+
+.fa-opencart {
+ --fa: "\f23d"; }
+
+.fa-vine {
+ --fa: "\f1ca"; }
+
+.fa-signal-messenger {
+ --fa: "\e663"; }
+
+.fa-paypal {
+ --fa: "\f1ed"; }
+
+.fa-gitlab {
+ --fa: "\f296"; }
+
+.fa-typo3 {
+ --fa: "\f42b"; }
+
+.fa-reddit-alien {
+ --fa: "\f281"; }
+
+.fa-yahoo {
+ --fa: "\f19e"; }
+
+.fa-dailymotion {
+ --fa: "\e052"; }
+
+.fa-affiliatetheme {
+ --fa: "\f36b"; }
+
+.fa-pied-piper-pp {
+ --fa: "\f1a7"; }
+
+.fa-bootstrap {
+ --fa: "\f836"; }
+
+.fa-odnoklassniki {
+ --fa: "\f263"; }
+
+.fa-nfc-symbol {
+ --fa: "\e531"; }
+
+.fa-mintbit {
+ --fa: "\e62f"; }
+
+.fa-ethereum {
+ --fa: "\f42e"; }
+
+.fa-speaker-deck {
+ --fa: "\f83c"; }
+
+.fa-creative-commons-nc-eu {
+ --fa: "\f4e9"; }
+
+.fa-patreon {
+ --fa: "\f3d9"; }
+
+.fa-avianex {
+ --fa: "\f374"; }
+
+.fa-ello {
+ --fa: "\f5f1"; }
+
+.fa-gofore {
+ --fa: "\f3a7"; }
+
+.fa-bimobject {
+ --fa: "\f378"; }
+
+.fa-brave-reverse {
+ --fa: "\e63d"; }
+
+.fa-facebook-f {
+ --fa: "\f39e"; }
+
+.fa-square-google-plus {
+ --fa: "\f0d4"; }
+
+.fa-google-plus-square {
+ --fa: "\f0d4"; }
+
+.fa-web-awesome {
+ --fa: "\e682"; }
+
+.fa-mandalorian {
+ --fa: "\f50f"; }
+
+.fa-first-order-alt {
+ --fa: "\f50a"; }
+
+.fa-osi {
+ --fa: "\f41a"; }
+
+.fa-google-wallet {
+ --fa: "\f1ee"; }
+
+.fa-d-and-d-beyond {
+ --fa: "\f6ca"; }
+
+.fa-periscope {
+ --fa: "\f3da"; }
+
+.fa-fulcrum {
+ --fa: "\f50b"; }
+
+.fa-cloudscale {
+ --fa: "\f383"; }
+
+.fa-forumbee {
+ --fa: "\f211"; }
+
+.fa-mizuni {
+ --fa: "\f3cc"; }
+
+.fa-schlix {
+ --fa: "\f3ea"; }
+
+.fa-square-xing {
+ --fa: "\f169"; }
+
+.fa-xing-square {
+ --fa: "\f169"; }
+
+.fa-bandcamp {
+ --fa: "\f2d5"; }
+
+.fa-wpforms {
+ --fa: "\f298"; }
+
+.fa-cloudversify {
+ --fa: "\f385"; }
+
+.fa-usps {
+ --fa: "\f7e1"; }
+
+.fa-megaport {
+ --fa: "\f5a3"; }
+
+.fa-magento {
+ --fa: "\f3c4"; }
+
+.fa-spotify {
+ --fa: "\f1bc"; }
+
+.fa-optin-monster {
+ --fa: "\f23c"; }
+
+.fa-fly {
+ --fa: "\f417"; }
+
+.fa-square-bluesky {
+ --fa: "\e6a3"; }
+
+.fa-aviato {
+ --fa: "\f421"; }
+
+.fa-itunes {
+ --fa: "\f3b4"; }
+
+.fa-cuttlefish {
+ --fa: "\f38c"; }
+
+.fa-blogger {
+ --fa: "\f37c"; }
+
+.fa-flickr {
+ --fa: "\f16e"; }
+
+.fa-viber {
+ --fa: "\f409"; }
+
+.fa-soundcloud {
+ --fa: "\f1be"; }
+
+.fa-digg {
+ --fa: "\f1a6"; }
+
+.fa-tencent-weibo {
+ --fa: "\f1d5"; }
+
+.fa-letterboxd {
+ --fa: "\e62d"; }
+
+.fa-symfony {
+ --fa: "\f83d"; }
+
+.fa-maxcdn {
+ --fa: "\f136"; }
+
+.fa-etsy {
+ --fa: "\f2d7"; }
+
+.fa-facebook-messenger {
+ --fa: "\f39f"; }
+
+.fa-audible {
+ --fa: "\f373"; }
+
+.fa-think-peaks {
+ --fa: "\f731"; }
+
+.fa-bilibili {
+ --fa: "\e3d9"; }
+
+.fa-erlang {
+ --fa: "\f39d"; }
+
+.fa-x-twitter {
+ --fa: "\e61b"; }
+
+.fa-cotton-bureau {
+ --fa: "\f89e"; }
+
+.fa-dashcube {
+ --fa: "\f210"; }
+
+.fa-42-group {
+ --fa: "\e080"; }
+
+.fa-innosoft {
+ --fa: "\e080"; }
+
+.fa-stack-exchange {
+ --fa: "\f18d"; }
+
+.fa-elementor {
+ --fa: "\f430"; }
+
+.fa-square-pied-piper {
+ --fa: "\e01e"; }
+
+.fa-pied-piper-square {
+ --fa: "\e01e"; }
+
+.fa-creative-commons-nd {
+ --fa: "\f4eb"; }
+
+.fa-palfed {
+ --fa: "\f3d8"; }
+
+.fa-superpowers {
+ --fa: "\f2dd"; }
+
+.fa-resolving {
+ --fa: "\f3e7"; }
+
+.fa-xbox {
+ --fa: "\f412"; }
+
+.fa-square-web-awesome-stroke {
+ --fa: "\e684"; }
+
+.fa-searchengin {
+ --fa: "\f3eb"; }
+
+.fa-tiktok {
+ --fa: "\e07b"; }
+
+.fa-square-facebook {
+ --fa: "\f082"; }
+
+.fa-facebook-square {
+ --fa: "\f082"; }
+
+.fa-renren {
+ --fa: "\f18b"; }
+
+.fa-linux {
+ --fa: "\f17c"; }
+
+.fa-glide {
+ --fa: "\f2a5"; }
+
+.fa-linkedin {
+ --fa: "\f08c"; }
+
+.fa-hubspot {
+ --fa: "\f3b2"; }
+
+.fa-deploydog {
+ --fa: "\f38e"; }
+
+.fa-twitch {
+ --fa: "\f1e8"; }
+
+.fa-flutter {
+ --fa: "\e694"; }
+
+.fa-ravelry {
+ --fa: "\f2d9"; }
+
+.fa-mixer {
+ --fa: "\e056"; }
+
+.fa-square-lastfm {
+ --fa: "\f203"; }
+
+.fa-lastfm-square {
+ --fa: "\f203"; }
+
+.fa-vimeo {
+ --fa: "\f40a"; }
+
+.fa-mendeley {
+ --fa: "\f7b3"; }
+
+.fa-uniregistry {
+ --fa: "\f404"; }
+
+.fa-figma {
+ --fa: "\f799"; }
+
+.fa-creative-commons-remix {
+ --fa: "\f4ee"; }
+
+.fa-cc-amazon-pay {
+ --fa: "\f42d"; }
+
+.fa-dropbox {
+ --fa: "\f16b"; }
+
+.fa-instagram {
+ --fa: "\f16d"; }
+
+.fa-cmplid {
+ --fa: "\e360"; }
+
+.fa-upwork {
+ --fa: "\e641"; }
+
+.fa-facebook {
+ --fa: "\f09a"; }
+
+.fa-gripfire {
+ --fa: "\f3ac"; }
+
+.fa-jedi-order {
+ --fa: "\f50e"; }
+
+.fa-uikit {
+ --fa: "\f403"; }
+
+.fa-fort-awesome-alt {
+ --fa: "\f3a3"; }
+
+.fa-phabricator {
+ --fa: "\f3db"; }
+
+.fa-ussunnah {
+ --fa: "\f407"; }
+
+.fa-earlybirds {
+ --fa: "\f39a"; }
+
+.fa-trade-federation {
+ --fa: "\f513"; }
+
+.fa-autoprefixer {
+ --fa: "\f41c"; }
+
+.fa-whatsapp {
+ --fa: "\f232"; }
+
+.fa-square-upwork {
+ --fa: "\e67c"; }
+
+.fa-slideshare {
+ --fa: "\f1e7"; }
+
+.fa-google-play {
+ --fa: "\f3ab"; }
+
+.fa-viadeo {
+ --fa: "\f2a9"; }
+
+.fa-line {
+ --fa: "\f3c0"; }
+
+.fa-google-drive {
+ --fa: "\f3aa"; }
+
+.fa-servicestack {
+ --fa: "\f3ec"; }
+
+.fa-simplybuilt {
+ --fa: "\f215"; }
+
+.fa-bitbucket {
+ --fa: "\f171"; }
+
+.fa-imdb {
+ --fa: "\f2d8"; }
+
+.fa-deezer {
+ --fa: "\e077"; }
+
+.fa-raspberry-pi {
+ --fa: "\f7bb"; }
+
+.fa-jira {
+ --fa: "\f7b1"; }
+
+.fa-docker {
+ --fa: "\f395"; }
+
+.fa-screenpal {
+ --fa: "\e570"; }
+
+.fa-bluetooth {
+ --fa: "\f293"; }
+
+.fa-gitter {
+ --fa: "\f426"; }
+
+.fa-d-and-d {
+ --fa: "\f38d"; }
+
+.fa-microblog {
+ --fa: "\e01a"; }
+
+.fa-cc-diners-club {
+ --fa: "\f24c"; }
+
+.fa-gg-circle {
+ --fa: "\f261"; }
+
+.fa-pied-piper-hat {
+ --fa: "\f4e5"; }
+
+.fa-kickstarter-k {
+ --fa: "\f3bc"; }
+
+.fa-yandex {
+ --fa: "\f413"; }
+
+.fa-readme {
+ --fa: "\f4d5"; }
+
+.fa-html5 {
+ --fa: "\f13b"; }
+
+.fa-sellsy {
+ --fa: "\f213"; }
+
+.fa-square-web-awesome {
+ --fa: "\e683"; }
+
+.fa-sass {
+ --fa: "\f41e"; }
+
+.fa-wirsindhandwerk {
+ --fa: "\e2d0"; }
+
+.fa-wsh {
+ --fa: "\e2d0"; }
+
+.fa-buromobelexperte {
+ --fa: "\f37f"; }
+
+.fa-salesforce {
+ --fa: "\f83b"; }
+
+.fa-octopus-deploy {
+ --fa: "\e082"; }
+
+.fa-medapps {
+ --fa: "\f3c6"; }
+
+.fa-ns8 {
+ --fa: "\f3d5"; }
+
+.fa-pinterest-p {
+ --fa: "\f231"; }
+
+.fa-apper {
+ --fa: "\f371"; }
+
+.fa-fort-awesome {
+ --fa: "\f286"; }
+
+.fa-waze {
+ --fa: "\f83f"; }
+
+.fa-bluesky {
+ --fa: "\e671"; }
+
+.fa-cc-jcb {
+ --fa: "\f24b"; }
+
+.fa-snapchat {
+ --fa: "\f2ab"; }
+
+.fa-snapchat-ghost {
+ --fa: "\f2ab"; }
+
+.fa-fantasy-flight-games {
+ --fa: "\f6dc"; }
+
+.fa-rust {
+ --fa: "\e07a"; }
+
+.fa-wix {
+ --fa: "\f5cf"; }
+
+.fa-square-behance {
+ --fa: "\f1b5"; }
+
+.fa-behance-square {
+ --fa: "\f1b5"; }
+
+.fa-supple {
+ --fa: "\f3f9"; }
+
+.fa-webflow {
+ --fa: "\e65c"; }
+
+.fa-rebel {
+ --fa: "\f1d0"; }
+
+.fa-css3 {
+ --fa: "\f13c"; }
+
+.fa-staylinked {
+ --fa: "\f3f5"; }
+
+.fa-kaggle {
+ --fa: "\f5fa"; }
+
+.fa-space-awesome {
+ --fa: "\e5ac"; }
+
+.fa-deviantart {
+ --fa: "\f1bd"; }
+
+.fa-cpanel {
+ --fa: "\f388"; }
+
+.fa-goodreads-g {
+ --fa: "\f3a9"; }
+
+.fa-square-git {
+ --fa: "\f1d2"; }
+
+.fa-git-square {
+ --fa: "\f1d2"; }
+
+.fa-square-tumblr {
+ --fa: "\f174"; }
+
+.fa-tumblr-square {
+ --fa: "\f174"; }
+
+.fa-trello {
+ --fa: "\f181"; }
+
+.fa-creative-commons-nc-jp {
+ --fa: "\f4ea"; }
+
+.fa-get-pocket {
+ --fa: "\f265"; }
+
+.fa-perbyte {
+ --fa: "\e083"; }
+
+.fa-grunt {
+ --fa: "\f3ad"; }
+
+.fa-weebly {
+ --fa: "\f5cc"; }
+
+.fa-connectdevelop {
+ --fa: "\f20e"; }
+
+.fa-leanpub {
+ --fa: "\f212"; }
+
+.fa-black-tie {
+ --fa: "\f27e"; }
+
+.fa-themeco {
+ --fa: "\f5c6"; }
+
+.fa-python {
+ --fa: "\f3e2"; }
+
+.fa-android {
+ --fa: "\f17b"; }
+
+.fa-bots {
+ --fa: "\e340"; }
+
+.fa-free-code-camp {
+ --fa: "\f2c5"; }
+
+.fa-hornbill {
+ --fa: "\f592"; }
+
+.fa-js {
+ --fa: "\f3b8"; }
+
+.fa-ideal {
+ --fa: "\e013"; }
+
+.fa-git {
+ --fa: "\f1d3"; }
+
+.fa-dev {
+ --fa: "\f6cc"; }
+
+.fa-sketch {
+ --fa: "\f7c6"; }
+
+.fa-yandex-international {
+ --fa: "\f414"; }
+
+.fa-cc-amex {
+ --fa: "\f1f3"; }
+
+.fa-uber {
+ --fa: "\f402"; }
+
+.fa-github {
+ --fa: "\f09b"; }
+
+.fa-php {
+ --fa: "\f457"; }
+
+.fa-alipay {
+ --fa: "\f642"; }
+
+.fa-youtube {
+ --fa: "\f167"; }
+
+.fa-skyatlas {
+ --fa: "\f216"; }
+
+.fa-firefox-browser {
+ --fa: "\e007"; }
+
+.fa-replyd {
+ --fa: "\f3e6"; }
+
+.fa-suse {
+ --fa: "\f7d6"; }
+
+.fa-jenkins {
+ --fa: "\f3b6"; }
+
+.fa-twitter {
+ --fa: "\f099"; }
+
+.fa-rockrms {
+ --fa: "\f3e9"; }
+
+.fa-pinterest {
+ --fa: "\f0d2"; }
+
+.fa-buffer {
+ --fa: "\f837"; }
+
+.fa-npm {
+ --fa: "\f3d4"; }
+
+.fa-yammer {
+ --fa: "\f840"; }
+
+.fa-btc {
+ --fa: "\f15a"; }
+
+.fa-dribbble {
+ --fa: "\f17d"; }
+
+.fa-stumbleupon-circle {
+ --fa: "\f1a3"; }
+
+.fa-internet-explorer {
+ --fa: "\f26b"; }
+
+.fa-stubber {
+ --fa: "\e5c7"; }
+
+.fa-telegram {
+ --fa: "\f2c6"; }
+
+.fa-telegram-plane {
+ --fa: "\f2c6"; }
+
+.fa-old-republic {
+ --fa: "\f510"; }
+
+.fa-odysee {
+ --fa: "\e5c6"; }
+
+.fa-square-whatsapp {
+ --fa: "\f40c"; }
+
+.fa-whatsapp-square {
+ --fa: "\f40c"; }
+
+.fa-node-js {
+ --fa: "\f3d3"; }
+
+.fa-edge-legacy {
+ --fa: "\e078"; }
+
+.fa-slack {
+ --fa: "\f198"; }
+
+.fa-slack-hash {
+ --fa: "\f198"; }
+
+.fa-medrt {
+ --fa: "\f3c8"; }
+
+.fa-usb {
+ --fa: "\f287"; }
+
+.fa-tumblr {
+ --fa: "\f173"; }
+
+.fa-vaadin {
+ --fa: "\f408"; }
+
+.fa-quora {
+ --fa: "\f2c4"; }
+
+.fa-square-x-twitter {
+ --fa: "\e61a"; }
+
+.fa-reacteurope {
+ --fa: "\f75d"; }
+
+.fa-medium {
+ --fa: "\f23a"; }
+
+.fa-medium-m {
+ --fa: "\f23a"; }
+
+.fa-amilia {
+ --fa: "\f36d"; }
+
+.fa-mixcloud {
+ --fa: "\f289"; }
+
+.fa-flipboard {
+ --fa: "\f44d"; }
+
+.fa-viacoin {
+ --fa: "\f237"; }
+
+.fa-critical-role {
+ --fa: "\f6c9"; }
+
+.fa-sitrox {
+ --fa: "\e44a"; }
+
+.fa-discourse {
+ --fa: "\f393"; }
+
+.fa-joomla {
+ --fa: "\f1aa"; }
+
+.fa-mastodon {
+ --fa: "\f4f6"; }
+
+.fa-airbnb {
+ --fa: "\f834"; }
+
+.fa-wolf-pack-battalion {
+ --fa: "\f514"; }
+
+.fa-buy-n-large {
+ --fa: "\f8a6"; }
+
+.fa-gulp {
+ --fa: "\f3ae"; }
+
+.fa-creative-commons-sampling-plus {
+ --fa: "\f4f1"; }
+
+.fa-strava {
+ --fa: "\f428"; }
+
+.fa-ember {
+ --fa: "\f423"; }
+
+.fa-canadian-maple-leaf {
+ --fa: "\f785"; }
+
+.fa-teamspeak {
+ --fa: "\f4f9"; }
+
+.fa-pushed {
+ --fa: "\f3e1"; }
+
+.fa-wordpress-simple {
+ --fa: "\f411"; }
+
+.fa-nutritionix {
+ --fa: "\f3d6"; }
+
+.fa-wodu {
+ --fa: "\e088"; }
+
+.fa-google-pay {
+ --fa: "\e079"; }
+
+.fa-intercom {
+ --fa: "\f7af"; }
+
+.fa-zhihu {
+ --fa: "\f63f"; }
+
+.fa-korvue {
+ --fa: "\f42f"; }
+
+.fa-pix {
+ --fa: "\e43a"; }
+
+.fa-steam-symbol {
+ --fa: "\f3f6"; }
diff --git a/libai/fontawesome/brands.min.css b/libai/fontawesome/brands.min.css
new file mode 100644
index 0000000..7aa3689
--- /dev/null
+++ b/libai/fontawesome/brands.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero{--fa:"\f3d0"}.fa-hooli{--fa:"\f427"}.fa-yelp{--fa:"\f1e9"}.fa-cc-visa{--fa:"\f1f0"}.fa-lastfm{--fa:"\f202"}.fa-shopware{--fa:"\f5b5"}.fa-creative-commons-nc{--fa:"\f4e8"}.fa-aws{--fa:"\f375"}.fa-redhat{--fa:"\f7bc"}.fa-yoast{--fa:"\f2b1"}.fa-cloudflare{--fa:"\e07d"}.fa-ups{--fa:"\f7e0"}.fa-pixiv{--fa:"\e640"}.fa-wpexplorer{--fa:"\f2de"}.fa-dyalog{--fa:"\f399"}.fa-bity{--fa:"\f37a"}.fa-stackpath{--fa:"\f842"}.fa-buysellads{--fa:"\f20d"}.fa-first-order{--fa:"\f2b0"}.fa-modx{--fa:"\f285"}.fa-guilded{--fa:"\e07e"}.fa-vnv{--fa:"\f40b"}.fa-js-square,.fa-square-js{--fa:"\f3b9"}.fa-microsoft{--fa:"\f3ca"}.fa-qq{--fa:"\f1d6"}.fa-orcid{--fa:"\f8d2"}.fa-java{--fa:"\f4e4"}.fa-invision{--fa:"\f7b0"}.fa-creative-commons-pd-alt{--fa:"\f4ed"}.fa-centercode{--fa:"\f380"}.fa-glide-g{--fa:"\f2a6"}.fa-drupal{--fa:"\f1a9"}.fa-jxl{--fa:"\e67b"}.fa-dart-lang{--fa:"\e693"}.fa-hire-a-helper{--fa:"\f3b0"}.fa-creative-commons-by{--fa:"\f4e7"}.fa-unity{--fa:"\e049"}.fa-whmcs{--fa:"\f40d"}.fa-rocketchat{--fa:"\f3e8"}.fa-vk{--fa:"\f189"}.fa-untappd{--fa:"\f405"}.fa-mailchimp{--fa:"\f59e"}.fa-css3-alt{--fa:"\f38b"}.fa-reddit-square,.fa-square-reddit{--fa:"\f1a2"}.fa-vimeo-v{--fa:"\f27d"}.fa-contao{--fa:"\f26d"}.fa-square-font-awesome{--fa:"\e5ad"}.fa-deskpro{--fa:"\f38f"}.fa-brave{--fa:"\e63c"}.fa-sistrix{--fa:"\f3ee"}.fa-instagram-square,.fa-square-instagram{--fa:"\e055"}.fa-battle-net{--fa:"\f835"}.fa-the-red-yeti{--fa:"\f69d"}.fa-hacker-news-square,.fa-square-hacker-news{--fa:"\f3af"}.fa-edge{--fa:"\f282"}.fa-threads{--fa:"\e618"}.fa-napster{--fa:"\f3d2"}.fa-snapchat-square,.fa-square-snapchat{--fa:"\f2ad"}.fa-google-plus-g{--fa:"\f0d5"}.fa-artstation{--fa:"\f77a"}.fa-markdown{--fa:"\f60f"}.fa-sourcetree{--fa:"\f7d3"}.fa-google-plus{--fa:"\f2b3"}.fa-diaspora{--fa:"\f791"}.fa-foursquare{--fa:"\f180"}.fa-stack-overflow{--fa:"\f16c"}.fa-github-alt{--fa:"\f113"}.fa-phoenix-squadron{--fa:"\f511"}.fa-pagelines{--fa:"\f18c"}.fa-algolia{--fa:"\f36c"}.fa-red-river{--fa:"\f3e3"}.fa-creative-commons-sa{--fa:"\f4ef"}.fa-safari{--fa:"\f267"}.fa-google{--fa:"\f1a0"}.fa-font-awesome-alt,.fa-square-font-awesome-stroke{--fa:"\f35c"}.fa-atlassian{--fa:"\f77b"}.fa-linkedin-in{--fa:"\f0e1"}.fa-digital-ocean{--fa:"\f391"}.fa-nimblr{--fa:"\f5a8"}.fa-chromecast{--fa:"\f838"}.fa-evernote{--fa:"\f839"}.fa-hacker-news{--fa:"\f1d4"}.fa-creative-commons-sampling{--fa:"\f4f0"}.fa-adversal{--fa:"\f36a"}.fa-creative-commons{--fa:"\f25e"}.fa-watchman-monitoring{--fa:"\e087"}.fa-fonticons{--fa:"\f280"}.fa-weixin{--fa:"\f1d7"}.fa-shirtsinbulk{--fa:"\f214"}.fa-codepen{--fa:"\f1cb"}.fa-git-alt{--fa:"\f841"}.fa-lyft{--fa:"\f3c3"}.fa-rev{--fa:"\f5b2"}.fa-windows{--fa:"\f17a"}.fa-wizards-of-the-coast{--fa:"\f730"}.fa-square-viadeo,.fa-viadeo-square{--fa:"\f2aa"}.fa-meetup{--fa:"\f2e0"}.fa-centos{--fa:"\f789"}.fa-adn{--fa:"\f170"}.fa-cloudsmith{--fa:"\f384"}.fa-opensuse{--fa:"\e62b"}.fa-pied-piper-alt{--fa:"\f1a8"}.fa-dribbble-square,.fa-square-dribbble{--fa:"\f397"}.fa-codiepie{--fa:"\f284"}.fa-node{--fa:"\f419"}.fa-mix{--fa:"\f3cb"}.fa-steam{--fa:"\f1b6"}.fa-cc-apple-pay{--fa:"\f416"}.fa-scribd{--fa:"\f28a"}.fa-debian{--fa:"\e60b"}.fa-openid{--fa:"\f19b"}.fa-instalod{--fa:"\e081"}.fa-files-pinwheel{--fa:"\e69f"}.fa-expeditedssl{--fa:"\f23e"}.fa-sellcast{--fa:"\f2da"}.fa-square-twitter,.fa-twitter-square{--fa:"\f081"}.fa-r-project{--fa:"\f4f7"}.fa-delicious{--fa:"\f1a5"}.fa-freebsd{--fa:"\f3a4"}.fa-vuejs{--fa:"\f41f"}.fa-accusoft{--fa:"\f369"}.fa-ioxhost{--fa:"\f208"}.fa-fonticons-fi{--fa:"\f3a2"}.fa-app-store{--fa:"\f36f"}.fa-cc-mastercard{--fa:"\f1f1"}.fa-itunes-note{--fa:"\f3b5"}.fa-golang{--fa:"\e40f"}.fa-kickstarter,.fa-square-kickstarter{--fa:"\f3bb"}.fa-grav{--fa:"\f2d6"}.fa-weibo{--fa:"\f18a"}.fa-uncharted{--fa:"\e084"}.fa-firstdraft{--fa:"\f3a1"}.fa-square-youtube,.fa-youtube-square{--fa:"\f431"}.fa-wikipedia-w{--fa:"\f266"}.fa-rendact,.fa-wpressr{--fa:"\f3e4"}.fa-angellist{--fa:"\f209"}.fa-galactic-republic{--fa:"\f50c"}.fa-nfc-directional{--fa:"\e530"}.fa-skype{--fa:"\f17e"}.fa-joget{--fa:"\f3b7"}.fa-fedora{--fa:"\f798"}.fa-stripe-s{--fa:"\f42a"}.fa-meta{--fa:"\e49b"}.fa-laravel{--fa:"\f3bd"}.fa-hotjar{--fa:"\f3b1"}.fa-bluetooth-b{--fa:"\f294"}.fa-square-letterboxd{--fa:"\e62e"}.fa-sticker-mule{--fa:"\f3f7"}.fa-creative-commons-zero{--fa:"\f4f3"}.fa-hips{--fa:"\f452"}.fa-css{--fa:"\e6a2"}.fa-behance{--fa:"\f1b4"}.fa-reddit{--fa:"\f1a1"}.fa-discord{--fa:"\f392"}.fa-chrome{--fa:"\f268"}.fa-app-store-ios{--fa:"\f370"}.fa-cc-discover{--fa:"\f1f2"}.fa-wpbeginner{--fa:"\f297"}.fa-confluence{--fa:"\f78d"}.fa-shoelace{--fa:"\e60c"}.fa-mdb{--fa:"\f8ca"}.fa-dochub{--fa:"\f394"}.fa-accessible-icon{--fa:"\f368"}.fa-ebay{--fa:"\f4f4"}.fa-amazon{--fa:"\f270"}.fa-unsplash{--fa:"\e07c"}.fa-yarn{--fa:"\f7e3"}.fa-square-steam,.fa-steam-square{--fa:"\f1b7"}.fa-500px{--fa:"\f26e"}.fa-square-vimeo,.fa-vimeo-square{--fa:"\f194"}.fa-asymmetrik{--fa:"\f372"}.fa-font-awesome,.fa-font-awesome-flag,.fa-font-awesome-logo-full{--fa:"\f2b4"}.fa-gratipay{--fa:"\f184"}.fa-apple{--fa:"\f179"}.fa-hive{--fa:"\e07f"}.fa-gitkraken{--fa:"\f3a6"}.fa-keybase{--fa:"\f4f5"}.fa-apple-pay{--fa:"\f415"}.fa-padlet{--fa:"\e4a0"}.fa-amazon-pay{--fa:"\f42c"}.fa-github-square,.fa-square-github{--fa:"\f092"}.fa-stumbleupon{--fa:"\f1a4"}.fa-fedex{--fa:"\f797"}.fa-phoenix-framework{--fa:"\f3dc"}.fa-shopify{--fa:"\e057"}.fa-neos{--fa:"\f612"}.fa-square-threads{--fa:"\e619"}.fa-hackerrank{--fa:"\f5f7"}.fa-researchgate{--fa:"\f4f8"}.fa-swift{--fa:"\f8e1"}.fa-angular{--fa:"\f420"}.fa-speakap{--fa:"\f3f3"}.fa-angrycreative{--fa:"\f36e"}.fa-y-combinator{--fa:"\f23b"}.fa-empire{--fa:"\f1d1"}.fa-envira{--fa:"\f299"}.fa-google-scholar{--fa:"\e63b"}.fa-gitlab-square,.fa-square-gitlab{--fa:"\e5ae"}.fa-studiovinari{--fa:"\f3f8"}.fa-pied-piper{--fa:"\f2ae"}.fa-wordpress{--fa:"\f19a"}.fa-product-hunt{--fa:"\f288"}.fa-firefox{--fa:"\f269"}.fa-linode{--fa:"\f2b8"}.fa-goodreads{--fa:"\f3a8"}.fa-odnoklassniki-square,.fa-square-odnoklassniki{--fa:"\f264"}.fa-jsfiddle{--fa:"\f1cc"}.fa-sith{--fa:"\f512"}.fa-themeisle{--fa:"\f2b2"}.fa-page4{--fa:"\f3d7"}.fa-hashnode{--fa:"\e499"}.fa-react{--fa:"\f41b"}.fa-cc-paypal{--fa:"\f1f4"}.fa-squarespace{--fa:"\f5be"}.fa-cc-stripe{--fa:"\f1f5"}.fa-creative-commons-share{--fa:"\f4f2"}.fa-bitcoin{--fa:"\f379"}.fa-keycdn{--fa:"\f3ba"}.fa-opera{--fa:"\f26a"}.fa-itch-io{--fa:"\f83a"}.fa-umbraco{--fa:"\f8e8"}.fa-galactic-senate{--fa:"\f50d"}.fa-ubuntu{--fa:"\f7df"}.fa-draft2digital{--fa:"\f396"}.fa-stripe{--fa:"\f429"}.fa-houzz{--fa:"\f27c"}.fa-gg{--fa:"\f260"}.fa-dhl{--fa:"\f790"}.fa-pinterest-square,.fa-square-pinterest{--fa:"\f0d3"}.fa-xing{--fa:"\f168"}.fa-blackberry{--fa:"\f37b"}.fa-creative-commons-pd{--fa:"\f4ec"}.fa-playstation{--fa:"\f3df"}.fa-quinscape{--fa:"\f459"}.fa-less{--fa:"\f41d"}.fa-blogger-b{--fa:"\f37d"}.fa-opencart{--fa:"\f23d"}.fa-vine{--fa:"\f1ca"}.fa-signal-messenger{--fa:"\e663"}.fa-paypal{--fa:"\f1ed"}.fa-gitlab{--fa:"\f296"}.fa-typo3{--fa:"\f42b"}.fa-reddit-alien{--fa:"\f281"}.fa-yahoo{--fa:"\f19e"}.fa-dailymotion{--fa:"\e052"}.fa-affiliatetheme{--fa:"\f36b"}.fa-pied-piper-pp{--fa:"\f1a7"}.fa-bootstrap{--fa:"\f836"}.fa-odnoklassniki{--fa:"\f263"}.fa-nfc-symbol{--fa:"\e531"}.fa-mintbit{--fa:"\e62f"}.fa-ethereum{--fa:"\f42e"}.fa-speaker-deck{--fa:"\f83c"}.fa-creative-commons-nc-eu{--fa:"\f4e9"}.fa-patreon{--fa:"\f3d9"}.fa-avianex{--fa:"\f374"}.fa-ello{--fa:"\f5f1"}.fa-gofore{--fa:"\f3a7"}.fa-bimobject{--fa:"\f378"}.fa-brave-reverse{--fa:"\e63d"}.fa-facebook-f{--fa:"\f39e"}.fa-google-plus-square,.fa-square-google-plus{--fa:"\f0d4"}.fa-web-awesome{--fa:"\e682"}.fa-mandalorian{--fa:"\f50f"}.fa-first-order-alt{--fa:"\f50a"}.fa-osi{--fa:"\f41a"}.fa-google-wallet{--fa:"\f1ee"}.fa-d-and-d-beyond{--fa:"\f6ca"}.fa-periscope{--fa:"\f3da"}.fa-fulcrum{--fa:"\f50b"}.fa-cloudscale{--fa:"\f383"}.fa-forumbee{--fa:"\f211"}.fa-mizuni{--fa:"\f3cc"}.fa-schlix{--fa:"\f3ea"}.fa-square-xing,.fa-xing-square{--fa:"\f169"}.fa-bandcamp{--fa:"\f2d5"}.fa-wpforms{--fa:"\f298"}.fa-cloudversify{--fa:"\f385"}.fa-usps{--fa:"\f7e1"}.fa-megaport{--fa:"\f5a3"}.fa-magento{--fa:"\f3c4"}.fa-spotify{--fa:"\f1bc"}.fa-optin-monster{--fa:"\f23c"}.fa-fly{--fa:"\f417"}.fa-square-bluesky{--fa:"\e6a3"}.fa-aviato{--fa:"\f421"}.fa-itunes{--fa:"\f3b4"}.fa-cuttlefish{--fa:"\f38c"}.fa-blogger{--fa:"\f37c"}.fa-flickr{--fa:"\f16e"}.fa-viber{--fa:"\f409"}.fa-soundcloud{--fa:"\f1be"}.fa-digg{--fa:"\f1a6"}.fa-tencent-weibo{--fa:"\f1d5"}.fa-letterboxd{--fa:"\e62d"}.fa-symfony{--fa:"\f83d"}.fa-maxcdn{--fa:"\f136"}.fa-etsy{--fa:"\f2d7"}.fa-facebook-messenger{--fa:"\f39f"}.fa-audible{--fa:"\f373"}.fa-think-peaks{--fa:"\f731"}.fa-bilibili{--fa:"\e3d9"}.fa-erlang{--fa:"\f39d"}.fa-x-twitter{--fa:"\e61b"}.fa-cotton-bureau{--fa:"\f89e"}.fa-dashcube{--fa:"\f210"}.fa-42-group,.fa-innosoft{--fa:"\e080"}.fa-stack-exchange{--fa:"\f18d"}.fa-elementor{--fa:"\f430"}.fa-pied-piper-square,.fa-square-pied-piper{--fa:"\e01e"}.fa-creative-commons-nd{--fa:"\f4eb"}.fa-palfed{--fa:"\f3d8"}.fa-superpowers{--fa:"\f2dd"}.fa-resolving{--fa:"\f3e7"}.fa-xbox{--fa:"\f412"}.fa-square-web-awesome-stroke{--fa:"\e684"}.fa-searchengin{--fa:"\f3eb"}.fa-tiktok{--fa:"\e07b"}.fa-facebook-square,.fa-square-facebook{--fa:"\f082"}.fa-renren{--fa:"\f18b"}.fa-linux{--fa:"\f17c"}.fa-glide{--fa:"\f2a5"}.fa-linkedin{--fa:"\f08c"}.fa-hubspot{--fa:"\f3b2"}.fa-deploydog{--fa:"\f38e"}.fa-twitch{--fa:"\f1e8"}.fa-flutter{--fa:"\e694"}.fa-ravelry{--fa:"\f2d9"}.fa-mixer{--fa:"\e056"}.fa-lastfm-square,.fa-square-lastfm{--fa:"\f203"}.fa-vimeo{--fa:"\f40a"}.fa-mendeley{--fa:"\f7b3"}.fa-uniregistry{--fa:"\f404"}.fa-figma{--fa:"\f799"}.fa-creative-commons-remix{--fa:"\f4ee"}.fa-cc-amazon-pay{--fa:"\f42d"}.fa-dropbox{--fa:"\f16b"}.fa-instagram{--fa:"\f16d"}.fa-cmplid{--fa:"\e360"}.fa-upwork{--fa:"\e641"}.fa-facebook{--fa:"\f09a"}.fa-gripfire{--fa:"\f3ac"}.fa-jedi-order{--fa:"\f50e"}.fa-uikit{--fa:"\f403"}.fa-fort-awesome-alt{--fa:"\f3a3"}.fa-phabricator{--fa:"\f3db"}.fa-ussunnah{--fa:"\f407"}.fa-earlybirds{--fa:"\f39a"}.fa-trade-federation{--fa:"\f513"}.fa-autoprefixer{--fa:"\f41c"}.fa-whatsapp{--fa:"\f232"}.fa-square-upwork{--fa:"\e67c"}.fa-slideshare{--fa:"\f1e7"}.fa-google-play{--fa:"\f3ab"}.fa-viadeo{--fa:"\f2a9"}.fa-line{--fa:"\f3c0"}.fa-google-drive{--fa:"\f3aa"}.fa-servicestack{--fa:"\f3ec"}.fa-simplybuilt{--fa:"\f215"}.fa-bitbucket{--fa:"\f171"}.fa-imdb{--fa:"\f2d8"}.fa-deezer{--fa:"\e077"}.fa-raspberry-pi{--fa:"\f7bb"}.fa-jira{--fa:"\f7b1"}.fa-docker{--fa:"\f395"}.fa-screenpal{--fa:"\e570"}.fa-bluetooth{--fa:"\f293"}.fa-gitter{--fa:"\f426"}.fa-d-and-d{--fa:"\f38d"}.fa-microblog{--fa:"\e01a"}.fa-cc-diners-club{--fa:"\f24c"}.fa-gg-circle{--fa:"\f261"}.fa-pied-piper-hat{--fa:"\f4e5"}.fa-kickstarter-k{--fa:"\f3bc"}.fa-yandex{--fa:"\f413"}.fa-readme{--fa:"\f4d5"}.fa-html5{--fa:"\f13b"}.fa-sellsy{--fa:"\f213"}.fa-square-web-awesome{--fa:"\e683"}.fa-sass{--fa:"\f41e"}.fa-wirsindhandwerk,.fa-wsh{--fa:"\e2d0"}.fa-buromobelexperte{--fa:"\f37f"}.fa-salesforce{--fa:"\f83b"}.fa-octopus-deploy{--fa:"\e082"}.fa-medapps{--fa:"\f3c6"}.fa-ns8{--fa:"\f3d5"}.fa-pinterest-p{--fa:"\f231"}.fa-apper{--fa:"\f371"}.fa-fort-awesome{--fa:"\f286"}.fa-waze{--fa:"\f83f"}.fa-bluesky{--fa:"\e671"}.fa-cc-jcb{--fa:"\f24b"}.fa-snapchat,.fa-snapchat-ghost{--fa:"\f2ab"}.fa-fantasy-flight-games{--fa:"\f6dc"}.fa-rust{--fa:"\e07a"}.fa-wix{--fa:"\f5cf"}.fa-behance-square,.fa-square-behance{--fa:"\f1b5"}.fa-supple{--fa:"\f3f9"}.fa-webflow{--fa:"\e65c"}.fa-rebel{--fa:"\f1d0"}.fa-css3{--fa:"\f13c"}.fa-staylinked{--fa:"\f3f5"}.fa-kaggle{--fa:"\f5fa"}.fa-space-awesome{--fa:"\e5ac"}.fa-deviantart{--fa:"\f1bd"}.fa-cpanel{--fa:"\f388"}.fa-goodreads-g{--fa:"\f3a9"}.fa-git-square,.fa-square-git{--fa:"\f1d2"}.fa-square-tumblr,.fa-tumblr-square{--fa:"\f174"}.fa-trello{--fa:"\f181"}.fa-creative-commons-nc-jp{--fa:"\f4ea"}.fa-get-pocket{--fa:"\f265"}.fa-perbyte{--fa:"\e083"}.fa-grunt{--fa:"\f3ad"}.fa-weebly{--fa:"\f5cc"}.fa-connectdevelop{--fa:"\f20e"}.fa-leanpub{--fa:"\f212"}.fa-black-tie{--fa:"\f27e"}.fa-themeco{--fa:"\f5c6"}.fa-python{--fa:"\f3e2"}.fa-android{--fa:"\f17b"}.fa-bots{--fa:"\e340"}.fa-free-code-camp{--fa:"\f2c5"}.fa-hornbill{--fa:"\f592"}.fa-js{--fa:"\f3b8"}.fa-ideal{--fa:"\e013"}.fa-git{--fa:"\f1d3"}.fa-dev{--fa:"\f6cc"}.fa-sketch{--fa:"\f7c6"}.fa-yandex-international{--fa:"\f414"}.fa-cc-amex{--fa:"\f1f3"}.fa-uber{--fa:"\f402"}.fa-github{--fa:"\f09b"}.fa-php{--fa:"\f457"}.fa-alipay{--fa:"\f642"}.fa-youtube{--fa:"\f167"}.fa-skyatlas{--fa:"\f216"}.fa-firefox-browser{--fa:"\e007"}.fa-replyd{--fa:"\f3e6"}.fa-suse{--fa:"\f7d6"}.fa-jenkins{--fa:"\f3b6"}.fa-twitter{--fa:"\f099"}.fa-rockrms{--fa:"\f3e9"}.fa-pinterest{--fa:"\f0d2"}.fa-buffer{--fa:"\f837"}.fa-npm{--fa:"\f3d4"}.fa-yammer{--fa:"\f840"}.fa-btc{--fa:"\f15a"}.fa-dribbble{--fa:"\f17d"}.fa-stumbleupon-circle{--fa:"\f1a3"}.fa-internet-explorer{--fa:"\f26b"}.fa-stubber{--fa:"\e5c7"}.fa-telegram,.fa-telegram-plane{--fa:"\f2c6"}.fa-old-republic{--fa:"\f510"}.fa-odysee{--fa:"\e5c6"}.fa-square-whatsapp,.fa-whatsapp-square{--fa:"\f40c"}.fa-node-js{--fa:"\f3d3"}.fa-edge-legacy{--fa:"\e078"}.fa-slack,.fa-slack-hash{--fa:"\f198"}.fa-medrt{--fa:"\f3c8"}.fa-usb{--fa:"\f287"}.fa-tumblr{--fa:"\f173"}.fa-vaadin{--fa:"\f408"}.fa-quora{--fa:"\f2c4"}.fa-square-x-twitter{--fa:"\e61a"}.fa-reacteurope{--fa:"\f75d"}.fa-medium,.fa-medium-m{--fa:"\f23a"}.fa-amilia{--fa:"\f36d"}.fa-mixcloud{--fa:"\f289"}.fa-flipboard{--fa:"\f44d"}.fa-viacoin{--fa:"\f237"}.fa-critical-role{--fa:"\f6c9"}.fa-sitrox{--fa:"\e44a"}.fa-discourse{--fa:"\f393"}.fa-joomla{--fa:"\f1aa"}.fa-mastodon{--fa:"\f4f6"}.fa-airbnb{--fa:"\f834"}.fa-wolf-pack-battalion{--fa:"\f514"}.fa-buy-n-large{--fa:"\f8a6"}.fa-gulp{--fa:"\f3ae"}.fa-creative-commons-sampling-plus{--fa:"\f4f1"}.fa-strava{--fa:"\f428"}.fa-ember{--fa:"\f423"}.fa-canadian-maple-leaf{--fa:"\f785"}.fa-teamspeak{--fa:"\f4f9"}.fa-pushed{--fa:"\f3e1"}.fa-wordpress-simple{--fa:"\f411"}.fa-nutritionix{--fa:"\f3d6"}.fa-wodu{--fa:"\e088"}.fa-google-pay{--fa:"\e079"}.fa-intercom{--fa:"\f7af"}.fa-zhihu{--fa:"\f63f"}.fa-korvue{--fa:"\f42f"}.fa-pix{--fa:"\e43a"}.fa-steam-symbol{--fa:"\f3f6"}
\ No newline at end of file
diff --git a/libai/fontawesome/fontawesome.css b/libai/fontawesome/fontawesome.css
new file mode 100644
index 0000000..a9b2ec8
--- /dev/null
+++ b/libai/fontawesome/fontawesome.css
@@ -0,0 +1,6243 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+.fa {
+ font-family: var(--fa-style-family, "Font Awesome 6 Free");
+ font-weight: var(--fa-style, 900); }
+
+.fas,
+.far,
+.fab,
+.fa-solid,
+.fa-regular,
+.fa-brands,
+.fa {
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ display: var(--fa-display, inline-block);
+ font-style: normal;
+ font-variant: normal;
+ line-height: 1;
+ text-rendering: auto; }
+
+.fas::before,
+.far::before,
+.fab::before,
+.fa-solid::before,
+.fa-regular::before,
+.fa-brands::before,
+.fa::before {
+ content: var(--fa); }
+
+.fa-classic,
+.fas,
+.fa-solid,
+.far,
+.fa-regular {
+ font-family: 'Font Awesome 6 Free'; }
+
+.fa-brands,
+.fab {
+ font-family: 'Font Awesome 6 Brands'; }
+
+.fa-1x {
+ font-size: 1em; }
+
+.fa-2x {
+ font-size: 2em; }
+
+.fa-3x {
+ font-size: 3em; }
+
+.fa-4x {
+ font-size: 4em; }
+
+.fa-5x {
+ font-size: 5em; }
+
+.fa-6x {
+ font-size: 6em; }
+
+.fa-7x {
+ font-size: 7em; }
+
+.fa-8x {
+ font-size: 8em; }
+
+.fa-9x {
+ font-size: 9em; }
+
+.fa-10x {
+ font-size: 10em; }
+
+.fa-2xs {
+ font-size: 0.625em;
+ line-height: 0.1em;
+ vertical-align: 0.225em; }
+
+.fa-xs {
+ font-size: 0.75em;
+ line-height: 0.08333em;
+ vertical-align: 0.125em; }
+
+.fa-sm {
+ font-size: 0.875em;
+ line-height: 0.07143em;
+ vertical-align: 0.05357em; }
+
+.fa-lg {
+ font-size: 1.25em;
+ line-height: 0.05em;
+ vertical-align: -0.075em; }
+
+.fa-xl {
+ font-size: 1.5em;
+ line-height: 0.04167em;
+ vertical-align: -0.125em; }
+
+.fa-2xl {
+ font-size: 2em;
+ line-height: 0.03125em;
+ vertical-align: -0.1875em; }
+
+.fa-fw {
+ text-align: center;
+ width: 1.25em; }
+
+.fa-ul {
+ list-style-type: none;
+ margin-left: var(--fa-li-margin, 2.5em);
+ padding-left: 0; }
+ .fa-ul > li {
+ position: relative; }
+
+.fa-li {
+ left: calc(-1 * var(--fa-li-width, 2em));
+ position: absolute;
+ text-align: center;
+ width: var(--fa-li-width, 2em);
+ line-height: inherit; }
+
+.fa-border {
+ border-color: var(--fa-border-color, #eee);
+ border-radius: var(--fa-border-radius, 0.1em);
+ border-style: var(--fa-border-style, solid);
+ border-width: var(--fa-border-width, 0.08em);
+ padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); }
+
+.fa-pull-left {
+ float: left;
+ margin-right: var(--fa-pull-margin, 0.3em); }
+
+.fa-pull-right {
+ float: right;
+ margin-left: var(--fa-pull-margin, 0.3em); }
+
+.fa-beat {
+ animation-name: fa-beat;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, ease-in-out); }
+
+.fa-bounce {
+ animation-name: fa-bounce;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
+
+.fa-fade {
+ animation-name: fa-fade;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
+
+.fa-beat-fade {
+ animation-name: fa-beat-fade;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
+
+.fa-flip {
+ animation-name: fa-flip;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, ease-in-out); }
+
+.fa-shake {
+ animation-name: fa-shake;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, linear); }
+
+.fa-spin {
+ animation-name: fa-spin;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 2s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, linear); }
+
+.fa-spin-reverse {
+ --fa-animation-direction: reverse; }
+
+.fa-pulse,
+.fa-spin-pulse {
+ animation-name: fa-spin;
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, steps(8)); }
+
+@media (prefers-reduced-motion: reduce) {
+ .fa-beat,
+ .fa-bounce,
+ .fa-fade,
+ .fa-beat-fade,
+ .fa-flip,
+ .fa-pulse,
+ .fa-shake,
+ .fa-spin,
+ .fa-spin-pulse {
+ animation-delay: -1ms;
+ animation-duration: 1ms;
+ animation-iteration-count: 1;
+ transition-delay: 0s;
+ transition-duration: 0s; } }
+
+@keyframes fa-beat {
+ 0%, 90% {
+ transform: scale(1); }
+ 45% {
+ transform: scale(var(--fa-beat-scale, 1.25)); } }
+
+@keyframes fa-bounce {
+ 0% {
+ transform: scale(1, 1) translateY(0); }
+ 10% {
+ transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
+ 30% {
+ transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
+ 50% {
+ transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
+ 57% {
+ transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
+ 64% {
+ transform: scale(1, 1) translateY(0); }
+ 100% {
+ transform: scale(1, 1) translateY(0); } }
+
+@keyframes fa-fade {
+ 50% {
+ opacity: var(--fa-fade-opacity, 0.4); } }
+
+@keyframes fa-beat-fade {
+ 0%, 100% {
+ opacity: var(--fa-beat-fade-opacity, 0.4);
+ transform: scale(1); }
+ 50% {
+ opacity: 1;
+ transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
+
+@keyframes fa-flip {
+ 50% {
+ transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
+
+@keyframes fa-shake {
+ 0% {
+ transform: rotate(-15deg); }
+ 4% {
+ transform: rotate(15deg); }
+ 8%, 24% {
+ transform: rotate(-18deg); }
+ 12%, 28% {
+ transform: rotate(18deg); }
+ 16% {
+ transform: rotate(-22deg); }
+ 20% {
+ transform: rotate(22deg); }
+ 32% {
+ transform: rotate(-12deg); }
+ 36% {
+ transform: rotate(12deg); }
+ 40%, 100% {
+ transform: rotate(0deg); } }
+
+@keyframes fa-spin {
+ 0% {
+ transform: rotate(0deg); }
+ 100% {
+ transform: rotate(360deg); } }
+
+.fa-rotate-90 {
+ transform: rotate(90deg); }
+
+.fa-rotate-180 {
+ transform: rotate(180deg); }
+
+.fa-rotate-270 {
+ transform: rotate(270deg); }
+
+.fa-flip-horizontal {
+ transform: scale(-1, 1); }
+
+.fa-flip-vertical {
+ transform: scale(1, -1); }
+
+.fa-flip-both,
+.fa-flip-horizontal.fa-flip-vertical {
+ transform: scale(-1, -1); }
+
+.fa-rotate-by {
+ transform: rotate(var(--fa-rotate-angle, 0)); }
+
+.fa-stack {
+ display: inline-block;
+ height: 2em;
+ line-height: 2em;
+ position: relative;
+ vertical-align: middle;
+ width: 2.5em; }
+
+.fa-stack-1x,
+.fa-stack-2x {
+ left: 0;
+ position: absolute;
+ text-align: center;
+ width: 100%;
+ z-index: var(--fa-stack-z-index, auto); }
+
+.fa-stack-1x {
+ line-height: inherit; }
+
+.fa-stack-2x {
+ font-size: 2em; }
+
+.fa-inverse {
+ color: var(--fa-inverse, #fff); }
+
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+readers do not read off random characters that represent icons */
+
+.fa-0 {
+ --fa: "\30"; }
+
+.fa-1 {
+ --fa: "\31"; }
+
+.fa-2 {
+ --fa: "\32"; }
+
+.fa-3 {
+ --fa: "\33"; }
+
+.fa-4 {
+ --fa: "\34"; }
+
+.fa-5 {
+ --fa: "\35"; }
+
+.fa-6 {
+ --fa: "\36"; }
+
+.fa-7 {
+ --fa: "\37"; }
+
+.fa-8 {
+ --fa: "\38"; }
+
+.fa-9 {
+ --fa: "\39"; }
+
+.fa-fill-drip {
+ --fa: "\f576"; }
+
+.fa-arrows-to-circle {
+ --fa: "\e4bd"; }
+
+.fa-circle-chevron-right {
+ --fa: "\f138"; }
+
+.fa-chevron-circle-right {
+ --fa: "\f138"; }
+
+.fa-at {
+ --fa: "\40"; }
+
+.fa-trash-can {
+ --fa: "\f2ed"; }
+
+.fa-trash-alt {
+ --fa: "\f2ed"; }
+
+.fa-text-height {
+ --fa: "\f034"; }
+
+.fa-user-xmark {
+ --fa: "\f235"; }
+
+.fa-user-times {
+ --fa: "\f235"; }
+
+.fa-stethoscope {
+ --fa: "\f0f1"; }
+
+.fa-message {
+ --fa: "\f27a"; }
+
+.fa-comment-alt {
+ --fa: "\f27a"; }
+
+.fa-info {
+ --fa: "\f129"; }
+
+.fa-down-left-and-up-right-to-center {
+ --fa: "\f422"; }
+
+.fa-compress-alt {
+ --fa: "\f422"; }
+
+.fa-explosion {
+ --fa: "\e4e9"; }
+
+.fa-file-lines {
+ --fa: "\f15c"; }
+
+.fa-file-alt {
+ --fa: "\f15c"; }
+
+.fa-file-text {
+ --fa: "\f15c"; }
+
+.fa-wave-square {
+ --fa: "\f83e"; }
+
+.fa-ring {
+ --fa: "\f70b"; }
+
+.fa-building-un {
+ --fa: "\e4d9"; }
+
+.fa-dice-three {
+ --fa: "\f527"; }
+
+.fa-calendar-days {
+ --fa: "\f073"; }
+
+.fa-calendar-alt {
+ --fa: "\f073"; }
+
+.fa-anchor-circle-check {
+ --fa: "\e4aa"; }
+
+.fa-building-circle-arrow-right {
+ --fa: "\e4d1"; }
+
+.fa-volleyball {
+ --fa: "\f45f"; }
+
+.fa-volleyball-ball {
+ --fa: "\f45f"; }
+
+.fa-arrows-up-to-line {
+ --fa: "\e4c2"; }
+
+.fa-sort-down {
+ --fa: "\f0dd"; }
+
+.fa-sort-desc {
+ --fa: "\f0dd"; }
+
+.fa-circle-minus {
+ --fa: "\f056"; }
+
+.fa-minus-circle {
+ --fa: "\f056"; }
+
+.fa-door-open {
+ --fa: "\f52b"; }
+
+.fa-right-from-bracket {
+ --fa: "\f2f5"; }
+
+.fa-sign-out-alt {
+ --fa: "\f2f5"; }
+
+.fa-atom {
+ --fa: "\f5d2"; }
+
+.fa-soap {
+ --fa: "\e06e"; }
+
+.fa-icons {
+ --fa: "\f86d"; }
+
+.fa-heart-music-camera-bolt {
+ --fa: "\f86d"; }
+
+.fa-microphone-lines-slash {
+ --fa: "\f539"; }
+
+.fa-microphone-alt-slash {
+ --fa: "\f539"; }
+
+.fa-bridge-circle-check {
+ --fa: "\e4c9"; }
+
+.fa-pump-medical {
+ --fa: "\e06a"; }
+
+.fa-fingerprint {
+ --fa: "\f577"; }
+
+.fa-hand-point-right {
+ --fa: "\f0a4"; }
+
+.fa-magnifying-glass-location {
+ --fa: "\f689"; }
+
+.fa-search-location {
+ --fa: "\f689"; }
+
+.fa-forward-step {
+ --fa: "\f051"; }
+
+.fa-step-forward {
+ --fa: "\f051"; }
+
+.fa-face-smile-beam {
+ --fa: "\f5b8"; }
+
+.fa-smile-beam {
+ --fa: "\f5b8"; }
+
+.fa-flag-checkered {
+ --fa: "\f11e"; }
+
+.fa-football {
+ --fa: "\f44e"; }
+
+.fa-football-ball {
+ --fa: "\f44e"; }
+
+.fa-school-circle-exclamation {
+ --fa: "\e56c"; }
+
+.fa-crop {
+ --fa: "\f125"; }
+
+.fa-angles-down {
+ --fa: "\f103"; }
+
+.fa-angle-double-down {
+ --fa: "\f103"; }
+
+.fa-users-rectangle {
+ --fa: "\e594"; }
+
+.fa-people-roof {
+ --fa: "\e537"; }
+
+.fa-people-line {
+ --fa: "\e534"; }
+
+.fa-beer-mug-empty {
+ --fa: "\f0fc"; }
+
+.fa-beer {
+ --fa: "\f0fc"; }
+
+.fa-diagram-predecessor {
+ --fa: "\e477"; }
+
+.fa-arrow-up-long {
+ --fa: "\f176"; }
+
+.fa-long-arrow-up {
+ --fa: "\f176"; }
+
+.fa-fire-flame-simple {
+ --fa: "\f46a"; }
+
+.fa-burn {
+ --fa: "\f46a"; }
+
+.fa-person {
+ --fa: "\f183"; }
+
+.fa-male {
+ --fa: "\f183"; }
+
+.fa-laptop {
+ --fa: "\f109"; }
+
+.fa-file-csv {
+ --fa: "\f6dd"; }
+
+.fa-menorah {
+ --fa: "\f676"; }
+
+.fa-truck-plane {
+ --fa: "\e58f"; }
+
+.fa-record-vinyl {
+ --fa: "\f8d9"; }
+
+.fa-face-grin-stars {
+ --fa: "\f587"; }
+
+.fa-grin-stars {
+ --fa: "\f587"; }
+
+.fa-bong {
+ --fa: "\f55c"; }
+
+.fa-spaghetti-monster-flying {
+ --fa: "\f67b"; }
+
+.fa-pastafarianism {
+ --fa: "\f67b"; }
+
+.fa-arrow-down-up-across-line {
+ --fa: "\e4af"; }
+
+.fa-spoon {
+ --fa: "\f2e5"; }
+
+.fa-utensil-spoon {
+ --fa: "\f2e5"; }
+
+.fa-jar-wheat {
+ --fa: "\e517"; }
+
+.fa-envelopes-bulk {
+ --fa: "\f674"; }
+
+.fa-mail-bulk {
+ --fa: "\f674"; }
+
+.fa-file-circle-exclamation {
+ --fa: "\e4eb"; }
+
+.fa-circle-h {
+ --fa: "\f47e"; }
+
+.fa-hospital-symbol {
+ --fa: "\f47e"; }
+
+.fa-pager {
+ --fa: "\f815"; }
+
+.fa-address-book {
+ --fa: "\f2b9"; }
+
+.fa-contact-book {
+ --fa: "\f2b9"; }
+
+.fa-strikethrough {
+ --fa: "\f0cc"; }
+
+.fa-k {
+ --fa: "\4b"; }
+
+.fa-landmark-flag {
+ --fa: "\e51c"; }
+
+.fa-pencil {
+ --fa: "\f303"; }
+
+.fa-pencil-alt {
+ --fa: "\f303"; }
+
+.fa-backward {
+ --fa: "\f04a"; }
+
+.fa-caret-right {
+ --fa: "\f0da"; }
+
+.fa-comments {
+ --fa: "\f086"; }
+
+.fa-paste {
+ --fa: "\f0ea"; }
+
+.fa-file-clipboard {
+ --fa: "\f0ea"; }
+
+.fa-code-pull-request {
+ --fa: "\e13c"; }
+
+.fa-clipboard-list {
+ --fa: "\f46d"; }
+
+.fa-truck-ramp-box {
+ --fa: "\f4de"; }
+
+.fa-truck-loading {
+ --fa: "\f4de"; }
+
+.fa-user-check {
+ --fa: "\f4fc"; }
+
+.fa-vial-virus {
+ --fa: "\e597"; }
+
+.fa-sheet-plastic {
+ --fa: "\e571"; }
+
+.fa-blog {
+ --fa: "\f781"; }
+
+.fa-user-ninja {
+ --fa: "\f504"; }
+
+.fa-person-arrow-up-from-line {
+ --fa: "\e539"; }
+
+.fa-scroll-torah {
+ --fa: "\f6a0"; }
+
+.fa-torah {
+ --fa: "\f6a0"; }
+
+.fa-broom-ball {
+ --fa: "\f458"; }
+
+.fa-quidditch {
+ --fa: "\f458"; }
+
+.fa-quidditch-broom-ball {
+ --fa: "\f458"; }
+
+.fa-toggle-off {
+ --fa: "\f204"; }
+
+.fa-box-archive {
+ --fa: "\f187"; }
+
+.fa-archive {
+ --fa: "\f187"; }
+
+.fa-person-drowning {
+ --fa: "\e545"; }
+
+.fa-arrow-down-9-1 {
+ --fa: "\f886"; }
+
+.fa-sort-numeric-desc {
+ --fa: "\f886"; }
+
+.fa-sort-numeric-down-alt {
+ --fa: "\f886"; }
+
+.fa-face-grin-tongue-squint {
+ --fa: "\f58a"; }
+
+.fa-grin-tongue-squint {
+ --fa: "\f58a"; }
+
+.fa-spray-can {
+ --fa: "\f5bd"; }
+
+.fa-truck-monster {
+ --fa: "\f63b"; }
+
+.fa-w {
+ --fa: "\57"; }
+
+.fa-earth-africa {
+ --fa: "\f57c"; }
+
+.fa-globe-africa {
+ --fa: "\f57c"; }
+
+.fa-rainbow {
+ --fa: "\f75b"; }
+
+.fa-circle-notch {
+ --fa: "\f1ce"; }
+
+.fa-tablet-screen-button {
+ --fa: "\f3fa"; }
+
+.fa-tablet-alt {
+ --fa: "\f3fa"; }
+
+.fa-paw {
+ --fa: "\f1b0"; }
+
+.fa-cloud {
+ --fa: "\f0c2"; }
+
+.fa-trowel-bricks {
+ --fa: "\e58a"; }
+
+.fa-face-flushed {
+ --fa: "\f579"; }
+
+.fa-flushed {
+ --fa: "\f579"; }
+
+.fa-hospital-user {
+ --fa: "\f80d"; }
+
+.fa-tent-arrow-left-right {
+ --fa: "\e57f"; }
+
+.fa-gavel {
+ --fa: "\f0e3"; }
+
+.fa-legal {
+ --fa: "\f0e3"; }
+
+.fa-binoculars {
+ --fa: "\f1e5"; }
+
+.fa-microphone-slash {
+ --fa: "\f131"; }
+
+.fa-box-tissue {
+ --fa: "\e05b"; }
+
+.fa-motorcycle {
+ --fa: "\f21c"; }
+
+.fa-bell-concierge {
+ --fa: "\f562"; }
+
+.fa-concierge-bell {
+ --fa: "\f562"; }
+
+.fa-pen-ruler {
+ --fa: "\f5ae"; }
+
+.fa-pencil-ruler {
+ --fa: "\f5ae"; }
+
+.fa-people-arrows {
+ --fa: "\e068"; }
+
+.fa-people-arrows-left-right {
+ --fa: "\e068"; }
+
+.fa-mars-and-venus-burst {
+ --fa: "\e523"; }
+
+.fa-square-caret-right {
+ --fa: "\f152"; }
+
+.fa-caret-square-right {
+ --fa: "\f152"; }
+
+.fa-scissors {
+ --fa: "\f0c4"; }
+
+.fa-cut {
+ --fa: "\f0c4"; }
+
+.fa-sun-plant-wilt {
+ --fa: "\e57a"; }
+
+.fa-toilets-portable {
+ --fa: "\e584"; }
+
+.fa-hockey-puck {
+ --fa: "\f453"; }
+
+.fa-table {
+ --fa: "\f0ce"; }
+
+.fa-magnifying-glass-arrow-right {
+ --fa: "\e521"; }
+
+.fa-tachograph-digital {
+ --fa: "\f566"; }
+
+.fa-digital-tachograph {
+ --fa: "\f566"; }
+
+.fa-users-slash {
+ --fa: "\e073"; }
+
+.fa-clover {
+ --fa: "\e139"; }
+
+.fa-reply {
+ --fa: "\f3e5"; }
+
+.fa-mail-reply {
+ --fa: "\f3e5"; }
+
+.fa-star-and-crescent {
+ --fa: "\f699"; }
+
+.fa-house-fire {
+ --fa: "\e50c"; }
+
+.fa-square-minus {
+ --fa: "\f146"; }
+
+.fa-minus-square {
+ --fa: "\f146"; }
+
+.fa-helicopter {
+ --fa: "\f533"; }
+
+.fa-compass {
+ --fa: "\f14e"; }
+
+.fa-square-caret-down {
+ --fa: "\f150"; }
+
+.fa-caret-square-down {
+ --fa: "\f150"; }
+
+.fa-file-circle-question {
+ --fa: "\e4ef"; }
+
+.fa-laptop-code {
+ --fa: "\f5fc"; }
+
+.fa-swatchbook {
+ --fa: "\f5c3"; }
+
+.fa-prescription-bottle {
+ --fa: "\f485"; }
+
+.fa-bars {
+ --fa: "\f0c9"; }
+
+.fa-navicon {
+ --fa: "\f0c9"; }
+
+.fa-people-group {
+ --fa: "\e533"; }
+
+.fa-hourglass-end {
+ --fa: "\f253"; }
+
+.fa-hourglass-3 {
+ --fa: "\f253"; }
+
+.fa-heart-crack {
+ --fa: "\f7a9"; }
+
+.fa-heart-broken {
+ --fa: "\f7a9"; }
+
+.fa-square-up-right {
+ --fa: "\f360"; }
+
+.fa-external-link-square-alt {
+ --fa: "\f360"; }
+
+.fa-face-kiss-beam {
+ --fa: "\f597"; }
+
+.fa-kiss-beam {
+ --fa: "\f597"; }
+
+.fa-film {
+ --fa: "\f008"; }
+
+.fa-ruler-horizontal {
+ --fa: "\f547"; }
+
+.fa-people-robbery {
+ --fa: "\e536"; }
+
+.fa-lightbulb {
+ --fa: "\f0eb"; }
+
+.fa-caret-left {
+ --fa: "\f0d9"; }
+
+.fa-circle-exclamation {
+ --fa: "\f06a"; }
+
+.fa-exclamation-circle {
+ --fa: "\f06a"; }
+
+.fa-school-circle-xmark {
+ --fa: "\e56d"; }
+
+.fa-arrow-right-from-bracket {
+ --fa: "\f08b"; }
+
+.fa-sign-out {
+ --fa: "\f08b"; }
+
+.fa-circle-chevron-down {
+ --fa: "\f13a"; }
+
+.fa-chevron-circle-down {
+ --fa: "\f13a"; }
+
+.fa-unlock-keyhole {
+ --fa: "\f13e"; }
+
+.fa-unlock-alt {
+ --fa: "\f13e"; }
+
+.fa-cloud-showers-heavy {
+ --fa: "\f740"; }
+
+.fa-headphones-simple {
+ --fa: "\f58f"; }
+
+.fa-headphones-alt {
+ --fa: "\f58f"; }
+
+.fa-sitemap {
+ --fa: "\f0e8"; }
+
+.fa-circle-dollar-to-slot {
+ --fa: "\f4b9"; }
+
+.fa-donate {
+ --fa: "\f4b9"; }
+
+.fa-memory {
+ --fa: "\f538"; }
+
+.fa-road-spikes {
+ --fa: "\e568"; }
+
+.fa-fire-burner {
+ --fa: "\e4f1"; }
+
+.fa-flag {
+ --fa: "\f024"; }
+
+.fa-hanukiah {
+ --fa: "\f6e6"; }
+
+.fa-feather {
+ --fa: "\f52d"; }
+
+.fa-volume-low {
+ --fa: "\f027"; }
+
+.fa-volume-down {
+ --fa: "\f027"; }
+
+.fa-comment-slash {
+ --fa: "\f4b3"; }
+
+.fa-cloud-sun-rain {
+ --fa: "\f743"; }
+
+.fa-compress {
+ --fa: "\f066"; }
+
+.fa-wheat-awn {
+ --fa: "\e2cd"; }
+
+.fa-wheat-alt {
+ --fa: "\e2cd"; }
+
+.fa-ankh {
+ --fa: "\f644"; }
+
+.fa-hands-holding-child {
+ --fa: "\e4fa"; }
+
+.fa-asterisk {
+ --fa: "\2a"; }
+
+.fa-square-check {
+ --fa: "\f14a"; }
+
+.fa-check-square {
+ --fa: "\f14a"; }
+
+.fa-peseta-sign {
+ --fa: "\e221"; }
+
+.fa-heading {
+ --fa: "\f1dc"; }
+
+.fa-header {
+ --fa: "\f1dc"; }
+
+.fa-ghost {
+ --fa: "\f6e2"; }
+
+.fa-list {
+ --fa: "\f03a"; }
+
+.fa-list-squares {
+ --fa: "\f03a"; }
+
+.fa-square-phone-flip {
+ --fa: "\f87b"; }
+
+.fa-phone-square-alt {
+ --fa: "\f87b"; }
+
+.fa-cart-plus {
+ --fa: "\f217"; }
+
+.fa-gamepad {
+ --fa: "\f11b"; }
+
+.fa-circle-dot {
+ --fa: "\f192"; }
+
+.fa-dot-circle {
+ --fa: "\f192"; }
+
+.fa-face-dizzy {
+ --fa: "\f567"; }
+
+.fa-dizzy {
+ --fa: "\f567"; }
+
+.fa-egg {
+ --fa: "\f7fb"; }
+
+.fa-house-medical-circle-xmark {
+ --fa: "\e513"; }
+
+.fa-campground {
+ --fa: "\f6bb"; }
+
+.fa-folder-plus {
+ --fa: "\f65e"; }
+
+.fa-futbol {
+ --fa: "\f1e3"; }
+
+.fa-futbol-ball {
+ --fa: "\f1e3"; }
+
+.fa-soccer-ball {
+ --fa: "\f1e3"; }
+
+.fa-paintbrush {
+ --fa: "\f1fc"; }
+
+.fa-paint-brush {
+ --fa: "\f1fc"; }
+
+.fa-lock {
+ --fa: "\f023"; }
+
+.fa-gas-pump {
+ --fa: "\f52f"; }
+
+.fa-hot-tub-person {
+ --fa: "\f593"; }
+
+.fa-hot-tub {
+ --fa: "\f593"; }
+
+.fa-map-location {
+ --fa: "\f59f"; }
+
+.fa-map-marked {
+ --fa: "\f59f"; }
+
+.fa-house-flood-water {
+ --fa: "\e50e"; }
+
+.fa-tree {
+ --fa: "\f1bb"; }
+
+.fa-bridge-lock {
+ --fa: "\e4cc"; }
+
+.fa-sack-dollar {
+ --fa: "\f81d"; }
+
+.fa-pen-to-square {
+ --fa: "\f044"; }
+
+.fa-edit {
+ --fa: "\f044"; }
+
+.fa-car-side {
+ --fa: "\f5e4"; }
+
+.fa-share-nodes {
+ --fa: "\f1e0"; }
+
+.fa-share-alt {
+ --fa: "\f1e0"; }
+
+.fa-heart-circle-minus {
+ --fa: "\e4ff"; }
+
+.fa-hourglass-half {
+ --fa: "\f252"; }
+
+.fa-hourglass-2 {
+ --fa: "\f252"; }
+
+.fa-microscope {
+ --fa: "\f610"; }
+
+.fa-sink {
+ --fa: "\e06d"; }
+
+.fa-bag-shopping {
+ --fa: "\f290"; }
+
+.fa-shopping-bag {
+ --fa: "\f290"; }
+
+.fa-arrow-down-z-a {
+ --fa: "\f881"; }
+
+.fa-sort-alpha-desc {
+ --fa: "\f881"; }
+
+.fa-sort-alpha-down-alt {
+ --fa: "\f881"; }
+
+.fa-mitten {
+ --fa: "\f7b5"; }
+
+.fa-person-rays {
+ --fa: "\e54d"; }
+
+.fa-users {
+ --fa: "\f0c0"; }
+
+.fa-eye-slash {
+ --fa: "\f070"; }
+
+.fa-flask-vial {
+ --fa: "\e4f3"; }
+
+.fa-hand {
+ --fa: "\f256"; }
+
+.fa-hand-paper {
+ --fa: "\f256"; }
+
+.fa-om {
+ --fa: "\f679"; }
+
+.fa-worm {
+ --fa: "\e599"; }
+
+.fa-house-circle-xmark {
+ --fa: "\e50b"; }
+
+.fa-plug {
+ --fa: "\f1e6"; }
+
+.fa-chevron-up {
+ --fa: "\f077"; }
+
+.fa-hand-spock {
+ --fa: "\f259"; }
+
+.fa-stopwatch {
+ --fa: "\f2f2"; }
+
+.fa-face-kiss {
+ --fa: "\f596"; }
+
+.fa-kiss {
+ --fa: "\f596"; }
+
+.fa-bridge-circle-xmark {
+ --fa: "\e4cb"; }
+
+.fa-face-grin-tongue {
+ --fa: "\f589"; }
+
+.fa-grin-tongue {
+ --fa: "\f589"; }
+
+.fa-chess-bishop {
+ --fa: "\f43a"; }
+
+.fa-face-grin-wink {
+ --fa: "\f58c"; }
+
+.fa-grin-wink {
+ --fa: "\f58c"; }
+
+.fa-ear-deaf {
+ --fa: "\f2a4"; }
+
+.fa-deaf {
+ --fa: "\f2a4"; }
+
+.fa-deafness {
+ --fa: "\f2a4"; }
+
+.fa-hard-of-hearing {
+ --fa: "\f2a4"; }
+
+.fa-road-circle-check {
+ --fa: "\e564"; }
+
+.fa-dice-five {
+ --fa: "\f523"; }
+
+.fa-square-rss {
+ --fa: "\f143"; }
+
+.fa-rss-square {
+ --fa: "\f143"; }
+
+.fa-land-mine-on {
+ --fa: "\e51b"; }
+
+.fa-i-cursor {
+ --fa: "\f246"; }
+
+.fa-stamp {
+ --fa: "\f5bf"; }
+
+.fa-stairs {
+ --fa: "\e289"; }
+
+.fa-i {
+ --fa: "\49"; }
+
+.fa-hryvnia-sign {
+ --fa: "\f6f2"; }
+
+.fa-hryvnia {
+ --fa: "\f6f2"; }
+
+.fa-pills {
+ --fa: "\f484"; }
+
+.fa-face-grin-wide {
+ --fa: "\f581"; }
+
+.fa-grin-alt {
+ --fa: "\f581"; }
+
+.fa-tooth {
+ --fa: "\f5c9"; }
+
+.fa-v {
+ --fa: "\56"; }
+
+.fa-bangladeshi-taka-sign {
+ --fa: "\e2e6"; }
+
+.fa-bicycle {
+ --fa: "\f206"; }
+
+.fa-staff-snake {
+ --fa: "\e579"; }
+
+.fa-rod-asclepius {
+ --fa: "\e579"; }
+
+.fa-rod-snake {
+ --fa: "\e579"; }
+
+.fa-staff-aesculapius {
+ --fa: "\e579"; }
+
+.fa-head-side-cough-slash {
+ --fa: "\e062"; }
+
+.fa-truck-medical {
+ --fa: "\f0f9"; }
+
+.fa-ambulance {
+ --fa: "\f0f9"; }
+
+.fa-wheat-awn-circle-exclamation {
+ --fa: "\e598"; }
+
+.fa-snowman {
+ --fa: "\f7d0"; }
+
+.fa-mortar-pestle {
+ --fa: "\f5a7"; }
+
+.fa-road-barrier {
+ --fa: "\e562"; }
+
+.fa-school {
+ --fa: "\f549"; }
+
+.fa-igloo {
+ --fa: "\f7ae"; }
+
+.fa-joint {
+ --fa: "\f595"; }
+
+.fa-angle-right {
+ --fa: "\f105"; }
+
+.fa-horse {
+ --fa: "\f6f0"; }
+
+.fa-q {
+ --fa: "\51"; }
+
+.fa-g {
+ --fa: "\47"; }
+
+.fa-notes-medical {
+ --fa: "\f481"; }
+
+.fa-temperature-half {
+ --fa: "\f2c9"; }
+
+.fa-temperature-2 {
+ --fa: "\f2c9"; }
+
+.fa-thermometer-2 {
+ --fa: "\f2c9"; }
+
+.fa-thermometer-half {
+ --fa: "\f2c9"; }
+
+.fa-dong-sign {
+ --fa: "\e169"; }
+
+.fa-capsules {
+ --fa: "\f46b"; }
+
+.fa-poo-storm {
+ --fa: "\f75a"; }
+
+.fa-poo-bolt {
+ --fa: "\f75a"; }
+
+.fa-face-frown-open {
+ --fa: "\f57a"; }
+
+.fa-frown-open {
+ --fa: "\f57a"; }
+
+.fa-hand-point-up {
+ --fa: "\f0a6"; }
+
+.fa-money-bill {
+ --fa: "\f0d6"; }
+
+.fa-bookmark {
+ --fa: "\f02e"; }
+
+.fa-align-justify {
+ --fa: "\f039"; }
+
+.fa-umbrella-beach {
+ --fa: "\f5ca"; }
+
+.fa-helmet-un {
+ --fa: "\e503"; }
+
+.fa-bullseye {
+ --fa: "\f140"; }
+
+.fa-bacon {
+ --fa: "\f7e5"; }
+
+.fa-hand-point-down {
+ --fa: "\f0a7"; }
+
+.fa-arrow-up-from-bracket {
+ --fa: "\e09a"; }
+
+.fa-folder {
+ --fa: "\f07b"; }
+
+.fa-folder-blank {
+ --fa: "\f07b"; }
+
+.fa-file-waveform {
+ --fa: "\f478"; }
+
+.fa-file-medical-alt {
+ --fa: "\f478"; }
+
+.fa-radiation {
+ --fa: "\f7b9"; }
+
+.fa-chart-simple {
+ --fa: "\e473"; }
+
+.fa-mars-stroke {
+ --fa: "\f229"; }
+
+.fa-vial {
+ --fa: "\f492"; }
+
+.fa-gauge {
+ --fa: "\f624"; }
+
+.fa-dashboard {
+ --fa: "\f624"; }
+
+.fa-gauge-med {
+ --fa: "\f624"; }
+
+.fa-tachometer-alt-average {
+ --fa: "\f624"; }
+
+.fa-wand-magic-sparkles {
+ --fa: "\e2ca"; }
+
+.fa-magic-wand-sparkles {
+ --fa: "\e2ca"; }
+
+.fa-e {
+ --fa: "\45"; }
+
+.fa-pen-clip {
+ --fa: "\f305"; }
+
+.fa-pen-alt {
+ --fa: "\f305"; }
+
+.fa-bridge-circle-exclamation {
+ --fa: "\e4ca"; }
+
+.fa-user {
+ --fa: "\f007"; }
+
+.fa-school-circle-check {
+ --fa: "\e56b"; }
+
+.fa-dumpster {
+ --fa: "\f793"; }
+
+.fa-van-shuttle {
+ --fa: "\f5b6"; }
+
+.fa-shuttle-van {
+ --fa: "\f5b6"; }
+
+.fa-building-user {
+ --fa: "\e4da"; }
+
+.fa-square-caret-left {
+ --fa: "\f191"; }
+
+.fa-caret-square-left {
+ --fa: "\f191"; }
+
+.fa-highlighter {
+ --fa: "\f591"; }
+
+.fa-key {
+ --fa: "\f084"; }
+
+.fa-bullhorn {
+ --fa: "\f0a1"; }
+
+.fa-globe {
+ --fa: "\f0ac"; }
+
+.fa-synagogue {
+ --fa: "\f69b"; }
+
+.fa-person-half-dress {
+ --fa: "\e548"; }
+
+.fa-road-bridge {
+ --fa: "\e563"; }
+
+.fa-location-arrow {
+ --fa: "\f124"; }
+
+.fa-c {
+ --fa: "\43"; }
+
+.fa-tablet-button {
+ --fa: "\f10a"; }
+
+.fa-building-lock {
+ --fa: "\e4d6"; }
+
+.fa-pizza-slice {
+ --fa: "\f818"; }
+
+.fa-money-bill-wave {
+ --fa: "\f53a"; }
+
+.fa-chart-area {
+ --fa: "\f1fe"; }
+
+.fa-area-chart {
+ --fa: "\f1fe"; }
+
+.fa-house-flag {
+ --fa: "\e50d"; }
+
+.fa-person-circle-minus {
+ --fa: "\e540"; }
+
+.fa-ban {
+ --fa: "\f05e"; }
+
+.fa-cancel {
+ --fa: "\f05e"; }
+
+.fa-camera-rotate {
+ --fa: "\e0d8"; }
+
+.fa-spray-can-sparkles {
+ --fa: "\f5d0"; }
+
+.fa-air-freshener {
+ --fa: "\f5d0"; }
+
+.fa-star {
+ --fa: "\f005"; }
+
+.fa-repeat {
+ --fa: "\f363"; }
+
+.fa-cross {
+ --fa: "\f654"; }
+
+.fa-box {
+ --fa: "\f466"; }
+
+.fa-venus-mars {
+ --fa: "\f228"; }
+
+.fa-arrow-pointer {
+ --fa: "\f245"; }
+
+.fa-mouse-pointer {
+ --fa: "\f245"; }
+
+.fa-maximize {
+ --fa: "\f31e"; }
+
+.fa-expand-arrows-alt {
+ --fa: "\f31e"; }
+
+.fa-charging-station {
+ --fa: "\f5e7"; }
+
+.fa-shapes {
+ --fa: "\f61f"; }
+
+.fa-triangle-circle-square {
+ --fa: "\f61f"; }
+
+.fa-shuffle {
+ --fa: "\f074"; }
+
+.fa-random {
+ --fa: "\f074"; }
+
+.fa-person-running {
+ --fa: "\f70c"; }
+
+.fa-running {
+ --fa: "\f70c"; }
+
+.fa-mobile-retro {
+ --fa: "\e527"; }
+
+.fa-grip-lines-vertical {
+ --fa: "\f7a5"; }
+
+.fa-spider {
+ --fa: "\f717"; }
+
+.fa-hands-bound {
+ --fa: "\e4f9"; }
+
+.fa-file-invoice-dollar {
+ --fa: "\f571"; }
+
+.fa-plane-circle-exclamation {
+ --fa: "\e556"; }
+
+.fa-x-ray {
+ --fa: "\f497"; }
+
+.fa-spell-check {
+ --fa: "\f891"; }
+
+.fa-slash {
+ --fa: "\f715"; }
+
+.fa-computer-mouse {
+ --fa: "\f8cc"; }
+
+.fa-mouse {
+ --fa: "\f8cc"; }
+
+.fa-arrow-right-to-bracket {
+ --fa: "\f090"; }
+
+.fa-sign-in {
+ --fa: "\f090"; }
+
+.fa-shop-slash {
+ --fa: "\e070"; }
+
+.fa-store-alt-slash {
+ --fa: "\e070"; }
+
+.fa-server {
+ --fa: "\f233"; }
+
+.fa-virus-covid-slash {
+ --fa: "\e4a9"; }
+
+.fa-shop-lock {
+ --fa: "\e4a5"; }
+
+.fa-hourglass-start {
+ --fa: "\f251"; }
+
+.fa-hourglass-1 {
+ --fa: "\f251"; }
+
+.fa-blender-phone {
+ --fa: "\f6b6"; }
+
+.fa-building-wheat {
+ --fa: "\e4db"; }
+
+.fa-person-breastfeeding {
+ --fa: "\e53a"; }
+
+.fa-right-to-bracket {
+ --fa: "\f2f6"; }
+
+.fa-sign-in-alt {
+ --fa: "\f2f6"; }
+
+.fa-venus {
+ --fa: "\f221"; }
+
+.fa-passport {
+ --fa: "\f5ab"; }
+
+.fa-thumbtack-slash {
+ --fa: "\e68f"; }
+
+.fa-thumb-tack-slash {
+ --fa: "\e68f"; }
+
+.fa-heart-pulse {
+ --fa: "\f21e"; }
+
+.fa-heartbeat {
+ --fa: "\f21e"; }
+
+.fa-people-carry-box {
+ --fa: "\f4ce"; }
+
+.fa-people-carry {
+ --fa: "\f4ce"; }
+
+.fa-temperature-high {
+ --fa: "\f769"; }
+
+.fa-microchip {
+ --fa: "\f2db"; }
+
+.fa-crown {
+ --fa: "\f521"; }
+
+.fa-weight-hanging {
+ --fa: "\f5cd"; }
+
+.fa-xmarks-lines {
+ --fa: "\e59a"; }
+
+.fa-file-prescription {
+ --fa: "\f572"; }
+
+.fa-weight-scale {
+ --fa: "\f496"; }
+
+.fa-weight {
+ --fa: "\f496"; }
+
+.fa-user-group {
+ --fa: "\f500"; }
+
+.fa-user-friends {
+ --fa: "\f500"; }
+
+.fa-arrow-up-a-z {
+ --fa: "\f15e"; }
+
+.fa-sort-alpha-up {
+ --fa: "\f15e"; }
+
+.fa-chess-knight {
+ --fa: "\f441"; }
+
+.fa-face-laugh-squint {
+ --fa: "\f59b"; }
+
+.fa-laugh-squint {
+ --fa: "\f59b"; }
+
+.fa-wheelchair {
+ --fa: "\f193"; }
+
+.fa-circle-arrow-up {
+ --fa: "\f0aa"; }
+
+.fa-arrow-circle-up {
+ --fa: "\f0aa"; }
+
+.fa-toggle-on {
+ --fa: "\f205"; }
+
+.fa-person-walking {
+ --fa: "\f554"; }
+
+.fa-walking {
+ --fa: "\f554"; }
+
+.fa-l {
+ --fa: "\4c"; }
+
+.fa-fire {
+ --fa: "\f06d"; }
+
+.fa-bed-pulse {
+ --fa: "\f487"; }
+
+.fa-procedures {
+ --fa: "\f487"; }
+
+.fa-shuttle-space {
+ --fa: "\f197"; }
+
+.fa-space-shuttle {
+ --fa: "\f197"; }
+
+.fa-face-laugh {
+ --fa: "\f599"; }
+
+.fa-laugh {
+ --fa: "\f599"; }
+
+.fa-folder-open {
+ --fa: "\f07c"; }
+
+.fa-heart-circle-plus {
+ --fa: "\e500"; }
+
+.fa-code-fork {
+ --fa: "\e13b"; }
+
+.fa-city {
+ --fa: "\f64f"; }
+
+.fa-microphone-lines {
+ --fa: "\f3c9"; }
+
+.fa-microphone-alt {
+ --fa: "\f3c9"; }
+
+.fa-pepper-hot {
+ --fa: "\f816"; }
+
+.fa-unlock {
+ --fa: "\f09c"; }
+
+.fa-colon-sign {
+ --fa: "\e140"; }
+
+.fa-headset {
+ --fa: "\f590"; }
+
+.fa-store-slash {
+ --fa: "\e071"; }
+
+.fa-road-circle-xmark {
+ --fa: "\e566"; }
+
+.fa-user-minus {
+ --fa: "\f503"; }
+
+.fa-mars-stroke-up {
+ --fa: "\f22a"; }
+
+.fa-mars-stroke-v {
+ --fa: "\f22a"; }
+
+.fa-champagne-glasses {
+ --fa: "\f79f"; }
+
+.fa-glass-cheers {
+ --fa: "\f79f"; }
+
+.fa-clipboard {
+ --fa: "\f328"; }
+
+.fa-house-circle-exclamation {
+ --fa: "\e50a"; }
+
+.fa-file-arrow-up {
+ --fa: "\f574"; }
+
+.fa-file-upload {
+ --fa: "\f574"; }
+
+.fa-wifi {
+ --fa: "\f1eb"; }
+
+.fa-wifi-3 {
+ --fa: "\f1eb"; }
+
+.fa-wifi-strong {
+ --fa: "\f1eb"; }
+
+.fa-bath {
+ --fa: "\f2cd"; }
+
+.fa-bathtub {
+ --fa: "\f2cd"; }
+
+.fa-underline {
+ --fa: "\f0cd"; }
+
+.fa-user-pen {
+ --fa: "\f4ff"; }
+
+.fa-user-edit {
+ --fa: "\f4ff"; }
+
+.fa-signature {
+ --fa: "\f5b7"; }
+
+.fa-stroopwafel {
+ --fa: "\f551"; }
+
+.fa-bold {
+ --fa: "\f032"; }
+
+.fa-anchor-lock {
+ --fa: "\e4ad"; }
+
+.fa-building-ngo {
+ --fa: "\e4d7"; }
+
+.fa-manat-sign {
+ --fa: "\e1d5"; }
+
+.fa-not-equal {
+ --fa: "\f53e"; }
+
+.fa-border-top-left {
+ --fa: "\f853"; }
+
+.fa-border-style {
+ --fa: "\f853"; }
+
+.fa-map-location-dot {
+ --fa: "\f5a0"; }
+
+.fa-map-marked-alt {
+ --fa: "\f5a0"; }
+
+.fa-jedi {
+ --fa: "\f669"; }
+
+.fa-square-poll-vertical {
+ --fa: "\f681"; }
+
+.fa-poll {
+ --fa: "\f681"; }
+
+.fa-mug-hot {
+ --fa: "\f7b6"; }
+
+.fa-car-battery {
+ --fa: "\f5df"; }
+
+.fa-battery-car {
+ --fa: "\f5df"; }
+
+.fa-gift {
+ --fa: "\f06b"; }
+
+.fa-dice-two {
+ --fa: "\f528"; }
+
+.fa-chess-queen {
+ --fa: "\f445"; }
+
+.fa-glasses {
+ --fa: "\f530"; }
+
+.fa-chess-board {
+ --fa: "\f43c"; }
+
+.fa-building-circle-check {
+ --fa: "\e4d2"; }
+
+.fa-person-chalkboard {
+ --fa: "\e53d"; }
+
+.fa-mars-stroke-right {
+ --fa: "\f22b"; }
+
+.fa-mars-stroke-h {
+ --fa: "\f22b"; }
+
+.fa-hand-back-fist {
+ --fa: "\f255"; }
+
+.fa-hand-rock {
+ --fa: "\f255"; }
+
+.fa-square-caret-up {
+ --fa: "\f151"; }
+
+.fa-caret-square-up {
+ --fa: "\f151"; }
+
+.fa-cloud-showers-water {
+ --fa: "\e4e4"; }
+
+.fa-chart-bar {
+ --fa: "\f080"; }
+
+.fa-bar-chart {
+ --fa: "\f080"; }
+
+.fa-hands-bubbles {
+ --fa: "\e05e"; }
+
+.fa-hands-wash {
+ --fa: "\e05e"; }
+
+.fa-less-than-equal {
+ --fa: "\f537"; }
+
+.fa-train {
+ --fa: "\f238"; }
+
+.fa-eye-low-vision {
+ --fa: "\f2a8"; }
+
+.fa-low-vision {
+ --fa: "\f2a8"; }
+
+.fa-crow {
+ --fa: "\f520"; }
+
+.fa-sailboat {
+ --fa: "\e445"; }
+
+.fa-window-restore {
+ --fa: "\f2d2"; }
+
+.fa-square-plus {
+ --fa: "\f0fe"; }
+
+.fa-plus-square {
+ --fa: "\f0fe"; }
+
+.fa-torii-gate {
+ --fa: "\f6a1"; }
+
+.fa-frog {
+ --fa: "\f52e"; }
+
+.fa-bucket {
+ --fa: "\e4cf"; }
+
+.fa-image {
+ --fa: "\f03e"; }
+
+.fa-microphone {
+ --fa: "\f130"; }
+
+.fa-cow {
+ --fa: "\f6c8"; }
+
+.fa-caret-up {
+ --fa: "\f0d8"; }
+
+.fa-screwdriver {
+ --fa: "\f54a"; }
+
+.fa-folder-closed {
+ --fa: "\e185"; }
+
+.fa-house-tsunami {
+ --fa: "\e515"; }
+
+.fa-square-nfi {
+ --fa: "\e576"; }
+
+.fa-arrow-up-from-ground-water {
+ --fa: "\e4b5"; }
+
+.fa-martini-glass {
+ --fa: "\f57b"; }
+
+.fa-glass-martini-alt {
+ --fa: "\f57b"; }
+
+.fa-square-binary {
+ --fa: "\e69b"; }
+
+.fa-rotate-left {
+ --fa: "\f2ea"; }
+
+.fa-rotate-back {
+ --fa: "\f2ea"; }
+
+.fa-rotate-backward {
+ --fa: "\f2ea"; }
+
+.fa-undo-alt {
+ --fa: "\f2ea"; }
+
+.fa-table-columns {
+ --fa: "\f0db"; }
+
+.fa-columns {
+ --fa: "\f0db"; }
+
+.fa-lemon {
+ --fa: "\f094"; }
+
+.fa-head-side-mask {
+ --fa: "\e063"; }
+
+.fa-handshake {
+ --fa: "\f2b5"; }
+
+.fa-gem {
+ --fa: "\f3a5"; }
+
+.fa-dolly {
+ --fa: "\f472"; }
+
+.fa-dolly-box {
+ --fa: "\f472"; }
+
+.fa-smoking {
+ --fa: "\f48d"; }
+
+.fa-minimize {
+ --fa: "\f78c"; }
+
+.fa-compress-arrows-alt {
+ --fa: "\f78c"; }
+
+.fa-monument {
+ --fa: "\f5a6"; }
+
+.fa-snowplow {
+ --fa: "\f7d2"; }
+
+.fa-angles-right {
+ --fa: "\f101"; }
+
+.fa-angle-double-right {
+ --fa: "\f101"; }
+
+.fa-cannabis {
+ --fa: "\f55f"; }
+
+.fa-circle-play {
+ --fa: "\f144"; }
+
+.fa-play-circle {
+ --fa: "\f144"; }
+
+.fa-tablets {
+ --fa: "\f490"; }
+
+.fa-ethernet {
+ --fa: "\f796"; }
+
+.fa-euro-sign {
+ --fa: "\f153"; }
+
+.fa-eur {
+ --fa: "\f153"; }
+
+.fa-euro {
+ --fa: "\f153"; }
+
+.fa-chair {
+ --fa: "\f6c0"; }
+
+.fa-circle-check {
+ --fa: "\f058"; }
+
+.fa-check-circle {
+ --fa: "\f058"; }
+
+.fa-circle-stop {
+ --fa: "\f28d"; }
+
+.fa-stop-circle {
+ --fa: "\f28d"; }
+
+.fa-compass-drafting {
+ --fa: "\f568"; }
+
+.fa-drafting-compass {
+ --fa: "\f568"; }
+
+.fa-plate-wheat {
+ --fa: "\e55a"; }
+
+.fa-icicles {
+ --fa: "\f7ad"; }
+
+.fa-person-shelter {
+ --fa: "\e54f"; }
+
+.fa-neuter {
+ --fa: "\f22c"; }
+
+.fa-id-badge {
+ --fa: "\f2c1"; }
+
+.fa-marker {
+ --fa: "\f5a1"; }
+
+.fa-face-laugh-beam {
+ --fa: "\f59a"; }
+
+.fa-laugh-beam {
+ --fa: "\f59a"; }
+
+.fa-helicopter-symbol {
+ --fa: "\e502"; }
+
+.fa-universal-access {
+ --fa: "\f29a"; }
+
+.fa-circle-chevron-up {
+ --fa: "\f139"; }
+
+.fa-chevron-circle-up {
+ --fa: "\f139"; }
+
+.fa-lari-sign {
+ --fa: "\e1c8"; }
+
+.fa-volcano {
+ --fa: "\f770"; }
+
+.fa-person-walking-dashed-line-arrow-right {
+ --fa: "\e553"; }
+
+.fa-sterling-sign {
+ --fa: "\f154"; }
+
+.fa-gbp {
+ --fa: "\f154"; }
+
+.fa-pound-sign {
+ --fa: "\f154"; }
+
+.fa-viruses {
+ --fa: "\e076"; }
+
+.fa-square-person-confined {
+ --fa: "\e577"; }
+
+.fa-user-tie {
+ --fa: "\f508"; }
+
+.fa-arrow-down-long {
+ --fa: "\f175"; }
+
+.fa-long-arrow-down {
+ --fa: "\f175"; }
+
+.fa-tent-arrow-down-to-line {
+ --fa: "\e57e"; }
+
+.fa-certificate {
+ --fa: "\f0a3"; }
+
+.fa-reply-all {
+ --fa: "\f122"; }
+
+.fa-mail-reply-all {
+ --fa: "\f122"; }
+
+.fa-suitcase {
+ --fa: "\f0f2"; }
+
+.fa-person-skating {
+ --fa: "\f7c5"; }
+
+.fa-skating {
+ --fa: "\f7c5"; }
+
+.fa-filter-circle-dollar {
+ --fa: "\f662"; }
+
+.fa-funnel-dollar {
+ --fa: "\f662"; }
+
+.fa-camera-retro {
+ --fa: "\f083"; }
+
+.fa-circle-arrow-down {
+ --fa: "\f0ab"; }
+
+.fa-arrow-circle-down {
+ --fa: "\f0ab"; }
+
+.fa-file-import {
+ --fa: "\f56f"; }
+
+.fa-arrow-right-to-file {
+ --fa: "\f56f"; }
+
+.fa-square-arrow-up-right {
+ --fa: "\f14c"; }
+
+.fa-external-link-square {
+ --fa: "\f14c"; }
+
+.fa-box-open {
+ --fa: "\f49e"; }
+
+.fa-scroll {
+ --fa: "\f70e"; }
+
+.fa-spa {
+ --fa: "\f5bb"; }
+
+.fa-location-pin-lock {
+ --fa: "\e51f"; }
+
+.fa-pause {
+ --fa: "\f04c"; }
+
+.fa-hill-avalanche {
+ --fa: "\e507"; }
+
+.fa-temperature-empty {
+ --fa: "\f2cb"; }
+
+.fa-temperature-0 {
+ --fa: "\f2cb"; }
+
+.fa-thermometer-0 {
+ --fa: "\f2cb"; }
+
+.fa-thermometer-empty {
+ --fa: "\f2cb"; }
+
+.fa-bomb {
+ --fa: "\f1e2"; }
+
+.fa-registered {
+ --fa: "\f25d"; }
+
+.fa-address-card {
+ --fa: "\f2bb"; }
+
+.fa-contact-card {
+ --fa: "\f2bb"; }
+
+.fa-vcard {
+ --fa: "\f2bb"; }
+
+.fa-scale-unbalanced-flip {
+ --fa: "\f516"; }
+
+.fa-balance-scale-right {
+ --fa: "\f516"; }
+
+.fa-subscript {
+ --fa: "\f12c"; }
+
+.fa-diamond-turn-right {
+ --fa: "\f5eb"; }
+
+.fa-directions {
+ --fa: "\f5eb"; }
+
+.fa-burst {
+ --fa: "\e4dc"; }
+
+.fa-house-laptop {
+ --fa: "\e066"; }
+
+.fa-laptop-house {
+ --fa: "\e066"; }
+
+.fa-face-tired {
+ --fa: "\f5c8"; }
+
+.fa-tired {
+ --fa: "\f5c8"; }
+
+.fa-money-bills {
+ --fa: "\e1f3"; }
+
+.fa-smog {
+ --fa: "\f75f"; }
+
+.fa-crutch {
+ --fa: "\f7f7"; }
+
+.fa-cloud-arrow-up {
+ --fa: "\f0ee"; }
+
+.fa-cloud-upload {
+ --fa: "\f0ee"; }
+
+.fa-cloud-upload-alt {
+ --fa: "\f0ee"; }
+
+.fa-palette {
+ --fa: "\f53f"; }
+
+.fa-arrows-turn-right {
+ --fa: "\e4c0"; }
+
+.fa-vest {
+ --fa: "\e085"; }
+
+.fa-ferry {
+ --fa: "\e4ea"; }
+
+.fa-arrows-down-to-people {
+ --fa: "\e4b9"; }
+
+.fa-seedling {
+ --fa: "\f4d8"; }
+
+.fa-sprout {
+ --fa: "\f4d8"; }
+
+.fa-left-right {
+ --fa: "\f337"; }
+
+.fa-arrows-alt-h {
+ --fa: "\f337"; }
+
+.fa-boxes-packing {
+ --fa: "\e4c7"; }
+
+.fa-circle-arrow-left {
+ --fa: "\f0a8"; }
+
+.fa-arrow-circle-left {
+ --fa: "\f0a8"; }
+
+.fa-group-arrows-rotate {
+ --fa: "\e4f6"; }
+
+.fa-bowl-food {
+ --fa: "\e4c6"; }
+
+.fa-candy-cane {
+ --fa: "\f786"; }
+
+.fa-arrow-down-wide-short {
+ --fa: "\f160"; }
+
+.fa-sort-amount-asc {
+ --fa: "\f160"; }
+
+.fa-sort-amount-down {
+ --fa: "\f160"; }
+
+.fa-cloud-bolt {
+ --fa: "\f76c"; }
+
+.fa-thunderstorm {
+ --fa: "\f76c"; }
+
+.fa-text-slash {
+ --fa: "\f87d"; }
+
+.fa-remove-format {
+ --fa: "\f87d"; }
+
+.fa-face-smile-wink {
+ --fa: "\f4da"; }
+
+.fa-smile-wink {
+ --fa: "\f4da"; }
+
+.fa-file-word {
+ --fa: "\f1c2"; }
+
+.fa-file-powerpoint {
+ --fa: "\f1c4"; }
+
+.fa-arrows-left-right {
+ --fa: "\f07e"; }
+
+.fa-arrows-h {
+ --fa: "\f07e"; }
+
+.fa-house-lock {
+ --fa: "\e510"; }
+
+.fa-cloud-arrow-down {
+ --fa: "\f0ed"; }
+
+.fa-cloud-download {
+ --fa: "\f0ed"; }
+
+.fa-cloud-download-alt {
+ --fa: "\f0ed"; }
+
+.fa-children {
+ --fa: "\e4e1"; }
+
+.fa-chalkboard {
+ --fa: "\f51b"; }
+
+.fa-blackboard {
+ --fa: "\f51b"; }
+
+.fa-user-large-slash {
+ --fa: "\f4fa"; }
+
+.fa-user-alt-slash {
+ --fa: "\f4fa"; }
+
+.fa-envelope-open {
+ --fa: "\f2b6"; }
+
+.fa-handshake-simple-slash {
+ --fa: "\e05f"; }
+
+.fa-handshake-alt-slash {
+ --fa: "\e05f"; }
+
+.fa-mattress-pillow {
+ --fa: "\e525"; }
+
+.fa-guarani-sign {
+ --fa: "\e19a"; }
+
+.fa-arrows-rotate {
+ --fa: "\f021"; }
+
+.fa-refresh {
+ --fa: "\f021"; }
+
+.fa-sync {
+ --fa: "\f021"; }
+
+.fa-fire-extinguisher {
+ --fa: "\f134"; }
+
+.fa-cruzeiro-sign {
+ --fa: "\e152"; }
+
+.fa-greater-than-equal {
+ --fa: "\f532"; }
+
+.fa-shield-halved {
+ --fa: "\f3ed"; }
+
+.fa-shield-alt {
+ --fa: "\f3ed"; }
+
+.fa-book-atlas {
+ --fa: "\f558"; }
+
+.fa-atlas {
+ --fa: "\f558"; }
+
+.fa-virus {
+ --fa: "\e074"; }
+
+.fa-envelope-circle-check {
+ --fa: "\e4e8"; }
+
+.fa-layer-group {
+ --fa: "\f5fd"; }
+
+.fa-arrows-to-dot {
+ --fa: "\e4be"; }
+
+.fa-archway {
+ --fa: "\f557"; }
+
+.fa-heart-circle-check {
+ --fa: "\e4fd"; }
+
+.fa-house-chimney-crack {
+ --fa: "\f6f1"; }
+
+.fa-house-damage {
+ --fa: "\f6f1"; }
+
+.fa-file-zipper {
+ --fa: "\f1c6"; }
+
+.fa-file-archive {
+ --fa: "\f1c6"; }
+
+.fa-square {
+ --fa: "\f0c8"; }
+
+.fa-martini-glass-empty {
+ --fa: "\f000"; }
+
+.fa-glass-martini {
+ --fa: "\f000"; }
+
+.fa-couch {
+ --fa: "\f4b8"; }
+
+.fa-cedi-sign {
+ --fa: "\e0df"; }
+
+.fa-italic {
+ --fa: "\f033"; }
+
+.fa-table-cells-column-lock {
+ --fa: "\e678"; }
+
+.fa-church {
+ --fa: "\f51d"; }
+
+.fa-comments-dollar {
+ --fa: "\f653"; }
+
+.fa-democrat {
+ --fa: "\f747"; }
+
+.fa-z {
+ --fa: "\5a"; }
+
+.fa-person-skiing {
+ --fa: "\f7c9"; }
+
+.fa-skiing {
+ --fa: "\f7c9"; }
+
+.fa-road-lock {
+ --fa: "\e567"; }
+
+.fa-a {
+ --fa: "\41"; }
+
+.fa-temperature-arrow-down {
+ --fa: "\e03f"; }
+
+.fa-temperature-down {
+ --fa: "\e03f"; }
+
+.fa-feather-pointed {
+ --fa: "\f56b"; }
+
+.fa-feather-alt {
+ --fa: "\f56b"; }
+
+.fa-p {
+ --fa: "\50"; }
+
+.fa-snowflake {
+ --fa: "\f2dc"; }
+
+.fa-newspaper {
+ --fa: "\f1ea"; }
+
+.fa-rectangle-ad {
+ --fa: "\f641"; }
+
+.fa-ad {
+ --fa: "\f641"; }
+
+.fa-circle-arrow-right {
+ --fa: "\f0a9"; }
+
+.fa-arrow-circle-right {
+ --fa: "\f0a9"; }
+
+.fa-filter-circle-xmark {
+ --fa: "\e17b"; }
+
+.fa-locust {
+ --fa: "\e520"; }
+
+.fa-sort {
+ --fa: "\f0dc"; }
+
+.fa-unsorted {
+ --fa: "\f0dc"; }
+
+.fa-list-ol {
+ --fa: "\f0cb"; }
+
+.fa-list-1-2 {
+ --fa: "\f0cb"; }
+
+.fa-list-numeric {
+ --fa: "\f0cb"; }
+
+.fa-person-dress-burst {
+ --fa: "\e544"; }
+
+.fa-money-check-dollar {
+ --fa: "\f53d"; }
+
+.fa-money-check-alt {
+ --fa: "\f53d"; }
+
+.fa-vector-square {
+ --fa: "\f5cb"; }
+
+.fa-bread-slice {
+ --fa: "\f7ec"; }
+
+.fa-language {
+ --fa: "\f1ab"; }
+
+.fa-face-kiss-wink-heart {
+ --fa: "\f598"; }
+
+.fa-kiss-wink-heart {
+ --fa: "\f598"; }
+
+.fa-filter {
+ --fa: "\f0b0"; }
+
+.fa-question {
+ --fa: "\3f"; }
+
+.fa-file-signature {
+ --fa: "\f573"; }
+
+.fa-up-down-left-right {
+ --fa: "\f0b2"; }
+
+.fa-arrows-alt {
+ --fa: "\f0b2"; }
+
+.fa-house-chimney-user {
+ --fa: "\e065"; }
+
+.fa-hand-holding-heart {
+ --fa: "\f4be"; }
+
+.fa-puzzle-piece {
+ --fa: "\f12e"; }
+
+.fa-money-check {
+ --fa: "\f53c"; }
+
+.fa-star-half-stroke {
+ --fa: "\f5c0"; }
+
+.fa-star-half-alt {
+ --fa: "\f5c0"; }
+
+.fa-code {
+ --fa: "\f121"; }
+
+.fa-whiskey-glass {
+ --fa: "\f7a0"; }
+
+.fa-glass-whiskey {
+ --fa: "\f7a0"; }
+
+.fa-building-circle-exclamation {
+ --fa: "\e4d3"; }
+
+.fa-magnifying-glass-chart {
+ --fa: "\e522"; }
+
+.fa-arrow-up-right-from-square {
+ --fa: "\f08e"; }
+
+.fa-external-link {
+ --fa: "\f08e"; }
+
+.fa-cubes-stacked {
+ --fa: "\e4e6"; }
+
+.fa-won-sign {
+ --fa: "\f159"; }
+
+.fa-krw {
+ --fa: "\f159"; }
+
+.fa-won {
+ --fa: "\f159"; }
+
+.fa-virus-covid {
+ --fa: "\e4a8"; }
+
+.fa-austral-sign {
+ --fa: "\e0a9"; }
+
+.fa-f {
+ --fa: "\46"; }
+
+.fa-leaf {
+ --fa: "\f06c"; }
+
+.fa-road {
+ --fa: "\f018"; }
+
+.fa-taxi {
+ --fa: "\f1ba"; }
+
+.fa-cab {
+ --fa: "\f1ba"; }
+
+.fa-person-circle-plus {
+ --fa: "\e541"; }
+
+.fa-chart-pie {
+ --fa: "\f200"; }
+
+.fa-pie-chart {
+ --fa: "\f200"; }
+
+.fa-bolt-lightning {
+ --fa: "\e0b7"; }
+
+.fa-sack-xmark {
+ --fa: "\e56a"; }
+
+.fa-file-excel {
+ --fa: "\f1c3"; }
+
+.fa-file-contract {
+ --fa: "\f56c"; }
+
+.fa-fish-fins {
+ --fa: "\e4f2"; }
+
+.fa-building-flag {
+ --fa: "\e4d5"; }
+
+.fa-face-grin-beam {
+ --fa: "\f582"; }
+
+.fa-grin-beam {
+ --fa: "\f582"; }
+
+.fa-object-ungroup {
+ --fa: "\f248"; }
+
+.fa-poop {
+ --fa: "\f619"; }
+
+.fa-location-pin {
+ --fa: "\f041"; }
+
+.fa-map-marker {
+ --fa: "\f041"; }
+
+.fa-kaaba {
+ --fa: "\f66b"; }
+
+.fa-toilet-paper {
+ --fa: "\f71e"; }
+
+.fa-helmet-safety {
+ --fa: "\f807"; }
+
+.fa-hard-hat {
+ --fa: "\f807"; }
+
+.fa-hat-hard {
+ --fa: "\f807"; }
+
+.fa-eject {
+ --fa: "\f052"; }
+
+.fa-circle-right {
+ --fa: "\f35a"; }
+
+.fa-arrow-alt-circle-right {
+ --fa: "\f35a"; }
+
+.fa-plane-circle-check {
+ --fa: "\e555"; }
+
+.fa-face-rolling-eyes {
+ --fa: "\f5a5"; }
+
+.fa-meh-rolling-eyes {
+ --fa: "\f5a5"; }
+
+.fa-object-group {
+ --fa: "\f247"; }
+
+.fa-chart-line {
+ --fa: "\f201"; }
+
+.fa-line-chart {
+ --fa: "\f201"; }
+
+.fa-mask-ventilator {
+ --fa: "\e524"; }
+
+.fa-arrow-right {
+ --fa: "\f061"; }
+
+.fa-signs-post {
+ --fa: "\f277"; }
+
+.fa-map-signs {
+ --fa: "\f277"; }
+
+.fa-cash-register {
+ --fa: "\f788"; }
+
+.fa-person-circle-question {
+ --fa: "\e542"; }
+
+.fa-h {
+ --fa: "\48"; }
+
+.fa-tarp {
+ --fa: "\e57b"; }
+
+.fa-screwdriver-wrench {
+ --fa: "\f7d9"; }
+
+.fa-tools {
+ --fa: "\f7d9"; }
+
+.fa-arrows-to-eye {
+ --fa: "\e4bf"; }
+
+.fa-plug-circle-bolt {
+ --fa: "\e55b"; }
+
+.fa-heart {
+ --fa: "\f004"; }
+
+.fa-mars-and-venus {
+ --fa: "\f224"; }
+
+.fa-house-user {
+ --fa: "\e1b0"; }
+
+.fa-home-user {
+ --fa: "\e1b0"; }
+
+.fa-dumpster-fire {
+ --fa: "\f794"; }
+
+.fa-house-crack {
+ --fa: "\e3b1"; }
+
+.fa-martini-glass-citrus {
+ --fa: "\f561"; }
+
+.fa-cocktail {
+ --fa: "\f561"; }
+
+.fa-face-surprise {
+ --fa: "\f5c2"; }
+
+.fa-surprise {
+ --fa: "\f5c2"; }
+
+.fa-bottle-water {
+ --fa: "\e4c5"; }
+
+.fa-circle-pause {
+ --fa: "\f28b"; }
+
+.fa-pause-circle {
+ --fa: "\f28b"; }
+
+.fa-toilet-paper-slash {
+ --fa: "\e072"; }
+
+.fa-apple-whole {
+ --fa: "\f5d1"; }
+
+.fa-apple-alt {
+ --fa: "\f5d1"; }
+
+.fa-kitchen-set {
+ --fa: "\e51a"; }
+
+.fa-r {
+ --fa: "\52"; }
+
+.fa-temperature-quarter {
+ --fa: "\f2ca"; }
+
+.fa-temperature-1 {
+ --fa: "\f2ca"; }
+
+.fa-thermometer-1 {
+ --fa: "\f2ca"; }
+
+.fa-thermometer-quarter {
+ --fa: "\f2ca"; }
+
+.fa-cube {
+ --fa: "\f1b2"; }
+
+.fa-bitcoin-sign {
+ --fa: "\e0b4"; }
+
+.fa-shield-dog {
+ --fa: "\e573"; }
+
+.fa-solar-panel {
+ --fa: "\f5ba"; }
+
+.fa-lock-open {
+ --fa: "\f3c1"; }
+
+.fa-elevator {
+ --fa: "\e16d"; }
+
+.fa-money-bill-transfer {
+ --fa: "\e528"; }
+
+.fa-money-bill-trend-up {
+ --fa: "\e529"; }
+
+.fa-house-flood-water-circle-arrow-right {
+ --fa: "\e50f"; }
+
+.fa-square-poll-horizontal {
+ --fa: "\f682"; }
+
+.fa-poll-h {
+ --fa: "\f682"; }
+
+.fa-circle {
+ --fa: "\f111"; }
+
+.fa-backward-fast {
+ --fa: "\f049"; }
+
+.fa-fast-backward {
+ --fa: "\f049"; }
+
+.fa-recycle {
+ --fa: "\f1b8"; }
+
+.fa-user-astronaut {
+ --fa: "\f4fb"; }
+
+.fa-plane-slash {
+ --fa: "\e069"; }
+
+.fa-trademark {
+ --fa: "\f25c"; }
+
+.fa-basketball {
+ --fa: "\f434"; }
+
+.fa-basketball-ball {
+ --fa: "\f434"; }
+
+.fa-satellite-dish {
+ --fa: "\f7c0"; }
+
+.fa-circle-up {
+ --fa: "\f35b"; }
+
+.fa-arrow-alt-circle-up {
+ --fa: "\f35b"; }
+
+.fa-mobile-screen-button {
+ --fa: "\f3cd"; }
+
+.fa-mobile-alt {
+ --fa: "\f3cd"; }
+
+.fa-volume-high {
+ --fa: "\f028"; }
+
+.fa-volume-up {
+ --fa: "\f028"; }
+
+.fa-users-rays {
+ --fa: "\e593"; }
+
+.fa-wallet {
+ --fa: "\f555"; }
+
+.fa-clipboard-check {
+ --fa: "\f46c"; }
+
+.fa-file-audio {
+ --fa: "\f1c7"; }
+
+.fa-burger {
+ --fa: "\f805"; }
+
+.fa-hamburger {
+ --fa: "\f805"; }
+
+.fa-wrench {
+ --fa: "\f0ad"; }
+
+.fa-bugs {
+ --fa: "\e4d0"; }
+
+.fa-rupee-sign {
+ --fa: "\f156"; }
+
+.fa-rupee {
+ --fa: "\f156"; }
+
+.fa-file-image {
+ --fa: "\f1c5"; }
+
+.fa-circle-question {
+ --fa: "\f059"; }
+
+.fa-question-circle {
+ --fa: "\f059"; }
+
+.fa-plane-departure {
+ --fa: "\f5b0"; }
+
+.fa-handshake-slash {
+ --fa: "\e060"; }
+
+.fa-book-bookmark {
+ --fa: "\e0bb"; }
+
+.fa-code-branch {
+ --fa: "\f126"; }
+
+.fa-hat-cowboy {
+ --fa: "\f8c0"; }
+
+.fa-bridge {
+ --fa: "\e4c8"; }
+
+.fa-phone-flip {
+ --fa: "\f879"; }
+
+.fa-phone-alt {
+ --fa: "\f879"; }
+
+.fa-truck-front {
+ --fa: "\e2b7"; }
+
+.fa-cat {
+ --fa: "\f6be"; }
+
+.fa-anchor-circle-exclamation {
+ --fa: "\e4ab"; }
+
+.fa-truck-field {
+ --fa: "\e58d"; }
+
+.fa-route {
+ --fa: "\f4d7"; }
+
+.fa-clipboard-question {
+ --fa: "\e4e3"; }
+
+.fa-panorama {
+ --fa: "\e209"; }
+
+.fa-comment-medical {
+ --fa: "\f7f5"; }
+
+.fa-teeth-open {
+ --fa: "\f62f"; }
+
+.fa-file-circle-minus {
+ --fa: "\e4ed"; }
+
+.fa-tags {
+ --fa: "\f02c"; }
+
+.fa-wine-glass {
+ --fa: "\f4e3"; }
+
+.fa-forward-fast {
+ --fa: "\f050"; }
+
+.fa-fast-forward {
+ --fa: "\f050"; }
+
+.fa-face-meh-blank {
+ --fa: "\f5a4"; }
+
+.fa-meh-blank {
+ --fa: "\f5a4"; }
+
+.fa-square-parking {
+ --fa: "\f540"; }
+
+.fa-parking {
+ --fa: "\f540"; }
+
+.fa-house-signal {
+ --fa: "\e012"; }
+
+.fa-bars-progress {
+ --fa: "\f828"; }
+
+.fa-tasks-alt {
+ --fa: "\f828"; }
+
+.fa-faucet-drip {
+ --fa: "\e006"; }
+
+.fa-cart-flatbed {
+ --fa: "\f474"; }
+
+.fa-dolly-flatbed {
+ --fa: "\f474"; }
+
+.fa-ban-smoking {
+ --fa: "\f54d"; }
+
+.fa-smoking-ban {
+ --fa: "\f54d"; }
+
+.fa-terminal {
+ --fa: "\f120"; }
+
+.fa-mobile-button {
+ --fa: "\f10b"; }
+
+.fa-house-medical-flag {
+ --fa: "\e514"; }
+
+.fa-basket-shopping {
+ --fa: "\f291"; }
+
+.fa-shopping-basket {
+ --fa: "\f291"; }
+
+.fa-tape {
+ --fa: "\f4db"; }
+
+.fa-bus-simple {
+ --fa: "\f55e"; }
+
+.fa-bus-alt {
+ --fa: "\f55e"; }
+
+.fa-eye {
+ --fa: "\f06e"; }
+
+.fa-face-sad-cry {
+ --fa: "\f5b3"; }
+
+.fa-sad-cry {
+ --fa: "\f5b3"; }
+
+.fa-audio-description {
+ --fa: "\f29e"; }
+
+.fa-person-military-to-person {
+ --fa: "\e54c"; }
+
+.fa-file-shield {
+ --fa: "\e4f0"; }
+
+.fa-user-slash {
+ --fa: "\f506"; }
+
+.fa-pen {
+ --fa: "\f304"; }
+
+.fa-tower-observation {
+ --fa: "\e586"; }
+
+.fa-file-code {
+ --fa: "\f1c9"; }
+
+.fa-signal {
+ --fa: "\f012"; }
+
+.fa-signal-5 {
+ --fa: "\f012"; }
+
+.fa-signal-perfect {
+ --fa: "\f012"; }
+
+.fa-bus {
+ --fa: "\f207"; }
+
+.fa-heart-circle-xmark {
+ --fa: "\e501"; }
+
+.fa-house-chimney {
+ --fa: "\e3af"; }
+
+.fa-home-lg {
+ --fa: "\e3af"; }
+
+.fa-window-maximize {
+ --fa: "\f2d0"; }
+
+.fa-face-frown {
+ --fa: "\f119"; }
+
+.fa-frown {
+ --fa: "\f119"; }
+
+.fa-prescription {
+ --fa: "\f5b1"; }
+
+.fa-shop {
+ --fa: "\f54f"; }
+
+.fa-store-alt {
+ --fa: "\f54f"; }
+
+.fa-floppy-disk {
+ --fa: "\f0c7"; }
+
+.fa-save {
+ --fa: "\f0c7"; }
+
+.fa-vihara {
+ --fa: "\f6a7"; }
+
+.fa-scale-unbalanced {
+ --fa: "\f515"; }
+
+.fa-balance-scale-left {
+ --fa: "\f515"; }
+
+.fa-sort-up {
+ --fa: "\f0de"; }
+
+.fa-sort-asc {
+ --fa: "\f0de"; }
+
+.fa-comment-dots {
+ --fa: "\f4ad"; }
+
+.fa-commenting {
+ --fa: "\f4ad"; }
+
+.fa-plant-wilt {
+ --fa: "\e5aa"; }
+
+.fa-diamond {
+ --fa: "\f219"; }
+
+.fa-face-grin-squint {
+ --fa: "\f585"; }
+
+.fa-grin-squint {
+ --fa: "\f585"; }
+
+.fa-hand-holding-dollar {
+ --fa: "\f4c0"; }
+
+.fa-hand-holding-usd {
+ --fa: "\f4c0"; }
+
+.fa-chart-diagram {
+ --fa: "\e695"; }
+
+.fa-bacterium {
+ --fa: "\e05a"; }
+
+.fa-hand-pointer {
+ --fa: "\f25a"; }
+
+.fa-drum-steelpan {
+ --fa: "\f56a"; }
+
+.fa-hand-scissors {
+ --fa: "\f257"; }
+
+.fa-hands-praying {
+ --fa: "\f684"; }
+
+.fa-praying-hands {
+ --fa: "\f684"; }
+
+.fa-arrow-rotate-right {
+ --fa: "\f01e"; }
+
+.fa-arrow-right-rotate {
+ --fa: "\f01e"; }
+
+.fa-arrow-rotate-forward {
+ --fa: "\f01e"; }
+
+.fa-redo {
+ --fa: "\f01e"; }
+
+.fa-biohazard {
+ --fa: "\f780"; }
+
+.fa-location-crosshairs {
+ --fa: "\f601"; }
+
+.fa-location {
+ --fa: "\f601"; }
+
+.fa-mars-double {
+ --fa: "\f227"; }
+
+.fa-child-dress {
+ --fa: "\e59c"; }
+
+.fa-users-between-lines {
+ --fa: "\e591"; }
+
+.fa-lungs-virus {
+ --fa: "\e067"; }
+
+.fa-face-grin-tears {
+ --fa: "\f588"; }
+
+.fa-grin-tears {
+ --fa: "\f588"; }
+
+.fa-phone {
+ --fa: "\f095"; }
+
+.fa-calendar-xmark {
+ --fa: "\f273"; }
+
+.fa-calendar-times {
+ --fa: "\f273"; }
+
+.fa-child-reaching {
+ --fa: "\e59d"; }
+
+.fa-head-side-virus {
+ --fa: "\e064"; }
+
+.fa-user-gear {
+ --fa: "\f4fe"; }
+
+.fa-user-cog {
+ --fa: "\f4fe"; }
+
+.fa-arrow-up-1-9 {
+ --fa: "\f163"; }
+
+.fa-sort-numeric-up {
+ --fa: "\f163"; }
+
+.fa-door-closed {
+ --fa: "\f52a"; }
+
+.fa-shield-virus {
+ --fa: "\e06c"; }
+
+.fa-dice-six {
+ --fa: "\f526"; }
+
+.fa-mosquito-net {
+ --fa: "\e52c"; }
+
+.fa-file-fragment {
+ --fa: "\e697"; }
+
+.fa-bridge-water {
+ --fa: "\e4ce"; }
+
+.fa-person-booth {
+ --fa: "\f756"; }
+
+.fa-text-width {
+ --fa: "\f035"; }
+
+.fa-hat-wizard {
+ --fa: "\f6e8"; }
+
+.fa-pen-fancy {
+ --fa: "\f5ac"; }
+
+.fa-person-digging {
+ --fa: "\f85e"; }
+
+.fa-digging {
+ --fa: "\f85e"; }
+
+.fa-trash {
+ --fa: "\f1f8"; }
+
+.fa-gauge-simple {
+ --fa: "\f629"; }
+
+.fa-gauge-simple-med {
+ --fa: "\f629"; }
+
+.fa-tachometer-average {
+ --fa: "\f629"; }
+
+.fa-book-medical {
+ --fa: "\f7e6"; }
+
+.fa-poo {
+ --fa: "\f2fe"; }
+
+.fa-quote-right {
+ --fa: "\f10e"; }
+
+.fa-quote-right-alt {
+ --fa: "\f10e"; }
+
+.fa-shirt {
+ --fa: "\f553"; }
+
+.fa-t-shirt {
+ --fa: "\f553"; }
+
+.fa-tshirt {
+ --fa: "\f553"; }
+
+.fa-cubes {
+ --fa: "\f1b3"; }
+
+.fa-divide {
+ --fa: "\f529"; }
+
+.fa-tenge-sign {
+ --fa: "\f7d7"; }
+
+.fa-tenge {
+ --fa: "\f7d7"; }
+
+.fa-headphones {
+ --fa: "\f025"; }
+
+.fa-hands-holding {
+ --fa: "\f4c2"; }
+
+.fa-hands-clapping {
+ --fa: "\e1a8"; }
+
+.fa-republican {
+ --fa: "\f75e"; }
+
+.fa-arrow-left {
+ --fa: "\f060"; }
+
+.fa-person-circle-xmark {
+ --fa: "\e543"; }
+
+.fa-ruler {
+ --fa: "\f545"; }
+
+.fa-align-left {
+ --fa: "\f036"; }
+
+.fa-dice-d6 {
+ --fa: "\f6d1"; }
+
+.fa-restroom {
+ --fa: "\f7bd"; }
+
+.fa-j {
+ --fa: "\4a"; }
+
+.fa-users-viewfinder {
+ --fa: "\e595"; }
+
+.fa-file-video {
+ --fa: "\f1c8"; }
+
+.fa-up-right-from-square {
+ --fa: "\f35d"; }
+
+.fa-external-link-alt {
+ --fa: "\f35d"; }
+
+.fa-table-cells {
+ --fa: "\f00a"; }
+
+.fa-th {
+ --fa: "\f00a"; }
+
+.fa-file-pdf {
+ --fa: "\f1c1"; }
+
+.fa-book-bible {
+ --fa: "\f647"; }
+
+.fa-bible {
+ --fa: "\f647"; }
+
+.fa-o {
+ --fa: "\4f"; }
+
+.fa-suitcase-medical {
+ --fa: "\f0fa"; }
+
+.fa-medkit {
+ --fa: "\f0fa"; }
+
+.fa-user-secret {
+ --fa: "\f21b"; }
+
+.fa-otter {
+ --fa: "\f700"; }
+
+.fa-person-dress {
+ --fa: "\f182"; }
+
+.fa-female {
+ --fa: "\f182"; }
+
+.fa-comment-dollar {
+ --fa: "\f651"; }
+
+.fa-business-time {
+ --fa: "\f64a"; }
+
+.fa-briefcase-clock {
+ --fa: "\f64a"; }
+
+.fa-table-cells-large {
+ --fa: "\f009"; }
+
+.fa-th-large {
+ --fa: "\f009"; }
+
+.fa-book-tanakh {
+ --fa: "\f827"; }
+
+.fa-tanakh {
+ --fa: "\f827"; }
+
+.fa-phone-volume {
+ --fa: "\f2a0"; }
+
+.fa-volume-control-phone {
+ --fa: "\f2a0"; }
+
+.fa-hat-cowboy-side {
+ --fa: "\f8c1"; }
+
+.fa-clipboard-user {
+ --fa: "\f7f3"; }
+
+.fa-child {
+ --fa: "\f1ae"; }
+
+.fa-lira-sign {
+ --fa: "\f195"; }
+
+.fa-satellite {
+ --fa: "\f7bf"; }
+
+.fa-plane-lock {
+ --fa: "\e558"; }
+
+.fa-tag {
+ --fa: "\f02b"; }
+
+.fa-comment {
+ --fa: "\f075"; }
+
+.fa-cake-candles {
+ --fa: "\f1fd"; }
+
+.fa-birthday-cake {
+ --fa: "\f1fd"; }
+
+.fa-cake {
+ --fa: "\f1fd"; }
+
+.fa-envelope {
+ --fa: "\f0e0"; }
+
+.fa-angles-up {
+ --fa: "\f102"; }
+
+.fa-angle-double-up {
+ --fa: "\f102"; }
+
+.fa-paperclip {
+ --fa: "\f0c6"; }
+
+.fa-arrow-right-to-city {
+ --fa: "\e4b3"; }
+
+.fa-ribbon {
+ --fa: "\f4d6"; }
+
+.fa-lungs {
+ --fa: "\f604"; }
+
+.fa-arrow-up-9-1 {
+ --fa: "\f887"; }
+
+.fa-sort-numeric-up-alt {
+ --fa: "\f887"; }
+
+.fa-litecoin-sign {
+ --fa: "\e1d3"; }
+
+.fa-border-none {
+ --fa: "\f850"; }
+
+.fa-circle-nodes {
+ --fa: "\e4e2"; }
+
+.fa-parachute-box {
+ --fa: "\f4cd"; }
+
+.fa-indent {
+ --fa: "\f03c"; }
+
+.fa-truck-field-un {
+ --fa: "\e58e"; }
+
+.fa-hourglass {
+ --fa: "\f254"; }
+
+.fa-hourglass-empty {
+ --fa: "\f254"; }
+
+.fa-mountain {
+ --fa: "\f6fc"; }
+
+.fa-user-doctor {
+ --fa: "\f0f0"; }
+
+.fa-user-md {
+ --fa: "\f0f0"; }
+
+.fa-circle-info {
+ --fa: "\f05a"; }
+
+.fa-info-circle {
+ --fa: "\f05a"; }
+
+.fa-cloud-meatball {
+ --fa: "\f73b"; }
+
+.fa-camera {
+ --fa: "\f030"; }
+
+.fa-camera-alt {
+ --fa: "\f030"; }
+
+.fa-square-virus {
+ --fa: "\e578"; }
+
+.fa-meteor {
+ --fa: "\f753"; }
+
+.fa-car-on {
+ --fa: "\e4dd"; }
+
+.fa-sleigh {
+ --fa: "\f7cc"; }
+
+.fa-arrow-down-1-9 {
+ --fa: "\f162"; }
+
+.fa-sort-numeric-asc {
+ --fa: "\f162"; }
+
+.fa-sort-numeric-down {
+ --fa: "\f162"; }
+
+.fa-hand-holding-droplet {
+ --fa: "\f4c1"; }
+
+.fa-hand-holding-water {
+ --fa: "\f4c1"; }
+
+.fa-water {
+ --fa: "\f773"; }
+
+.fa-calendar-check {
+ --fa: "\f274"; }
+
+.fa-braille {
+ --fa: "\f2a1"; }
+
+.fa-prescription-bottle-medical {
+ --fa: "\f486"; }
+
+.fa-prescription-bottle-alt {
+ --fa: "\f486"; }
+
+.fa-landmark {
+ --fa: "\f66f"; }
+
+.fa-truck {
+ --fa: "\f0d1"; }
+
+.fa-crosshairs {
+ --fa: "\f05b"; }
+
+.fa-person-cane {
+ --fa: "\e53c"; }
+
+.fa-tent {
+ --fa: "\e57d"; }
+
+.fa-vest-patches {
+ --fa: "\e086"; }
+
+.fa-check-double {
+ --fa: "\f560"; }
+
+.fa-arrow-down-a-z {
+ --fa: "\f15d"; }
+
+.fa-sort-alpha-asc {
+ --fa: "\f15d"; }
+
+.fa-sort-alpha-down {
+ --fa: "\f15d"; }
+
+.fa-money-bill-wheat {
+ --fa: "\e52a"; }
+
+.fa-cookie {
+ --fa: "\f563"; }
+
+.fa-arrow-rotate-left {
+ --fa: "\f0e2"; }
+
+.fa-arrow-left-rotate {
+ --fa: "\f0e2"; }
+
+.fa-arrow-rotate-back {
+ --fa: "\f0e2"; }
+
+.fa-arrow-rotate-backward {
+ --fa: "\f0e2"; }
+
+.fa-undo {
+ --fa: "\f0e2"; }
+
+.fa-hard-drive {
+ --fa: "\f0a0"; }
+
+.fa-hdd {
+ --fa: "\f0a0"; }
+
+.fa-face-grin-squint-tears {
+ --fa: "\f586"; }
+
+.fa-grin-squint-tears {
+ --fa: "\f586"; }
+
+.fa-dumbbell {
+ --fa: "\f44b"; }
+
+.fa-rectangle-list {
+ --fa: "\f022"; }
+
+.fa-list-alt {
+ --fa: "\f022"; }
+
+.fa-tarp-droplet {
+ --fa: "\e57c"; }
+
+.fa-house-medical-circle-check {
+ --fa: "\e511"; }
+
+.fa-person-skiing-nordic {
+ --fa: "\f7ca"; }
+
+.fa-skiing-nordic {
+ --fa: "\f7ca"; }
+
+.fa-calendar-plus {
+ --fa: "\f271"; }
+
+.fa-plane-arrival {
+ --fa: "\f5af"; }
+
+.fa-circle-left {
+ --fa: "\f359"; }
+
+.fa-arrow-alt-circle-left {
+ --fa: "\f359"; }
+
+.fa-train-subway {
+ --fa: "\f239"; }
+
+.fa-subway {
+ --fa: "\f239"; }
+
+.fa-chart-gantt {
+ --fa: "\e0e4"; }
+
+.fa-indian-rupee-sign {
+ --fa: "\e1bc"; }
+
+.fa-indian-rupee {
+ --fa: "\e1bc"; }
+
+.fa-inr {
+ --fa: "\e1bc"; }
+
+.fa-crop-simple {
+ --fa: "\f565"; }
+
+.fa-crop-alt {
+ --fa: "\f565"; }
+
+.fa-money-bill-1 {
+ --fa: "\f3d1"; }
+
+.fa-money-bill-alt {
+ --fa: "\f3d1"; }
+
+.fa-left-long {
+ --fa: "\f30a"; }
+
+.fa-long-arrow-alt-left {
+ --fa: "\f30a"; }
+
+.fa-dna {
+ --fa: "\f471"; }
+
+.fa-virus-slash {
+ --fa: "\e075"; }
+
+.fa-minus {
+ --fa: "\f068"; }
+
+.fa-subtract {
+ --fa: "\f068"; }
+
+.fa-chess {
+ --fa: "\f439"; }
+
+.fa-arrow-left-long {
+ --fa: "\f177"; }
+
+.fa-long-arrow-left {
+ --fa: "\f177"; }
+
+.fa-plug-circle-check {
+ --fa: "\e55c"; }
+
+.fa-street-view {
+ --fa: "\f21d"; }
+
+.fa-franc-sign {
+ --fa: "\e18f"; }
+
+.fa-volume-off {
+ --fa: "\f026"; }
+
+.fa-hands-asl-interpreting {
+ --fa: "\f2a3"; }
+
+.fa-american-sign-language-interpreting {
+ --fa: "\f2a3"; }
+
+.fa-asl-interpreting {
+ --fa: "\f2a3"; }
+
+.fa-hands-american-sign-language-interpreting {
+ --fa: "\f2a3"; }
+
+.fa-gear {
+ --fa: "\f013"; }
+
+.fa-cog {
+ --fa: "\f013"; }
+
+.fa-droplet-slash {
+ --fa: "\f5c7"; }
+
+.fa-tint-slash {
+ --fa: "\f5c7"; }
+
+.fa-mosque {
+ --fa: "\f678"; }
+
+.fa-mosquito {
+ --fa: "\e52b"; }
+
+.fa-star-of-david {
+ --fa: "\f69a"; }
+
+.fa-person-military-rifle {
+ --fa: "\e54b"; }
+
+.fa-cart-shopping {
+ --fa: "\f07a"; }
+
+.fa-shopping-cart {
+ --fa: "\f07a"; }
+
+.fa-vials {
+ --fa: "\f493"; }
+
+.fa-plug-circle-plus {
+ --fa: "\e55f"; }
+
+.fa-place-of-worship {
+ --fa: "\f67f"; }
+
+.fa-grip-vertical {
+ --fa: "\f58e"; }
+
+.fa-hexagon-nodes {
+ --fa: "\e699"; }
+
+.fa-arrow-turn-up {
+ --fa: "\f148"; }
+
+.fa-level-up {
+ --fa: "\f148"; }
+
+.fa-u {
+ --fa: "\55"; }
+
+.fa-square-root-variable {
+ --fa: "\f698"; }
+
+.fa-square-root-alt {
+ --fa: "\f698"; }
+
+.fa-clock {
+ --fa: "\f017"; }
+
+.fa-clock-four {
+ --fa: "\f017"; }
+
+.fa-backward-step {
+ --fa: "\f048"; }
+
+.fa-step-backward {
+ --fa: "\f048"; }
+
+.fa-pallet {
+ --fa: "\f482"; }
+
+.fa-faucet {
+ --fa: "\e005"; }
+
+.fa-baseball-bat-ball {
+ --fa: "\f432"; }
+
+.fa-s {
+ --fa: "\53"; }
+
+.fa-timeline {
+ --fa: "\e29c"; }
+
+.fa-keyboard {
+ --fa: "\f11c"; }
+
+.fa-caret-down {
+ --fa: "\f0d7"; }
+
+.fa-house-chimney-medical {
+ --fa: "\f7f2"; }
+
+.fa-clinic-medical {
+ --fa: "\f7f2"; }
+
+.fa-temperature-three-quarters {
+ --fa: "\f2c8"; }
+
+.fa-temperature-3 {
+ --fa: "\f2c8"; }
+
+.fa-thermometer-3 {
+ --fa: "\f2c8"; }
+
+.fa-thermometer-three-quarters {
+ --fa: "\f2c8"; }
+
+.fa-mobile-screen {
+ --fa: "\f3cf"; }
+
+.fa-mobile-android-alt {
+ --fa: "\f3cf"; }
+
+.fa-plane-up {
+ --fa: "\e22d"; }
+
+.fa-piggy-bank {
+ --fa: "\f4d3"; }
+
+.fa-battery-half {
+ --fa: "\f242"; }
+
+.fa-battery-3 {
+ --fa: "\f242"; }
+
+.fa-mountain-city {
+ --fa: "\e52e"; }
+
+.fa-coins {
+ --fa: "\f51e"; }
+
+.fa-khanda {
+ --fa: "\f66d"; }
+
+.fa-sliders {
+ --fa: "\f1de"; }
+
+.fa-sliders-h {
+ --fa: "\f1de"; }
+
+.fa-folder-tree {
+ --fa: "\f802"; }
+
+.fa-network-wired {
+ --fa: "\f6ff"; }
+
+.fa-map-pin {
+ --fa: "\f276"; }
+
+.fa-hamsa {
+ --fa: "\f665"; }
+
+.fa-cent-sign {
+ --fa: "\e3f5"; }
+
+.fa-flask {
+ --fa: "\f0c3"; }
+
+.fa-person-pregnant {
+ --fa: "\e31e"; }
+
+.fa-wand-sparkles {
+ --fa: "\f72b"; }
+
+.fa-ellipsis-vertical {
+ --fa: "\f142"; }
+
+.fa-ellipsis-v {
+ --fa: "\f142"; }
+
+.fa-ticket {
+ --fa: "\f145"; }
+
+.fa-power-off {
+ --fa: "\f011"; }
+
+.fa-right-long {
+ --fa: "\f30b"; }
+
+.fa-long-arrow-alt-right {
+ --fa: "\f30b"; }
+
+.fa-flag-usa {
+ --fa: "\f74d"; }
+
+.fa-laptop-file {
+ --fa: "\e51d"; }
+
+.fa-tty {
+ --fa: "\f1e4"; }
+
+.fa-teletype {
+ --fa: "\f1e4"; }
+
+.fa-diagram-next {
+ --fa: "\e476"; }
+
+.fa-person-rifle {
+ --fa: "\e54e"; }
+
+.fa-house-medical-circle-exclamation {
+ --fa: "\e512"; }
+
+.fa-closed-captioning {
+ --fa: "\f20a"; }
+
+.fa-person-hiking {
+ --fa: "\f6ec"; }
+
+.fa-hiking {
+ --fa: "\f6ec"; }
+
+.fa-venus-double {
+ --fa: "\f226"; }
+
+.fa-images {
+ --fa: "\f302"; }
+
+.fa-calculator {
+ --fa: "\f1ec"; }
+
+.fa-people-pulling {
+ --fa: "\e535"; }
+
+.fa-n {
+ --fa: "\4e"; }
+
+.fa-cable-car {
+ --fa: "\f7da"; }
+
+.fa-tram {
+ --fa: "\f7da"; }
+
+.fa-cloud-rain {
+ --fa: "\f73d"; }
+
+.fa-building-circle-xmark {
+ --fa: "\e4d4"; }
+
+.fa-ship {
+ --fa: "\f21a"; }
+
+.fa-arrows-down-to-line {
+ --fa: "\e4b8"; }
+
+.fa-download {
+ --fa: "\f019"; }
+
+.fa-face-grin {
+ --fa: "\f580"; }
+
+.fa-grin {
+ --fa: "\f580"; }
+
+.fa-delete-left {
+ --fa: "\f55a"; }
+
+.fa-backspace {
+ --fa: "\f55a"; }
+
+.fa-eye-dropper {
+ --fa: "\f1fb"; }
+
+.fa-eye-dropper-empty {
+ --fa: "\f1fb"; }
+
+.fa-eyedropper {
+ --fa: "\f1fb"; }
+
+.fa-file-circle-check {
+ --fa: "\e5a0"; }
+
+.fa-forward {
+ --fa: "\f04e"; }
+
+.fa-mobile {
+ --fa: "\f3ce"; }
+
+.fa-mobile-android {
+ --fa: "\f3ce"; }
+
+.fa-mobile-phone {
+ --fa: "\f3ce"; }
+
+.fa-face-meh {
+ --fa: "\f11a"; }
+
+.fa-meh {
+ --fa: "\f11a"; }
+
+.fa-align-center {
+ --fa: "\f037"; }
+
+.fa-book-skull {
+ --fa: "\f6b7"; }
+
+.fa-book-dead {
+ --fa: "\f6b7"; }
+
+.fa-id-card {
+ --fa: "\f2c2"; }
+
+.fa-drivers-license {
+ --fa: "\f2c2"; }
+
+.fa-outdent {
+ --fa: "\f03b"; }
+
+.fa-dedent {
+ --fa: "\f03b"; }
+
+.fa-heart-circle-exclamation {
+ --fa: "\e4fe"; }
+
+.fa-house {
+ --fa: "\f015"; }
+
+.fa-home {
+ --fa: "\f015"; }
+
+.fa-home-alt {
+ --fa: "\f015"; }
+
+.fa-home-lg-alt {
+ --fa: "\f015"; }
+
+.fa-calendar-week {
+ --fa: "\f784"; }
+
+.fa-laptop-medical {
+ --fa: "\f812"; }
+
+.fa-b {
+ --fa: "\42"; }
+
+.fa-file-medical {
+ --fa: "\f477"; }
+
+.fa-dice-one {
+ --fa: "\f525"; }
+
+.fa-kiwi-bird {
+ --fa: "\f535"; }
+
+.fa-arrow-right-arrow-left {
+ --fa: "\f0ec"; }
+
+.fa-exchange {
+ --fa: "\f0ec"; }
+
+.fa-rotate-right {
+ --fa: "\f2f9"; }
+
+.fa-redo-alt {
+ --fa: "\f2f9"; }
+
+.fa-rotate-forward {
+ --fa: "\f2f9"; }
+
+.fa-utensils {
+ --fa: "\f2e7"; }
+
+.fa-cutlery {
+ --fa: "\f2e7"; }
+
+.fa-arrow-up-wide-short {
+ --fa: "\f161"; }
+
+.fa-sort-amount-up {
+ --fa: "\f161"; }
+
+.fa-mill-sign {
+ --fa: "\e1ed"; }
+
+.fa-bowl-rice {
+ --fa: "\e2eb"; }
+
+.fa-skull {
+ --fa: "\f54c"; }
+
+.fa-tower-broadcast {
+ --fa: "\f519"; }
+
+.fa-broadcast-tower {
+ --fa: "\f519"; }
+
+.fa-truck-pickup {
+ --fa: "\f63c"; }
+
+.fa-up-long {
+ --fa: "\f30c"; }
+
+.fa-long-arrow-alt-up {
+ --fa: "\f30c"; }
+
+.fa-stop {
+ --fa: "\f04d"; }
+
+.fa-code-merge {
+ --fa: "\f387"; }
+
+.fa-upload {
+ --fa: "\f093"; }
+
+.fa-hurricane {
+ --fa: "\f751"; }
+
+.fa-mound {
+ --fa: "\e52d"; }
+
+.fa-toilet-portable {
+ --fa: "\e583"; }
+
+.fa-compact-disc {
+ --fa: "\f51f"; }
+
+.fa-file-arrow-down {
+ --fa: "\f56d"; }
+
+.fa-file-download {
+ --fa: "\f56d"; }
+
+.fa-caravan {
+ --fa: "\f8ff"; }
+
+.fa-shield-cat {
+ --fa: "\e572"; }
+
+.fa-bolt {
+ --fa: "\f0e7"; }
+
+.fa-zap {
+ --fa: "\f0e7"; }
+
+.fa-glass-water {
+ --fa: "\e4f4"; }
+
+.fa-oil-well {
+ --fa: "\e532"; }
+
+.fa-vault {
+ --fa: "\e2c5"; }
+
+.fa-mars {
+ --fa: "\f222"; }
+
+.fa-toilet {
+ --fa: "\f7d8"; }
+
+.fa-plane-circle-xmark {
+ --fa: "\e557"; }
+
+.fa-yen-sign {
+ --fa: "\f157"; }
+
+.fa-cny {
+ --fa: "\f157"; }
+
+.fa-jpy {
+ --fa: "\f157"; }
+
+.fa-rmb {
+ --fa: "\f157"; }
+
+.fa-yen {
+ --fa: "\f157"; }
+
+.fa-ruble-sign {
+ --fa: "\f158"; }
+
+.fa-rouble {
+ --fa: "\f158"; }
+
+.fa-rub {
+ --fa: "\f158"; }
+
+.fa-ruble {
+ --fa: "\f158"; }
+
+.fa-sun {
+ --fa: "\f185"; }
+
+.fa-guitar {
+ --fa: "\f7a6"; }
+
+.fa-face-laugh-wink {
+ --fa: "\f59c"; }
+
+.fa-laugh-wink {
+ --fa: "\f59c"; }
+
+.fa-horse-head {
+ --fa: "\f7ab"; }
+
+.fa-bore-hole {
+ --fa: "\e4c3"; }
+
+.fa-industry {
+ --fa: "\f275"; }
+
+.fa-circle-down {
+ --fa: "\f358"; }
+
+.fa-arrow-alt-circle-down {
+ --fa: "\f358"; }
+
+.fa-arrows-turn-to-dots {
+ --fa: "\e4c1"; }
+
+.fa-florin-sign {
+ --fa: "\e184"; }
+
+.fa-arrow-down-short-wide {
+ --fa: "\f884"; }
+
+.fa-sort-amount-desc {
+ --fa: "\f884"; }
+
+.fa-sort-amount-down-alt {
+ --fa: "\f884"; }
+
+.fa-less-than {
+ --fa: "\3c"; }
+
+.fa-angle-down {
+ --fa: "\f107"; }
+
+.fa-car-tunnel {
+ --fa: "\e4de"; }
+
+.fa-head-side-cough {
+ --fa: "\e061"; }
+
+.fa-grip-lines {
+ --fa: "\f7a4"; }
+
+.fa-thumbs-down {
+ --fa: "\f165"; }
+
+.fa-user-lock {
+ --fa: "\f502"; }
+
+.fa-arrow-right-long {
+ --fa: "\f178"; }
+
+.fa-long-arrow-right {
+ --fa: "\f178"; }
+
+.fa-anchor-circle-xmark {
+ --fa: "\e4ac"; }
+
+.fa-ellipsis {
+ --fa: "\f141"; }
+
+.fa-ellipsis-h {
+ --fa: "\f141"; }
+
+.fa-chess-pawn {
+ --fa: "\f443"; }
+
+.fa-kit-medical {
+ --fa: "\f479"; }
+
+.fa-first-aid {
+ --fa: "\f479"; }
+
+.fa-person-through-window {
+ --fa: "\e5a9"; }
+
+.fa-toolbox {
+ --fa: "\f552"; }
+
+.fa-hands-holding-circle {
+ --fa: "\e4fb"; }
+
+.fa-bug {
+ --fa: "\f188"; }
+
+.fa-credit-card {
+ --fa: "\f09d"; }
+
+.fa-credit-card-alt {
+ --fa: "\f09d"; }
+
+.fa-car {
+ --fa: "\f1b9"; }
+
+.fa-automobile {
+ --fa: "\f1b9"; }
+
+.fa-hand-holding-hand {
+ --fa: "\e4f7"; }
+
+.fa-book-open-reader {
+ --fa: "\f5da"; }
+
+.fa-book-reader {
+ --fa: "\f5da"; }
+
+.fa-mountain-sun {
+ --fa: "\e52f"; }
+
+.fa-arrows-left-right-to-line {
+ --fa: "\e4ba"; }
+
+.fa-dice-d20 {
+ --fa: "\f6cf"; }
+
+.fa-truck-droplet {
+ --fa: "\e58c"; }
+
+.fa-file-circle-xmark {
+ --fa: "\e5a1"; }
+
+.fa-temperature-arrow-up {
+ --fa: "\e040"; }
+
+.fa-temperature-up {
+ --fa: "\e040"; }
+
+.fa-medal {
+ --fa: "\f5a2"; }
+
+.fa-bed {
+ --fa: "\f236"; }
+
+.fa-square-h {
+ --fa: "\f0fd"; }
+
+.fa-h-square {
+ --fa: "\f0fd"; }
+
+.fa-podcast {
+ --fa: "\f2ce"; }
+
+.fa-temperature-full {
+ --fa: "\f2c7"; }
+
+.fa-temperature-4 {
+ --fa: "\f2c7"; }
+
+.fa-thermometer-4 {
+ --fa: "\f2c7"; }
+
+.fa-thermometer-full {
+ --fa: "\f2c7"; }
+
+.fa-bell {
+ --fa: "\f0f3"; }
+
+.fa-superscript {
+ --fa: "\f12b"; }
+
+.fa-plug-circle-xmark {
+ --fa: "\e560"; }
+
+.fa-star-of-life {
+ --fa: "\f621"; }
+
+.fa-phone-slash {
+ --fa: "\f3dd"; }
+
+.fa-paint-roller {
+ --fa: "\f5aa"; }
+
+.fa-handshake-angle {
+ --fa: "\f4c4"; }
+
+.fa-hands-helping {
+ --fa: "\f4c4"; }
+
+.fa-location-dot {
+ --fa: "\f3c5"; }
+
+.fa-map-marker-alt {
+ --fa: "\f3c5"; }
+
+.fa-file {
+ --fa: "\f15b"; }
+
+.fa-greater-than {
+ --fa: "\3e"; }
+
+.fa-person-swimming {
+ --fa: "\f5c4"; }
+
+.fa-swimmer {
+ --fa: "\f5c4"; }
+
+.fa-arrow-down {
+ --fa: "\f063"; }
+
+.fa-droplet {
+ --fa: "\f043"; }
+
+.fa-tint {
+ --fa: "\f043"; }
+
+.fa-eraser {
+ --fa: "\f12d"; }
+
+.fa-earth-americas {
+ --fa: "\f57d"; }
+
+.fa-earth {
+ --fa: "\f57d"; }
+
+.fa-earth-america {
+ --fa: "\f57d"; }
+
+.fa-globe-americas {
+ --fa: "\f57d"; }
+
+.fa-person-burst {
+ --fa: "\e53b"; }
+
+.fa-dove {
+ --fa: "\f4ba"; }
+
+.fa-battery-empty {
+ --fa: "\f244"; }
+
+.fa-battery-0 {
+ --fa: "\f244"; }
+
+.fa-socks {
+ --fa: "\f696"; }
+
+.fa-inbox {
+ --fa: "\f01c"; }
+
+.fa-section {
+ --fa: "\e447"; }
+
+.fa-gauge-high {
+ --fa: "\f625"; }
+
+.fa-tachometer-alt {
+ --fa: "\f625"; }
+
+.fa-tachometer-alt-fast {
+ --fa: "\f625"; }
+
+.fa-envelope-open-text {
+ --fa: "\f658"; }
+
+.fa-hospital {
+ --fa: "\f0f8"; }
+
+.fa-hospital-alt {
+ --fa: "\f0f8"; }
+
+.fa-hospital-wide {
+ --fa: "\f0f8"; }
+
+.fa-wine-bottle {
+ --fa: "\f72f"; }
+
+.fa-chess-rook {
+ --fa: "\f447"; }
+
+.fa-bars-staggered {
+ --fa: "\f550"; }
+
+.fa-reorder {
+ --fa: "\f550"; }
+
+.fa-stream {
+ --fa: "\f550"; }
+
+.fa-dharmachakra {
+ --fa: "\f655"; }
+
+.fa-hotdog {
+ --fa: "\f80f"; }
+
+.fa-person-walking-with-cane {
+ --fa: "\f29d"; }
+
+.fa-blind {
+ --fa: "\f29d"; }
+
+.fa-drum {
+ --fa: "\f569"; }
+
+.fa-ice-cream {
+ --fa: "\f810"; }
+
+.fa-heart-circle-bolt {
+ --fa: "\e4fc"; }
+
+.fa-fax {
+ --fa: "\f1ac"; }
+
+.fa-paragraph {
+ --fa: "\f1dd"; }
+
+.fa-check-to-slot {
+ --fa: "\f772"; }
+
+.fa-vote-yea {
+ --fa: "\f772"; }
+
+.fa-star-half {
+ --fa: "\f089"; }
+
+.fa-boxes-stacked {
+ --fa: "\f468"; }
+
+.fa-boxes {
+ --fa: "\f468"; }
+
+.fa-boxes-alt {
+ --fa: "\f468"; }
+
+.fa-link {
+ --fa: "\f0c1"; }
+
+.fa-chain {
+ --fa: "\f0c1"; }
+
+.fa-ear-listen {
+ --fa: "\f2a2"; }
+
+.fa-assistive-listening-systems {
+ --fa: "\f2a2"; }
+
+.fa-tree-city {
+ --fa: "\e587"; }
+
+.fa-play {
+ --fa: "\f04b"; }
+
+.fa-font {
+ --fa: "\f031"; }
+
+.fa-table-cells-row-lock {
+ --fa: "\e67a"; }
+
+.fa-rupiah-sign {
+ --fa: "\e23d"; }
+
+.fa-magnifying-glass {
+ --fa: "\f002"; }
+
+.fa-search {
+ --fa: "\f002"; }
+
+.fa-table-tennis-paddle-ball {
+ --fa: "\f45d"; }
+
+.fa-ping-pong-paddle-ball {
+ --fa: "\f45d"; }
+
+.fa-table-tennis {
+ --fa: "\f45d"; }
+
+.fa-person-dots-from-line {
+ --fa: "\f470"; }
+
+.fa-diagnoses {
+ --fa: "\f470"; }
+
+.fa-trash-can-arrow-up {
+ --fa: "\f82a"; }
+
+.fa-trash-restore-alt {
+ --fa: "\f82a"; }
+
+.fa-naira-sign {
+ --fa: "\e1f6"; }
+
+.fa-cart-arrow-down {
+ --fa: "\f218"; }
+
+.fa-walkie-talkie {
+ --fa: "\f8ef"; }
+
+.fa-file-pen {
+ --fa: "\f31c"; }
+
+.fa-file-edit {
+ --fa: "\f31c"; }
+
+.fa-receipt {
+ --fa: "\f543"; }
+
+.fa-square-pen {
+ --fa: "\f14b"; }
+
+.fa-pen-square {
+ --fa: "\f14b"; }
+
+.fa-pencil-square {
+ --fa: "\f14b"; }
+
+.fa-suitcase-rolling {
+ --fa: "\f5c1"; }
+
+.fa-person-circle-exclamation {
+ --fa: "\e53f"; }
+
+.fa-chevron-down {
+ --fa: "\f078"; }
+
+.fa-battery-full {
+ --fa: "\f240"; }
+
+.fa-battery {
+ --fa: "\f240"; }
+
+.fa-battery-5 {
+ --fa: "\f240"; }
+
+.fa-skull-crossbones {
+ --fa: "\f714"; }
+
+.fa-code-compare {
+ --fa: "\e13a"; }
+
+.fa-list-ul {
+ --fa: "\f0ca"; }
+
+.fa-list-dots {
+ --fa: "\f0ca"; }
+
+.fa-school-lock {
+ --fa: "\e56f"; }
+
+.fa-tower-cell {
+ --fa: "\e585"; }
+
+.fa-down-long {
+ --fa: "\f309"; }
+
+.fa-long-arrow-alt-down {
+ --fa: "\f309"; }
+
+.fa-ranking-star {
+ --fa: "\e561"; }
+
+.fa-chess-king {
+ --fa: "\f43f"; }
+
+.fa-person-harassing {
+ --fa: "\e549"; }
+
+.fa-brazilian-real-sign {
+ --fa: "\e46c"; }
+
+.fa-landmark-dome {
+ --fa: "\f752"; }
+
+.fa-landmark-alt {
+ --fa: "\f752"; }
+
+.fa-arrow-up {
+ --fa: "\f062"; }
+
+.fa-tv {
+ --fa: "\f26c"; }
+
+.fa-television {
+ --fa: "\f26c"; }
+
+.fa-tv-alt {
+ --fa: "\f26c"; }
+
+.fa-shrimp {
+ --fa: "\e448"; }
+
+.fa-list-check {
+ --fa: "\f0ae"; }
+
+.fa-tasks {
+ --fa: "\f0ae"; }
+
+.fa-jug-detergent {
+ --fa: "\e519"; }
+
+.fa-circle-user {
+ --fa: "\f2bd"; }
+
+.fa-user-circle {
+ --fa: "\f2bd"; }
+
+.fa-user-shield {
+ --fa: "\f505"; }
+
+.fa-wind {
+ --fa: "\f72e"; }
+
+.fa-car-burst {
+ --fa: "\f5e1"; }
+
+.fa-car-crash {
+ --fa: "\f5e1"; }
+
+.fa-y {
+ --fa: "\59"; }
+
+.fa-person-snowboarding {
+ --fa: "\f7ce"; }
+
+.fa-snowboarding {
+ --fa: "\f7ce"; }
+
+.fa-truck-fast {
+ --fa: "\f48b"; }
+
+.fa-shipping-fast {
+ --fa: "\f48b"; }
+
+.fa-fish {
+ --fa: "\f578"; }
+
+.fa-user-graduate {
+ --fa: "\f501"; }
+
+.fa-circle-half-stroke {
+ --fa: "\f042"; }
+
+.fa-adjust {
+ --fa: "\f042"; }
+
+.fa-clapperboard {
+ --fa: "\e131"; }
+
+.fa-circle-radiation {
+ --fa: "\f7ba"; }
+
+.fa-radiation-alt {
+ --fa: "\f7ba"; }
+
+.fa-baseball {
+ --fa: "\f433"; }
+
+.fa-baseball-ball {
+ --fa: "\f433"; }
+
+.fa-jet-fighter-up {
+ --fa: "\e518"; }
+
+.fa-diagram-project {
+ --fa: "\f542"; }
+
+.fa-project-diagram {
+ --fa: "\f542"; }
+
+.fa-copy {
+ --fa: "\f0c5"; }
+
+.fa-volume-xmark {
+ --fa: "\f6a9"; }
+
+.fa-volume-mute {
+ --fa: "\f6a9"; }
+
+.fa-volume-times {
+ --fa: "\f6a9"; }
+
+.fa-hand-sparkles {
+ --fa: "\e05d"; }
+
+.fa-grip {
+ --fa: "\f58d"; }
+
+.fa-grip-horizontal {
+ --fa: "\f58d"; }
+
+.fa-share-from-square {
+ --fa: "\f14d"; }
+
+.fa-share-square {
+ --fa: "\f14d"; }
+
+.fa-child-combatant {
+ --fa: "\e4e0"; }
+
+.fa-child-rifle {
+ --fa: "\e4e0"; }
+
+.fa-gun {
+ --fa: "\e19b"; }
+
+.fa-square-phone {
+ --fa: "\f098"; }
+
+.fa-phone-square {
+ --fa: "\f098"; }
+
+.fa-plus {
+ --fa: "\2b"; }
+
+.fa-add {
+ --fa: "\2b"; }
+
+.fa-expand {
+ --fa: "\f065"; }
+
+.fa-computer {
+ --fa: "\e4e5"; }
+
+.fa-xmark {
+ --fa: "\f00d"; }
+
+.fa-close {
+ --fa: "\f00d"; }
+
+.fa-multiply {
+ --fa: "\f00d"; }
+
+.fa-remove {
+ --fa: "\f00d"; }
+
+.fa-times {
+ --fa: "\f00d"; }
+
+.fa-arrows-up-down-left-right {
+ --fa: "\f047"; }
+
+.fa-arrows {
+ --fa: "\f047"; }
+
+.fa-chalkboard-user {
+ --fa: "\f51c"; }
+
+.fa-chalkboard-teacher {
+ --fa: "\f51c"; }
+
+.fa-peso-sign {
+ --fa: "\e222"; }
+
+.fa-building-shield {
+ --fa: "\e4d8"; }
+
+.fa-baby {
+ --fa: "\f77c"; }
+
+.fa-users-line {
+ --fa: "\e592"; }
+
+.fa-quote-left {
+ --fa: "\f10d"; }
+
+.fa-quote-left-alt {
+ --fa: "\f10d"; }
+
+.fa-tractor {
+ --fa: "\f722"; }
+
+.fa-trash-arrow-up {
+ --fa: "\f829"; }
+
+.fa-trash-restore {
+ --fa: "\f829"; }
+
+.fa-arrow-down-up-lock {
+ --fa: "\e4b0"; }
+
+.fa-lines-leaning {
+ --fa: "\e51e"; }
+
+.fa-ruler-combined {
+ --fa: "\f546"; }
+
+.fa-copyright {
+ --fa: "\f1f9"; }
+
+.fa-equals {
+ --fa: "\3d"; }
+
+.fa-blender {
+ --fa: "\f517"; }
+
+.fa-teeth {
+ --fa: "\f62e"; }
+
+.fa-shekel-sign {
+ --fa: "\f20b"; }
+
+.fa-ils {
+ --fa: "\f20b"; }
+
+.fa-shekel {
+ --fa: "\f20b"; }
+
+.fa-sheqel {
+ --fa: "\f20b"; }
+
+.fa-sheqel-sign {
+ --fa: "\f20b"; }
+
+.fa-map {
+ --fa: "\f279"; }
+
+.fa-rocket {
+ --fa: "\f135"; }
+
+.fa-photo-film {
+ --fa: "\f87c"; }
+
+.fa-photo-video {
+ --fa: "\f87c"; }
+
+.fa-folder-minus {
+ --fa: "\f65d"; }
+
+.fa-hexagon-nodes-bolt {
+ --fa: "\e69a"; }
+
+.fa-store {
+ --fa: "\f54e"; }
+
+.fa-arrow-trend-up {
+ --fa: "\e098"; }
+
+.fa-plug-circle-minus {
+ --fa: "\e55e"; }
+
+.fa-sign-hanging {
+ --fa: "\f4d9"; }
+
+.fa-sign {
+ --fa: "\f4d9"; }
+
+.fa-bezier-curve {
+ --fa: "\f55b"; }
+
+.fa-bell-slash {
+ --fa: "\f1f6"; }
+
+.fa-tablet {
+ --fa: "\f3fb"; }
+
+.fa-tablet-android {
+ --fa: "\f3fb"; }
+
+.fa-school-flag {
+ --fa: "\e56e"; }
+
+.fa-fill {
+ --fa: "\f575"; }
+
+.fa-angle-up {
+ --fa: "\f106"; }
+
+.fa-drumstick-bite {
+ --fa: "\f6d7"; }
+
+.fa-holly-berry {
+ --fa: "\f7aa"; }
+
+.fa-chevron-left {
+ --fa: "\f053"; }
+
+.fa-bacteria {
+ --fa: "\e059"; }
+
+.fa-hand-lizard {
+ --fa: "\f258"; }
+
+.fa-notdef {
+ --fa: "\e1fe"; }
+
+.fa-disease {
+ --fa: "\f7fa"; }
+
+.fa-briefcase-medical {
+ --fa: "\f469"; }
+
+.fa-genderless {
+ --fa: "\f22d"; }
+
+.fa-chevron-right {
+ --fa: "\f054"; }
+
+.fa-retweet {
+ --fa: "\f079"; }
+
+.fa-car-rear {
+ --fa: "\f5de"; }
+
+.fa-car-alt {
+ --fa: "\f5de"; }
+
+.fa-pump-soap {
+ --fa: "\e06b"; }
+
+.fa-video-slash {
+ --fa: "\f4e2"; }
+
+.fa-battery-quarter {
+ --fa: "\f243"; }
+
+.fa-battery-2 {
+ --fa: "\f243"; }
+
+.fa-radio {
+ --fa: "\f8d7"; }
+
+.fa-baby-carriage {
+ --fa: "\f77d"; }
+
+.fa-carriage-baby {
+ --fa: "\f77d"; }
+
+.fa-traffic-light {
+ --fa: "\f637"; }
+
+.fa-thermometer {
+ --fa: "\f491"; }
+
+.fa-vr-cardboard {
+ --fa: "\f729"; }
+
+.fa-hand-middle-finger {
+ --fa: "\f806"; }
+
+.fa-percent {
+ --fa: "\25"; }
+
+.fa-percentage {
+ --fa: "\25"; }
+
+.fa-truck-moving {
+ --fa: "\f4df"; }
+
+.fa-glass-water-droplet {
+ --fa: "\e4f5"; }
+
+.fa-display {
+ --fa: "\e163"; }
+
+.fa-face-smile {
+ --fa: "\f118"; }
+
+.fa-smile {
+ --fa: "\f118"; }
+
+.fa-thumbtack {
+ --fa: "\f08d"; }
+
+.fa-thumb-tack {
+ --fa: "\f08d"; }
+
+.fa-trophy {
+ --fa: "\f091"; }
+
+.fa-person-praying {
+ --fa: "\f683"; }
+
+.fa-pray {
+ --fa: "\f683"; }
+
+.fa-hammer {
+ --fa: "\f6e3"; }
+
+.fa-hand-peace {
+ --fa: "\f25b"; }
+
+.fa-rotate {
+ --fa: "\f2f1"; }
+
+.fa-sync-alt {
+ --fa: "\f2f1"; }
+
+.fa-spinner {
+ --fa: "\f110"; }
+
+.fa-robot {
+ --fa: "\f544"; }
+
+.fa-peace {
+ --fa: "\f67c"; }
+
+.fa-gears {
+ --fa: "\f085"; }
+
+.fa-cogs {
+ --fa: "\f085"; }
+
+.fa-warehouse {
+ --fa: "\f494"; }
+
+.fa-arrow-up-right-dots {
+ --fa: "\e4b7"; }
+
+.fa-splotch {
+ --fa: "\f5bc"; }
+
+.fa-face-grin-hearts {
+ --fa: "\f584"; }
+
+.fa-grin-hearts {
+ --fa: "\f584"; }
+
+.fa-dice-four {
+ --fa: "\f524"; }
+
+.fa-sim-card {
+ --fa: "\f7c4"; }
+
+.fa-transgender {
+ --fa: "\f225"; }
+
+.fa-transgender-alt {
+ --fa: "\f225"; }
+
+.fa-mercury {
+ --fa: "\f223"; }
+
+.fa-arrow-turn-down {
+ --fa: "\f149"; }
+
+.fa-level-down {
+ --fa: "\f149"; }
+
+.fa-person-falling-burst {
+ --fa: "\e547"; }
+
+.fa-award {
+ --fa: "\f559"; }
+
+.fa-ticket-simple {
+ --fa: "\f3ff"; }
+
+.fa-ticket-alt {
+ --fa: "\f3ff"; }
+
+.fa-building {
+ --fa: "\f1ad"; }
+
+.fa-angles-left {
+ --fa: "\f100"; }
+
+.fa-angle-double-left {
+ --fa: "\f100"; }
+
+.fa-qrcode {
+ --fa: "\f029"; }
+
+.fa-clock-rotate-left {
+ --fa: "\f1da"; }
+
+.fa-history {
+ --fa: "\f1da"; }
+
+.fa-face-grin-beam-sweat {
+ --fa: "\f583"; }
+
+.fa-grin-beam-sweat {
+ --fa: "\f583"; }
+
+.fa-file-export {
+ --fa: "\f56e"; }
+
+.fa-arrow-right-from-file {
+ --fa: "\f56e"; }
+
+.fa-shield {
+ --fa: "\f132"; }
+
+.fa-shield-blank {
+ --fa: "\f132"; }
+
+.fa-arrow-up-short-wide {
+ --fa: "\f885"; }
+
+.fa-sort-amount-up-alt {
+ --fa: "\f885"; }
+
+.fa-comment-nodes {
+ --fa: "\e696"; }
+
+.fa-house-medical {
+ --fa: "\e3b2"; }
+
+.fa-golf-ball-tee {
+ --fa: "\f450"; }
+
+.fa-golf-ball {
+ --fa: "\f450"; }
+
+.fa-circle-chevron-left {
+ --fa: "\f137"; }
+
+.fa-chevron-circle-left {
+ --fa: "\f137"; }
+
+.fa-house-chimney-window {
+ --fa: "\e00d"; }
+
+.fa-pen-nib {
+ --fa: "\f5ad"; }
+
+.fa-tent-arrow-turn-left {
+ --fa: "\e580"; }
+
+.fa-tents {
+ --fa: "\e582"; }
+
+.fa-wand-magic {
+ --fa: "\f0d0"; }
+
+.fa-magic {
+ --fa: "\f0d0"; }
+
+.fa-dog {
+ --fa: "\f6d3"; }
+
+.fa-carrot {
+ --fa: "\f787"; }
+
+.fa-moon {
+ --fa: "\f186"; }
+
+.fa-wine-glass-empty {
+ --fa: "\f5ce"; }
+
+.fa-wine-glass-alt {
+ --fa: "\f5ce"; }
+
+.fa-cheese {
+ --fa: "\f7ef"; }
+
+.fa-yin-yang {
+ --fa: "\f6ad"; }
+
+.fa-music {
+ --fa: "\f001"; }
+
+.fa-code-commit {
+ --fa: "\f386"; }
+
+.fa-temperature-low {
+ --fa: "\f76b"; }
+
+.fa-person-biking {
+ --fa: "\f84a"; }
+
+.fa-biking {
+ --fa: "\f84a"; }
+
+.fa-broom {
+ --fa: "\f51a"; }
+
+.fa-shield-heart {
+ --fa: "\e574"; }
+
+.fa-gopuram {
+ --fa: "\f664"; }
+
+.fa-earth-oceania {
+ --fa: "\e47b"; }
+
+.fa-globe-oceania {
+ --fa: "\e47b"; }
+
+.fa-square-xmark {
+ --fa: "\f2d3"; }
+
+.fa-times-square {
+ --fa: "\f2d3"; }
+
+.fa-xmark-square {
+ --fa: "\f2d3"; }
+
+.fa-hashtag {
+ --fa: "\23"; }
+
+.fa-up-right-and-down-left-from-center {
+ --fa: "\f424"; }
+
+.fa-expand-alt {
+ --fa: "\f424"; }
+
+.fa-oil-can {
+ --fa: "\f613"; }
+
+.fa-t {
+ --fa: "\54"; }
+
+.fa-hippo {
+ --fa: "\f6ed"; }
+
+.fa-chart-column {
+ --fa: "\e0e3"; }
+
+.fa-infinity {
+ --fa: "\f534"; }
+
+.fa-vial-circle-check {
+ --fa: "\e596"; }
+
+.fa-person-arrow-down-to-line {
+ --fa: "\e538"; }
+
+.fa-voicemail {
+ --fa: "\f897"; }
+
+.fa-fan {
+ --fa: "\f863"; }
+
+.fa-person-walking-luggage {
+ --fa: "\e554"; }
+
+.fa-up-down {
+ --fa: "\f338"; }
+
+.fa-arrows-alt-v {
+ --fa: "\f338"; }
+
+.fa-cloud-moon-rain {
+ --fa: "\f73c"; }
+
+.fa-calendar {
+ --fa: "\f133"; }
+
+.fa-trailer {
+ --fa: "\e041"; }
+
+.fa-bahai {
+ --fa: "\f666"; }
+
+.fa-haykal {
+ --fa: "\f666"; }
+
+.fa-sd-card {
+ --fa: "\f7c2"; }
+
+.fa-dragon {
+ --fa: "\f6d5"; }
+
+.fa-shoe-prints {
+ --fa: "\f54b"; }
+
+.fa-circle-plus {
+ --fa: "\f055"; }
+
+.fa-plus-circle {
+ --fa: "\f055"; }
+
+.fa-face-grin-tongue-wink {
+ --fa: "\f58b"; }
+
+.fa-grin-tongue-wink {
+ --fa: "\f58b"; }
+
+.fa-hand-holding {
+ --fa: "\f4bd"; }
+
+.fa-plug-circle-exclamation {
+ --fa: "\e55d"; }
+
+.fa-link-slash {
+ --fa: "\f127"; }
+
+.fa-chain-broken {
+ --fa: "\f127"; }
+
+.fa-chain-slash {
+ --fa: "\f127"; }
+
+.fa-unlink {
+ --fa: "\f127"; }
+
+.fa-clone {
+ --fa: "\f24d"; }
+
+.fa-person-walking-arrow-loop-left {
+ --fa: "\e551"; }
+
+.fa-arrow-up-z-a {
+ --fa: "\f882"; }
+
+.fa-sort-alpha-up-alt {
+ --fa: "\f882"; }
+
+.fa-fire-flame-curved {
+ --fa: "\f7e4"; }
+
+.fa-fire-alt {
+ --fa: "\f7e4"; }
+
+.fa-tornado {
+ --fa: "\f76f"; }
+
+.fa-file-circle-plus {
+ --fa: "\e494"; }
+
+.fa-book-quran {
+ --fa: "\f687"; }
+
+.fa-quran {
+ --fa: "\f687"; }
+
+.fa-anchor {
+ --fa: "\f13d"; }
+
+.fa-border-all {
+ --fa: "\f84c"; }
+
+.fa-face-angry {
+ --fa: "\f556"; }
+
+.fa-angry {
+ --fa: "\f556"; }
+
+.fa-cookie-bite {
+ --fa: "\f564"; }
+
+.fa-arrow-trend-down {
+ --fa: "\e097"; }
+
+.fa-rss {
+ --fa: "\f09e"; }
+
+.fa-feed {
+ --fa: "\f09e"; }
+
+.fa-draw-polygon {
+ --fa: "\f5ee"; }
+
+.fa-scale-balanced {
+ --fa: "\f24e"; }
+
+.fa-balance-scale {
+ --fa: "\f24e"; }
+
+.fa-gauge-simple-high {
+ --fa: "\f62a"; }
+
+.fa-tachometer {
+ --fa: "\f62a"; }
+
+.fa-tachometer-fast {
+ --fa: "\f62a"; }
+
+.fa-shower {
+ --fa: "\f2cc"; }
+
+.fa-desktop {
+ --fa: "\f390"; }
+
+.fa-desktop-alt {
+ --fa: "\f390"; }
+
+.fa-m {
+ --fa: "\4d"; }
+
+.fa-table-list {
+ --fa: "\f00b"; }
+
+.fa-th-list {
+ --fa: "\f00b"; }
+
+.fa-comment-sms {
+ --fa: "\f7cd"; }
+
+.fa-sms {
+ --fa: "\f7cd"; }
+
+.fa-book {
+ --fa: "\f02d"; }
+
+.fa-user-plus {
+ --fa: "\f234"; }
+
+.fa-check {
+ --fa: "\f00c"; }
+
+.fa-battery-three-quarters {
+ --fa: "\f241"; }
+
+.fa-battery-4 {
+ --fa: "\f241"; }
+
+.fa-house-circle-check {
+ --fa: "\e509"; }
+
+.fa-angle-left {
+ --fa: "\f104"; }
+
+.fa-diagram-successor {
+ --fa: "\e47a"; }
+
+.fa-truck-arrow-right {
+ --fa: "\e58b"; }
+
+.fa-arrows-split-up-and-left {
+ --fa: "\e4bc"; }
+
+.fa-hand-fist {
+ --fa: "\f6de"; }
+
+.fa-fist-raised {
+ --fa: "\f6de"; }
+
+.fa-cloud-moon {
+ --fa: "\f6c3"; }
+
+.fa-briefcase {
+ --fa: "\f0b1"; }
+
+.fa-person-falling {
+ --fa: "\e546"; }
+
+.fa-image-portrait {
+ --fa: "\f3e0"; }
+
+.fa-portrait {
+ --fa: "\f3e0"; }
+
+.fa-user-tag {
+ --fa: "\f507"; }
+
+.fa-rug {
+ --fa: "\e569"; }
+
+.fa-earth-europe {
+ --fa: "\f7a2"; }
+
+.fa-globe-europe {
+ --fa: "\f7a2"; }
+
+.fa-cart-flatbed-suitcase {
+ --fa: "\f59d"; }
+
+.fa-luggage-cart {
+ --fa: "\f59d"; }
+
+.fa-rectangle-xmark {
+ --fa: "\f410"; }
+
+.fa-rectangle-times {
+ --fa: "\f410"; }
+
+.fa-times-rectangle {
+ --fa: "\f410"; }
+
+.fa-window-close {
+ --fa: "\f410"; }
+
+.fa-baht-sign {
+ --fa: "\e0ac"; }
+
+.fa-book-open {
+ --fa: "\f518"; }
+
+.fa-book-journal-whills {
+ --fa: "\f66a"; }
+
+.fa-journal-whills {
+ --fa: "\f66a"; }
+
+.fa-handcuffs {
+ --fa: "\e4f8"; }
+
+.fa-triangle-exclamation {
+ --fa: "\f071"; }
+
+.fa-exclamation-triangle {
+ --fa: "\f071"; }
+
+.fa-warning {
+ --fa: "\f071"; }
+
+.fa-database {
+ --fa: "\f1c0"; }
+
+.fa-share {
+ --fa: "\f064"; }
+
+.fa-mail-forward {
+ --fa: "\f064"; }
+
+.fa-bottle-droplet {
+ --fa: "\e4c4"; }
+
+.fa-mask-face {
+ --fa: "\e1d7"; }
+
+.fa-hill-rockslide {
+ --fa: "\e508"; }
+
+.fa-right-left {
+ --fa: "\f362"; }
+
+.fa-exchange-alt {
+ --fa: "\f362"; }
+
+.fa-paper-plane {
+ --fa: "\f1d8"; }
+
+.fa-road-circle-exclamation {
+ --fa: "\e565"; }
+
+.fa-dungeon {
+ --fa: "\f6d9"; }
+
+.fa-align-right {
+ --fa: "\f038"; }
+
+.fa-money-bill-1-wave {
+ --fa: "\f53b"; }
+
+.fa-money-bill-wave-alt {
+ --fa: "\f53b"; }
+
+.fa-life-ring {
+ --fa: "\f1cd"; }
+
+.fa-hands {
+ --fa: "\f2a7"; }
+
+.fa-sign-language {
+ --fa: "\f2a7"; }
+
+.fa-signing {
+ --fa: "\f2a7"; }
+
+.fa-calendar-day {
+ --fa: "\f783"; }
+
+.fa-water-ladder {
+ --fa: "\f5c5"; }
+
+.fa-ladder-water {
+ --fa: "\f5c5"; }
+
+.fa-swimming-pool {
+ --fa: "\f5c5"; }
+
+.fa-arrows-up-down {
+ --fa: "\f07d"; }
+
+.fa-arrows-v {
+ --fa: "\f07d"; }
+
+.fa-face-grimace {
+ --fa: "\f57f"; }
+
+.fa-grimace {
+ --fa: "\f57f"; }
+
+.fa-wheelchair-move {
+ --fa: "\e2ce"; }
+
+.fa-wheelchair-alt {
+ --fa: "\e2ce"; }
+
+.fa-turn-down {
+ --fa: "\f3be"; }
+
+.fa-level-down-alt {
+ --fa: "\f3be"; }
+
+.fa-person-walking-arrow-right {
+ --fa: "\e552"; }
+
+.fa-square-envelope {
+ --fa: "\f199"; }
+
+.fa-envelope-square {
+ --fa: "\f199"; }
+
+.fa-dice {
+ --fa: "\f522"; }
+
+.fa-bowling-ball {
+ --fa: "\f436"; }
+
+.fa-brain {
+ --fa: "\f5dc"; }
+
+.fa-bandage {
+ --fa: "\f462"; }
+
+.fa-band-aid {
+ --fa: "\f462"; }
+
+.fa-calendar-minus {
+ --fa: "\f272"; }
+
+.fa-circle-xmark {
+ --fa: "\f057"; }
+
+.fa-times-circle {
+ --fa: "\f057"; }
+
+.fa-xmark-circle {
+ --fa: "\f057"; }
+
+.fa-gifts {
+ --fa: "\f79c"; }
+
+.fa-hotel {
+ --fa: "\f594"; }
+
+.fa-earth-asia {
+ --fa: "\f57e"; }
+
+.fa-globe-asia {
+ --fa: "\f57e"; }
+
+.fa-id-card-clip {
+ --fa: "\f47f"; }
+
+.fa-id-card-alt {
+ --fa: "\f47f"; }
+
+.fa-magnifying-glass-plus {
+ --fa: "\f00e"; }
+
+.fa-search-plus {
+ --fa: "\f00e"; }
+
+.fa-thumbs-up {
+ --fa: "\f164"; }
+
+.fa-user-clock {
+ --fa: "\f4fd"; }
+
+.fa-hand-dots {
+ --fa: "\f461"; }
+
+.fa-allergies {
+ --fa: "\f461"; }
+
+.fa-file-invoice {
+ --fa: "\f570"; }
+
+.fa-window-minimize {
+ --fa: "\f2d1"; }
+
+.fa-mug-saucer {
+ --fa: "\f0f4"; }
+
+.fa-coffee {
+ --fa: "\f0f4"; }
+
+.fa-brush {
+ --fa: "\f55d"; }
+
+.fa-file-half-dashed {
+ --fa: "\e698"; }
+
+.fa-mask {
+ --fa: "\f6fa"; }
+
+.fa-magnifying-glass-minus {
+ --fa: "\f010"; }
+
+.fa-search-minus {
+ --fa: "\f010"; }
+
+.fa-ruler-vertical {
+ --fa: "\f548"; }
+
+.fa-user-large {
+ --fa: "\f406"; }
+
+.fa-user-alt {
+ --fa: "\f406"; }
+
+.fa-train-tram {
+ --fa: "\e5b4"; }
+
+.fa-user-nurse {
+ --fa: "\f82f"; }
+
+.fa-syringe {
+ --fa: "\f48e"; }
+
+.fa-cloud-sun {
+ --fa: "\f6c4"; }
+
+.fa-stopwatch-20 {
+ --fa: "\e06f"; }
+
+.fa-square-full {
+ --fa: "\f45c"; }
+
+.fa-magnet {
+ --fa: "\f076"; }
+
+.fa-jar {
+ --fa: "\e516"; }
+
+.fa-note-sticky {
+ --fa: "\f249"; }
+
+.fa-sticky-note {
+ --fa: "\f249"; }
+
+.fa-bug-slash {
+ --fa: "\e490"; }
+
+.fa-arrow-up-from-water-pump {
+ --fa: "\e4b6"; }
+
+.fa-bone {
+ --fa: "\f5d7"; }
+
+.fa-table-cells-row-unlock {
+ --fa: "\e691"; }
+
+.fa-user-injured {
+ --fa: "\f728"; }
+
+.fa-face-sad-tear {
+ --fa: "\f5b4"; }
+
+.fa-sad-tear {
+ --fa: "\f5b4"; }
+
+.fa-plane {
+ --fa: "\f072"; }
+
+.fa-tent-arrows-down {
+ --fa: "\e581"; }
+
+.fa-exclamation {
+ --fa: "\21"; }
+
+.fa-arrows-spin {
+ --fa: "\e4bb"; }
+
+.fa-print {
+ --fa: "\f02f"; }
+
+.fa-turkish-lira-sign {
+ --fa: "\e2bb"; }
+
+.fa-try {
+ --fa: "\e2bb"; }
+
+.fa-turkish-lira {
+ --fa: "\e2bb"; }
+
+.fa-dollar-sign {
+ --fa: "\24"; }
+
+.fa-dollar {
+ --fa: "\24"; }
+
+.fa-usd {
+ --fa: "\24"; }
+
+.fa-x {
+ --fa: "\58"; }
+
+.fa-magnifying-glass-dollar {
+ --fa: "\f688"; }
+
+.fa-search-dollar {
+ --fa: "\f688"; }
+
+.fa-users-gear {
+ --fa: "\f509"; }
+
+.fa-users-cog {
+ --fa: "\f509"; }
+
+.fa-person-military-pointing {
+ --fa: "\e54a"; }
+
+.fa-building-columns {
+ --fa: "\f19c"; }
+
+.fa-bank {
+ --fa: "\f19c"; }
+
+.fa-institution {
+ --fa: "\f19c"; }
+
+.fa-museum {
+ --fa: "\f19c"; }
+
+.fa-university {
+ --fa: "\f19c"; }
+
+.fa-umbrella {
+ --fa: "\f0e9"; }
+
+.fa-trowel {
+ --fa: "\e589"; }
+
+.fa-d {
+ --fa: "\44"; }
+
+.fa-stapler {
+ --fa: "\e5af"; }
+
+.fa-masks-theater {
+ --fa: "\f630"; }
+
+.fa-theater-masks {
+ --fa: "\f630"; }
+
+.fa-kip-sign {
+ --fa: "\e1c4"; }
+
+.fa-hand-point-left {
+ --fa: "\f0a5"; }
+
+.fa-handshake-simple {
+ --fa: "\f4c6"; }
+
+.fa-handshake-alt {
+ --fa: "\f4c6"; }
+
+.fa-jet-fighter {
+ --fa: "\f0fb"; }
+
+.fa-fighter-jet {
+ --fa: "\f0fb"; }
+
+.fa-square-share-nodes {
+ --fa: "\f1e1"; }
+
+.fa-share-alt-square {
+ --fa: "\f1e1"; }
+
+.fa-barcode {
+ --fa: "\f02a"; }
+
+.fa-plus-minus {
+ --fa: "\e43c"; }
+
+.fa-video {
+ --fa: "\f03d"; }
+
+.fa-video-camera {
+ --fa: "\f03d"; }
+
+.fa-graduation-cap {
+ --fa: "\f19d"; }
+
+.fa-mortar-board {
+ --fa: "\f19d"; }
+
+.fa-hand-holding-medical {
+ --fa: "\e05c"; }
+
+.fa-person-circle-check {
+ --fa: "\e53e"; }
+
+.fa-turn-up {
+ --fa: "\f3bf"; }
+
+.fa-level-up-alt {
+ --fa: "\f3bf"; }
+
+.sr-only,
+.fa-sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0; }
+
+.sr-only-focusable:not(:focus),
+.fa-sr-only-focusable:not(:focus) {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0; }
diff --git a/libai/fontawesome/fontawesome.min.css b/libai/fontawesome/fontawesome.min.css
new file mode 100644
index 0000000..4e07e30
--- /dev/null
+++ b/libai/fontawesome/fontawesome.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-regular,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-brands:before,.fa-regular:before,.fa-solid:before,.fa:before,.fab:before,.far:before,.fas:before{content:var(--fa)}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}
+
+.fa-0{--fa:"\30"}.fa-1{--fa:"\31"}.fa-2{--fa:"\32"}.fa-3{--fa:"\33"}.fa-4{--fa:"\34"}.fa-5{--fa:"\35"}.fa-6{--fa:"\36"}.fa-7{--fa:"\37"}.fa-8{--fa:"\38"}.fa-9{--fa:"\39"}.fa-fill-drip{--fa:"\f576"}.fa-arrows-to-circle{--fa:"\e4bd"}.fa-chevron-circle-right,.fa-circle-chevron-right{--fa:"\f138"}.fa-at{--fa:"\40"}.fa-trash-alt,.fa-trash-can{--fa:"\f2ed"}.fa-text-height{--fa:"\f034"}.fa-user-times,.fa-user-xmark{--fa:"\f235"}.fa-stethoscope{--fa:"\f0f1"}.fa-comment-alt,.fa-message{--fa:"\f27a"}.fa-info{--fa:"\f129"}.fa-compress-alt,.fa-down-left-and-up-right-to-center{--fa:"\f422"}.fa-explosion{--fa:"\e4e9"}.fa-file-alt,.fa-file-lines,.fa-file-text{--fa:"\f15c"}.fa-wave-square{--fa:"\f83e"}.fa-ring{--fa:"\f70b"}.fa-building-un{--fa:"\e4d9"}.fa-dice-three{--fa:"\f527"}.fa-calendar-alt,.fa-calendar-days{--fa:"\f073"}.fa-anchor-circle-check{--fa:"\e4aa"}.fa-building-circle-arrow-right{--fa:"\e4d1"}.fa-volleyball,.fa-volleyball-ball{--fa:"\f45f"}.fa-arrows-up-to-line{--fa:"\e4c2"}.fa-sort-desc,.fa-sort-down{--fa:"\f0dd"}.fa-circle-minus,.fa-minus-circle{--fa:"\f056"}.fa-door-open{--fa:"\f52b"}.fa-right-from-bracket,.fa-sign-out-alt{--fa:"\f2f5"}.fa-atom{--fa:"\f5d2"}.fa-soap{--fa:"\e06e"}.fa-heart-music-camera-bolt,.fa-icons{--fa:"\f86d"}.fa-microphone-alt-slash,.fa-microphone-lines-slash{--fa:"\f539"}.fa-bridge-circle-check{--fa:"\e4c9"}.fa-pump-medical{--fa:"\e06a"}.fa-fingerprint{--fa:"\f577"}.fa-hand-point-right{--fa:"\f0a4"}.fa-magnifying-glass-location,.fa-search-location{--fa:"\f689"}.fa-forward-step,.fa-step-forward{--fa:"\f051"}.fa-face-smile-beam,.fa-smile-beam{--fa:"\f5b8"}.fa-flag-checkered{--fa:"\f11e"}.fa-football,.fa-football-ball{--fa:"\f44e"}.fa-school-circle-exclamation{--fa:"\e56c"}.fa-crop{--fa:"\f125"}.fa-angle-double-down,.fa-angles-down{--fa:"\f103"}.fa-users-rectangle{--fa:"\e594"}.fa-people-roof{--fa:"\e537"}.fa-people-line{--fa:"\e534"}.fa-beer,.fa-beer-mug-empty{--fa:"\f0fc"}.fa-diagram-predecessor{--fa:"\e477"}.fa-arrow-up-long,.fa-long-arrow-up{--fa:"\f176"}.fa-burn,.fa-fire-flame-simple{--fa:"\f46a"}.fa-male,.fa-person{--fa:"\f183"}.fa-laptop{--fa:"\f109"}.fa-file-csv{--fa:"\f6dd"}.fa-menorah{--fa:"\f676"}.fa-truck-plane{--fa:"\e58f"}.fa-record-vinyl{--fa:"\f8d9"}.fa-face-grin-stars,.fa-grin-stars{--fa:"\f587"}.fa-bong{--fa:"\f55c"}.fa-pastafarianism,.fa-spaghetti-monster-flying{--fa:"\f67b"}.fa-arrow-down-up-across-line{--fa:"\e4af"}.fa-spoon,.fa-utensil-spoon{--fa:"\f2e5"}.fa-jar-wheat{--fa:"\e517"}.fa-envelopes-bulk,.fa-mail-bulk{--fa:"\f674"}.fa-file-circle-exclamation{--fa:"\e4eb"}.fa-circle-h,.fa-hospital-symbol{--fa:"\f47e"}.fa-pager{--fa:"\f815"}.fa-address-book,.fa-contact-book{--fa:"\f2b9"}.fa-strikethrough{--fa:"\f0cc"}.fa-k{--fa:"\4b"}.fa-landmark-flag{--fa:"\e51c"}.fa-pencil,.fa-pencil-alt{--fa:"\f303"}.fa-backward{--fa:"\f04a"}.fa-caret-right{--fa:"\f0da"}.fa-comments{--fa:"\f086"}.fa-file-clipboard,.fa-paste{--fa:"\f0ea"}.fa-code-pull-request{--fa:"\e13c"}.fa-clipboard-list{--fa:"\f46d"}.fa-truck-loading,.fa-truck-ramp-box{--fa:"\f4de"}.fa-user-check{--fa:"\f4fc"}.fa-vial-virus{--fa:"\e597"}.fa-sheet-plastic{--fa:"\e571"}.fa-blog{--fa:"\f781"}.fa-user-ninja{--fa:"\f504"}.fa-person-arrow-up-from-line{--fa:"\e539"}.fa-scroll-torah,.fa-torah{--fa:"\f6a0"}.fa-broom-ball,.fa-quidditch,.fa-quidditch-broom-ball{--fa:"\f458"}.fa-toggle-off{--fa:"\f204"}.fa-archive,.fa-box-archive{--fa:"\f187"}.fa-person-drowning{--fa:"\e545"}.fa-arrow-down-9-1,.fa-sort-numeric-desc,.fa-sort-numeric-down-alt{--fa:"\f886"}.fa-face-grin-tongue-squint,.fa-grin-tongue-squint{--fa:"\f58a"}.fa-spray-can{--fa:"\f5bd"}.fa-truck-monster{--fa:"\f63b"}.fa-w{--fa:"\57"}.fa-earth-africa,.fa-globe-africa{--fa:"\f57c"}.fa-rainbow{--fa:"\f75b"}.fa-circle-notch{--fa:"\f1ce"}.fa-tablet-alt,.fa-tablet-screen-button{--fa:"\f3fa"}.fa-paw{--fa:"\f1b0"}.fa-cloud{--fa:"\f0c2"}.fa-trowel-bricks{--fa:"\e58a"}.fa-face-flushed,.fa-flushed{--fa:"\f579"}.fa-hospital-user{--fa:"\f80d"}.fa-tent-arrow-left-right{--fa:"\e57f"}.fa-gavel,.fa-legal{--fa:"\f0e3"}.fa-binoculars{--fa:"\f1e5"}.fa-microphone-slash{--fa:"\f131"}.fa-box-tissue{--fa:"\e05b"}.fa-motorcycle{--fa:"\f21c"}.fa-bell-concierge,.fa-concierge-bell{--fa:"\f562"}.fa-pen-ruler,.fa-pencil-ruler{--fa:"\f5ae"}.fa-people-arrows,.fa-people-arrows-left-right{--fa:"\e068"}.fa-mars-and-venus-burst{--fa:"\e523"}.fa-caret-square-right,.fa-square-caret-right{--fa:"\f152"}.fa-cut,.fa-scissors{--fa:"\f0c4"}.fa-sun-plant-wilt{--fa:"\e57a"}.fa-toilets-portable{--fa:"\e584"}.fa-hockey-puck{--fa:"\f453"}.fa-table{--fa:"\f0ce"}.fa-magnifying-glass-arrow-right{--fa:"\e521"}.fa-digital-tachograph,.fa-tachograph-digital{--fa:"\f566"}.fa-users-slash{--fa:"\e073"}.fa-clover{--fa:"\e139"}.fa-mail-reply,.fa-reply{--fa:"\f3e5"}.fa-star-and-crescent{--fa:"\f699"}.fa-house-fire{--fa:"\e50c"}.fa-minus-square,.fa-square-minus{--fa:"\f146"}.fa-helicopter{--fa:"\f533"}.fa-compass{--fa:"\f14e"}.fa-caret-square-down,.fa-square-caret-down{--fa:"\f150"}.fa-file-circle-question{--fa:"\e4ef"}.fa-laptop-code{--fa:"\f5fc"}.fa-swatchbook{--fa:"\f5c3"}.fa-prescription-bottle{--fa:"\f485"}.fa-bars,.fa-navicon{--fa:"\f0c9"}.fa-people-group{--fa:"\e533"}.fa-hourglass-3,.fa-hourglass-end{--fa:"\f253"}.fa-heart-broken,.fa-heart-crack{--fa:"\f7a9"}.fa-external-link-square-alt,.fa-square-up-right{--fa:"\f360"}.fa-face-kiss-beam,.fa-kiss-beam{--fa:"\f597"}.fa-film{--fa:"\f008"}.fa-ruler-horizontal{--fa:"\f547"}.fa-people-robbery{--fa:"\e536"}.fa-lightbulb{--fa:"\f0eb"}.fa-caret-left{--fa:"\f0d9"}.fa-circle-exclamation,.fa-exclamation-circle{--fa:"\f06a"}.fa-school-circle-xmark{--fa:"\e56d"}.fa-arrow-right-from-bracket,.fa-sign-out{--fa:"\f08b"}.fa-chevron-circle-down,.fa-circle-chevron-down{--fa:"\f13a"}.fa-unlock-alt,.fa-unlock-keyhole{--fa:"\f13e"}.fa-cloud-showers-heavy{--fa:"\f740"}.fa-headphones-alt,.fa-headphones-simple{--fa:"\f58f"}.fa-sitemap{--fa:"\f0e8"}.fa-circle-dollar-to-slot,.fa-donate{--fa:"\f4b9"}.fa-memory{--fa:"\f538"}.fa-road-spikes{--fa:"\e568"}.fa-fire-burner{--fa:"\e4f1"}.fa-flag{--fa:"\f024"}.fa-hanukiah{--fa:"\f6e6"}.fa-feather{--fa:"\f52d"}.fa-volume-down,.fa-volume-low{--fa:"\f027"}.fa-comment-slash{--fa:"\f4b3"}.fa-cloud-sun-rain{--fa:"\f743"}.fa-compress{--fa:"\f066"}.fa-wheat-alt,.fa-wheat-awn{--fa:"\e2cd"}.fa-ankh{--fa:"\f644"}.fa-hands-holding-child{--fa:"\e4fa"}.fa-asterisk{--fa:"\2a"}.fa-check-square,.fa-square-check{--fa:"\f14a"}.fa-peseta-sign{--fa:"\e221"}.fa-header,.fa-heading{--fa:"\f1dc"}.fa-ghost{--fa:"\f6e2"}.fa-list,.fa-list-squares{--fa:"\f03a"}.fa-phone-square-alt,.fa-square-phone-flip{--fa:"\f87b"}.fa-cart-plus{--fa:"\f217"}.fa-gamepad{--fa:"\f11b"}.fa-circle-dot,.fa-dot-circle{--fa:"\f192"}.fa-dizzy,.fa-face-dizzy{--fa:"\f567"}.fa-egg{--fa:"\f7fb"}.fa-house-medical-circle-xmark{--fa:"\e513"}.fa-campground{--fa:"\f6bb"}.fa-folder-plus{--fa:"\f65e"}.fa-futbol,.fa-futbol-ball,.fa-soccer-ball{--fa:"\f1e3"}.fa-paint-brush,.fa-paintbrush{--fa:"\f1fc"}.fa-lock{--fa:"\f023"}.fa-gas-pump{--fa:"\f52f"}.fa-hot-tub,.fa-hot-tub-person{--fa:"\f593"}.fa-map-location,.fa-map-marked{--fa:"\f59f"}.fa-house-flood-water{--fa:"\e50e"}.fa-tree{--fa:"\f1bb"}.fa-bridge-lock{--fa:"\e4cc"}.fa-sack-dollar{--fa:"\f81d"}.fa-edit,.fa-pen-to-square{--fa:"\f044"}.fa-car-side{--fa:"\f5e4"}.fa-share-alt,.fa-share-nodes{--fa:"\f1e0"}.fa-heart-circle-minus{--fa:"\e4ff"}.fa-hourglass-2,.fa-hourglass-half{--fa:"\f252"}.fa-microscope{--fa:"\f610"}.fa-sink{--fa:"\e06d"}.fa-bag-shopping,.fa-shopping-bag{--fa:"\f290"}.fa-arrow-down-z-a,.fa-sort-alpha-desc,.fa-sort-alpha-down-alt{--fa:"\f881"}.fa-mitten{--fa:"\f7b5"}.fa-person-rays{--fa:"\e54d"}.fa-users{--fa:"\f0c0"}.fa-eye-slash{--fa:"\f070"}.fa-flask-vial{--fa:"\e4f3"}.fa-hand,.fa-hand-paper{--fa:"\f256"}.fa-om{--fa:"\f679"}.fa-worm{--fa:"\e599"}.fa-house-circle-xmark{--fa:"\e50b"}.fa-plug{--fa:"\f1e6"}.fa-chevron-up{--fa:"\f077"}.fa-hand-spock{--fa:"\f259"}.fa-stopwatch{--fa:"\f2f2"}.fa-face-kiss,.fa-kiss{--fa:"\f596"}.fa-bridge-circle-xmark{--fa:"\e4cb"}.fa-face-grin-tongue,.fa-grin-tongue{--fa:"\f589"}.fa-chess-bishop{--fa:"\f43a"}.fa-face-grin-wink,.fa-grin-wink{--fa:"\f58c"}.fa-deaf,.fa-deafness,.fa-ear-deaf,.fa-hard-of-hearing{--fa:"\f2a4"}.fa-road-circle-check{--fa:"\e564"}.fa-dice-five{--fa:"\f523"}.fa-rss-square,.fa-square-rss{--fa:"\f143"}.fa-land-mine-on{--fa:"\e51b"}.fa-i-cursor{--fa:"\f246"}.fa-stamp{--fa:"\f5bf"}.fa-stairs{--fa:"\e289"}.fa-i{--fa:"\49"}.fa-hryvnia,.fa-hryvnia-sign{--fa:"\f6f2"}.fa-pills{--fa:"\f484"}.fa-face-grin-wide,.fa-grin-alt{--fa:"\f581"}.fa-tooth{--fa:"\f5c9"}.fa-v{--fa:"\56"}.fa-bangladeshi-taka-sign{--fa:"\e2e6"}.fa-bicycle{--fa:"\f206"}.fa-rod-asclepius,.fa-rod-snake,.fa-staff-aesculapius,.fa-staff-snake{--fa:"\e579"}.fa-head-side-cough-slash{--fa:"\e062"}.fa-ambulance,.fa-truck-medical{--fa:"\f0f9"}.fa-wheat-awn-circle-exclamation{--fa:"\e598"}.fa-snowman{--fa:"\f7d0"}.fa-mortar-pestle{--fa:"\f5a7"}.fa-road-barrier{--fa:"\e562"}.fa-school{--fa:"\f549"}.fa-igloo{--fa:"\f7ae"}.fa-joint{--fa:"\f595"}.fa-angle-right{--fa:"\f105"}.fa-horse{--fa:"\f6f0"}.fa-q{--fa:"\51"}.fa-g{--fa:"\47"}.fa-notes-medical{--fa:"\f481"}.fa-temperature-2,.fa-temperature-half,.fa-thermometer-2,.fa-thermometer-half{--fa:"\f2c9"}.fa-dong-sign{--fa:"\e169"}.fa-capsules{--fa:"\f46b"}.fa-poo-bolt,.fa-poo-storm{--fa:"\f75a"}.fa-face-frown-open,.fa-frown-open{--fa:"\f57a"}.fa-hand-point-up{--fa:"\f0a6"}.fa-money-bill{--fa:"\f0d6"}.fa-bookmark{--fa:"\f02e"}.fa-align-justify{--fa:"\f039"}.fa-umbrella-beach{--fa:"\f5ca"}.fa-helmet-un{--fa:"\e503"}.fa-bullseye{--fa:"\f140"}.fa-bacon{--fa:"\f7e5"}.fa-hand-point-down{--fa:"\f0a7"}.fa-arrow-up-from-bracket{--fa:"\e09a"}.fa-folder,.fa-folder-blank{--fa:"\f07b"}.fa-file-medical-alt,.fa-file-waveform{--fa:"\f478"}.fa-radiation{--fa:"\f7b9"}.fa-chart-simple{--fa:"\e473"}.fa-mars-stroke{--fa:"\f229"}.fa-vial{--fa:"\f492"}.fa-dashboard,.fa-gauge,.fa-gauge-med,.fa-tachometer-alt-average{--fa:"\f624"}.fa-magic-wand-sparkles,.fa-wand-magic-sparkles{--fa:"\e2ca"}.fa-e{--fa:"\45"}.fa-pen-alt,.fa-pen-clip{--fa:"\f305"}.fa-bridge-circle-exclamation{--fa:"\e4ca"}.fa-user{--fa:"\f007"}.fa-school-circle-check{--fa:"\e56b"}.fa-dumpster{--fa:"\f793"}.fa-shuttle-van,.fa-van-shuttle{--fa:"\f5b6"}.fa-building-user{--fa:"\e4da"}.fa-caret-square-left,.fa-square-caret-left{--fa:"\f191"}.fa-highlighter{--fa:"\f591"}.fa-key{--fa:"\f084"}.fa-bullhorn{--fa:"\f0a1"}.fa-globe{--fa:"\f0ac"}.fa-synagogue{--fa:"\f69b"}.fa-person-half-dress{--fa:"\e548"}.fa-road-bridge{--fa:"\e563"}.fa-location-arrow{--fa:"\f124"}.fa-c{--fa:"\43"}.fa-tablet-button{--fa:"\f10a"}.fa-building-lock{--fa:"\e4d6"}.fa-pizza-slice{--fa:"\f818"}.fa-money-bill-wave{--fa:"\f53a"}.fa-area-chart,.fa-chart-area{--fa:"\f1fe"}.fa-house-flag{--fa:"\e50d"}.fa-person-circle-minus{--fa:"\e540"}.fa-ban,.fa-cancel{--fa:"\f05e"}.fa-camera-rotate{--fa:"\e0d8"}.fa-air-freshener,.fa-spray-can-sparkles{--fa:"\f5d0"}.fa-star{--fa:"\f005"}.fa-repeat{--fa:"\f363"}.fa-cross{--fa:"\f654"}.fa-box{--fa:"\f466"}.fa-venus-mars{--fa:"\f228"}.fa-arrow-pointer,.fa-mouse-pointer{--fa:"\f245"}.fa-expand-arrows-alt,.fa-maximize{--fa:"\f31e"}.fa-charging-station{--fa:"\f5e7"}.fa-shapes,.fa-triangle-circle-square{--fa:"\f61f"}.fa-random,.fa-shuffle{--fa:"\f074"}.fa-person-running,.fa-running{--fa:"\f70c"}.fa-mobile-retro{--fa:"\e527"}.fa-grip-lines-vertical{--fa:"\f7a5"}.fa-spider{--fa:"\f717"}.fa-hands-bound{--fa:"\e4f9"}.fa-file-invoice-dollar{--fa:"\f571"}.fa-plane-circle-exclamation{--fa:"\e556"}.fa-x-ray{--fa:"\f497"}.fa-spell-check{--fa:"\f891"}.fa-slash{--fa:"\f715"}.fa-computer-mouse,.fa-mouse{--fa:"\f8cc"}.fa-arrow-right-to-bracket,.fa-sign-in{--fa:"\f090"}.fa-shop-slash,.fa-store-alt-slash{--fa:"\e070"}.fa-server{--fa:"\f233"}.fa-virus-covid-slash{--fa:"\e4a9"}.fa-shop-lock{--fa:"\e4a5"}.fa-hourglass-1,.fa-hourglass-start{--fa:"\f251"}.fa-blender-phone{--fa:"\f6b6"}.fa-building-wheat{--fa:"\e4db"}.fa-person-breastfeeding{--fa:"\e53a"}.fa-right-to-bracket,.fa-sign-in-alt{--fa:"\f2f6"}.fa-venus{--fa:"\f221"}.fa-passport{--fa:"\f5ab"}.fa-thumb-tack-slash,.fa-thumbtack-slash{--fa:"\e68f"}.fa-heart-pulse,.fa-heartbeat{--fa:"\f21e"}.fa-people-carry,.fa-people-carry-box{--fa:"\f4ce"}.fa-temperature-high{--fa:"\f769"}.fa-microchip{--fa:"\f2db"}.fa-crown{--fa:"\f521"}.fa-weight-hanging{--fa:"\f5cd"}.fa-xmarks-lines{--fa:"\e59a"}.fa-file-prescription{--fa:"\f572"}.fa-weight,.fa-weight-scale{--fa:"\f496"}.fa-user-friends,.fa-user-group{--fa:"\f500"}.fa-arrow-up-a-z,.fa-sort-alpha-up{--fa:"\f15e"}.fa-chess-knight{--fa:"\f441"}.fa-face-laugh-squint,.fa-laugh-squint{--fa:"\f59b"}.fa-wheelchair{--fa:"\f193"}.fa-arrow-circle-up,.fa-circle-arrow-up{--fa:"\f0aa"}.fa-toggle-on{--fa:"\f205"}.fa-person-walking,.fa-walking{--fa:"\f554"}.fa-l{--fa:"\4c"}.fa-fire{--fa:"\f06d"}.fa-bed-pulse,.fa-procedures{--fa:"\f487"}.fa-shuttle-space,.fa-space-shuttle{--fa:"\f197"}.fa-face-laugh,.fa-laugh{--fa:"\f599"}.fa-folder-open{--fa:"\f07c"}.fa-heart-circle-plus{--fa:"\e500"}.fa-code-fork{--fa:"\e13b"}.fa-city{--fa:"\f64f"}.fa-microphone-alt,.fa-microphone-lines{--fa:"\f3c9"}.fa-pepper-hot{--fa:"\f816"}.fa-unlock{--fa:"\f09c"}.fa-colon-sign{--fa:"\e140"}.fa-headset{--fa:"\f590"}.fa-store-slash{--fa:"\e071"}.fa-road-circle-xmark{--fa:"\e566"}.fa-user-minus{--fa:"\f503"}.fa-mars-stroke-up,.fa-mars-stroke-v{--fa:"\f22a"}.fa-champagne-glasses,.fa-glass-cheers{--fa:"\f79f"}.fa-clipboard{--fa:"\f328"}.fa-house-circle-exclamation{--fa:"\e50a"}.fa-file-arrow-up,.fa-file-upload{--fa:"\f574"}.fa-wifi,.fa-wifi-3,.fa-wifi-strong{--fa:"\f1eb"}.fa-bath,.fa-bathtub{--fa:"\f2cd"}.fa-underline{--fa:"\f0cd"}.fa-user-edit,.fa-user-pen{--fa:"\f4ff"}.fa-signature{--fa:"\f5b7"}.fa-stroopwafel{--fa:"\f551"}.fa-bold{--fa:"\f032"}.fa-anchor-lock{--fa:"\e4ad"}.fa-building-ngo{--fa:"\e4d7"}.fa-manat-sign{--fa:"\e1d5"}.fa-not-equal{--fa:"\f53e"}.fa-border-style,.fa-border-top-left{--fa:"\f853"}.fa-map-location-dot,.fa-map-marked-alt{--fa:"\f5a0"}.fa-jedi{--fa:"\f669"}.fa-poll,.fa-square-poll-vertical{--fa:"\f681"}.fa-mug-hot{--fa:"\f7b6"}.fa-battery-car,.fa-car-battery{--fa:"\f5df"}.fa-gift{--fa:"\f06b"}.fa-dice-two{--fa:"\f528"}.fa-chess-queen{--fa:"\f445"}.fa-glasses{--fa:"\f530"}.fa-chess-board{--fa:"\f43c"}.fa-building-circle-check{--fa:"\e4d2"}.fa-person-chalkboard{--fa:"\e53d"}.fa-mars-stroke-h,.fa-mars-stroke-right{--fa:"\f22b"}.fa-hand-back-fist,.fa-hand-rock{--fa:"\f255"}.fa-caret-square-up,.fa-square-caret-up{--fa:"\f151"}.fa-cloud-showers-water{--fa:"\e4e4"}.fa-bar-chart,.fa-chart-bar{--fa:"\f080"}.fa-hands-bubbles,.fa-hands-wash{--fa:"\e05e"}.fa-less-than-equal{--fa:"\f537"}.fa-train{--fa:"\f238"}.fa-eye-low-vision,.fa-low-vision{--fa:"\f2a8"}.fa-crow{--fa:"\f520"}.fa-sailboat{--fa:"\e445"}.fa-window-restore{--fa:"\f2d2"}.fa-plus-square,.fa-square-plus{--fa:"\f0fe"}.fa-torii-gate{--fa:"\f6a1"}.fa-frog{--fa:"\f52e"}.fa-bucket{--fa:"\e4cf"}.fa-image{--fa:"\f03e"}.fa-microphone{--fa:"\f130"}.fa-cow{--fa:"\f6c8"}.fa-caret-up{--fa:"\f0d8"}.fa-screwdriver{--fa:"\f54a"}.fa-folder-closed{--fa:"\e185"}.fa-house-tsunami{--fa:"\e515"}.fa-square-nfi{--fa:"\e576"}.fa-arrow-up-from-ground-water{--fa:"\e4b5"}.fa-glass-martini-alt,.fa-martini-glass{--fa:"\f57b"}.fa-square-binary{--fa:"\e69b"}.fa-rotate-back,.fa-rotate-backward,.fa-rotate-left,.fa-undo-alt{--fa:"\f2ea"}.fa-columns,.fa-table-columns{--fa:"\f0db"}.fa-lemon{--fa:"\f094"}.fa-head-side-mask{--fa:"\e063"}.fa-handshake{--fa:"\f2b5"}.fa-gem{--fa:"\f3a5"}.fa-dolly,.fa-dolly-box{--fa:"\f472"}.fa-smoking{--fa:"\f48d"}.fa-compress-arrows-alt,.fa-minimize{--fa:"\f78c"}.fa-monument{--fa:"\f5a6"}.fa-snowplow{--fa:"\f7d2"}.fa-angle-double-right,.fa-angles-right{--fa:"\f101"}.fa-cannabis{--fa:"\f55f"}.fa-circle-play,.fa-play-circle{--fa:"\f144"}.fa-tablets{--fa:"\f490"}.fa-ethernet{--fa:"\f796"}.fa-eur,.fa-euro,.fa-euro-sign{--fa:"\f153"}.fa-chair{--fa:"\f6c0"}.fa-check-circle,.fa-circle-check{--fa:"\f058"}.fa-circle-stop,.fa-stop-circle{--fa:"\f28d"}.fa-compass-drafting,.fa-drafting-compass{--fa:"\f568"}.fa-plate-wheat{--fa:"\e55a"}.fa-icicles{--fa:"\f7ad"}.fa-person-shelter{--fa:"\e54f"}.fa-neuter{--fa:"\f22c"}.fa-id-badge{--fa:"\f2c1"}.fa-marker{--fa:"\f5a1"}.fa-face-laugh-beam,.fa-laugh-beam{--fa:"\f59a"}.fa-helicopter-symbol{--fa:"\e502"}.fa-universal-access{--fa:"\f29a"}.fa-chevron-circle-up,.fa-circle-chevron-up{--fa:"\f139"}.fa-lari-sign{--fa:"\e1c8"}.fa-volcano{--fa:"\f770"}.fa-person-walking-dashed-line-arrow-right{--fa:"\e553"}.fa-gbp,.fa-pound-sign,.fa-sterling-sign{--fa:"\f154"}.fa-viruses{--fa:"\e076"}.fa-square-person-confined{--fa:"\e577"}.fa-user-tie{--fa:"\f508"}.fa-arrow-down-long,.fa-long-arrow-down{--fa:"\f175"}.fa-tent-arrow-down-to-line{--fa:"\e57e"}.fa-certificate{--fa:"\f0a3"}.fa-mail-reply-all,.fa-reply-all{--fa:"\f122"}.fa-suitcase{--fa:"\f0f2"}.fa-person-skating,.fa-skating{--fa:"\f7c5"}.fa-filter-circle-dollar,.fa-funnel-dollar{--fa:"\f662"}.fa-camera-retro{--fa:"\f083"}.fa-arrow-circle-down,.fa-circle-arrow-down{--fa:"\f0ab"}.fa-arrow-right-to-file,.fa-file-import{--fa:"\f56f"}.fa-external-link-square,.fa-square-arrow-up-right{--fa:"\f14c"}.fa-box-open{--fa:"\f49e"}.fa-scroll{--fa:"\f70e"}.fa-spa{--fa:"\f5bb"}.fa-location-pin-lock{--fa:"\e51f"}.fa-pause{--fa:"\f04c"}.fa-hill-avalanche{--fa:"\e507"}.fa-temperature-0,.fa-temperature-empty,.fa-thermometer-0,.fa-thermometer-empty{--fa:"\f2cb"}.fa-bomb{--fa:"\f1e2"}.fa-registered{--fa:"\f25d"}.fa-address-card,.fa-contact-card,.fa-vcard{--fa:"\f2bb"}.fa-balance-scale-right,.fa-scale-unbalanced-flip{--fa:"\f516"}.fa-subscript{--fa:"\f12c"}.fa-diamond-turn-right,.fa-directions{--fa:"\f5eb"}.fa-burst{--fa:"\e4dc"}.fa-house-laptop,.fa-laptop-house{--fa:"\e066"}.fa-face-tired,.fa-tired{--fa:"\f5c8"}.fa-money-bills{--fa:"\e1f3"}.fa-smog{--fa:"\f75f"}.fa-crutch{--fa:"\f7f7"}.fa-cloud-arrow-up,.fa-cloud-upload,.fa-cloud-upload-alt{--fa:"\f0ee"}.fa-palette{--fa:"\f53f"}.fa-arrows-turn-right{--fa:"\e4c0"}.fa-vest{--fa:"\e085"}.fa-ferry{--fa:"\e4ea"}.fa-arrows-down-to-people{--fa:"\e4b9"}.fa-seedling,.fa-sprout{--fa:"\f4d8"}.fa-arrows-alt-h,.fa-left-right{--fa:"\f337"}.fa-boxes-packing{--fa:"\e4c7"}.fa-arrow-circle-left,.fa-circle-arrow-left{--fa:"\f0a8"}.fa-group-arrows-rotate{--fa:"\e4f6"}.fa-bowl-food{--fa:"\e4c6"}.fa-candy-cane{--fa:"\f786"}.fa-arrow-down-wide-short,.fa-sort-amount-asc,.fa-sort-amount-down{--fa:"\f160"}.fa-cloud-bolt,.fa-thunderstorm{--fa:"\f76c"}.fa-remove-format,.fa-text-slash{--fa:"\f87d"}.fa-face-smile-wink,.fa-smile-wink{--fa:"\f4da"}.fa-file-word{--fa:"\f1c2"}.fa-file-powerpoint{--fa:"\f1c4"}.fa-arrows-h,.fa-arrows-left-right{--fa:"\f07e"}.fa-house-lock{--fa:"\e510"}.fa-cloud-arrow-down,.fa-cloud-download,.fa-cloud-download-alt{--fa:"\f0ed"}.fa-children{--fa:"\e4e1"}.fa-blackboard,.fa-chalkboard{--fa:"\f51b"}.fa-user-alt-slash,.fa-user-large-slash{--fa:"\f4fa"}.fa-envelope-open{--fa:"\f2b6"}.fa-handshake-alt-slash,.fa-handshake-simple-slash{--fa:"\e05f"}.fa-mattress-pillow{--fa:"\e525"}.fa-guarani-sign{--fa:"\e19a"}.fa-arrows-rotate,.fa-refresh,.fa-sync{--fa:"\f021"}.fa-fire-extinguisher{--fa:"\f134"}.fa-cruzeiro-sign{--fa:"\e152"}.fa-greater-than-equal{--fa:"\f532"}.fa-shield-alt,.fa-shield-halved{--fa:"\f3ed"}.fa-atlas,.fa-book-atlas{--fa:"\f558"}.fa-virus{--fa:"\e074"}.fa-envelope-circle-check{--fa:"\e4e8"}.fa-layer-group{--fa:"\f5fd"}.fa-arrows-to-dot{--fa:"\e4be"}.fa-archway{--fa:"\f557"}.fa-heart-circle-check{--fa:"\e4fd"}.fa-house-chimney-crack,.fa-house-damage{--fa:"\f6f1"}.fa-file-archive,.fa-file-zipper{--fa:"\f1c6"}.fa-square{--fa:"\f0c8"}.fa-glass-martini,.fa-martini-glass-empty{--fa:"\f000"}.fa-couch{--fa:"\f4b8"}.fa-cedi-sign{--fa:"\e0df"}.fa-italic{--fa:"\f033"}.fa-table-cells-column-lock{--fa:"\e678"}.fa-church{--fa:"\f51d"}.fa-comments-dollar{--fa:"\f653"}.fa-democrat{--fa:"\f747"}.fa-z{--fa:"\5a"}.fa-person-skiing,.fa-skiing{--fa:"\f7c9"}.fa-road-lock{--fa:"\e567"}.fa-a{--fa:"\41"}.fa-temperature-arrow-down,.fa-temperature-down{--fa:"\e03f"}.fa-feather-alt,.fa-feather-pointed{--fa:"\f56b"}.fa-p{--fa:"\50"}.fa-snowflake{--fa:"\f2dc"}.fa-newspaper{--fa:"\f1ea"}.fa-ad,.fa-rectangle-ad{--fa:"\f641"}.fa-arrow-circle-right,.fa-circle-arrow-right{--fa:"\f0a9"}.fa-filter-circle-xmark{--fa:"\e17b"}.fa-locust{--fa:"\e520"}.fa-sort,.fa-unsorted{--fa:"\f0dc"}.fa-list-1-2,.fa-list-numeric,.fa-list-ol{--fa:"\f0cb"}.fa-person-dress-burst{--fa:"\e544"}.fa-money-check-alt,.fa-money-check-dollar{--fa:"\f53d"}.fa-vector-square{--fa:"\f5cb"}.fa-bread-slice{--fa:"\f7ec"}.fa-language{--fa:"\f1ab"}.fa-face-kiss-wink-heart,.fa-kiss-wink-heart{--fa:"\f598"}.fa-filter{--fa:"\f0b0"}.fa-question{--fa:"\3f"}.fa-file-signature{--fa:"\f573"}.fa-arrows-alt,.fa-up-down-left-right{--fa:"\f0b2"}.fa-house-chimney-user{--fa:"\e065"}.fa-hand-holding-heart{--fa:"\f4be"}.fa-puzzle-piece{--fa:"\f12e"}.fa-money-check{--fa:"\f53c"}.fa-star-half-alt,.fa-star-half-stroke{--fa:"\f5c0"}.fa-code{--fa:"\f121"}.fa-glass-whiskey,.fa-whiskey-glass{--fa:"\f7a0"}.fa-building-circle-exclamation{--fa:"\e4d3"}.fa-magnifying-glass-chart{--fa:"\e522"}.fa-arrow-up-right-from-square,.fa-external-link{--fa:"\f08e"}.fa-cubes-stacked{--fa:"\e4e6"}.fa-krw,.fa-won,.fa-won-sign{--fa:"\f159"}.fa-virus-covid{--fa:"\e4a8"}.fa-austral-sign{--fa:"\e0a9"}.fa-f{--fa:"\46"}.fa-leaf{--fa:"\f06c"}.fa-road{--fa:"\f018"}.fa-cab,.fa-taxi{--fa:"\f1ba"}.fa-person-circle-plus{--fa:"\e541"}.fa-chart-pie,.fa-pie-chart{--fa:"\f200"}.fa-bolt-lightning{--fa:"\e0b7"}.fa-sack-xmark{--fa:"\e56a"}.fa-file-excel{--fa:"\f1c3"}.fa-file-contract{--fa:"\f56c"}.fa-fish-fins{--fa:"\e4f2"}.fa-building-flag{--fa:"\e4d5"}.fa-face-grin-beam,.fa-grin-beam{--fa:"\f582"}.fa-object-ungroup{--fa:"\f248"}.fa-poop{--fa:"\f619"}.fa-location-pin,.fa-map-marker{--fa:"\f041"}.fa-kaaba{--fa:"\f66b"}.fa-toilet-paper{--fa:"\f71e"}.fa-hard-hat,.fa-hat-hard,.fa-helmet-safety{--fa:"\f807"}.fa-eject{--fa:"\f052"}.fa-arrow-alt-circle-right,.fa-circle-right{--fa:"\f35a"}.fa-plane-circle-check{--fa:"\e555"}.fa-face-rolling-eyes,.fa-meh-rolling-eyes{--fa:"\f5a5"}.fa-object-group{--fa:"\f247"}.fa-chart-line,.fa-line-chart{--fa:"\f201"}.fa-mask-ventilator{--fa:"\e524"}.fa-arrow-right{--fa:"\f061"}.fa-map-signs,.fa-signs-post{--fa:"\f277"}.fa-cash-register{--fa:"\f788"}.fa-person-circle-question{--fa:"\e542"}.fa-h{--fa:"\48"}.fa-tarp{--fa:"\e57b"}.fa-screwdriver-wrench,.fa-tools{--fa:"\f7d9"}.fa-arrows-to-eye{--fa:"\e4bf"}.fa-plug-circle-bolt{--fa:"\e55b"}.fa-heart{--fa:"\f004"}.fa-mars-and-venus{--fa:"\f224"}.fa-home-user,.fa-house-user{--fa:"\e1b0"}.fa-dumpster-fire{--fa:"\f794"}.fa-house-crack{--fa:"\e3b1"}.fa-cocktail,.fa-martini-glass-citrus{--fa:"\f561"}.fa-face-surprise,.fa-surprise{--fa:"\f5c2"}.fa-bottle-water{--fa:"\e4c5"}.fa-circle-pause,.fa-pause-circle{--fa:"\f28b"}.fa-toilet-paper-slash{--fa:"\e072"}.fa-apple-alt,.fa-apple-whole{--fa:"\f5d1"}.fa-kitchen-set{--fa:"\e51a"}.fa-r{--fa:"\52"}.fa-temperature-1,.fa-temperature-quarter,.fa-thermometer-1,.fa-thermometer-quarter{--fa:"\f2ca"}.fa-cube{--fa:"\f1b2"}.fa-bitcoin-sign{--fa:"\e0b4"}.fa-shield-dog{--fa:"\e573"}.fa-solar-panel{--fa:"\f5ba"}.fa-lock-open{--fa:"\f3c1"}.fa-elevator{--fa:"\e16d"}.fa-money-bill-transfer{--fa:"\e528"}.fa-money-bill-trend-up{--fa:"\e529"}.fa-house-flood-water-circle-arrow-right{--fa:"\e50f"}.fa-poll-h,.fa-square-poll-horizontal{--fa:"\f682"}.fa-circle{--fa:"\f111"}.fa-backward-fast,.fa-fast-backward{--fa:"\f049"}.fa-recycle{--fa:"\f1b8"}.fa-user-astronaut{--fa:"\f4fb"}.fa-plane-slash{--fa:"\e069"}.fa-trademark{--fa:"\f25c"}.fa-basketball,.fa-basketball-ball{--fa:"\f434"}.fa-satellite-dish{--fa:"\f7c0"}.fa-arrow-alt-circle-up,.fa-circle-up{--fa:"\f35b"}.fa-mobile-alt,.fa-mobile-screen-button{--fa:"\f3cd"}.fa-volume-high,.fa-volume-up{--fa:"\f028"}.fa-users-rays{--fa:"\e593"}.fa-wallet{--fa:"\f555"}.fa-clipboard-check{--fa:"\f46c"}.fa-file-audio{--fa:"\f1c7"}.fa-burger,.fa-hamburger{--fa:"\f805"}.fa-wrench{--fa:"\f0ad"}.fa-bugs{--fa:"\e4d0"}.fa-rupee,.fa-rupee-sign{--fa:"\f156"}.fa-file-image{--fa:"\f1c5"}.fa-circle-question,.fa-question-circle{--fa:"\f059"}.fa-plane-departure{--fa:"\f5b0"}.fa-handshake-slash{--fa:"\e060"}.fa-book-bookmark{--fa:"\e0bb"}.fa-code-branch{--fa:"\f126"}.fa-hat-cowboy{--fa:"\f8c0"}.fa-bridge{--fa:"\e4c8"}.fa-phone-alt,.fa-phone-flip{--fa:"\f879"}.fa-truck-front{--fa:"\e2b7"}.fa-cat{--fa:"\f6be"}.fa-anchor-circle-exclamation{--fa:"\e4ab"}.fa-truck-field{--fa:"\e58d"}.fa-route{--fa:"\f4d7"}.fa-clipboard-question{--fa:"\e4e3"}.fa-panorama{--fa:"\e209"}.fa-comment-medical{--fa:"\f7f5"}.fa-teeth-open{--fa:"\f62f"}.fa-file-circle-minus{--fa:"\e4ed"}.fa-tags{--fa:"\f02c"}.fa-wine-glass{--fa:"\f4e3"}.fa-fast-forward,.fa-forward-fast{--fa:"\f050"}.fa-face-meh-blank,.fa-meh-blank{--fa:"\f5a4"}.fa-parking,.fa-square-parking{--fa:"\f540"}.fa-house-signal{--fa:"\e012"}.fa-bars-progress,.fa-tasks-alt{--fa:"\f828"}.fa-faucet-drip{--fa:"\e006"}.fa-cart-flatbed,.fa-dolly-flatbed{--fa:"\f474"}.fa-ban-smoking,.fa-smoking-ban{--fa:"\f54d"}.fa-terminal{--fa:"\f120"}.fa-mobile-button{--fa:"\f10b"}.fa-house-medical-flag{--fa:"\e514"}.fa-basket-shopping,.fa-shopping-basket{--fa:"\f291"}.fa-tape{--fa:"\f4db"}.fa-bus-alt,.fa-bus-simple{--fa:"\f55e"}.fa-eye{--fa:"\f06e"}.fa-face-sad-cry,.fa-sad-cry{--fa:"\f5b3"}.fa-audio-description{--fa:"\f29e"}.fa-person-military-to-person{--fa:"\e54c"}.fa-file-shield{--fa:"\e4f0"}.fa-user-slash{--fa:"\f506"}.fa-pen{--fa:"\f304"}.fa-tower-observation{--fa:"\e586"}.fa-file-code{--fa:"\f1c9"}.fa-signal,.fa-signal-5,.fa-signal-perfect{--fa:"\f012"}.fa-bus{--fa:"\f207"}.fa-heart-circle-xmark{--fa:"\e501"}.fa-home-lg,.fa-house-chimney{--fa:"\e3af"}.fa-window-maximize{--fa:"\f2d0"}.fa-face-frown,.fa-frown{--fa:"\f119"}.fa-prescription{--fa:"\f5b1"}.fa-shop,.fa-store-alt{--fa:"\f54f"}.fa-floppy-disk,.fa-save{--fa:"\f0c7"}.fa-vihara{--fa:"\f6a7"}.fa-balance-scale-left,.fa-scale-unbalanced{--fa:"\f515"}.fa-sort-asc,.fa-sort-up{--fa:"\f0de"}.fa-comment-dots,.fa-commenting{--fa:"\f4ad"}.fa-plant-wilt{--fa:"\e5aa"}.fa-diamond{--fa:"\f219"}.fa-face-grin-squint,.fa-grin-squint{--fa:"\f585"}.fa-hand-holding-dollar,.fa-hand-holding-usd{--fa:"\f4c0"}.fa-chart-diagram{--fa:"\e695"}.fa-bacterium{--fa:"\e05a"}.fa-hand-pointer{--fa:"\f25a"}.fa-drum-steelpan{--fa:"\f56a"}.fa-hand-scissors{--fa:"\f257"}.fa-hands-praying,.fa-praying-hands{--fa:"\f684"}.fa-arrow-right-rotate,.fa-arrow-rotate-forward,.fa-arrow-rotate-right,.fa-redo{--fa:"\f01e"}.fa-biohazard{--fa:"\f780"}.fa-location,.fa-location-crosshairs{--fa:"\f601"}.fa-mars-double{--fa:"\f227"}.fa-child-dress{--fa:"\e59c"}.fa-users-between-lines{--fa:"\e591"}.fa-lungs-virus{--fa:"\e067"}.fa-face-grin-tears,.fa-grin-tears{--fa:"\f588"}.fa-phone{--fa:"\f095"}.fa-calendar-times,.fa-calendar-xmark{--fa:"\f273"}.fa-child-reaching{--fa:"\e59d"}.fa-head-side-virus{--fa:"\e064"}.fa-user-cog,.fa-user-gear{--fa:"\f4fe"}.fa-arrow-up-1-9,.fa-sort-numeric-up{--fa:"\f163"}.fa-door-closed{--fa:"\f52a"}.fa-shield-virus{--fa:"\e06c"}.fa-dice-six{--fa:"\f526"}.fa-mosquito-net{--fa:"\e52c"}.fa-file-fragment{--fa:"\e697"}.fa-bridge-water{--fa:"\e4ce"}.fa-person-booth{--fa:"\f756"}.fa-text-width{--fa:"\f035"}.fa-hat-wizard{--fa:"\f6e8"}.fa-pen-fancy{--fa:"\f5ac"}.fa-digging,.fa-person-digging{--fa:"\f85e"}.fa-trash{--fa:"\f1f8"}.fa-gauge-simple,.fa-gauge-simple-med,.fa-tachometer-average{--fa:"\f629"}.fa-book-medical{--fa:"\f7e6"}.fa-poo{--fa:"\f2fe"}.fa-quote-right,.fa-quote-right-alt{--fa:"\f10e"}.fa-shirt,.fa-t-shirt,.fa-tshirt{--fa:"\f553"}.fa-cubes{--fa:"\f1b3"}.fa-divide{--fa:"\f529"}.fa-tenge,.fa-tenge-sign{--fa:"\f7d7"}.fa-headphones{--fa:"\f025"}.fa-hands-holding{--fa:"\f4c2"}.fa-hands-clapping{--fa:"\e1a8"}.fa-republican{--fa:"\f75e"}.fa-arrow-left{--fa:"\f060"}.fa-person-circle-xmark{--fa:"\e543"}.fa-ruler{--fa:"\f545"}.fa-align-left{--fa:"\f036"}.fa-dice-d6{--fa:"\f6d1"}.fa-restroom{--fa:"\f7bd"}.fa-j{--fa:"\4a"}.fa-users-viewfinder{--fa:"\e595"}.fa-file-video{--fa:"\f1c8"}.fa-external-link-alt,.fa-up-right-from-square{--fa:"\f35d"}.fa-table-cells,.fa-th{--fa:"\f00a"}.fa-file-pdf{--fa:"\f1c1"}.fa-bible,.fa-book-bible{--fa:"\f647"}.fa-o{--fa:"\4f"}.fa-medkit,.fa-suitcase-medical{--fa:"\f0fa"}.fa-user-secret{--fa:"\f21b"}.fa-otter{--fa:"\f700"}.fa-female,.fa-person-dress{--fa:"\f182"}.fa-comment-dollar{--fa:"\f651"}.fa-briefcase-clock,.fa-business-time{--fa:"\f64a"}.fa-table-cells-large,.fa-th-large{--fa:"\f009"}.fa-book-tanakh,.fa-tanakh{--fa:"\f827"}.fa-phone-volume,.fa-volume-control-phone{--fa:"\f2a0"}.fa-hat-cowboy-side{--fa:"\f8c1"}.fa-clipboard-user{--fa:"\f7f3"}.fa-child{--fa:"\f1ae"}.fa-lira-sign{--fa:"\f195"}.fa-satellite{--fa:"\f7bf"}.fa-plane-lock{--fa:"\e558"}.fa-tag{--fa:"\f02b"}.fa-comment{--fa:"\f075"}.fa-birthday-cake,.fa-cake,.fa-cake-candles{--fa:"\f1fd"}.fa-envelope{--fa:"\f0e0"}.fa-angle-double-up,.fa-angles-up{--fa:"\f102"}.fa-paperclip{--fa:"\f0c6"}.fa-arrow-right-to-city{--fa:"\e4b3"}.fa-ribbon{--fa:"\f4d6"}.fa-lungs{--fa:"\f604"}.fa-arrow-up-9-1,.fa-sort-numeric-up-alt{--fa:"\f887"}.fa-litecoin-sign{--fa:"\e1d3"}.fa-border-none{--fa:"\f850"}.fa-circle-nodes{--fa:"\e4e2"}.fa-parachute-box{--fa:"\f4cd"}.fa-indent{--fa:"\f03c"}.fa-truck-field-un{--fa:"\e58e"}.fa-hourglass,.fa-hourglass-empty{--fa:"\f254"}.fa-mountain{--fa:"\f6fc"}.fa-user-doctor,.fa-user-md{--fa:"\f0f0"}.fa-circle-info,.fa-info-circle{--fa:"\f05a"}.fa-cloud-meatball{--fa:"\f73b"}.fa-camera,.fa-camera-alt{--fa:"\f030"}.fa-square-virus{--fa:"\e578"}.fa-meteor{--fa:"\f753"}.fa-car-on{--fa:"\e4dd"}.fa-sleigh{--fa:"\f7cc"}.fa-arrow-down-1-9,.fa-sort-numeric-asc,.fa-sort-numeric-down{--fa:"\f162"}.fa-hand-holding-droplet,.fa-hand-holding-water{--fa:"\f4c1"}.fa-water{--fa:"\f773"}.fa-calendar-check{--fa:"\f274"}.fa-braille{--fa:"\f2a1"}.fa-prescription-bottle-alt,.fa-prescription-bottle-medical{--fa:"\f486"}.fa-landmark{--fa:"\f66f"}.fa-truck{--fa:"\f0d1"}.fa-crosshairs{--fa:"\f05b"}.fa-person-cane{--fa:"\e53c"}.fa-tent{--fa:"\e57d"}.fa-vest-patches{--fa:"\e086"}.fa-check-double{--fa:"\f560"}.fa-arrow-down-a-z,.fa-sort-alpha-asc,.fa-sort-alpha-down{--fa:"\f15d"}.fa-money-bill-wheat{--fa:"\e52a"}.fa-cookie{--fa:"\f563"}.fa-arrow-left-rotate,.fa-arrow-rotate-back,.fa-arrow-rotate-backward,.fa-arrow-rotate-left,.fa-undo{--fa:"\f0e2"}.fa-hard-drive,.fa-hdd{--fa:"\f0a0"}.fa-face-grin-squint-tears,.fa-grin-squint-tears{--fa:"\f586"}.fa-dumbbell{--fa:"\f44b"}.fa-list-alt,.fa-rectangle-list{--fa:"\f022"}.fa-tarp-droplet{--fa:"\e57c"}.fa-house-medical-circle-check{--fa:"\e511"}.fa-person-skiing-nordic,.fa-skiing-nordic{--fa:"\f7ca"}.fa-calendar-plus{--fa:"\f271"}.fa-plane-arrival{--fa:"\f5af"}.fa-arrow-alt-circle-left,.fa-circle-left{--fa:"\f359"}.fa-subway,.fa-train-subway{--fa:"\f239"}.fa-chart-gantt{--fa:"\e0e4"}.fa-indian-rupee,.fa-indian-rupee-sign,.fa-inr{--fa:"\e1bc"}.fa-crop-alt,.fa-crop-simple{--fa:"\f565"}.fa-money-bill-1,.fa-money-bill-alt{--fa:"\f3d1"}.fa-left-long,.fa-long-arrow-alt-left{--fa:"\f30a"}.fa-dna{--fa:"\f471"}.fa-virus-slash{--fa:"\e075"}.fa-minus,.fa-subtract{--fa:"\f068"}.fa-chess{--fa:"\f439"}.fa-arrow-left-long,.fa-long-arrow-left{--fa:"\f177"}.fa-plug-circle-check{--fa:"\e55c"}.fa-street-view{--fa:"\f21d"}.fa-franc-sign{--fa:"\e18f"}.fa-volume-off{--fa:"\f026"}.fa-american-sign-language-interpreting,.fa-asl-interpreting,.fa-hands-american-sign-language-interpreting,.fa-hands-asl-interpreting{--fa:"\f2a3"}.fa-cog,.fa-gear{--fa:"\f013"}.fa-droplet-slash,.fa-tint-slash{--fa:"\f5c7"}.fa-mosque{--fa:"\f678"}.fa-mosquito{--fa:"\e52b"}.fa-star-of-david{--fa:"\f69a"}.fa-person-military-rifle{--fa:"\e54b"}.fa-cart-shopping,.fa-shopping-cart{--fa:"\f07a"}.fa-vials{--fa:"\f493"}.fa-plug-circle-plus{--fa:"\e55f"}.fa-place-of-worship{--fa:"\f67f"}.fa-grip-vertical{--fa:"\f58e"}.fa-hexagon-nodes{--fa:"\e699"}.fa-arrow-turn-up,.fa-level-up{--fa:"\f148"}.fa-u{--fa:"\55"}.fa-square-root-alt,.fa-square-root-variable{--fa:"\f698"}.fa-clock,.fa-clock-four{--fa:"\f017"}.fa-backward-step,.fa-step-backward{--fa:"\f048"}.fa-pallet{--fa:"\f482"}.fa-faucet{--fa:"\e005"}.fa-baseball-bat-ball{--fa:"\f432"}.fa-s{--fa:"\53"}.fa-timeline{--fa:"\e29c"}.fa-keyboard{--fa:"\f11c"}.fa-caret-down{--fa:"\f0d7"}.fa-clinic-medical,.fa-house-chimney-medical{--fa:"\f7f2"}.fa-temperature-3,.fa-temperature-three-quarters,.fa-thermometer-3,.fa-thermometer-three-quarters{--fa:"\f2c8"}.fa-mobile-android-alt,.fa-mobile-screen{--fa:"\f3cf"}.fa-plane-up{--fa:"\e22d"}.fa-piggy-bank{--fa:"\f4d3"}.fa-battery-3,.fa-battery-half{--fa:"\f242"}.fa-mountain-city{--fa:"\e52e"}.fa-coins{--fa:"\f51e"}.fa-khanda{--fa:"\f66d"}.fa-sliders,.fa-sliders-h{--fa:"\f1de"}.fa-folder-tree{--fa:"\f802"}.fa-network-wired{--fa:"\f6ff"}.fa-map-pin{--fa:"\f276"}.fa-hamsa{--fa:"\f665"}.fa-cent-sign{--fa:"\e3f5"}.fa-flask{--fa:"\f0c3"}.fa-person-pregnant{--fa:"\e31e"}.fa-wand-sparkles{--fa:"\f72b"}.fa-ellipsis-v,.fa-ellipsis-vertical{--fa:"\f142"}.fa-ticket{--fa:"\f145"}.fa-power-off{--fa:"\f011"}.fa-long-arrow-alt-right,.fa-right-long{--fa:"\f30b"}.fa-flag-usa{--fa:"\f74d"}.fa-laptop-file{--fa:"\e51d"}.fa-teletype,.fa-tty{--fa:"\f1e4"}.fa-diagram-next{--fa:"\e476"}.fa-person-rifle{--fa:"\e54e"}.fa-house-medical-circle-exclamation{--fa:"\e512"}.fa-closed-captioning{--fa:"\f20a"}.fa-hiking,.fa-person-hiking{--fa:"\f6ec"}.fa-venus-double{--fa:"\f226"}.fa-images{--fa:"\f302"}.fa-calculator{--fa:"\f1ec"}.fa-people-pulling{--fa:"\e535"}.fa-n{--fa:"\4e"}.fa-cable-car,.fa-tram{--fa:"\f7da"}.fa-cloud-rain{--fa:"\f73d"}.fa-building-circle-xmark{--fa:"\e4d4"}.fa-ship{--fa:"\f21a"}.fa-arrows-down-to-line{--fa:"\e4b8"}.fa-download{--fa:"\f019"}.fa-face-grin,.fa-grin{--fa:"\f580"}.fa-backspace,.fa-delete-left{--fa:"\f55a"}.fa-eye-dropper,.fa-eye-dropper-empty,.fa-eyedropper{--fa:"\f1fb"}.fa-file-circle-check{--fa:"\e5a0"}.fa-forward{--fa:"\f04e"}.fa-mobile,.fa-mobile-android,.fa-mobile-phone{--fa:"\f3ce"}.fa-face-meh,.fa-meh{--fa:"\f11a"}.fa-align-center{--fa:"\f037"}.fa-book-dead,.fa-book-skull{--fa:"\f6b7"}.fa-drivers-license,.fa-id-card{--fa:"\f2c2"}.fa-dedent,.fa-outdent{--fa:"\f03b"}.fa-heart-circle-exclamation{--fa:"\e4fe"}.fa-home,.fa-home-alt,.fa-home-lg-alt,.fa-house{--fa:"\f015"}.fa-calendar-week{--fa:"\f784"}.fa-laptop-medical{--fa:"\f812"}.fa-b{--fa:"\42"}.fa-file-medical{--fa:"\f477"}.fa-dice-one{--fa:"\f525"}.fa-kiwi-bird{--fa:"\f535"}.fa-arrow-right-arrow-left,.fa-exchange{--fa:"\f0ec"}.fa-redo-alt,.fa-rotate-forward,.fa-rotate-right{--fa:"\f2f9"}.fa-cutlery,.fa-utensils{--fa:"\f2e7"}.fa-arrow-up-wide-short,.fa-sort-amount-up{--fa:"\f161"}.fa-mill-sign{--fa:"\e1ed"}.fa-bowl-rice{--fa:"\e2eb"}.fa-skull{--fa:"\f54c"}.fa-broadcast-tower,.fa-tower-broadcast{--fa:"\f519"}.fa-truck-pickup{--fa:"\f63c"}.fa-long-arrow-alt-up,.fa-up-long{--fa:"\f30c"}.fa-stop{--fa:"\f04d"}.fa-code-merge{--fa:"\f387"}.fa-upload{--fa:"\f093"}.fa-hurricane{--fa:"\f751"}.fa-mound{--fa:"\e52d"}.fa-toilet-portable{--fa:"\e583"}.fa-compact-disc{--fa:"\f51f"}.fa-file-arrow-down,.fa-file-download{--fa:"\f56d"}.fa-caravan{--fa:"\f8ff"}.fa-shield-cat{--fa:"\e572"}.fa-bolt,.fa-zap{--fa:"\f0e7"}.fa-glass-water{--fa:"\e4f4"}.fa-oil-well{--fa:"\e532"}.fa-vault{--fa:"\e2c5"}.fa-mars{--fa:"\f222"}.fa-toilet{--fa:"\f7d8"}.fa-plane-circle-xmark{--fa:"\e557"}.fa-cny,.fa-jpy,.fa-rmb,.fa-yen,.fa-yen-sign{--fa:"\f157"}.fa-rouble,.fa-rub,.fa-ruble,.fa-ruble-sign{--fa:"\f158"}.fa-sun{--fa:"\f185"}.fa-guitar{--fa:"\f7a6"}.fa-face-laugh-wink,.fa-laugh-wink{--fa:"\f59c"}.fa-horse-head{--fa:"\f7ab"}.fa-bore-hole{--fa:"\e4c3"}.fa-industry{--fa:"\f275"}.fa-arrow-alt-circle-down,.fa-circle-down{--fa:"\f358"}.fa-arrows-turn-to-dots{--fa:"\e4c1"}.fa-florin-sign{--fa:"\e184"}.fa-arrow-down-short-wide,.fa-sort-amount-desc,.fa-sort-amount-down-alt{--fa:"\f884"}.fa-less-than{--fa:"\3c"}.fa-angle-down{--fa:"\f107"}.fa-car-tunnel{--fa:"\e4de"}.fa-head-side-cough{--fa:"\e061"}.fa-grip-lines{--fa:"\f7a4"}.fa-thumbs-down{--fa:"\f165"}.fa-user-lock{--fa:"\f502"}.fa-arrow-right-long,.fa-long-arrow-right{--fa:"\f178"}.fa-anchor-circle-xmark{--fa:"\e4ac"}.fa-ellipsis,.fa-ellipsis-h{--fa:"\f141"}.fa-chess-pawn{--fa:"\f443"}.fa-first-aid,.fa-kit-medical{--fa:"\f479"}.fa-person-through-window{--fa:"\e5a9"}.fa-toolbox{--fa:"\f552"}.fa-hands-holding-circle{--fa:"\e4fb"}.fa-bug{--fa:"\f188"}.fa-credit-card,.fa-credit-card-alt{--fa:"\f09d"}.fa-automobile,.fa-car{--fa:"\f1b9"}.fa-hand-holding-hand{--fa:"\e4f7"}.fa-book-open-reader,.fa-book-reader{--fa:"\f5da"}.fa-mountain-sun{--fa:"\e52f"}.fa-arrows-left-right-to-line{--fa:"\e4ba"}.fa-dice-d20{--fa:"\f6cf"}.fa-truck-droplet{--fa:"\e58c"}.fa-file-circle-xmark{--fa:"\e5a1"}.fa-temperature-arrow-up,.fa-temperature-up{--fa:"\e040"}.fa-medal{--fa:"\f5a2"}.fa-bed{--fa:"\f236"}.fa-h-square,.fa-square-h{--fa:"\f0fd"}.fa-podcast{--fa:"\f2ce"}.fa-temperature-4,.fa-temperature-full,.fa-thermometer-4,.fa-thermometer-full{--fa:"\f2c7"}.fa-bell{--fa:"\f0f3"}.fa-superscript{--fa:"\f12b"}.fa-plug-circle-xmark{--fa:"\e560"}.fa-star-of-life{--fa:"\f621"}.fa-phone-slash{--fa:"\f3dd"}.fa-paint-roller{--fa:"\f5aa"}.fa-hands-helping,.fa-handshake-angle{--fa:"\f4c4"}.fa-location-dot,.fa-map-marker-alt{--fa:"\f3c5"}.fa-file{--fa:"\f15b"}.fa-greater-than{--fa:"\3e"}.fa-person-swimming,.fa-swimmer{--fa:"\f5c4"}.fa-arrow-down{--fa:"\f063"}.fa-droplet,.fa-tint{--fa:"\f043"}.fa-eraser{--fa:"\f12d"}.fa-earth,.fa-earth-america,.fa-earth-americas,.fa-globe-americas{--fa:"\f57d"}.fa-person-burst{--fa:"\e53b"}.fa-dove{--fa:"\f4ba"}.fa-battery-0,.fa-battery-empty{--fa:"\f244"}.fa-socks{--fa:"\f696"}.fa-inbox{--fa:"\f01c"}.fa-section{--fa:"\e447"}.fa-gauge-high,.fa-tachometer-alt,.fa-tachometer-alt-fast{--fa:"\f625"}.fa-envelope-open-text{--fa:"\f658"}.fa-hospital,.fa-hospital-alt,.fa-hospital-wide{--fa:"\f0f8"}.fa-wine-bottle{--fa:"\f72f"}.fa-chess-rook{--fa:"\f447"}.fa-bars-staggered,.fa-reorder,.fa-stream{--fa:"\f550"}.fa-dharmachakra{--fa:"\f655"}.fa-hotdog{--fa:"\f80f"}.fa-blind,.fa-person-walking-with-cane{--fa:"\f29d"}.fa-drum{--fa:"\f569"}.fa-ice-cream{--fa:"\f810"}.fa-heart-circle-bolt{--fa:"\e4fc"}.fa-fax{--fa:"\f1ac"}.fa-paragraph{--fa:"\f1dd"}.fa-check-to-slot,.fa-vote-yea{--fa:"\f772"}.fa-star-half{--fa:"\f089"}.fa-boxes,.fa-boxes-alt,.fa-boxes-stacked{--fa:"\f468"}.fa-chain,.fa-link{--fa:"\f0c1"}.fa-assistive-listening-systems,.fa-ear-listen{--fa:"\f2a2"}.fa-tree-city{--fa:"\e587"}.fa-play{--fa:"\f04b"}.fa-font{--fa:"\f031"}.fa-table-cells-row-lock{--fa:"\e67a"}.fa-rupiah-sign{--fa:"\e23d"}.fa-magnifying-glass,.fa-search{--fa:"\f002"}.fa-ping-pong-paddle-ball,.fa-table-tennis,.fa-table-tennis-paddle-ball{--fa:"\f45d"}.fa-diagnoses,.fa-person-dots-from-line{--fa:"\f470"}.fa-trash-can-arrow-up,.fa-trash-restore-alt{--fa:"\f82a"}.fa-naira-sign{--fa:"\e1f6"}.fa-cart-arrow-down{--fa:"\f218"}.fa-walkie-talkie{--fa:"\f8ef"}.fa-file-edit,.fa-file-pen{--fa:"\f31c"}.fa-receipt{--fa:"\f543"}.fa-pen-square,.fa-pencil-square,.fa-square-pen{--fa:"\f14b"}.fa-suitcase-rolling{--fa:"\f5c1"}.fa-person-circle-exclamation{--fa:"\e53f"}.fa-chevron-down{--fa:"\f078"}.fa-battery,.fa-battery-5,.fa-battery-full{--fa:"\f240"}.fa-skull-crossbones{--fa:"\f714"}.fa-code-compare{--fa:"\e13a"}.fa-list-dots,.fa-list-ul{--fa:"\f0ca"}.fa-school-lock{--fa:"\e56f"}.fa-tower-cell{--fa:"\e585"}.fa-down-long,.fa-long-arrow-alt-down{--fa:"\f309"}.fa-ranking-star{--fa:"\e561"}.fa-chess-king{--fa:"\f43f"}.fa-person-harassing{--fa:"\e549"}.fa-brazilian-real-sign{--fa:"\e46c"}.fa-landmark-alt,.fa-landmark-dome{--fa:"\f752"}.fa-arrow-up{--fa:"\f062"}.fa-television,.fa-tv,.fa-tv-alt{--fa:"\f26c"}.fa-shrimp{--fa:"\e448"}.fa-list-check,.fa-tasks{--fa:"\f0ae"}.fa-jug-detergent{--fa:"\e519"}.fa-circle-user,.fa-user-circle{--fa:"\f2bd"}.fa-user-shield{--fa:"\f505"}.fa-wind{--fa:"\f72e"}.fa-car-burst,.fa-car-crash{--fa:"\f5e1"}.fa-y{--fa:"\59"}.fa-person-snowboarding,.fa-snowboarding{--fa:"\f7ce"}.fa-shipping-fast,.fa-truck-fast{--fa:"\f48b"}.fa-fish{--fa:"\f578"}.fa-user-graduate{--fa:"\f501"}.fa-adjust,.fa-circle-half-stroke{--fa:"\f042"}.fa-clapperboard{--fa:"\e131"}.fa-circle-radiation,.fa-radiation-alt{--fa:"\f7ba"}.fa-baseball,.fa-baseball-ball{--fa:"\f433"}.fa-jet-fighter-up{--fa:"\e518"}.fa-diagram-project,.fa-project-diagram{--fa:"\f542"}.fa-copy{--fa:"\f0c5"}.fa-volume-mute,.fa-volume-times,.fa-volume-xmark{--fa:"\f6a9"}.fa-hand-sparkles{--fa:"\e05d"}.fa-grip,.fa-grip-horizontal{--fa:"\f58d"}.fa-share-from-square,.fa-share-square{--fa:"\f14d"}.fa-child-combatant,.fa-child-rifle{--fa:"\e4e0"}.fa-gun{--fa:"\e19b"}.fa-phone-square,.fa-square-phone{--fa:"\f098"}.fa-add,.fa-plus{--fa:"\2b"}.fa-expand{--fa:"\f065"}.fa-computer{--fa:"\e4e5"}.fa-close,.fa-multiply,.fa-remove,.fa-times,.fa-xmark{--fa:"\f00d"}.fa-arrows,.fa-arrows-up-down-left-right{--fa:"\f047"}.fa-chalkboard-teacher,.fa-chalkboard-user{--fa:"\f51c"}.fa-peso-sign{--fa:"\e222"}.fa-building-shield{--fa:"\e4d8"}.fa-baby{--fa:"\f77c"}.fa-users-line{--fa:"\e592"}.fa-quote-left,.fa-quote-left-alt{--fa:"\f10d"}.fa-tractor{--fa:"\f722"}.fa-trash-arrow-up,.fa-trash-restore{--fa:"\f829"}.fa-arrow-down-up-lock{--fa:"\e4b0"}.fa-lines-leaning{--fa:"\e51e"}.fa-ruler-combined{--fa:"\f546"}.fa-copyright{--fa:"\f1f9"}.fa-equals{--fa:"\3d"}.fa-blender{--fa:"\f517"}.fa-teeth{--fa:"\f62e"}.fa-ils,.fa-shekel,.fa-shekel-sign,.fa-sheqel,.fa-sheqel-sign{--fa:"\f20b"}.fa-map{--fa:"\f279"}.fa-rocket{--fa:"\f135"}.fa-photo-film,.fa-photo-video{--fa:"\f87c"}.fa-folder-minus{--fa:"\f65d"}.fa-hexagon-nodes-bolt{--fa:"\e69a"}.fa-store{--fa:"\f54e"}.fa-arrow-trend-up{--fa:"\e098"}.fa-plug-circle-minus{--fa:"\e55e"}.fa-sign,.fa-sign-hanging{--fa:"\f4d9"}.fa-bezier-curve{--fa:"\f55b"}.fa-bell-slash{--fa:"\f1f6"}.fa-tablet,.fa-tablet-android{--fa:"\f3fb"}.fa-school-flag{--fa:"\e56e"}.fa-fill{--fa:"\f575"}.fa-angle-up{--fa:"\f106"}.fa-drumstick-bite{--fa:"\f6d7"}.fa-holly-berry{--fa:"\f7aa"}.fa-chevron-left{--fa:"\f053"}.fa-bacteria{--fa:"\e059"}.fa-hand-lizard{--fa:"\f258"}.fa-notdef{--fa:"\e1fe"}.fa-disease{--fa:"\f7fa"}.fa-briefcase-medical{--fa:"\f469"}.fa-genderless{--fa:"\f22d"}.fa-chevron-right{--fa:"\f054"}.fa-retweet{--fa:"\f079"}.fa-car-alt,.fa-car-rear{--fa:"\f5de"}.fa-pump-soap{--fa:"\e06b"}.fa-video-slash{--fa:"\f4e2"}.fa-battery-2,.fa-battery-quarter{--fa:"\f243"}.fa-radio{--fa:"\f8d7"}.fa-baby-carriage,.fa-carriage-baby{--fa:"\f77d"}.fa-traffic-light{--fa:"\f637"}.fa-thermometer{--fa:"\f491"}.fa-vr-cardboard{--fa:"\f729"}.fa-hand-middle-finger{--fa:"\f806"}.fa-percent,.fa-percentage{--fa:"\25"}.fa-truck-moving{--fa:"\f4df"}.fa-glass-water-droplet{--fa:"\e4f5"}.fa-display{--fa:"\e163"}.fa-face-smile,.fa-smile{--fa:"\f118"}.fa-thumb-tack,.fa-thumbtack{--fa:"\f08d"}.fa-trophy{--fa:"\f091"}.fa-person-praying,.fa-pray{--fa:"\f683"}.fa-hammer{--fa:"\f6e3"}.fa-hand-peace{--fa:"\f25b"}.fa-rotate,.fa-sync-alt{--fa:"\f2f1"}.fa-spinner{--fa:"\f110"}.fa-robot{--fa:"\f544"}.fa-peace{--fa:"\f67c"}.fa-cogs,.fa-gears{--fa:"\f085"}.fa-warehouse{--fa:"\f494"}.fa-arrow-up-right-dots{--fa:"\e4b7"}.fa-splotch{--fa:"\f5bc"}.fa-face-grin-hearts,.fa-grin-hearts{--fa:"\f584"}.fa-dice-four{--fa:"\f524"}.fa-sim-card{--fa:"\f7c4"}.fa-transgender,.fa-transgender-alt{--fa:"\f225"}.fa-mercury{--fa:"\f223"}.fa-arrow-turn-down,.fa-level-down{--fa:"\f149"}.fa-person-falling-burst{--fa:"\e547"}.fa-award{--fa:"\f559"}.fa-ticket-alt,.fa-ticket-simple{--fa:"\f3ff"}.fa-building{--fa:"\f1ad"}.fa-angle-double-left,.fa-angles-left{--fa:"\f100"}.fa-qrcode{--fa:"\f029"}.fa-clock-rotate-left,.fa-history{--fa:"\f1da"}.fa-face-grin-beam-sweat,.fa-grin-beam-sweat{--fa:"\f583"}.fa-arrow-right-from-file,.fa-file-export{--fa:"\f56e"}.fa-shield,.fa-shield-blank{--fa:"\f132"}.fa-arrow-up-short-wide,.fa-sort-amount-up-alt{--fa:"\f885"}.fa-comment-nodes{--fa:"\e696"}.fa-house-medical{--fa:"\e3b2"}.fa-golf-ball,.fa-golf-ball-tee{--fa:"\f450"}.fa-chevron-circle-left,.fa-circle-chevron-left{--fa:"\f137"}.fa-house-chimney-window{--fa:"\e00d"}.fa-pen-nib{--fa:"\f5ad"}.fa-tent-arrow-turn-left{--fa:"\e580"}.fa-tents{--fa:"\e582"}.fa-magic,.fa-wand-magic{--fa:"\f0d0"}.fa-dog{--fa:"\f6d3"}.fa-carrot{--fa:"\f787"}.fa-moon{--fa:"\f186"}.fa-wine-glass-alt,.fa-wine-glass-empty{--fa:"\f5ce"}.fa-cheese{--fa:"\f7ef"}.fa-yin-yang{--fa:"\f6ad"}.fa-music{--fa:"\f001"}.fa-code-commit{--fa:"\f386"}.fa-temperature-low{--fa:"\f76b"}.fa-biking,.fa-person-biking{--fa:"\f84a"}.fa-broom{--fa:"\f51a"}.fa-shield-heart{--fa:"\e574"}.fa-gopuram{--fa:"\f664"}.fa-earth-oceania,.fa-globe-oceania{--fa:"\e47b"}.fa-square-xmark,.fa-times-square,.fa-xmark-square{--fa:"\f2d3"}.fa-hashtag{--fa:"\23"}.fa-expand-alt,.fa-up-right-and-down-left-from-center{--fa:"\f424"}.fa-oil-can{--fa:"\f613"}.fa-t{--fa:"\54"}.fa-hippo{--fa:"\f6ed"}.fa-chart-column{--fa:"\e0e3"}.fa-infinity{--fa:"\f534"}.fa-vial-circle-check{--fa:"\e596"}.fa-person-arrow-down-to-line{--fa:"\e538"}.fa-voicemail{--fa:"\f897"}.fa-fan{--fa:"\f863"}.fa-person-walking-luggage{--fa:"\e554"}.fa-arrows-alt-v,.fa-up-down{--fa:"\f338"}.fa-cloud-moon-rain{--fa:"\f73c"}.fa-calendar{--fa:"\f133"}.fa-trailer{--fa:"\e041"}.fa-bahai,.fa-haykal{--fa:"\f666"}.fa-sd-card{--fa:"\f7c2"}.fa-dragon{--fa:"\f6d5"}.fa-shoe-prints{--fa:"\f54b"}.fa-circle-plus,.fa-plus-circle{--fa:"\f055"}.fa-face-grin-tongue-wink,.fa-grin-tongue-wink{--fa:"\f58b"}.fa-hand-holding{--fa:"\f4bd"}.fa-plug-circle-exclamation{--fa:"\e55d"}.fa-chain-broken,.fa-chain-slash,.fa-link-slash,.fa-unlink{--fa:"\f127"}.fa-clone{--fa:"\f24d"}.fa-person-walking-arrow-loop-left{--fa:"\e551"}.fa-arrow-up-z-a,.fa-sort-alpha-up-alt{--fa:"\f882"}.fa-fire-alt,.fa-fire-flame-curved{--fa:"\f7e4"}.fa-tornado{--fa:"\f76f"}.fa-file-circle-plus{--fa:"\e494"}.fa-book-quran,.fa-quran{--fa:"\f687"}.fa-anchor{--fa:"\f13d"}.fa-border-all{--fa:"\f84c"}.fa-angry,.fa-face-angry{--fa:"\f556"}.fa-cookie-bite{--fa:"\f564"}.fa-arrow-trend-down{--fa:"\e097"}.fa-feed,.fa-rss{--fa:"\f09e"}.fa-draw-polygon{--fa:"\f5ee"}.fa-balance-scale,.fa-scale-balanced{--fa:"\f24e"}.fa-gauge-simple-high,.fa-tachometer,.fa-tachometer-fast{--fa:"\f62a"}.fa-shower{--fa:"\f2cc"}.fa-desktop,.fa-desktop-alt{--fa:"\f390"}.fa-m{--fa:"\4d"}.fa-table-list,.fa-th-list{--fa:"\f00b"}.fa-comment-sms,.fa-sms{--fa:"\f7cd"}.fa-book{--fa:"\f02d"}.fa-user-plus{--fa:"\f234"}.fa-check{--fa:"\f00c"}.fa-battery-4,.fa-battery-three-quarters{--fa:"\f241"}.fa-house-circle-check{--fa:"\e509"}.fa-angle-left{--fa:"\f104"}.fa-diagram-successor{--fa:"\e47a"}.fa-truck-arrow-right{--fa:"\e58b"}.fa-arrows-split-up-and-left{--fa:"\e4bc"}.fa-fist-raised,.fa-hand-fist{--fa:"\f6de"}.fa-cloud-moon{--fa:"\f6c3"}.fa-briefcase{--fa:"\f0b1"}.fa-person-falling{--fa:"\e546"}.fa-image-portrait,.fa-portrait{--fa:"\f3e0"}.fa-user-tag{--fa:"\f507"}.fa-rug{--fa:"\e569"}.fa-earth-europe,.fa-globe-europe{--fa:"\f7a2"}.fa-cart-flatbed-suitcase,.fa-luggage-cart{--fa:"\f59d"}.fa-rectangle-times,.fa-rectangle-xmark,.fa-times-rectangle,.fa-window-close{--fa:"\f410"}.fa-baht-sign{--fa:"\e0ac"}.fa-book-open{--fa:"\f518"}.fa-book-journal-whills,.fa-journal-whills{--fa:"\f66a"}.fa-handcuffs{--fa:"\e4f8"}.fa-exclamation-triangle,.fa-triangle-exclamation,.fa-warning{--fa:"\f071"}.fa-database{--fa:"\f1c0"}.fa-mail-forward,.fa-share{--fa:"\f064"}.fa-bottle-droplet{--fa:"\e4c4"}.fa-mask-face{--fa:"\e1d7"}.fa-hill-rockslide{--fa:"\e508"}.fa-exchange-alt,.fa-right-left{--fa:"\f362"}.fa-paper-plane{--fa:"\f1d8"}.fa-road-circle-exclamation{--fa:"\e565"}.fa-dungeon{--fa:"\f6d9"}.fa-align-right{--fa:"\f038"}.fa-money-bill-1-wave,.fa-money-bill-wave-alt{--fa:"\f53b"}.fa-life-ring{--fa:"\f1cd"}.fa-hands,.fa-sign-language,.fa-signing{--fa:"\f2a7"}.fa-calendar-day{--fa:"\f783"}.fa-ladder-water,.fa-swimming-pool,.fa-water-ladder{--fa:"\f5c5"}.fa-arrows-up-down,.fa-arrows-v{--fa:"\f07d"}.fa-face-grimace,.fa-grimace{--fa:"\f57f"}.fa-wheelchair-alt,.fa-wheelchair-move{--fa:"\e2ce"}.fa-level-down-alt,.fa-turn-down{--fa:"\f3be"}.fa-person-walking-arrow-right{--fa:"\e552"}.fa-envelope-square,.fa-square-envelope{--fa:"\f199"}.fa-dice{--fa:"\f522"}.fa-bowling-ball{--fa:"\f436"}.fa-brain{--fa:"\f5dc"}.fa-band-aid,.fa-bandage{--fa:"\f462"}.fa-calendar-minus{--fa:"\f272"}.fa-circle-xmark,.fa-times-circle,.fa-xmark-circle{--fa:"\f057"}.fa-gifts{--fa:"\f79c"}.fa-hotel{--fa:"\f594"}.fa-earth-asia,.fa-globe-asia{--fa:"\f57e"}.fa-id-card-alt,.fa-id-card-clip{--fa:"\f47f"}.fa-magnifying-glass-plus,.fa-search-plus{--fa:"\f00e"}.fa-thumbs-up{--fa:"\f164"}.fa-user-clock{--fa:"\f4fd"}.fa-allergies,.fa-hand-dots{--fa:"\f461"}.fa-file-invoice{--fa:"\f570"}.fa-window-minimize{--fa:"\f2d1"}.fa-coffee,.fa-mug-saucer{--fa:"\f0f4"}.fa-brush{--fa:"\f55d"}.fa-file-half-dashed{--fa:"\e698"}.fa-mask{--fa:"\f6fa"}.fa-magnifying-glass-minus,.fa-search-minus{--fa:"\f010"}.fa-ruler-vertical{--fa:"\f548"}.fa-user-alt,.fa-user-large{--fa:"\f406"}.fa-train-tram{--fa:"\e5b4"}.fa-user-nurse{--fa:"\f82f"}.fa-syringe{--fa:"\f48e"}.fa-cloud-sun{--fa:"\f6c4"}.fa-stopwatch-20{--fa:"\e06f"}.fa-square-full{--fa:"\f45c"}.fa-magnet{--fa:"\f076"}.fa-jar{--fa:"\e516"}.fa-note-sticky,.fa-sticky-note{--fa:"\f249"}.fa-bug-slash{--fa:"\e490"}.fa-arrow-up-from-water-pump{--fa:"\e4b6"}.fa-bone{--fa:"\f5d7"}.fa-table-cells-row-unlock{--fa:"\e691"}.fa-user-injured{--fa:"\f728"}.fa-face-sad-tear,.fa-sad-tear{--fa:"\f5b4"}.fa-plane{--fa:"\f072"}.fa-tent-arrows-down{--fa:"\e581"}.fa-exclamation{--fa:"\21"}.fa-arrows-spin{--fa:"\e4bb"}.fa-print{--fa:"\f02f"}.fa-try,.fa-turkish-lira,.fa-turkish-lira-sign{--fa:"\e2bb"}.fa-dollar,.fa-dollar-sign,.fa-usd{--fa:"\24"}.fa-x{--fa:"\58"}.fa-magnifying-glass-dollar,.fa-search-dollar{--fa:"\f688"}.fa-users-cog,.fa-users-gear{--fa:"\f509"}.fa-person-military-pointing{--fa:"\e54a"}.fa-bank,.fa-building-columns,.fa-institution,.fa-museum,.fa-university{--fa:"\f19c"}.fa-umbrella{--fa:"\f0e9"}.fa-trowel{--fa:"\e589"}.fa-d{--fa:"\44"}.fa-stapler{--fa:"\e5af"}.fa-masks-theater,.fa-theater-masks{--fa:"\f630"}.fa-kip-sign{--fa:"\e1c4"}.fa-hand-point-left{--fa:"\f0a5"}.fa-handshake-alt,.fa-handshake-simple{--fa:"\f4c6"}.fa-fighter-jet,.fa-jet-fighter{--fa:"\f0fb"}.fa-share-alt-square,.fa-square-share-nodes{--fa:"\f1e1"}.fa-barcode{--fa:"\f02a"}.fa-plus-minus{--fa:"\e43c"}.fa-video,.fa-video-camera{--fa:"\f03d"}.fa-graduation-cap,.fa-mortar-board{--fa:"\f19d"}.fa-hand-holding-medical{--fa:"\e05c"}.fa-person-circle-check{--fa:"\e53e"}.fa-level-up-alt,.fa-turn-up{--fa:"\f3bf"}
+.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}
\ No newline at end of file
diff --git a/libai/fontawesome/regular.css b/libai/fontawesome/regular.css
new file mode 100644
index 0000000..be1e468
--- /dev/null
+++ b/libai/fontawesome/regular.css
@@ -0,0 +1,19 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+:root, :host {
+ --fa-style-family-classic: 'Font Awesome 6 Free';
+ --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; }
+
+@font-face {
+ font-family: 'Font Awesome 6 Free';
+ font-style: normal;
+ font-weight: 400;
+ font-display: block;
+ src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }
+
+.far,
+.fa-regular {
+ font-weight: 400; }
diff --git a/libai/fontawesome/regular.min.css b/libai/fontawesome/regular.min.css
new file mode 100644
index 0000000..31256ee
--- /dev/null
+++ b/libai/fontawesome/regular.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}
\ No newline at end of file
diff --git a/libai/fontawesome/solid.css b/libai/fontawesome/solid.css
new file mode 100644
index 0000000..6742be3
--- /dev/null
+++ b/libai/fontawesome/solid.css
@@ -0,0 +1,19 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+:root, :host {
+ --fa-style-family-classic: 'Font Awesome 6 Free';
+ --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; }
+
+@font-face {
+ font-family: 'Font Awesome 6 Free';
+ font-style: normal;
+ font-weight: 900;
+ font-display: block;
+ src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
+
+.fas,
+.fa-solid {
+ font-weight: 900; }
diff --git a/libai/fontawesome/solid.min.css b/libai/fontawesome/solid.min.css
new file mode 100644
index 0000000..8dc0112
--- /dev/null
+++ b/libai/fontawesome/solid.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}
\ No newline at end of file
diff --git a/libai/fontawesome/svg-with-js.css b/libai/fontawesome/svg-with-js.css
new file mode 100644
index 0000000..d780146
--- /dev/null
+++ b/libai/fontawesome/svg-with-js.css
@@ -0,0 +1,461 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+:root, :host {
+ --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free';
+ --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free';
+ --fa-font-light: normal 300 1em/1 'Font Awesome 6 Pro';
+ --fa-font-thin: normal 100 1em/1 'Font Awesome 6 Pro';
+ --fa-font-duotone: normal 900 1em/1 'Font Awesome 6 Duotone';
+ --fa-font-duotone-regular: normal 400 1em/1 'Font Awesome 6 Duotone';
+ --fa-font-duotone-light: normal 300 1em/1 'Font Awesome 6 Duotone';
+ --fa-font-duotone-thin: normal 100 1em/1 'Font Awesome 6 Duotone';
+ --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands';
+ --fa-font-sharp-solid: normal 900 1em/1 'Font Awesome 6 Sharp';
+ --fa-font-sharp-regular: normal 400 1em/1 'Font Awesome 6 Sharp';
+ --fa-font-sharp-light: normal 300 1em/1 'Font Awesome 6 Sharp';
+ --fa-font-sharp-thin: normal 100 1em/1 'Font Awesome 6 Sharp';
+ --fa-font-sharp-duotone-solid: normal 900 1em/1 'Font Awesome 6 Sharp Duotone';
+ --fa-font-sharp-duotone-regular: normal 400 1em/1 'Font Awesome 6 Sharp Duotone';
+ --fa-font-sharp-duotone-light: normal 300 1em/1 'Font Awesome 6 Sharp Duotone';
+ --fa-font-sharp-duotone-thin: normal 100 1em/1 'Font Awesome 6 Sharp Duotone'; }
+
+svg.svg-inline--fa:not(:root), svg.svg-inline--fa:not(:host) {
+ overflow: visible;
+ box-sizing: content-box; }
+
+.svg-inline--fa {
+ display: var(--fa-display, inline-block);
+ height: 1em;
+ overflow: visible;
+ vertical-align: -.125em; }
+ .svg-inline--fa.fa-2xs {
+ vertical-align: 0.1em; }
+ .svg-inline--fa.fa-xs {
+ vertical-align: 0em; }
+ .svg-inline--fa.fa-sm {
+ vertical-align: -0.07143em; }
+ .svg-inline--fa.fa-lg {
+ vertical-align: -0.2em; }
+ .svg-inline--fa.fa-xl {
+ vertical-align: -0.25em; }
+ .svg-inline--fa.fa-2xl {
+ vertical-align: -0.3125em; }
+ .svg-inline--fa.fa-pull-left {
+ margin-right: var(--fa-pull-margin, 0.3em);
+ width: auto; }
+ .svg-inline--fa.fa-pull-right {
+ margin-left: var(--fa-pull-margin, 0.3em);
+ width: auto; }
+ .svg-inline--fa.fa-li {
+ width: var(--fa-li-width, 2em);
+ top: 0.25em; }
+ .svg-inline--fa.fa-fw {
+ width: var(--fa-fw-width, 1.25em); }
+
+.fa-layers svg.svg-inline--fa {
+ bottom: 0;
+ left: 0;
+ margin: auto;
+ position: absolute;
+ right: 0;
+ top: 0; }
+
+.fa-layers-counter, .fa-layers-text {
+ display: inline-block;
+ position: absolute;
+ text-align: center; }
+
+.fa-layers {
+ display: inline-block;
+ height: 1em;
+ position: relative;
+ text-align: center;
+ vertical-align: -.125em;
+ width: 1em; }
+ .fa-layers svg.svg-inline--fa {
+ transform-origin: center center; }
+
+.fa-layers-text {
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ transform-origin: center center; }
+
+.fa-layers-counter {
+ background-color: var(--fa-counter-background-color, #ff253a);
+ border-radius: var(--fa-counter-border-radius, 1em);
+ box-sizing: border-box;
+ color: var(--fa-inverse, #fff);
+ line-height: var(--fa-counter-line-height, 1);
+ max-width: var(--fa-counter-max-width, 5em);
+ min-width: var(--fa-counter-min-width, 1.5em);
+ overflow: hidden;
+ padding: var(--fa-counter-padding, 0.25em 0.5em);
+ right: var(--fa-right, 0);
+ text-overflow: ellipsis;
+ top: var(--fa-top, 0);
+ transform: scale(var(--fa-counter-scale, 0.25));
+ transform-origin: top right; }
+
+.fa-layers-bottom-right {
+ bottom: var(--fa-bottom, 0);
+ right: var(--fa-right, 0);
+ top: auto;
+ transform: scale(var(--fa-layers-scale, 0.25));
+ transform-origin: bottom right; }
+
+.fa-layers-bottom-left {
+ bottom: var(--fa-bottom, 0);
+ left: var(--fa-left, 0);
+ right: auto;
+ top: auto;
+ transform: scale(var(--fa-layers-scale, 0.25));
+ transform-origin: bottom left; }
+
+.fa-layers-top-right {
+ top: var(--fa-top, 0);
+ right: var(--fa-right, 0);
+ transform: scale(var(--fa-layers-scale, 0.25));
+ transform-origin: top right; }
+
+.fa-layers-top-left {
+ left: var(--fa-left, 0);
+ right: auto;
+ top: var(--fa-top, 0);
+ transform: scale(var(--fa-layers-scale, 0.25));
+ transform-origin: top left; }
+
+.fa-1x {
+ font-size: 1em; }
+
+.fa-2x {
+ font-size: 2em; }
+
+.fa-3x {
+ font-size: 3em; }
+
+.fa-4x {
+ font-size: 4em; }
+
+.fa-5x {
+ font-size: 5em; }
+
+.fa-6x {
+ font-size: 6em; }
+
+.fa-7x {
+ font-size: 7em; }
+
+.fa-8x {
+ font-size: 8em; }
+
+.fa-9x {
+ font-size: 9em; }
+
+.fa-10x {
+ font-size: 10em; }
+
+.fa-2xs {
+ font-size: 0.625em;
+ line-height: 0.1em;
+ vertical-align: 0.225em; }
+
+.fa-xs {
+ font-size: 0.75em;
+ line-height: 0.08333em;
+ vertical-align: 0.125em; }
+
+.fa-sm {
+ font-size: 0.875em;
+ line-height: 0.07143em;
+ vertical-align: 0.05357em; }
+
+.fa-lg {
+ font-size: 1.25em;
+ line-height: 0.05em;
+ vertical-align: -0.075em; }
+
+.fa-xl {
+ font-size: 1.5em;
+ line-height: 0.04167em;
+ vertical-align: -0.125em; }
+
+.fa-2xl {
+ font-size: 2em;
+ line-height: 0.03125em;
+ vertical-align: -0.1875em; }
+
+.fa-fw {
+ text-align: center;
+ width: 1.25em; }
+
+.fa-ul {
+ list-style-type: none;
+ margin-left: var(--fa-li-margin, 2.5em);
+ padding-left: 0; }
+ .fa-ul > li {
+ position: relative; }
+
+.fa-li {
+ left: calc(-1 * var(--fa-li-width, 2em));
+ position: absolute;
+ text-align: center;
+ width: var(--fa-li-width, 2em);
+ line-height: inherit; }
+
+.fa-border {
+ border-color: var(--fa-border-color, #eee);
+ border-radius: var(--fa-border-radius, 0.1em);
+ border-style: var(--fa-border-style, solid);
+ border-width: var(--fa-border-width, 0.08em);
+ padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); }
+
+.fa-pull-left {
+ float: left;
+ margin-right: var(--fa-pull-margin, 0.3em); }
+
+.fa-pull-right {
+ float: right;
+ margin-left: var(--fa-pull-margin, 0.3em); }
+
+.fa-beat {
+ animation-name: fa-beat;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, ease-in-out); }
+
+.fa-bounce {
+ animation-name: fa-bounce;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
+
+.fa-fade {
+ animation-name: fa-fade;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
+
+.fa-beat-fade {
+ animation-name: fa-beat-fade;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
+
+.fa-flip {
+ animation-name: fa-flip;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, ease-in-out); }
+
+.fa-shake {
+ animation-name: fa-shake;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, linear); }
+
+.fa-spin {
+ animation-name: fa-spin;
+ animation-delay: var(--fa-animation-delay, 0s);
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 2s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, linear); }
+
+.fa-spin-reverse {
+ --fa-animation-direction: reverse; }
+
+.fa-pulse,
+.fa-spin-pulse {
+ animation-name: fa-spin;
+ animation-direction: var(--fa-animation-direction, normal);
+ animation-duration: var(--fa-animation-duration, 1s);
+ animation-iteration-count: var(--fa-animation-iteration-count, infinite);
+ animation-timing-function: var(--fa-animation-timing, steps(8)); }
+
+@media (prefers-reduced-motion: reduce) {
+ .fa-beat,
+ .fa-bounce,
+ .fa-fade,
+ .fa-beat-fade,
+ .fa-flip,
+ .fa-pulse,
+ .fa-shake,
+ .fa-spin,
+ .fa-spin-pulse {
+ animation-delay: -1ms;
+ animation-duration: 1ms;
+ animation-iteration-count: 1;
+ transition-delay: 0s;
+ transition-duration: 0s; } }
+
+@keyframes fa-beat {
+ 0%, 90% {
+ transform: scale(1); }
+ 45% {
+ transform: scale(var(--fa-beat-scale, 1.25)); } }
+
+@keyframes fa-bounce {
+ 0% {
+ transform: scale(1, 1) translateY(0); }
+ 10% {
+ transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
+ 30% {
+ transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
+ 50% {
+ transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
+ 57% {
+ transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
+ 64% {
+ transform: scale(1, 1) translateY(0); }
+ 100% {
+ transform: scale(1, 1) translateY(0); } }
+
+@keyframes fa-fade {
+ 50% {
+ opacity: var(--fa-fade-opacity, 0.4); } }
+
+@keyframes fa-beat-fade {
+ 0%, 100% {
+ opacity: var(--fa-beat-fade-opacity, 0.4);
+ transform: scale(1); }
+ 50% {
+ opacity: 1;
+ transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
+
+@keyframes fa-flip {
+ 50% {
+ transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
+
+@keyframes fa-shake {
+ 0% {
+ transform: rotate(-15deg); }
+ 4% {
+ transform: rotate(15deg); }
+ 8%, 24% {
+ transform: rotate(-18deg); }
+ 12%, 28% {
+ transform: rotate(18deg); }
+ 16% {
+ transform: rotate(-22deg); }
+ 20% {
+ transform: rotate(22deg); }
+ 32% {
+ transform: rotate(-12deg); }
+ 36% {
+ transform: rotate(12deg); }
+ 40%, 100% {
+ transform: rotate(0deg); } }
+
+@keyframes fa-spin {
+ 0% {
+ transform: rotate(0deg); }
+ 100% {
+ transform: rotate(360deg); } }
+
+.fa-rotate-90 {
+ transform: rotate(90deg); }
+
+.fa-rotate-180 {
+ transform: rotate(180deg); }
+
+.fa-rotate-270 {
+ transform: rotate(270deg); }
+
+.fa-flip-horizontal {
+ transform: scale(-1, 1); }
+
+.fa-flip-vertical {
+ transform: scale(1, -1); }
+
+.fa-flip-both,
+.fa-flip-horizontal.fa-flip-vertical {
+ transform: scale(-1, -1); }
+
+.fa-rotate-by {
+ transform: rotate(var(--fa-rotate-angle, 0)); }
+
+.fa-stack {
+ display: inline-block;
+ vertical-align: middle;
+ height: 2em;
+ position: relative;
+ width: 2.5em; }
+
+.fa-stack-1x,
+.fa-stack-2x {
+ bottom: 0;
+ left: 0;
+ margin: auto;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: var(--fa-stack-z-index, auto); }
+
+.svg-inline--fa.fa-stack-1x {
+ height: 1em;
+ width: 1.25em; }
+
+.svg-inline--fa.fa-stack-2x {
+ height: 2em;
+ width: 2.5em; }
+
+.fa-inverse {
+ color: var(--fa-inverse, #fff); }
+
+.sr-only,
+.fa-sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0; }
+
+.sr-only-focusable:not(:focus),
+.fa-sr-only-focusable:not(:focus) {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0; }
+
+.svg-inline--fa .fa-primary {
+ fill: var(--fa-primary-color, currentColor);
+ opacity: var(--fa-primary-opacity, 1); }
+
+.svg-inline--fa .fa-secondary {
+ fill: var(--fa-secondary-color, currentColor);
+ opacity: var(--fa-secondary-opacity, 0.4); }
+
+.svg-inline--fa.fa-swap-opacity .fa-primary {
+ opacity: var(--fa-secondary-opacity, 0.4); }
+
+.svg-inline--fa.fa-swap-opacity .fa-secondary {
+ opacity: var(--fa-primary-opacity, 1); }
+
+.svg-inline--fa mask .fa-primary,
+.svg-inline--fa mask .fa-secondary {
+ fill: black; }
diff --git a/libai/fontawesome/svg-with-js.min.css b/libai/fontawesome/svg-with-js.min.css
new file mode 100644
index 0000000..cb091a6
--- /dev/null
+++ b/libai/fontawesome/svg-with-js.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+:host,:root{--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free";--fa-font-light:normal 300 1em/1 "Font Awesome 6 Pro";--fa-font-thin:normal 100 1em/1 "Font Awesome 6 Pro";--fa-font-duotone:normal 900 1em/1 "Font Awesome 6 Duotone";--fa-font-duotone-regular:normal 400 1em/1 "Font Awesome 6 Duotone";--fa-font-duotone-light:normal 300 1em/1 "Font Awesome 6 Duotone";--fa-font-duotone-thin:normal 100 1em/1 "Font Awesome 6 Duotone";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands";--fa-font-sharp-solid:normal 900 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-regular:normal 400 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-light:normal 300 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-thin:normal 100 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-duotone-solid:normal 900 1em/1 "Font Awesome 6 Sharp Duotone";--fa-font-sharp-duotone-regular:normal 400 1em/1 "Font Awesome 6 Sharp Duotone";--fa-font-sharp-duotone-light:normal 300 1em/1 "Font Awesome 6 Sharp Duotone";--fa-font-sharp-duotone-thin:normal 100 1em/1 "Font Awesome 6 Sharp Duotone"}svg.svg-inline--fa:not(:host),svg.svg-inline--fa:not(:root){overflow:visible;box-sizing:initial}.svg-inline--fa{display:var(--fa-display,inline-block);height:1em;overflow:visible;vertical-align:-.125em}.svg-inline--fa.fa-2xs{vertical-align:.1em}.svg-inline--fa.fa-xs{vertical-align:0}.svg-inline--fa.fa-sm{vertical-align:-.07143em}.svg-inline--fa.fa-lg{vertical-align:-.2em}.svg-inline--fa.fa-xl{vertical-align:-.25em}.svg-inline--fa.fa-2xl{vertical-align:-.3125em}.svg-inline--fa.fa-pull-left{margin-right:var(--fa-pull-margin,.3em);width:auto}.svg-inline--fa.fa-pull-right{margin-left:var(--fa-pull-margin,.3em);width:auto}.svg-inline--fa.fa-li{width:var(--fa-li-width,2em);top:.25em}.svg-inline--fa.fa-fw{width:var(--fa-fw-width,1.25em)}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{transform-origin:center center}.fa-layers-text{left:50%;top:50%;transform:translate(-50%,-50%);transform-origin:center center}.fa-layers-counter{background-color:var(--fa-counter-background-color,#ff253a);border-radius:var(--fa-counter-border-radius,1em);box-sizing:border-box;color:var(--fa-inverse,#fff);line-height:var(--fa-counter-line-height,1);max-width:var(--fa-counter-max-width,5em);min-width:var(--fa-counter-min-width,1.5em);overflow:hidden;padding:var(--fa-counter-padding,.25em .5em);right:var(--fa-right,0);text-overflow:ellipsis;top:var(--fa-top,0);transform:scale(var(--fa-counter-scale,.25));transform-origin:top right}.fa-layers-bottom-right{bottom:var(--fa-bottom,0);right:var(--fa-right,0);top:auto;transform:scale(var(--fa-layers-scale,.25));transform-origin:bottom right}.fa-layers-bottom-left{bottom:var(--fa-bottom,0);left:var(--fa-left,0);right:auto;top:auto;transform:scale(var(--fa-layers-scale,.25));transform-origin:bottom left}.fa-layers-top-right{top:var(--fa-top,0);right:var(--fa-right,0);transform:scale(var(--fa-layers-scale,.25));transform-origin:top right}.fa-layers-top-left{left:var(--fa-left,0);right:auto;top:var(--fa-top,0);transform:scale(var(--fa-layers-scale,.25));transform-origin:top left}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;vertical-align:middle;height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0;z-index:var(--fa-stack-z-index,auto)}.svg-inline--fa.fa-stack-1x{height:1em;width:1.25em}.svg-inline--fa.fa-stack-2x{height:2em;width:2.5em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.svg-inline--fa .fa-primary{fill:var(--fa-primary-color,currentColor);opacity:var(--fa-primary-opacity,1)}.svg-inline--fa .fa-secondary{fill:var(--fa-secondary-color,currentColor)}.svg-inline--fa .fa-secondary,.svg-inline--fa.fa-swap-opacity .fa-primary{opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-secondary{opacity:var(--fa-primary-opacity,1)}.svg-inline--fa mask .fa-primary,.svg-inline--fa mask .fa-secondary{fill:#000}
\ No newline at end of file
diff --git a/libai/fontawesome/v4-font-face.css b/libai/fontawesome/v4-font-face.css
new file mode 100644
index 0000000..c453a99
--- /dev/null
+++ b/libai/fontawesome/v4-font-face.css
@@ -0,0 +1,26 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+@font-face {
+ font-family: 'FontAwesome';
+ font-display: block;
+ src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
+
+@font-face {
+ font-family: 'FontAwesome';
+ font-display: block;
+ src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
+
+@font-face {
+ font-family: 'FontAwesome';
+ font-display: block;
+ src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype");
+ unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; }
+
+@font-face {
+ font-family: 'FontAwesome';
+ font-display: block;
+ src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype");
+ unicode-range: U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A; }
diff --git a/libai/fontawesome/v4-font-face.min.css b/libai/fontawesome/v4-font-face.min.css
new file mode 100644
index 0000000..fa58107
--- /dev/null
+++ b/libai/fontawesome/v4-font-face.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
\ No newline at end of file
diff --git a/libai/fontawesome/v4-shims.css b/libai/fontawesome/v4-shims.css
new file mode 100644
index 0000000..7ed4af7
--- /dev/null
+++ b/libai/fontawesome/v4-shims.css
@@ -0,0 +1,2194 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+.fa.fa-glass {
+ --fa: "\f000"; }
+
+.fa.fa-envelope-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-envelope-o {
+ --fa: "\f0e0"; }
+
+.fa.fa-star-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-star-o {
+ --fa: "\f005"; }
+
+.fa.fa-remove {
+ --fa: "\f00d"; }
+
+.fa.fa-close {
+ --fa: "\f00d"; }
+
+.fa.fa-gear {
+ --fa: "\f013"; }
+
+.fa.fa-trash-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-trash-o {
+ --fa: "\f2ed"; }
+
+.fa.fa-home {
+ --fa: "\f015"; }
+
+.fa.fa-file-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-o {
+ --fa: "\f15b"; }
+
+.fa.fa-clock-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-clock-o {
+ --fa: "\f017"; }
+
+.fa.fa-arrow-circle-o-down {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-arrow-circle-o-down {
+ --fa: "\f358"; }
+
+.fa.fa-arrow-circle-o-up {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-arrow-circle-o-up {
+ --fa: "\f35b"; }
+
+.fa.fa-play-circle-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-play-circle-o {
+ --fa: "\f144"; }
+
+.fa.fa-repeat {
+ --fa: "\f01e"; }
+
+.fa.fa-rotate-right {
+ --fa: "\f01e"; }
+
+.fa.fa-refresh {
+ --fa: "\f021"; }
+
+.fa.fa-list-alt {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-list-alt {
+ --fa: "\f022"; }
+
+.fa.fa-dedent {
+ --fa: "\f03b"; }
+
+.fa.fa-video-camera {
+ --fa: "\f03d"; }
+
+.fa.fa-picture-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-picture-o {
+ --fa: "\f03e"; }
+
+.fa.fa-photo {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-photo {
+ --fa: "\f03e"; }
+
+.fa.fa-image {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-image {
+ --fa: "\f03e"; }
+
+.fa.fa-map-marker {
+ --fa: "\f3c5"; }
+
+.fa.fa-pencil-square-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-pencil-square-o {
+ --fa: "\f044"; }
+
+.fa.fa-edit {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-edit {
+ --fa: "\f044"; }
+
+.fa.fa-share-square-o {
+ --fa: "\f14d"; }
+
+.fa.fa-check-square-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-check-square-o {
+ --fa: "\f14a"; }
+
+.fa.fa-arrows {
+ --fa: "\f0b2"; }
+
+.fa.fa-times-circle-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-times-circle-o {
+ --fa: "\f057"; }
+
+.fa.fa-check-circle-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-check-circle-o {
+ --fa: "\f058"; }
+
+.fa.fa-mail-forward {
+ --fa: "\f064"; }
+
+.fa.fa-expand {
+ --fa: "\f424"; }
+
+.fa.fa-compress {
+ --fa: "\f422"; }
+
+.fa.fa-eye {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-eye-slash {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-warning {
+ --fa: "\f071"; }
+
+.fa.fa-calendar {
+ --fa: "\f073"; }
+
+.fa.fa-arrows-v {
+ --fa: "\f338"; }
+
+.fa.fa-arrows-h {
+ --fa: "\f337"; }
+
+.fa.fa-bar-chart {
+ --fa: "\e0e3"; }
+
+.fa.fa-bar-chart-o {
+ --fa: "\e0e3"; }
+
+.fa.fa-twitter-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-twitter-square {
+ --fa: "\f081"; }
+
+.fa.fa-facebook-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-facebook-square {
+ --fa: "\f082"; }
+
+.fa.fa-gears {
+ --fa: "\f085"; }
+
+.fa.fa-thumbs-o-up {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-thumbs-o-up {
+ --fa: "\f164"; }
+
+.fa.fa-thumbs-o-down {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-thumbs-o-down {
+ --fa: "\f165"; }
+
+.fa.fa-heart-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-heart-o {
+ --fa: "\f004"; }
+
+.fa.fa-sign-out {
+ --fa: "\f2f5"; }
+
+.fa.fa-linkedin-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-linkedin-square {
+ --fa: "\f08c"; }
+
+.fa.fa-thumb-tack {
+ --fa: "\f08d"; }
+
+.fa.fa-external-link {
+ --fa: "\f35d"; }
+
+.fa.fa-sign-in {
+ --fa: "\f2f6"; }
+
+.fa.fa-github-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-github-square {
+ --fa: "\f092"; }
+
+.fa.fa-lemon-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-lemon-o {
+ --fa: "\f094"; }
+
+.fa.fa-square-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-square-o {
+ --fa: "\f0c8"; }
+
+.fa.fa-bookmark-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-bookmark-o {
+ --fa: "\f02e"; }
+
+.fa.fa-twitter {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-facebook {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-facebook {
+ --fa: "\f39e"; }
+
+.fa.fa-facebook-f {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-facebook-f {
+ --fa: "\f39e"; }
+
+.fa.fa-github {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-credit-card {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-feed {
+ --fa: "\f09e"; }
+
+.fa.fa-hdd-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hdd-o {
+ --fa: "\f0a0"; }
+
+.fa.fa-hand-o-right {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-o-right {
+ --fa: "\f0a4"; }
+
+.fa.fa-hand-o-left {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-o-left {
+ --fa: "\f0a5"; }
+
+.fa.fa-hand-o-up {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-o-up {
+ --fa: "\f0a6"; }
+
+.fa.fa-hand-o-down {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-o-down {
+ --fa: "\f0a7"; }
+
+.fa.fa-globe {
+ --fa: "\f57d"; }
+
+.fa.fa-tasks {
+ --fa: "\f828"; }
+
+.fa.fa-arrows-alt {
+ --fa: "\f31e"; }
+
+.fa.fa-group {
+ --fa: "\f0c0"; }
+
+.fa.fa-chain {
+ --fa: "\f0c1"; }
+
+.fa.fa-cut {
+ --fa: "\f0c4"; }
+
+.fa.fa-files-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-files-o {
+ --fa: "\f0c5"; }
+
+.fa.fa-floppy-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-floppy-o {
+ --fa: "\f0c7"; }
+
+.fa.fa-save {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-save {
+ --fa: "\f0c7"; }
+
+.fa.fa-navicon {
+ --fa: "\f0c9"; }
+
+.fa.fa-reorder {
+ --fa: "\f0c9"; }
+
+.fa.fa-magic {
+ --fa: "\e2ca"; }
+
+.fa.fa-pinterest {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-pinterest-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-pinterest-square {
+ --fa: "\f0d3"; }
+
+.fa.fa-google-plus-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-google-plus-square {
+ --fa: "\f0d4"; }
+
+.fa.fa-google-plus {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-google-plus {
+ --fa: "\f0d5"; }
+
+.fa.fa-money {
+ --fa: "\f3d1"; }
+
+.fa.fa-unsorted {
+ --fa: "\f0dc"; }
+
+.fa.fa-sort-desc {
+ --fa: "\f0dd"; }
+
+.fa.fa-sort-asc {
+ --fa: "\f0de"; }
+
+.fa.fa-linkedin {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-linkedin {
+ --fa: "\f0e1"; }
+
+.fa.fa-rotate-left {
+ --fa: "\f0e2"; }
+
+.fa.fa-legal {
+ --fa: "\f0e3"; }
+
+.fa.fa-tachometer {
+ --fa: "\f625"; }
+
+.fa.fa-dashboard {
+ --fa: "\f625"; }
+
+.fa.fa-comment-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-comment-o {
+ --fa: "\f075"; }
+
+.fa.fa-comments-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-comments-o {
+ --fa: "\f086"; }
+
+.fa.fa-flash {
+ --fa: "\f0e7"; }
+
+.fa.fa-clipboard {
+ --fa: "\f0ea"; }
+
+.fa.fa-lightbulb-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-lightbulb-o {
+ --fa: "\f0eb"; }
+
+.fa.fa-exchange {
+ --fa: "\f362"; }
+
+.fa.fa-cloud-download {
+ --fa: "\f0ed"; }
+
+.fa.fa-cloud-upload {
+ --fa: "\f0ee"; }
+
+.fa.fa-bell-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-bell-o {
+ --fa: "\f0f3"; }
+
+.fa.fa-cutlery {
+ --fa: "\f2e7"; }
+
+.fa.fa-file-text-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-text-o {
+ --fa: "\f15c"; }
+
+.fa.fa-building-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-building-o {
+ --fa: "\f1ad"; }
+
+.fa.fa-hospital-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hospital-o {
+ --fa: "\f0f8"; }
+
+.fa.fa-tablet {
+ --fa: "\f3fa"; }
+
+.fa.fa-mobile {
+ --fa: "\f3cd"; }
+
+.fa.fa-mobile-phone {
+ --fa: "\f3cd"; }
+
+.fa.fa-circle-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-circle-o {
+ --fa: "\f111"; }
+
+.fa.fa-mail-reply {
+ --fa: "\f3e5"; }
+
+.fa.fa-github-alt {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-folder-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-folder-o {
+ --fa: "\f07b"; }
+
+.fa.fa-folder-open-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-folder-open-o {
+ --fa: "\f07c"; }
+
+.fa.fa-smile-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-smile-o {
+ --fa: "\f118"; }
+
+.fa.fa-frown-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-frown-o {
+ --fa: "\f119"; }
+
+.fa.fa-meh-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-meh-o {
+ --fa: "\f11a"; }
+
+.fa.fa-keyboard-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-keyboard-o {
+ --fa: "\f11c"; }
+
+.fa.fa-flag-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-flag-o {
+ --fa: "\f024"; }
+
+.fa.fa-mail-reply-all {
+ --fa: "\f122"; }
+
+.fa.fa-star-half-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-star-half-o {
+ --fa: "\f5c0"; }
+
+.fa.fa-star-half-empty {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-star-half-empty {
+ --fa: "\f5c0"; }
+
+.fa.fa-star-half-full {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-star-half-full {
+ --fa: "\f5c0"; }
+
+.fa.fa-code-fork {
+ --fa: "\f126"; }
+
+.fa.fa-chain-broken {
+ --fa: "\f127"; }
+
+.fa.fa-unlink {
+ --fa: "\f127"; }
+
+.fa.fa-calendar-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-calendar-o {
+ --fa: "\f133"; }
+
+.fa.fa-maxcdn {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-html5 {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-css3 {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-unlock-alt {
+ --fa: "\f09c"; }
+
+.fa.fa-minus-square-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-minus-square-o {
+ --fa: "\f146"; }
+
+.fa.fa-level-up {
+ --fa: "\f3bf"; }
+
+.fa.fa-level-down {
+ --fa: "\f3be"; }
+
+.fa.fa-pencil-square {
+ --fa: "\f14b"; }
+
+.fa.fa-external-link-square {
+ --fa: "\f360"; }
+
+.fa.fa-compass {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-caret-square-o-down {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-caret-square-o-down {
+ --fa: "\f150"; }
+
+.fa.fa-toggle-down {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-toggle-down {
+ --fa: "\f150"; }
+
+.fa.fa-caret-square-o-up {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-caret-square-o-up {
+ --fa: "\f151"; }
+
+.fa.fa-toggle-up {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-toggle-up {
+ --fa: "\f151"; }
+
+.fa.fa-caret-square-o-right {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-caret-square-o-right {
+ --fa: "\f152"; }
+
+.fa.fa-toggle-right {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-toggle-right {
+ --fa: "\f152"; }
+
+.fa.fa-eur {
+ --fa: "\f153"; }
+
+.fa.fa-euro {
+ --fa: "\f153"; }
+
+.fa.fa-gbp {
+ --fa: "\f154"; }
+
+.fa.fa-usd {
+ --fa: "\24"; }
+
+.fa.fa-dollar {
+ --fa: "\24"; }
+
+.fa.fa-inr {
+ --fa: "\e1bc"; }
+
+.fa.fa-rupee {
+ --fa: "\e1bc"; }
+
+.fa.fa-jpy {
+ --fa: "\f157"; }
+
+.fa.fa-cny {
+ --fa: "\f157"; }
+
+.fa.fa-rmb {
+ --fa: "\f157"; }
+
+.fa.fa-yen {
+ --fa: "\f157"; }
+
+.fa.fa-rub {
+ --fa: "\f158"; }
+
+.fa.fa-ruble {
+ --fa: "\f158"; }
+
+.fa.fa-rouble {
+ --fa: "\f158"; }
+
+.fa.fa-krw {
+ --fa: "\f159"; }
+
+.fa.fa-won {
+ --fa: "\f159"; }
+
+.fa.fa-btc {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-bitcoin {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-bitcoin {
+ --fa: "\f15a"; }
+
+.fa.fa-file-text {
+ --fa: "\f15c"; }
+
+.fa.fa-sort-alpha-asc {
+ --fa: "\f15d"; }
+
+.fa.fa-sort-alpha-desc {
+ --fa: "\f881"; }
+
+.fa.fa-sort-amount-asc {
+ --fa: "\f884"; }
+
+.fa.fa-sort-amount-desc {
+ --fa: "\f160"; }
+
+.fa.fa-sort-numeric-asc {
+ --fa: "\f162"; }
+
+.fa.fa-sort-numeric-desc {
+ --fa: "\f886"; }
+
+.fa.fa-youtube-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-youtube-square {
+ --fa: "\f431"; }
+
+.fa.fa-youtube {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-xing {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-xing-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-xing-square {
+ --fa: "\f169"; }
+
+.fa.fa-youtube-play {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-youtube-play {
+ --fa: "\f167"; }
+
+.fa.fa-dropbox {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-stack-overflow {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-instagram {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-flickr {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-adn {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-bitbucket {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-bitbucket-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-bitbucket-square {
+ --fa: "\f171"; }
+
+.fa.fa-tumblr {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-tumblr-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-tumblr-square {
+ --fa: "\f174"; }
+
+.fa.fa-long-arrow-down {
+ --fa: "\f309"; }
+
+.fa.fa-long-arrow-up {
+ --fa: "\f30c"; }
+
+.fa.fa-long-arrow-left {
+ --fa: "\f30a"; }
+
+.fa.fa-long-arrow-right {
+ --fa: "\f30b"; }
+
+.fa.fa-apple {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-windows {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-android {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-linux {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-dribbble {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-skype {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-foursquare {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-trello {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-gratipay {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-gittip {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-gittip {
+ --fa: "\f184"; }
+
+.fa.fa-sun-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-sun-o {
+ --fa: "\f185"; }
+
+.fa.fa-moon-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-moon-o {
+ --fa: "\f186"; }
+
+.fa.fa-vk {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-weibo {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-renren {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-pagelines {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-stack-exchange {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-arrow-circle-o-right {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-arrow-circle-o-right {
+ --fa: "\f35a"; }
+
+.fa.fa-arrow-circle-o-left {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-arrow-circle-o-left {
+ --fa: "\f359"; }
+
+.fa.fa-caret-square-o-left {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-caret-square-o-left {
+ --fa: "\f191"; }
+
+.fa.fa-toggle-left {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-toggle-left {
+ --fa: "\f191"; }
+
+.fa.fa-dot-circle-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-dot-circle-o {
+ --fa: "\f192"; }
+
+.fa.fa-vimeo-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-vimeo-square {
+ --fa: "\f194"; }
+
+.fa.fa-try {
+ --fa: "\e2bb"; }
+
+.fa.fa-turkish-lira {
+ --fa: "\e2bb"; }
+
+.fa.fa-plus-square-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-plus-square-o {
+ --fa: "\f0fe"; }
+
+.fa.fa-slack {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-wordpress {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-openid {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-institution {
+ --fa: "\f19c"; }
+
+.fa.fa-bank {
+ --fa: "\f19c"; }
+
+.fa.fa-mortar-board {
+ --fa: "\f19d"; }
+
+.fa.fa-yahoo {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-google {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-reddit {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-reddit-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-reddit-square {
+ --fa: "\f1a2"; }
+
+.fa.fa-stumbleupon-circle {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-stumbleupon {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-delicious {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-digg {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-pied-piper-pp {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-pied-piper-alt {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-drupal {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-joomla {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-behance {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-behance-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-behance-square {
+ --fa: "\f1b5"; }
+
+.fa.fa-steam {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-steam-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-steam-square {
+ --fa: "\f1b7"; }
+
+.fa.fa-automobile {
+ --fa: "\f1b9"; }
+
+.fa.fa-cab {
+ --fa: "\f1ba"; }
+
+.fa.fa-spotify {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-deviantart {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-soundcloud {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-file-pdf-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-pdf-o {
+ --fa: "\f1c1"; }
+
+.fa.fa-file-word-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-word-o {
+ --fa: "\f1c2"; }
+
+.fa.fa-file-excel-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-excel-o {
+ --fa: "\f1c3"; }
+
+.fa.fa-file-powerpoint-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-powerpoint-o {
+ --fa: "\f1c4"; }
+
+.fa.fa-file-image-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-image-o {
+ --fa: "\f1c5"; }
+
+.fa.fa-file-photo-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-photo-o {
+ --fa: "\f1c5"; }
+
+.fa.fa-file-picture-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-picture-o {
+ --fa: "\f1c5"; }
+
+.fa.fa-file-archive-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-archive-o {
+ --fa: "\f1c6"; }
+
+.fa.fa-file-zip-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-zip-o {
+ --fa: "\f1c6"; }
+
+.fa.fa-file-audio-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-audio-o {
+ --fa: "\f1c7"; }
+
+.fa.fa-file-sound-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-sound-o {
+ --fa: "\f1c7"; }
+
+.fa.fa-file-video-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-video-o {
+ --fa: "\f1c8"; }
+
+.fa.fa-file-movie-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-movie-o {
+ --fa: "\f1c8"; }
+
+.fa.fa-file-code-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-file-code-o {
+ --fa: "\f1c9"; }
+
+.fa.fa-vine {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-codepen {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-jsfiddle {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-life-bouy {
+ --fa: "\f1cd"; }
+
+.fa.fa-life-buoy {
+ --fa: "\f1cd"; }
+
+.fa.fa-life-saver {
+ --fa: "\f1cd"; }
+
+.fa.fa-support {
+ --fa: "\f1cd"; }
+
+.fa.fa-circle-o-notch {
+ --fa: "\f1ce"; }
+
+.fa.fa-rebel {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-ra {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-ra {
+ --fa: "\f1d0"; }
+
+.fa.fa-resistance {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-resistance {
+ --fa: "\f1d0"; }
+
+.fa.fa-empire {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-ge {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-ge {
+ --fa: "\f1d1"; }
+
+.fa.fa-git-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-git-square {
+ --fa: "\f1d2"; }
+
+.fa.fa-git {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-hacker-news {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-y-combinator-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-y-combinator-square {
+ --fa: "\f1d4"; }
+
+.fa.fa-yc-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-yc-square {
+ --fa: "\f1d4"; }
+
+.fa.fa-tencent-weibo {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-qq {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-weixin {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-wechat {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-wechat {
+ --fa: "\f1d7"; }
+
+.fa.fa-send {
+ --fa: "\f1d8"; }
+
+.fa.fa-paper-plane-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-paper-plane-o {
+ --fa: "\f1d8"; }
+
+.fa.fa-send-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-send-o {
+ --fa: "\f1d8"; }
+
+.fa.fa-circle-thin {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-circle-thin {
+ --fa: "\f111"; }
+
+.fa.fa-header {
+ --fa: "\f1dc"; }
+
+.fa.fa-futbol-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-futbol-o {
+ --fa: "\f1e3"; }
+
+.fa.fa-soccer-ball-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-soccer-ball-o {
+ --fa: "\f1e3"; }
+
+.fa.fa-slideshare {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-twitch {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-yelp {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-newspaper-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-newspaper-o {
+ --fa: "\f1ea"; }
+
+.fa.fa-paypal {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-google-wallet {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-visa {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-mastercard {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-discover {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-amex {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-paypal {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-stripe {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-bell-slash-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-bell-slash-o {
+ --fa: "\f1f6"; }
+
+.fa.fa-trash {
+ --fa: "\f2ed"; }
+
+.fa.fa-copyright {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-eyedropper {
+ --fa: "\f1fb"; }
+
+.fa.fa-area-chart {
+ --fa: "\f1fe"; }
+
+.fa.fa-pie-chart {
+ --fa: "\f200"; }
+
+.fa.fa-line-chart {
+ --fa: "\f201"; }
+
+.fa.fa-lastfm {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-lastfm-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-lastfm-square {
+ --fa: "\f203"; }
+
+.fa.fa-ioxhost {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-angellist {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-cc {
+ --fa: "\f20a"; }
+
+.fa.fa-ils {
+ --fa: "\f20b"; }
+
+.fa.fa-shekel {
+ --fa: "\f20b"; }
+
+.fa.fa-sheqel {
+ --fa: "\f20b"; }
+
+.fa.fa-buysellads {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-connectdevelop {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-dashcube {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-forumbee {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-leanpub {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-sellsy {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-shirtsinbulk {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-simplybuilt {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-skyatlas {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-diamond {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-diamond {
+ --fa: "\f3a5"; }
+
+.fa.fa-transgender {
+ --fa: "\f224"; }
+
+.fa.fa-intersex {
+ --fa: "\f224"; }
+
+.fa.fa-transgender-alt {
+ --fa: "\f225"; }
+
+.fa.fa-facebook-official {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-facebook-official {
+ --fa: "\f09a"; }
+
+.fa.fa-pinterest-p {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-whatsapp {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-hotel {
+ --fa: "\f236"; }
+
+.fa.fa-viacoin {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-medium {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-y-combinator {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-yc {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-yc {
+ --fa: "\f23b"; }
+
+.fa.fa-optin-monster {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-opencart {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-expeditedssl {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-battery-4 {
+ --fa: "\f240"; }
+
+.fa.fa-battery {
+ --fa: "\f240"; }
+
+.fa.fa-battery-3 {
+ --fa: "\f241"; }
+
+.fa.fa-battery-2 {
+ --fa: "\f242"; }
+
+.fa.fa-battery-1 {
+ --fa: "\f243"; }
+
+.fa.fa-battery-0 {
+ --fa: "\f244"; }
+
+.fa.fa-object-group {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-object-ungroup {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-sticky-note-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-sticky-note-o {
+ --fa: "\f249"; }
+
+.fa.fa-cc-jcb {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-diners-club {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-clone {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hourglass-o {
+ --fa: "\f254"; }
+
+.fa.fa-hourglass-1 {
+ --fa: "\f251"; }
+
+.fa.fa-hourglass-2 {
+ --fa: "\f252"; }
+
+.fa.fa-hourglass-3 {
+ --fa: "\f253"; }
+
+.fa.fa-hand-rock-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-rock-o {
+ --fa: "\f255"; }
+
+.fa.fa-hand-grab-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-grab-o {
+ --fa: "\f255"; }
+
+.fa.fa-hand-paper-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-paper-o {
+ --fa: "\f256"; }
+
+.fa.fa-hand-stop-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-stop-o {
+ --fa: "\f256"; }
+
+.fa.fa-hand-scissors-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-scissors-o {
+ --fa: "\f257"; }
+
+.fa.fa-hand-lizard-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-lizard-o {
+ --fa: "\f258"; }
+
+.fa.fa-hand-spock-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-spock-o {
+ --fa: "\f259"; }
+
+.fa.fa-hand-pointer-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-pointer-o {
+ --fa: "\f25a"; }
+
+.fa.fa-hand-peace-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-peace-o {
+ --fa: "\f25b"; }
+
+.fa.fa-registered {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-creative-commons {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-gg {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-gg-circle {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-odnoklassniki {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-odnoklassniki-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-odnoklassniki-square {
+ --fa: "\f264"; }
+
+.fa.fa-get-pocket {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-wikipedia-w {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-safari {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-chrome {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-firefox {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-opera {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-internet-explorer {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-television {
+ --fa: "\f26c"; }
+
+.fa.fa-contao {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-500px {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-amazon {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-calendar-plus-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-calendar-plus-o {
+ --fa: "\f271"; }
+
+.fa.fa-calendar-minus-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-calendar-minus-o {
+ --fa: "\f272"; }
+
+.fa.fa-calendar-times-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-calendar-times-o {
+ --fa: "\f273"; }
+
+.fa.fa-calendar-check-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-calendar-check-o {
+ --fa: "\f274"; }
+
+.fa.fa-map-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-map-o {
+ --fa: "\f279"; }
+
+.fa.fa-commenting {
+ --fa: "\f4ad"; }
+
+.fa.fa-commenting-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-commenting-o {
+ --fa: "\f4ad"; }
+
+.fa.fa-houzz {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-vimeo {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-vimeo {
+ --fa: "\f27d"; }
+
+.fa.fa-black-tie {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-fonticons {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-reddit-alien {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-edge {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-credit-card-alt {
+ --fa: "\f09d"; }
+
+.fa.fa-codiepie {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-modx {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-fort-awesome {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-usb {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-product-hunt {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-mixcloud {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-scribd {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-pause-circle-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-pause-circle-o {
+ --fa: "\f28b"; }
+
+.fa.fa-stop-circle-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-stop-circle-o {
+ --fa: "\f28d"; }
+
+.fa.fa-bluetooth {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-bluetooth-b {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-gitlab {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-wpbeginner {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-wpforms {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-envira {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-wheelchair-alt {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-wheelchair-alt {
+ --fa: "\f368"; }
+
+.fa.fa-question-circle-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-question-circle-o {
+ --fa: "\f059"; }
+
+.fa.fa-volume-control-phone {
+ --fa: "\f2a0"; }
+
+.fa.fa-asl-interpreting {
+ --fa: "\f2a3"; }
+
+.fa.fa-deafness {
+ --fa: "\f2a4"; }
+
+.fa.fa-hard-of-hearing {
+ --fa: "\f2a4"; }
+
+.fa.fa-glide {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-glide-g {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-signing {
+ --fa: "\f2a7"; }
+
+.fa.fa-viadeo {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-viadeo-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-viadeo-square {
+ --fa: "\f2aa"; }
+
+.fa.fa-snapchat {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-snapchat-ghost {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-snapchat-ghost {
+ --fa: "\f2ab"; }
+
+.fa.fa-snapchat-square {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-snapchat-square {
+ --fa: "\f2ad"; }
+
+.fa.fa-pied-piper {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-first-order {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-yoast {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-themeisle {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-google-plus-official {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-google-plus-official {
+ --fa: "\f2b3"; }
+
+.fa.fa-google-plus-circle {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-google-plus-circle {
+ --fa: "\f2b3"; }
+
+.fa.fa-font-awesome {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-fa {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-fa {
+ --fa: "\f2b4"; }
+
+.fa.fa-handshake-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-handshake-o {
+ --fa: "\f2b5"; }
+
+.fa.fa-envelope-open-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-envelope-open-o {
+ --fa: "\f2b6"; }
+
+.fa.fa-linode {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-address-book-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-address-book-o {
+ --fa: "\f2b9"; }
+
+.fa.fa-vcard {
+ --fa: "\f2bb"; }
+
+.fa.fa-address-card-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-address-card-o {
+ --fa: "\f2bb"; }
+
+.fa.fa-vcard-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-vcard-o {
+ --fa: "\f2bb"; }
+
+.fa.fa-user-circle-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-user-circle-o {
+ --fa: "\f2bd"; }
+
+.fa.fa-user-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-user-o {
+ --fa: "\f007"; }
+
+.fa.fa-id-badge {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-drivers-license {
+ --fa: "\f2c2"; }
+
+.fa.fa-id-card-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-id-card-o {
+ --fa: "\f2c2"; }
+
+.fa.fa-drivers-license-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-drivers-license-o {
+ --fa: "\f2c2"; }
+
+.fa.fa-quora {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-free-code-camp {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-telegram {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-thermometer-4 {
+ --fa: "\f2c7"; }
+
+.fa.fa-thermometer {
+ --fa: "\f2c7"; }
+
+.fa.fa-thermometer-3 {
+ --fa: "\f2c8"; }
+
+.fa.fa-thermometer-2 {
+ --fa: "\f2c9"; }
+
+.fa.fa-thermometer-1 {
+ --fa: "\f2ca"; }
+
+.fa.fa-thermometer-0 {
+ --fa: "\f2cb"; }
+
+.fa.fa-bathtub {
+ --fa: "\f2cd"; }
+
+.fa.fa-s15 {
+ --fa: "\f2cd"; }
+
+.fa.fa-window-maximize {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-window-restore {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-times-rectangle {
+ --fa: "\f410"; }
+
+.fa.fa-window-close-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-window-close-o {
+ --fa: "\f410"; }
+
+.fa.fa-times-rectangle-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-times-rectangle-o {
+ --fa: "\f410"; }
+
+.fa.fa-bandcamp {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-grav {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-etsy {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-imdb {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-ravelry {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-eercast {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-eercast {
+ --fa: "\f2da"; }
+
+.fa.fa-snowflake-o {
+ font-family: 'Font Awesome 6 Free';
+ font-weight: 400; }
+
+.fa.fa-snowflake-o {
+ --fa: "\f2dc"; }
+
+.fa.fa-superpowers {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-wpexplorer {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
+
+.fa.fa-meetup {
+ font-family: 'Font Awesome 6 Brands';
+ font-weight: 400; }
diff --git a/libai/fontawesome/v4-shims.min.css b/libai/fontawesome/v4-shims.min.css
new file mode 100644
index 0000000..93685c8
--- /dev/null
+++ b/libai/fontawesome/v4-shims.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+.fa.fa-glass{--fa:"\f000"}.fa.fa-envelope-o{--fa:"\f0e0"}.fa.fa-envelope-o,.fa.fa-star-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-o{--fa:"\f005"}.fa.fa-close,.fa.fa-remove{--fa:"\f00d"}.fa.fa-gear{--fa:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f2ed"}.fa.fa-home{--fa:"\f015"}.fa.fa-file-o{--fa:"\f15b"}.fa.fa-clock-o,.fa.fa-file-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-clock-o{--fa:"\f017"}.fa.fa-arrow-circle-o-down{--fa:"\f358"}.fa.fa-arrow-circle-o-down,.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-up{--fa:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f144"}.fa.fa-repeat,.fa.fa-rotate-right{--fa:"\f01e"}.fa.fa-refresh{--fa:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f022"}.fa.fa-dedent{--fa:"\f03b"}.fa.fa-video-camera{--fa:"\f03d"}.fa.fa-picture-o{--fa:"\f03e"}.fa.fa-photo,.fa.fa-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-photo{--fa:"\f03e"}.fa.fa-image{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f03e"}.fa.fa-map-marker{--fa:"\f3c5"}.fa.fa-pencil-square-o{--fa:"\f044"}.fa.fa-edit,.fa.fa-pencil-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-edit{--fa:"\f044"}.fa.fa-share-square-o{--fa:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f14a"}.fa.fa-arrows{--fa:"\f0b2"}.fa.fa-times-circle-o{--fa:"\f057"}.fa.fa-check-circle-o,.fa.fa-times-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-circle-o{--fa:"\f058"}.fa.fa-mail-forward{--fa:"\f064"}.fa.fa-expand{--fa:"\f424"}.fa.fa-compress{--fa:"\f422"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-warning{--fa:"\f071"}.fa.fa-calendar{--fa:"\f073"}.fa.fa-arrows-v{--fa:"\f338"}.fa.fa-arrows-h{--fa:"\f337"}.fa.fa-bar-chart,.fa.fa-bar-chart-o{--fa:"\e0e3"}.fa.fa-twitter-square{--fa:"\f081"}.fa.fa-facebook-square,.fa.fa-twitter-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-square{--fa:"\f082"}.fa.fa-gears{--fa:"\f085"}.fa.fa-thumbs-o-up{--fa:"\f164"}.fa.fa-thumbs-o-down,.fa.fa-thumbs-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-down{--fa:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f004"}.fa.fa-sign-out{--fa:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 6 Brands";font-weight:400;--fa:"\f08c"}.fa.fa-thumb-tack{--fa:"\f08d"}.fa.fa-external-link{--fa:"\f35d"}.fa.fa-sign-in{--fa:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 6 Brands";font-weight:400;--fa:"\f092"}.fa.fa-lemon-o{--fa:"\f094"}.fa.fa-lemon-o,.fa.fa-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-square-o{--fa:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook{--fa:"\f39e"}.fa.fa-facebook-f{--fa:"\f39e"}.fa.fa-facebook-f,.fa.fa-github{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-feed{--fa:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f0a0"}.fa.fa-hand-o-right{--fa:"\f0a4"}.fa.fa-hand-o-left,.fa.fa-hand-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-left{--fa:"\f0a5"}.fa.fa-hand-o-up{--fa:"\f0a6"}.fa.fa-hand-o-down,.fa.fa-hand-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-down{--fa:"\f0a7"}.fa.fa-globe{--fa:"\f57d"}.fa.fa-tasks{--fa:"\f828"}.fa.fa-arrows-alt{--fa:"\f31e"}.fa.fa-group{--fa:"\f0c0"}.fa.fa-chain{--fa:"\f0c1"}.fa.fa-cut{--fa:"\f0c4"}.fa.fa-files-o{--fa:"\f0c5"}.fa.fa-files-o,.fa.fa-floppy-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-floppy-o{--fa:"\f0c7"}.fa.fa-save{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f0c7"}.fa.fa-navicon,.fa.fa-reorder{--fa:"\f0c9"}.fa.fa-magic{--fa:"\e2ca"}.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pinterest-square{--fa:"\f0d3"}.fa.fa-google-plus-square{--fa:"\f0d4"}.fa.fa-google-plus,.fa.fa-google-plus-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus{--fa:"\f0d5"}.fa.fa-money{--fa:"\f3d1"}.fa.fa-unsorted{--fa:"\f0dc"}.fa.fa-sort-desc{--fa:"\f0dd"}.fa.fa-sort-asc{--fa:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 6 Brands";font-weight:400;--fa:"\f0e1"}.fa.fa-rotate-left{--fa:"\f0e2"}.fa.fa-legal{--fa:"\f0e3"}.fa.fa-dashboard,.fa.fa-tachometer{--fa:"\f625"}.fa.fa-comment-o{--fa:"\f075"}.fa.fa-comment-o,.fa.fa-comments-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comments-o{--fa:"\f086"}.fa.fa-flash{--fa:"\f0e7"}.fa.fa-clipboard{--fa:"\f0ea"}.fa.fa-lightbulb-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f0eb"}.fa.fa-exchange{--fa:"\f362"}.fa.fa-cloud-download{--fa:"\f0ed"}.fa.fa-cloud-upload{--fa:"\f0ee"}.fa.fa-bell-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f0f3"}.fa.fa-cutlery{--fa:"\f2e7"}.fa.fa-file-text-o{--fa:"\f15c"}.fa.fa-building-o,.fa.fa-file-text-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-building-o{--fa:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f0f8"}.fa.fa-tablet{--fa:"\f3fa"}.fa.fa-mobile,.fa.fa-mobile-phone{--fa:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f111"}.fa.fa-mail-reply{--fa:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-folder-o{--fa:"\f07b"}.fa.fa-folder-o,.fa.fa-folder-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-open-o{--fa:"\f07c"}.fa.fa-smile-o{--fa:"\f118"}.fa.fa-frown-o,.fa.fa-smile-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-frown-o{--fa:"\f119"}.fa.fa-meh-o{--fa:"\f11a"}.fa.fa-keyboard-o,.fa.fa-meh-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-keyboard-o{--fa:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f024"}.fa.fa-mail-reply-all{--fa:"\f122"}.fa.fa-star-half-o{--fa:"\f5c0"}.fa.fa-star-half-empty,.fa.fa-star-half-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-empty{--fa:"\f5c0"}.fa.fa-star-half-full{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f5c0"}.fa.fa-code-fork{--fa:"\f126"}.fa.fa-chain-broken,.fa.fa-unlink{--fa:"\f127"}.fa.fa-calendar-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-unlock-alt{--fa:"\f09c"}.fa.fa-minus-square-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f146"}.fa.fa-level-up{--fa:"\f3bf"}.fa.fa-level-down{--fa:"\f3be"}.fa.fa-pencil-square{--fa:"\f14b"}.fa.fa-external-link-square{--fa:"\f360"}.fa.fa-compass{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f152"}.fa.fa-eur,.fa.fa-euro{--fa:"\f153"}.fa.fa-gbp{--fa:"\f154"}.fa.fa-dollar,.fa.fa-usd{--fa:"\24"}.fa.fa-inr,.fa.fa-rupee{--fa:"\e1bc"}.fa.fa-cny,.fa.fa-jpy,.fa.fa-rmb,.fa.fa-yen{--fa:"\f157"}.fa.fa-rouble,.fa.fa-rub,.fa.fa-ruble{--fa:"\f158"}.fa.fa-krw,.fa.fa-won{--fa:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitcoin{--fa:"\f15a"}.fa.fa-file-text{--fa:"\f15c"}.fa.fa-sort-alpha-asc{--fa:"\f15d"}.fa.fa-sort-alpha-desc{--fa:"\f881"}.fa.fa-sort-amount-asc{--fa:"\f884"}.fa.fa-sort-amount-desc{--fa:"\f160"}.fa.fa-sort-numeric-asc{--fa:"\f162"}.fa.fa-sort-numeric-desc{--fa:"\f886"}.fa.fa-youtube-square{--fa:"\f431"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube,.fa.fa-youtube-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-xing-square{--fa:"\f169"}.fa.fa-youtube-play{--fa:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow,.fa.fa-youtube-play{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitbucket-square{--fa:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-tumblr-square{--fa:"\f174"}.fa.fa-long-arrow-down{--fa:"\f309"}.fa.fa-long-arrow-up{--fa:"\f30c"}.fa.fa-long-arrow-left{--fa:"\f30a"}.fa.fa-long-arrow-right{--fa:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-gittip{--fa:"\f184"}.fa.fa-sun-o{--fa:"\f185"}.fa.fa-moon-o,.fa.fa-sun-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-moon-o{--fa:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{--fa:"\f35a"}.fa.fa-arrow-circle-o-left,.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-left{--fa:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f191"}.fa.fa-toggle-left{--fa:"\f191"}.fa.fa-dot-circle-o,.fa.fa-toggle-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-dot-circle-o{--fa:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 6 Brands";font-weight:400;--fa:"\f194"}.fa.fa-try,.fa.fa-turkish-lira{--fa:"\e2bb"}.fa.fa-plus-square-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bank,.fa.fa-institution{--fa:"\f19c"}.fa.fa-mortar-board{--fa:"\f19d"}.fa.fa-google,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-yahoo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-reddit-square{--fa:"\f1a2"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-behance-square{--fa:"\f1b5"}.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-steam-square{--fa:"\f1b7"}.fa.fa-automobile{--fa:"\f1b9"}.fa.fa-cab{--fa:"\f1ba"}.fa.fa-deviantart,.fa.fa-soundcloud,.fa.fa-spotify{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-file-pdf-o{--fa:"\f1c1"}.fa.fa-file-pdf-o,.fa.fa-file-word-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-word-o{--fa:"\f1c2"}.fa.fa-file-excel-o{--fa:"\f1c3"}.fa.fa-file-excel-o,.fa.fa-file-powerpoint-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-powerpoint-o{--fa:"\f1c4"}.fa.fa-file-image-o{--fa:"\f1c5"}.fa.fa-file-image-o,.fa.fa-file-photo-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-photo-o{--fa:"\f1c5"}.fa.fa-file-picture-o{--fa:"\f1c5"}.fa.fa-file-archive-o,.fa.fa-file-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-archive-o{--fa:"\f1c6"}.fa.fa-file-zip-o{--fa:"\f1c6"}.fa.fa-file-audio-o,.fa.fa-file-zip-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-audio-o{--fa:"\f1c7"}.fa.fa-file-sound-o{--fa:"\f1c7"}.fa.fa-file-sound-o,.fa.fa-file-video-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-video-o{--fa:"\f1c8"}.fa.fa-file-movie-o{--fa:"\f1c8"}.fa.fa-file-code-o,.fa.fa-file-movie-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-code-o{--fa:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-life-bouy,.fa.fa-life-buoy,.fa.fa-life-saver,.fa.fa-support{--fa:"\f1cd"}.fa.fa-circle-o-notch{--fa:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ra{--fa:"\f1d0"}.fa.fa-resistance{--fa:"\f1d0"}.fa.fa-empire,.fa.fa-ge,.fa.fa-resistance{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ge{--fa:"\f1d1"}.fa.fa-git-square{--fa:"\f1d2"}.fa.fa-git,.fa.fa-git-square,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-y-combinator-square{--fa:"\f1d4"}.fa.fa-yc-square{--fa:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin,.fa.fa-yc-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wechat{--fa:"\f1d7"}.fa.fa-send{--fa:"\f1d8"}.fa.fa-paper-plane-o{--fa:"\f1d8"}.fa.fa-paper-plane-o,.fa.fa-send-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-send-o{--fa:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f111"}.fa.fa-header{--fa:"\f1dc"}.fa.fa-futbol-o{--fa:"\f1e3"}.fa.fa-futbol-o,.fa.fa-soccer-ball-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-soccer-ball-o{--fa:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f1f6"}.fa.fa-trash{--fa:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-eyedropper{--fa:"\f1fb"}.fa.fa-area-chart{--fa:"\f1fe"}.fa.fa-pie-chart{--fa:"\f200"}.fa.fa-line-chart{--fa:"\f201"}.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-lastfm-square{--fa:"\f203"}.fa.fa-angellist,.fa.fa-ioxhost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f20a"}.fa.fa-ils,.fa.fa-shekel,.fa.fa-sheqel{--fa:"\f20b"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f3a5"}.fa.fa-intersex,.fa.fa-transgender{--fa:"\f224"}.fa.fa-transgender-alt{--fa:"\f225"}.fa.fa-facebook-official{--fa:"\f09a"}.fa.fa-facebook-official,.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-hotel{--fa:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc{--fa:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-battery,.fa.fa-battery-4{--fa:"\f240"}.fa.fa-battery-3{--fa:"\f241"}.fa.fa-battery-2{--fa:"\f242"}.fa.fa-battery-1{--fa:"\f243"}.fa.fa-battery-0{--fa:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sticky-note-o{--fa:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-clone{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hourglass-o{--fa:"\f254"}.fa.fa-hourglass-1{--fa:"\f251"}.fa.fa-hourglass-2{--fa:"\f252"}.fa.fa-hourglass-3{--fa:"\f253"}.fa.fa-hand-rock-o{--fa:"\f255"}.fa.fa-hand-grab-o,.fa.fa-hand-rock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-grab-o{--fa:"\f255"}.fa.fa-hand-paper-o{--fa:"\f256"}.fa.fa-hand-paper-o,.fa.fa-hand-stop-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-stop-o{--fa:"\f256"}.fa.fa-hand-scissors-o{--fa:"\f257"}.fa.fa-hand-lizard-o,.fa.fa-hand-scissors-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-lizard-o{--fa:"\f258"}.fa.fa-hand-spock-o{--fa:"\f259"}.fa.fa-hand-pointer-o,.fa.fa-hand-spock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-pointer-o{--fa:"\f25a"}.fa.fa-hand-peace-o{--fa:"\f25b"}.fa.fa-hand-peace-o,.fa.fa-registered{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-creative-commons,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-odnoklassniki-square{--fa:"\f264"}.fa.fa-chrome,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-internet-explorer,.fa.fa-opera,.fa.fa-safari,.fa.fa-wikipedia-w{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-television{--fa:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-calendar-plus-o{--fa:"\f271"}.fa.fa-calendar-minus-o,.fa.fa-calendar-plus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-minus-o{--fa:"\f272"}.fa.fa-calendar-times-o{--fa:"\f273"}.fa.fa-calendar-check-o,.fa.fa-calendar-times-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-check-o{--fa:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f279"}.fa.fa-commenting{--fa:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo{--fa:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card-alt{--fa:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pause-circle-o{--fa:"\f28b"}.fa.fa-pause-circle-o,.fa.fa-stop-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-stop-circle-o{--fa:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wheelchair-alt{--fa:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f059"}.fa.fa-volume-control-phone{--fa:"\f2a0"}.fa.fa-asl-interpreting{--fa:"\f2a3"}.fa.fa-deafness,.fa.fa-hard-of-hearing{--fa:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-signing{--fa:"\f2a7"}.fa.fa-viadeo,.fa.fa-viadeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-viadeo-square{--fa:"\f2aa"}.fa.fa-snapchat,.fa.fa-snapchat-ghost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-ghost{--fa:"\f2ab"}.fa.fa-snapchat-square{--fa:"\f2ad"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-snapchat-square,.fa.fa-themeisle,.fa.fa-yoast{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-official{--fa:"\f2b3"}.fa.fa-google-plus-circle{--fa:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome,.fa.fa-google-plus-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-fa{--fa:"\f2b4"}.fa.fa-handshake-o{--fa:"\f2b5"}.fa.fa-envelope-open-o,.fa.fa-handshake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-open-o{--fa:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f2b9"}.fa.fa-vcard{--fa:"\f2bb"}.fa.fa-address-card-o{--fa:"\f2bb"}.fa.fa-address-card-o,.fa.fa-vcard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-vcard-o{--fa:"\f2bb"}.fa.fa-user-circle-o{--fa:"\f2bd"}.fa.fa-user-circle-o,.fa.fa-user-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-o{--fa:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license{--fa:"\f2c2"}.fa.fa-id-card-o{--fa:"\f2c2"}.fa.fa-drivers-license-o,.fa.fa-id-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license-o{--fa:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-thermometer,.fa.fa-thermometer-4{--fa:"\f2c7"}.fa.fa-thermometer-3{--fa:"\f2c8"}.fa.fa-thermometer-2{--fa:"\f2c9"}.fa.fa-thermometer-1{--fa:"\f2ca"}.fa.fa-thermometer-0{--fa:"\f2cb"}.fa.fa-bathtub,.fa.fa-s15{--fa:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle{--fa:"\f410"}.fa.fa-window-close-o{--fa:"\f410"}.fa.fa-times-rectangle-o,.fa.fa-window-close-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle-o{--fa:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-eercast{--fa:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f2dc"}.fa.fa-meetup,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 6 Brands";font-weight:400}
\ No newline at end of file
diff --git a/libai/fontawesome/v5-font-face.css b/libai/fontawesome/v5-font-face.css
new file mode 100644
index 0000000..3c603d6
--- /dev/null
+++ b/libai/fontawesome/v5-font-face.css
@@ -0,0 +1,22 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+@font-face {
+ font-family: 'Font Awesome 5 Brands';
+ font-display: block;
+ font-weight: 400;
+ src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
+
+@font-face {
+ font-family: 'Font Awesome 5 Free';
+ font-display: block;
+ font-weight: 900;
+ src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
+
+@font-face {
+ font-family: 'Font Awesome 5 Free';
+ font-display: block;
+ font-weight: 400;
+ src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }
diff --git a/libai/fontawesome/v5-font-face.min.css b/libai/fontawesome/v5-font-face.min.css
new file mode 100644
index 0000000..ada52ac
--- /dev/null
+++ b/libai/fontawesome/v5-font-face.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}
\ No newline at end of file
diff --git a/libai/googlecss2.css b/libai/googlecss2.css
new file mode 100644
index 0000000..8e0d0f5
--- /dev/null
+++ b/libai/googlecss2.css
@@ -0,0 +1,6496 @@
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRKoKIyQ4.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIYKIyQ4.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIIKIyQ4.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 300;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRLoKI.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRKoKIyQ4.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIYKIyQ4.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIIKIyQ4.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRLoKI.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRKoKIyQ4.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIYKIyQ4.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIIKIyQ4.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRLoKI.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRKoKIyQ4.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIYKIyQ4.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIIKIyQ4.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRLoKI.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALhLOCT-xWNm8Hqd37g1OkDRZe7lR4sg1IzSy-MNbE9VH8V.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRKoKIyQ4.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIYKIyQ4.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRIIKIyQ4.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Sans SC';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notosanssc/v39/k3kXo84MPvpLmixcA63oeALRLoKI.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kqWWbghq.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kq6Wbghq.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kq-Wbghq.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kqGWbg.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kqWWbghq.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kq6Wbghq.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kq-Wbghq.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kqGWbg.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.4.woff2) format('woff2');
+ unicode-range: U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.5.woff2) format('woff2');
+ unicode-range: U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.6.woff2) format('woff2');
+ unicode-range: U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.21.woff2) format('woff2');
+ unicode-range: U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff0-9fff, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.22.woff2) format('woff2');
+ unicode-range: U+9e30-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39, U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.23.woff2) format('woff2');
+ unicode-range: U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9-9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e2f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.24.woff2) format('woff2');
+ unicode-range: U+9a80, U+9a83, U+9a85, U+9a88-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39, U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.25.woff2) format('woff2');
+ unicode-range: U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab, U+99ad-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b, U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.26.woff2) format('woff2');
+ unicode-range: U+975b-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c8, U+98cf-98d6, U+98da-98db;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.27.woff2) format('woff2');
+ unicode-range: U+95c4-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727, U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.28.woff2) format('woff2');
+ unicode-range: U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8-95c3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.29.woff2) format('woff2');
+ unicode-range: U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94ec, U+94ee-94f1, U+94f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.30.woff2) format('woff2');
+ unicode-range: U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-941a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.31.woff2) format('woff2');
+ unicode-range: U+9163-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6-92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.32.woff2) format('woff2');
+ unicode-range: U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a, U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9162;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.33.woff2) format('woff2');
+ unicode-range: U+8e41-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda, U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.34.woff2) format('woff2');
+ unicode-range: U+8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.35.woff2) format('woff2');
+ unicode-range: U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb4-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac, U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.36.woff2) format('woff2');
+ unicode-range: U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c, U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.37.woff2) format('woff2');
+ unicode-range: U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.38.woff2) format('woff2');
+ unicode-range: U+86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864, U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.39.woff2) format('woff2');
+ unicode-range: U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df, U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.40.woff2) format('woff2');
+ unicode-range: U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d, U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.41.woff2) format('woff2');
+ unicode-range: U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3-83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.42.woff2) format('woff2');
+ unicode-range: U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.43.woff2) format('woff2');
+ unicode-range: U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148, U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.44.woff2) format('woff2');
+ unicode-range: U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9-7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.45.woff2) format('woff2');
+ unicode-range: U+7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4, U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.46.woff2) format('woff2');
+ unicode-range: U+7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1, U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.47.woff2) format('woff2');
+ unicode-range: U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9, U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.48.woff2) format('woff2');
+ unicode-range: U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1, U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.49.woff2) format('woff2');
+ unicode-range: U+798b-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8, U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.50.woff2) format('woff2');
+ unicode-range: U+784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b-797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.51.woff2) format('woff2');
+ unicode-range: U+7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c, U+783e, U+7841-7844, U+7847-7849, U+784b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.52.woff2) format('woff2');
+ unicode-range: U+7613-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.53.woff2) format('woff2');
+ unicode-range: U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-760e, U+7610-7612;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.54.woff2) format('woff2');
+ unicode-range: U+73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee-74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.55.woff2) format('woff2');
+ unicode-range: U+72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73ea, U+73ee-73ef;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.56.woff2) format('woff2');
+ unicode-range: U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db, U+72dd-72df, U+72e1, U+72e5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.57.woff2) format('woff2');
+ unicode-range: U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198, U+719c, U+71a0, U+71a4-71a5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.58.woff2) format('woff2');
+ unicode-range: U+6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe, U+7005-7006, U+7009;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.59.woff2) format('woff2');
+ unicode-range: U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7-6ed8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.60.woff2) format('woff2');
+ unicode-range: U+6cb1-6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.61.woff2) format('woff2');
+ unicode-range: U+6b83-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.62.woff2) format('woff2');
+ unicode-range: U+69fe-6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b82;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.63.woff2) format('woff2');
+ unicode-range: U+68d3, U+68d7, U+68dd, U+68df, U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.64.woff2) format('woff2');
+ unicode-range: U+678b-678d, U+678f, U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.65.woff2) format('woff2');
+ unicode-range: U+6631, U+6633-6634, U+6636, U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.66.woff2) format('woff2');
+ unicode-range: U+64f1-64f2, U+64f4, U+64f7-64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.67.woff2) format('woff2');
+ unicode-range: U+63b8-63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.68.woff2) format('woff2');
+ unicode-range: U+622c, U+622e-6230, U+6232, U+6238, U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.69.woff2) format('woff2');
+ unicode-range: U+60ed-60ee, U+60f0-60f1, U+60f4, U+60f6, U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.70.woff2) format('woff2');
+ unicode-range: U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.71.woff2) format('woff2');
+ unicode-range: U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.72.woff2) format('woff2');
+ unicode-range: U+5d26-5d27, U+5d2e-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.73.woff2) format('woff2');
+ unicode-range: U+5bec, U+5bee-5bf0, U+5bf2-5bf3, U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d25;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.74.woff2) format('woff2');
+ unicode-range: U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1-5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be5, U+5be7, U+5be9, U+5beb;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.75.woff2) format('woff2');
+ unicode-range: U+596a, U+596c-596e, U+5977, U+597b-597c, U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.76.woff2) format('woff2');
+ unicode-range: U+5820, U+5822-5823, U+5825-5826, U+582c, U+582f, U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.77.woff2) format('woff2');
+ unicode-range: U+56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709-570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-581f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.78.woff2) format('woff2');
+ unicode-range: U+55f5-55f7, U+55fb, U+55fe, U+5600-5601, U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.79.woff2) format('woff2');
+ unicode-range: U+550f, U+5511-5514, U+5516-5517, U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.80.woff2) format('woff2');
+ unicode-range: U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.81.woff2) format('woff2');
+ unicode-range: U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a, U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.82.woff2) format('woff2');
+ unicode-range: U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f-5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.83.woff2) format('woff2');
+ unicode-range: U+4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.84.woff2) format('woff2');
+ unicode-range: U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.85.woff2) format('woff2');
+ unicode-range: U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.86.woff2) format('woff2');
+ unicode-range: U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.87.woff2) format('woff2');
+ unicode-range: U+2651-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796, U+279c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.88.woff2) format('woff2');
+ unicode-range: U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-2650;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.89.woff2) format('woff2');
+ unicode-range: U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a-254b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.90.woff2) format('woff2');
+ unicode-range: U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.91.woff2) format('woff2');
+ unicode-range: U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a-207b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.97.woff2) format('woff2');
+ unicode-range: U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.98.woff2) format('woff2');
+ unicode-range: U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.99.woff2) format('woff2');
+ unicode-range: U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.100.woff2) format('woff2');
+ unicode-range: U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5340, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+5618, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5be6, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+62ce, U+62ed, U+6345, U+6390, U+63b0, U+63b7, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f31, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+733f, U+7396, U+739f, U+7459, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8bb3, U+8d2e, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+99ac, U+9a6f, U+9a87, U+9a8b, U+9ab7, U+9abc, U+9ac5, U+9e25, U+e608, U+e621, U+ff06, U+ff14-ff16;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.101.woff2) format('woff2');
+ unicode-range: U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+51c4, U+5225, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+560e, U+565c, U+5662, U+5669, U+566c, U+56bc, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5ac9, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+620c, U+6273, U+62c7, U+62f7, U+6320, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+72e9, U+7409, U+7422, U+745a, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8aaa, U+8c41, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.102.woff2) format('woff2');
+ unicode-range: U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2463, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+516e, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5364, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6ed5, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+7405, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+803f, U+8046, U+80fa, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8cec, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9704, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+9f9a, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+ff3d, U+f012b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.103.woff2) format('woff2');
+ unicode-range: U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+609a, U+60df, U+6168, U+61c8, U+6236, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+67da, U+67ec, U+6813, U+6816, U+6869, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+73fe, U+7410, U+7426, U+7455, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+81b3, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8e72, U+8f9c, U+900d, U+904b, U+904e, U+9063, U+90a2, U+90b9, U+9119, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.104.woff2) format('woff2');
+ unicode-range: U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a1f, U+5a49, U+5ac2, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f6c, U+5f8c, U+603c, U+608d, U+611b, U+6127, U+62a0, U+62d0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6703, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d50, U+8d63, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9610, U+9631, U+9699, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.105.woff2) format('woff2');
+ unicode-range: U+5e, U+2190, U+250a, U+25bc, U+25cf, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bb0, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6e9c, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82bd, U+8305, U+8328, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8e81, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+9540, U+958b, U+9600, U+9640, U+96b6, U+96c7, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.106.woff2) format('woff2');
+ unicode-range: U+b0, U+2191, U+2460-2461, U+25c6, U+300e-300f, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54b1, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+61be, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+6380, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+82ad, U+8304, U+8393, U+83b9, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95f7, U+9706, U+9709, U+9774, U+98a0, U+9e64, U+9f9f, U+e603;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.107.woff2) format('woff2');
+ unicode-range: U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+83ca, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95ef, U+95fa, U+95fd, U+96c0, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9887, U+9b4f, U+9e2d, U+9f0e, U+e601-e602, U+e604-e605, U+ff5c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.108.woff2) format('woff2');
+ unicode-range: U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b-886c, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+964c, U+9675, U+971c, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.109.woff2) format('woff2');
+ unicode-range: U+a5, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+85aa, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90aa, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.110.woff2) format('woff2');
+ unicode-range: U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.111.woff2) format('woff2');
+ unicode-range: U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.112.woff2) format('woff2');
+ unicode-range: U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.113.woff2) format('woff2');
+ unicode-range: U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6740, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.114.woff2) format('woff2');
+ unicode-range: U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b63, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.115.woff2) format('woff2');
+ unicode-range: U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4b, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.116.woff2) format('woff2');
+ unicode-range: U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+53ea, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.117.woff2) format('woff2');
+ unicode-range: U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e38, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.118.woff2) format('woff2');
+ unicode-range: U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee4-4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;
+}
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7oqP0dTpxZbB9E9gjjmzKvaeKHUTtJDWv3z-us4bxD8F5og.119.woff2) format('woff2');
+ unicode-range: U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2022, U+2027, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+3127, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kqWWbghq.woff2) format('woff2');
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kq6Wbghq.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kq-Wbghq.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Noto Serif SC';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(https://fonts.gstatic.com/s/notoserifsc/v34/H4chBXePl9DZ0Xe7gG9cyOj7kqGWbg.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
diff --git a/libai/shader-park-core.cjs.js b/libai/shader-park-core.cjs.js
new file mode 100644
index 0000000..83dd311
--- /dev/null
+++ b/libai/shader-park-core.cjs.js
@@ -0,0 +1,96389 @@
+/* Version: 0.1.26 - May 29, 2022 01:18:38 */
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+function _typeof(obj) {
+ "@babel/helpers - typeof";
+
+ if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
+ _typeof = function (obj) {
+ return typeof obj;
+ };
+ } else {
+ _typeof = function (obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ }
+
+ return _typeof(obj);
+}
+
+var REACT_ELEMENT_TYPE;
+
+function _jsx(type, props, key, children) {
+ if (!REACT_ELEMENT_TYPE) {
+ REACT_ELEMENT_TYPE = typeof Symbol === "function" && Symbol["for"] && Symbol["for"]("react.element") || 0xeac7;
+ }
+
+ var defaultProps = type && type.defaultProps;
+ var childrenLength = arguments.length - 3;
+
+ if (!props && childrenLength !== 0) {
+ props = {
+ children: void 0
+ };
+ }
+
+ if (childrenLength === 1) {
+ props.children = children;
+ } else if (childrenLength > 1) {
+ var childArray = new Array(childrenLength);
+
+ for (var i = 0; i < childrenLength; i++) {
+ childArray[i] = arguments[i + 3];
+ }
+
+ props.children = childArray;
+ }
+
+ if (props && defaultProps) {
+ for (var propName in defaultProps) {
+ if (props[propName] === void 0) {
+ props[propName] = defaultProps[propName];
+ }
+ }
+ } else if (!props) {
+ props = defaultProps || {};
+ }
+
+ return {
+ $$typeof: REACT_ELEMENT_TYPE,
+ type: type,
+ key: key === undefined ? null : '' + key,
+ ref: null,
+ props: props,
+ _owner: null
+ };
+}
+
+function _asyncIterator(iterable) {
+ var method;
+
+ if (typeof Symbol !== "undefined") {
+ if (Symbol.asyncIterator) {
+ method = iterable[Symbol.asyncIterator];
+ if (method != null) return method.call(iterable);
+ }
+
+ if (Symbol.iterator) {
+ method = iterable[Symbol.iterator];
+ if (method != null) return method.call(iterable);
+ }
+ }
+
+ throw new TypeError("Object is not async iterable");
+}
+
+function _AwaitValue(value) {
+ this.wrapped = value;
+}
+
+function _AsyncGenerator(gen) {
+ var front, back;
+
+ function send(key, arg) {
+ return new Promise(function (resolve, reject) {
+ var request = {
+ key: key,
+ arg: arg,
+ resolve: resolve,
+ reject: reject,
+ next: null
+ };
+
+ if (back) {
+ back = back.next = request;
+ } else {
+ front = back = request;
+ resume(key, arg);
+ }
+ });
+ }
+
+ function resume(key, arg) {
+ try {
+ var result = gen[key](arg);
+ var value = result.value;
+ var wrappedAwait = value instanceof _AwaitValue;
+ Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
+ if (wrappedAwait) {
+ resume(key === "return" ? "return" : "next", arg);
+ return;
+ }
+
+ settle(result.done ? "return" : "normal", arg);
+ }, function (err) {
+ resume("throw", err);
+ });
+ } catch (err) {
+ settle("throw", err);
+ }
+ }
+
+ function settle(type, value) {
+ switch (type) {
+ case "return":
+ front.resolve({
+ value: value,
+ done: true
+ });
+ break;
+
+ case "throw":
+ front.reject(value);
+ break;
+
+ default:
+ front.resolve({
+ value: value,
+ done: false
+ });
+ break;
+ }
+
+ front = front.next;
+
+ if (front) {
+ resume(front.key, front.arg);
+ } else {
+ back = null;
+ }
+ }
+
+ this._invoke = send;
+
+ if (typeof gen.return !== "function") {
+ this.return = undefined;
+ }
+}
+
+if (typeof Symbol === "function" && Symbol.asyncIterator) {
+ _AsyncGenerator.prototype[Symbol.asyncIterator] = function () {
+ return this;
+ };
+}
+
+_AsyncGenerator.prototype.next = function (arg) {
+ return this._invoke("next", arg);
+};
+
+_AsyncGenerator.prototype.throw = function (arg) {
+ return this._invoke("throw", arg);
+};
+
+_AsyncGenerator.prototype.return = function (arg) {
+ return this._invoke("return", arg);
+};
+
+function _wrapAsyncGenerator(fn) {
+ return function () {
+ return new _AsyncGenerator(fn.apply(this, arguments));
+ };
+}
+
+function _awaitAsyncGenerator(value) {
+ return new _AwaitValue(value);
+}
+
+function _asyncGeneratorDelegate(inner, awaitWrap) {
+ var iter = {},
+ waiting = false;
+
+ function pump(key, value) {
+ waiting = true;
+ value = new Promise(function (resolve) {
+ resolve(inner[key](value));
+ });
+ return {
+ done: false,
+ value: awaitWrap(value)
+ };
+ }
+
+ ;
+
+ if (typeof Symbol === "function" && Symbol.iterator) {
+ iter[Symbol.iterator] = function () {
+ return this;
+ };
+ }
+
+ iter.next = function (value) {
+ if (waiting) {
+ waiting = false;
+ return value;
+ }
+
+ return pump("next", value);
+ };
+
+ if (typeof inner.throw === "function") {
+ iter.throw = function (value) {
+ if (waiting) {
+ waiting = false;
+ throw value;
+ }
+
+ return pump("throw", value);
+ };
+ }
+
+ if (typeof inner.return === "function") {
+ iter.return = function (value) {
+ if (waiting) {
+ waiting = false;
+ return value;
+ }
+
+ return pump("return", value);
+ };
+ }
+
+ return iter;
+}
+
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
+ try {
+ var info = gen[key](arg);
+ var value = info.value;
+ } catch (error) {
+ reject(error);
+ return;
+ }
+
+ if (info.done) {
+ resolve(value);
+ } else {
+ Promise.resolve(value).then(_next, _throw);
+ }
+}
+
+function _asyncToGenerator(fn) {
+ return function () {
+ var self = this,
+ args = arguments;
+ return new Promise(function (resolve, reject) {
+ var gen = fn.apply(self, args);
+
+ function _next(value) {
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
+ }
+
+ function _throw(err) {
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
+ }
+
+ _next(undefined);
+ });
+ };
+}
+
+function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+}
+
+function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+}
+
+function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+}
+
+function _defineEnumerableProperties(obj, descs) {
+ for (var key in descs) {
+ var desc = descs[key];
+ desc.configurable = desc.enumerable = true;
+ if ("value" in desc) desc.writable = true;
+ Object.defineProperty(obj, key, desc);
+ }
+
+ if (Object.getOwnPropertySymbols) {
+ var objectSymbols = Object.getOwnPropertySymbols(descs);
+
+ for (var i = 0; i < objectSymbols.length; i++) {
+ var sym = objectSymbols[i];
+ var desc = descs[sym];
+ desc.configurable = desc.enumerable = true;
+ if ("value" in desc) desc.writable = true;
+ Object.defineProperty(obj, sym, desc);
+ }
+ }
+
+ return obj;
+}
+
+function _defaults(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);
+
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var value = Object.getOwnPropertyDescriptor(defaults, key);
+
+ if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }
+
+ return obj;
+}
+
+function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+}
+
+function _extends() {
+ _extends = Object.assign || function (target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+
+ return target;
+ };
+
+ return _extends.apply(this, arguments);
+}
+
+function _objectSpread(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i] != null ? Object(arguments[i]) : {};
+ var ownKeys = Object.keys(source);
+
+ if (typeof Object.getOwnPropertySymbols === 'function') {
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
+ }));
+ }
+
+ ownKeys.forEach(function (key) {
+ _defineProperty(target, key, source[key]);
+ });
+ }
+
+ return target;
+}
+
+function ownKeys(object, enumerableOnly) {
+ var keys = Object.keys(object);
+
+ if (Object.getOwnPropertySymbols) {
+ var symbols = Object.getOwnPropertySymbols(object);
+ if (enumerableOnly) symbols = symbols.filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
+ });
+ keys.push.apply(keys, symbols);
+ }
+
+ return keys;
+}
+
+function _objectSpread2(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i] != null ? arguments[i] : {};
+
+ if (i % 2) {
+ ownKeys(Object(source), true).forEach(function (key) {
+ _defineProperty(target, key, source[key]);
+ });
+ } else if (Object.getOwnPropertyDescriptors) {
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
+ } else {
+ ownKeys(Object(source)).forEach(function (key) {
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
+ });
+ }
+ }
+
+ return target;
+}
+
+function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function");
+ }
+
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ writable: true,
+ configurable: true
+ }
+ });
+ if (superClass) _setPrototypeOf(subClass, superClass);
+}
+
+function _inheritsLoose(subClass, superClass) {
+ subClass.prototype = Object.create(superClass.prototype);
+ subClass.prototype.constructor = subClass;
+
+ _setPrototypeOf(subClass, superClass);
+}
+
+function _getPrototypeOf(o) {
+ _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
+ return o.__proto__ || Object.getPrototypeOf(o);
+ };
+ return _getPrototypeOf(o);
+}
+
+function _setPrototypeOf(o, p) {
+ _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
+ o.__proto__ = p;
+ return o;
+ };
+
+ return _setPrototypeOf(o, p);
+}
+
+function _isNativeReflectConstruct() {
+ if (typeof Reflect === "undefined" || !Reflect.construct) return false;
+ if (Reflect.construct.sham) return false;
+ if (typeof Proxy === "function") return true;
+
+ try {
+ Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+function _construct(Parent, args, Class) {
+ if (_isNativeReflectConstruct()) {
+ _construct = Reflect.construct;
+ } else {
+ _construct = function _construct(Parent, args, Class) {
+ var a = [null];
+ a.push.apply(a, args);
+ var Constructor = Function.bind.apply(Parent, a);
+ var instance = new Constructor();
+ if (Class) _setPrototypeOf(instance, Class.prototype);
+ return instance;
+ };
+ }
+
+ return _construct.apply(null, arguments);
+}
+
+function _isNativeFunction(fn) {
+ return Function.toString.call(fn).indexOf("[native code]") !== -1;
+}
+
+function _wrapNativeSuper(Class) {
+ var _cache = typeof Map === "function" ? new Map() : undefined;
+
+ _wrapNativeSuper = function _wrapNativeSuper(Class) {
+ if (Class === null || !_isNativeFunction(Class)) return Class;
+
+ if (typeof Class !== "function") {
+ throw new TypeError("Super expression must either be null or a function");
+ }
+
+ if (typeof _cache !== "undefined") {
+ if (_cache.has(Class)) return _cache.get(Class);
+
+ _cache.set(Class, Wrapper);
+ }
+
+ function Wrapper() {
+ return _construct(Class, arguments, _getPrototypeOf(this).constructor);
+ }
+
+ Wrapper.prototype = Object.create(Class.prototype, {
+ constructor: {
+ value: Wrapper,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ return _setPrototypeOf(Wrapper, Class);
+ };
+
+ return _wrapNativeSuper(Class);
+}
+
+function _instanceof(left, right) {
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
+ return !!right[Symbol.hasInstance](left);
+ } else {
+ return left instanceof right;
+ }
+}
+
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+}
+
+function _getRequireWildcardCache() {
+ if (typeof WeakMap !== "function") return null;
+ var cache = new WeakMap();
+
+ _getRequireWildcardCache = function () {
+ return cache;
+ };
+
+ return cache;
+}
+
+function _interopRequireWildcard(obj) {
+ if (obj && obj.__esModule) {
+ return obj;
+ }
+
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
+ return {
+ default: obj
+ };
+ }
+
+ var cache = _getRequireWildcardCache();
+
+ if (cache && cache.has(obj)) {
+ return cache.get(obj);
+ }
+
+ var newObj = {};
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
+
+ for (var key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
+
+ if (desc && (desc.get || desc.set)) {
+ Object.defineProperty(newObj, key, desc);
+ } else {
+ newObj[key] = obj[key];
+ }
+ }
+ }
+
+ newObj.default = obj;
+
+ if (cache) {
+ cache.set(obj, newObj);
+ }
+
+ return newObj;
+}
+
+function _newArrowCheck(innerThis, boundThis) {
+ if (innerThis !== boundThis) {
+ throw new TypeError("Cannot instantiate an arrow function");
+ }
+}
+
+function _objectDestructuringEmpty(obj) {
+ if (obj == null) throw new TypeError("Cannot destructure undefined");
+}
+
+function _objectWithoutPropertiesLoose(source, excluded) {
+ if (source == null) return {};
+ var target = {};
+ var sourceKeys = Object.keys(source);
+ var key, i;
+
+ for (i = 0; i < sourceKeys.length; i++) {
+ key = sourceKeys[i];
+ if (excluded.indexOf(key) >= 0) continue;
+ target[key] = source[key];
+ }
+
+ return target;
+}
+
+function _objectWithoutProperties(source, excluded) {
+ if (source == null) return {};
+
+ var target = _objectWithoutPropertiesLoose(source, excluded);
+
+ var key, i;
+
+ if (Object.getOwnPropertySymbols) {
+ var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
+
+ for (i = 0; i < sourceSymbolKeys.length; i++) {
+ key = sourceSymbolKeys[i];
+ if (excluded.indexOf(key) >= 0) continue;
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
+ target[key] = source[key];
+ }
+ }
+
+ return target;
+}
+
+function _assertThisInitialized(self) {
+ if (self === void 0) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }
+
+ return self;
+}
+
+function _possibleConstructorReturn(self, call) {
+ if (call && (typeof call === "object" || typeof call === "function")) {
+ return call;
+ }
+
+ return _assertThisInitialized(self);
+}
+
+function _createSuper(Derived) {
+ var hasNativeReflectConstruct = _isNativeReflectConstruct();
+
+ return function _createSuperInternal() {
+ var Super = _getPrototypeOf(Derived),
+ result;
+
+ if (hasNativeReflectConstruct) {
+ var NewTarget = _getPrototypeOf(this).constructor;
+
+ result = Reflect.construct(Super, arguments, NewTarget);
+ } else {
+ result = Super.apply(this, arguments);
+ }
+
+ return _possibleConstructorReturn(this, result);
+ };
+}
+
+function _superPropBase(object, property) {
+ while (!Object.prototype.hasOwnProperty.call(object, property)) {
+ object = _getPrototypeOf(object);
+ if (object === null) break;
+ }
+
+ return object;
+}
+
+function _get(target, property, receiver) {
+ if (typeof Reflect !== "undefined" && Reflect.get) {
+ _get = Reflect.get;
+ } else {
+ _get = function _get(target, property, receiver) {
+ var base = _superPropBase(target, property);
+
+ if (!base) return;
+ var desc = Object.getOwnPropertyDescriptor(base, property);
+
+ if (desc.get) {
+ return desc.get.call(receiver);
+ }
+
+ return desc.value;
+ };
+ }
+
+ return _get(target, property, receiver || target);
+}
+
+function set(target, property, value, receiver) {
+ if (typeof Reflect !== "undefined" && Reflect.set) {
+ set = Reflect.set;
+ } else {
+ set = function set(target, property, value, receiver) {
+ var base = _superPropBase(target, property);
+
+ var desc;
+
+ if (base) {
+ desc = Object.getOwnPropertyDescriptor(base, property);
+
+ if (desc.set) {
+ desc.set.call(receiver, value);
+ return true;
+ } else if (!desc.writable) {
+ return false;
+ }
+ }
+
+ desc = Object.getOwnPropertyDescriptor(receiver, property);
+
+ if (desc) {
+ if (!desc.writable) {
+ return false;
+ }
+
+ desc.value = value;
+ Object.defineProperty(receiver, property, desc);
+ } else {
+ _defineProperty(receiver, property, value);
+ }
+
+ return true;
+ };
+ }
+
+ return set(target, property, value, receiver);
+}
+
+function _set(target, property, value, receiver, isStrict) {
+ var s = set(target, property, value, receiver || target);
+
+ if (!s && isStrict) {
+ throw new Error('failed to set property');
+ }
+
+ return value;
+}
+
+function _taggedTemplateLiteral(strings, raw) {
+ if (!raw) {
+ raw = strings.slice(0);
+ }
+
+ return Object.freeze(Object.defineProperties(strings, {
+ raw: {
+ value: Object.freeze(raw)
+ }
+ }));
+}
+
+function _taggedTemplateLiteralLoose(strings, raw) {
+ if (!raw) {
+ raw = strings.slice(0);
+ }
+
+ strings.raw = raw;
+ return strings;
+}
+
+function _readOnlyError(name) {
+ throw new TypeError("\"" + name + "\" is read-only");
+}
+
+function _writeOnlyError(name) {
+ throw new TypeError("\"" + name + "\" is write-only");
+}
+
+function _classNameTDZError(name) {
+ throw new Error("Class \"" + name + "\" cannot be referenced in computed property keys.");
+}
+
+function _temporalUndefined() {}
+
+function _tdz(name) {
+ throw new ReferenceError(name + " is not defined - temporal dead zone");
+}
+
+function _temporalRef(val, name) {
+ return val === _temporalUndefined ? _tdz(name) : val;
+}
+
+function _slicedToArray(arr, i) {
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
+}
+
+function _slicedToArrayLoose(arr, i) {
+ return _arrayWithHoles(arr) || _iterableToArrayLimitLoose(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
+}
+
+function _toArray(arr) {
+ return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();
+}
+
+function _toConsumableArray(arr) {
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
+}
+
+function _arrayWithoutHoles(arr) {
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
+}
+
+function _arrayWithHoles(arr) {
+ if (Array.isArray(arr)) return arr;
+}
+
+function _maybeArrayLike(next, arr, i) {
+ if (arr && !Array.isArray(arr) && typeof arr.length === "number") {
+ var len = arr.length;
+ return _arrayLikeToArray(arr, i !== void 0 && i < len ? i : len);
+ }
+
+ return next(arr, i);
+}
+
+function _iterableToArray(iter) {
+ if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
+}
+
+function _iterableToArrayLimit(arr, i) {
+ if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
+ var _arr = [];
+ var _n = true;
+ var _d = false;
+ var _e = undefined;
+
+ try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);
+
+ if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;
+ _e = err;
+ } finally {
+ try {
+ if (!_n && _i["return"] != null) _i["return"]();
+ } finally {
+ if (_d) throw _e;
+ }
+ }
+
+ return _arr;
+}
+
+function _iterableToArrayLimitLoose(arr, i) {
+ if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
+ var _arr = [];
+
+ for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
+ _arr.push(_step.value);
+
+ if (i && _arr.length === i) break;
+ }
+
+ return _arr;
+}
+
+function _unsupportedIterableToArray(o, minLen) {
+ if (!o) return;
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
+ var n = Object.prototype.toString.call(o).slice(8, -1);
+ if (n === "Object" && o.constructor) n = o.constructor.name;
+ if (n === "Map" || n === "Set") return Array.from(o);
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
+}
+
+function _arrayLikeToArray(arr, len) {
+ if (len == null || len > arr.length) len = arr.length;
+
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
+
+ return arr2;
+}
+
+function _nonIterableSpread() {
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+}
+
+function _nonIterableRest() {
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+}
+
+function _createForOfIteratorHelper(o, allowArrayLike) {
+ var it;
+
+ if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
+ if (it) o = it;
+ var i = 0;
+
+ var F = function () {};
+
+ return {
+ s: F,
+ n: function () {
+ if (i >= o.length) return {
+ done: true
+ };
+ return {
+ done: false,
+ value: o[i++]
+ };
+ },
+ e: function (e) {
+ throw e;
+ },
+ f: F
+ };
+ }
+
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+ }
+
+ var normalCompletion = true,
+ didErr = false,
+ err;
+ return {
+ s: function () {
+ it = o[Symbol.iterator]();
+ },
+ n: function () {
+ var step = it.next();
+ normalCompletion = step.done;
+ return step;
+ },
+ e: function (e) {
+ didErr = true;
+ err = e;
+ },
+ f: function () {
+ try {
+ if (!normalCompletion && it.return != null) it.return();
+ } finally {
+ if (didErr) throw err;
+ }
+ }
+ };
+}
+
+function _createForOfIteratorHelperLoose(o, allowArrayLike) {
+ var it;
+
+ if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
+ if (it) o = it;
+ var i = 0;
+ return function () {
+ if (i >= o.length) return {
+ done: true
+ };
+ return {
+ done: false,
+ value: o[i++]
+ };
+ };
+ }
+
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+ }
+
+ it = o[Symbol.iterator]();
+ return it.next.bind(it);
+}
+
+function _skipFirstGeneratorNext(fn) {
+ return function () {
+ var it = fn.apply(this, arguments);
+ it.next();
+ return it;
+ };
+}
+
+function _toPrimitive(input, hint) {
+ if (typeof input !== "object" || input === null) return input;
+ var prim = input[Symbol.toPrimitive];
+
+ if (prim !== undefined) {
+ var res = prim.call(input, hint || "default");
+ if (typeof res !== "object") return res;
+ throw new TypeError("@@toPrimitive must return a primitive value.");
+ }
+
+ return (hint === "string" ? String : Number)(input);
+}
+
+function _toPropertyKey(arg) {
+ var key = _toPrimitive(arg, "string");
+
+ return typeof key === "symbol" ? key : String(key);
+}
+
+function _initializerWarningHelper(descriptor, context) {
+ throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');
+}
+
+function _initializerDefineProperty(target, property, descriptor, context) {
+ if (!descriptor) return;
+ Object.defineProperty(target, property, {
+ enumerable: descriptor.enumerable,
+ configurable: descriptor.configurable,
+ writable: descriptor.writable,
+ value: descriptor.initializer ? descriptor.initializer.call(context) : void 0
+ });
+}
+
+function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
+ var desc = {};
+ Object.keys(descriptor).forEach(function (key) {
+ desc[key] = descriptor[key];
+ });
+ desc.enumerable = !!desc.enumerable;
+ desc.configurable = !!desc.configurable;
+
+ if ('value' in desc || desc.initializer) {
+ desc.writable = true;
+ }
+
+ desc = decorators.slice().reverse().reduce(function (desc, decorator) {
+ return decorator(target, property, desc) || desc;
+ }, desc);
+
+ if (context && desc.initializer !== void 0) {
+ desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
+ desc.initializer = undefined;
+ }
+
+ if (desc.initializer === void 0) {
+ Object.defineProperty(target, property, desc);
+ desc = null;
+ }
+
+ return desc;
+}
+
+var id = 0;
+
+function _classPrivateFieldLooseKey(name) {
+ return "__private_" + id++ + "_" + name;
+}
+
+function _classPrivateFieldLooseBase(receiver, privateKey) {
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
+ throw new TypeError("attempted to use private field on non-instance");
+ }
+
+ return receiver;
+}
+
+function _classPrivateFieldGet(receiver, privateMap) {
+ var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get");
+
+ return _classApplyDescriptorGet(receiver, descriptor);
+}
+
+function _classPrivateFieldSet(receiver, privateMap, value) {
+ var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set");
+
+ _classApplyDescriptorSet(receiver, descriptor, value);
+
+ return value;
+}
+
+function _classPrivateFieldDestructureSet(receiver, privateMap) {
+ var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set");
+
+ return _classApplyDescriptorDestructureSet(receiver, descriptor);
+}
+
+function _classExtractFieldDescriptor(receiver, privateMap, action) {
+ if (!privateMap.has(receiver)) {
+ throw new TypeError("attempted to " + action + " private field on non-instance");
+ }
+
+ return privateMap.get(receiver);
+}
+
+function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) {
+ _classCheckPrivateStaticAccess(receiver, classConstructor);
+
+ _classCheckPrivateStaticFieldDescriptor(descriptor, "get");
+
+ return _classApplyDescriptorGet(receiver, descriptor);
+}
+
+function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) {
+ _classCheckPrivateStaticAccess(receiver, classConstructor);
+
+ _classCheckPrivateStaticFieldDescriptor(descriptor, "set");
+
+ _classApplyDescriptorSet(receiver, descriptor, value);
+
+ return value;
+}
+
+function _classStaticPrivateMethodGet(receiver, classConstructor, method) {
+ _classCheckPrivateStaticAccess(receiver, classConstructor);
+
+ return method;
+}
+
+function _classStaticPrivateMethodSet() {
+ throw new TypeError("attempted to set read only static private field");
+}
+
+function _classApplyDescriptorGet(receiver, descriptor) {
+ if (descriptor.get) {
+ return descriptor.get.call(receiver);
+ }
+
+ return descriptor.value;
+}
+
+function _classApplyDescriptorSet(receiver, descriptor, value) {
+ if (descriptor.set) {
+ descriptor.set.call(receiver, value);
+ } else {
+ if (!descriptor.writable) {
+ throw new TypeError("attempted to set read only private field");
+ }
+
+ descriptor.value = value;
+ }
+}
+
+function _classApplyDescriptorDestructureSet(receiver, descriptor) {
+ if (descriptor.set) {
+ if (!("__destrObj" in descriptor)) {
+ descriptor.__destrObj = {
+ set value(v) {
+ descriptor.set.call(receiver, v);
+ }
+
+ };
+ }
+
+ return descriptor.__destrObj;
+ } else {
+ if (!descriptor.writable) {
+ throw new TypeError("attempted to set read only private field");
+ }
+
+ return descriptor;
+ }
+}
+
+function _classStaticPrivateFieldDestructureSet(receiver, classConstructor, descriptor) {
+ _classCheckPrivateStaticAccess(receiver, classConstructor);
+
+ _classCheckPrivateStaticFieldDescriptor(descriptor, "set");
+
+ return _classApplyDescriptorDestructureSet(receiver, descriptor);
+}
+
+function _classCheckPrivateStaticAccess(receiver, classConstructor) {
+ if (receiver !== classConstructor) {
+ throw new TypeError("Private static access of wrong provenance");
+ }
+}
+
+function _classCheckPrivateStaticFieldDescriptor(descriptor, action) {
+ if (descriptor === undefined) {
+ throw new TypeError("attempted to " + action + " private static field before its declaration");
+ }
+}
+
+function _decorate(decorators, factory, superClass, mixins) {
+ var api = _getDecoratorsApi();
+
+ if (mixins) {
+ for (var i = 0; i < mixins.length; i++) {
+ api = mixins[i](api);
+ }
+ }
+
+ var r = factory(function initialize(O) {
+ api.initializeInstanceElements(O, decorated.elements);
+ }, superClass);
+ var decorated = api.decorateClass(_coalesceClassElements(r.d.map(_createElementDescriptor)), decorators);
+ api.initializeClassElements(r.F, decorated.elements);
+ return api.runClassFinishers(r.F, decorated.finishers);
+}
+
+function _getDecoratorsApi() {
+ _getDecoratorsApi = function () {
+ return api;
+ };
+
+ var api = {
+ elementsDefinitionOrder: [["method"], ["field"]],
+ initializeInstanceElements: function (O, elements) {
+ ["method", "field"].forEach(function (kind) {
+ elements.forEach(function (element) {
+ if (element.kind === kind && element.placement === "own") {
+ this.defineClassElement(O, element);
+ }
+ }, this);
+ }, this);
+ },
+ initializeClassElements: function (F, elements) {
+ var proto = F.prototype;
+ ["method", "field"].forEach(function (kind) {
+ elements.forEach(function (element) {
+ var placement = element.placement;
+
+ if (element.kind === kind && (placement === "static" || placement === "prototype")) {
+ var receiver = placement === "static" ? F : proto;
+ this.defineClassElement(receiver, element);
+ }
+ }, this);
+ }, this);
+ },
+ defineClassElement: function (receiver, element) {
+ var descriptor = element.descriptor;
+
+ if (element.kind === "field") {
+ var initializer = element.initializer;
+ descriptor = {
+ enumerable: descriptor.enumerable,
+ writable: descriptor.writable,
+ configurable: descriptor.configurable,
+ value: initializer === void 0 ? void 0 : initializer.call(receiver)
+ };
+ }
+
+ Object.defineProperty(receiver, element.key, descriptor);
+ },
+ decorateClass: function (elements, decorators) {
+ var newElements = [];
+ var finishers = [];
+ var placements = {
+ static: [],
+ prototype: [],
+ own: []
+ };
+ elements.forEach(function (element) {
+ this.addElementPlacement(element, placements);
+ }, this);
+ elements.forEach(function (element) {
+ if (!_hasDecorators(element)) return newElements.push(element);
+ var elementFinishersExtras = this.decorateElement(element, placements);
+ newElements.push(elementFinishersExtras.element);
+ newElements.push.apply(newElements, elementFinishersExtras.extras);
+ finishers.push.apply(finishers, elementFinishersExtras.finishers);
+ }, this);
+
+ if (!decorators) {
+ return {
+ elements: newElements,
+ finishers: finishers
+ };
+ }
+
+ var result = this.decorateConstructor(newElements, decorators);
+ finishers.push.apply(finishers, result.finishers);
+ result.finishers = finishers;
+ return result;
+ },
+ addElementPlacement: function (element, placements, silent) {
+ var keys = placements[element.placement];
+
+ if (!silent && keys.indexOf(element.key) !== -1) {
+ throw new TypeError("Duplicated element (" + element.key + ")");
+ }
+
+ keys.push(element.key);
+ },
+ decorateElement: function (element, placements) {
+ var extras = [];
+ var finishers = [];
+
+ for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {
+ var keys = placements[element.placement];
+ keys.splice(keys.indexOf(element.key), 1);
+ var elementObject = this.fromElementDescriptor(element);
+ var elementFinisherExtras = this.toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject);
+ element = elementFinisherExtras.element;
+ this.addElementPlacement(element, placements);
+
+ if (elementFinisherExtras.finisher) {
+ finishers.push(elementFinisherExtras.finisher);
+ }
+
+ var newExtras = elementFinisherExtras.extras;
+
+ if (newExtras) {
+ for (var j = 0; j < newExtras.length; j++) {
+ this.addElementPlacement(newExtras[j], placements);
+ }
+
+ extras.push.apply(extras, newExtras);
+ }
+ }
+
+ return {
+ element: element,
+ finishers: finishers,
+ extras: extras
+ };
+ },
+ decorateConstructor: function (elements, decorators) {
+ var finishers = [];
+
+ for (var i = decorators.length - 1; i >= 0; i--) {
+ var obj = this.fromClassDescriptor(elements);
+ var elementsAndFinisher = this.toClassDescriptor((0, decorators[i])(obj) || obj);
+
+ if (elementsAndFinisher.finisher !== undefined) {
+ finishers.push(elementsAndFinisher.finisher);
+ }
+
+ if (elementsAndFinisher.elements !== undefined) {
+ elements = elementsAndFinisher.elements;
+
+ for (var j = 0; j < elements.length - 1; j++) {
+ for (var k = j + 1; k < elements.length; k++) {
+ if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) {
+ throw new TypeError("Duplicated element (" + elements[j].key + ")");
+ }
+ }
+ }
+ }
+ }
+
+ return {
+ elements: elements,
+ finishers: finishers
+ };
+ },
+ fromElementDescriptor: function (element) {
+ var obj = {
+ kind: element.kind,
+ key: element.key,
+ placement: element.placement,
+ descriptor: element.descriptor
+ };
+ var desc = {
+ value: "Descriptor",
+ configurable: true
+ };
+ Object.defineProperty(obj, Symbol.toStringTag, desc);
+ if (element.kind === "field") obj.initializer = element.initializer;
+ return obj;
+ },
+ toElementDescriptors: function (elementObjects) {
+ if (elementObjects === undefined) return;
+ return _toArray(elementObjects).map(function (elementObject) {
+ var element = this.toElementDescriptor(elementObject);
+ this.disallowProperty(elementObject, "finisher", "An element descriptor");
+ this.disallowProperty(elementObject, "extras", "An element descriptor");
+ return element;
+ }, this);
+ },
+ toElementDescriptor: function (elementObject) {
+ var kind = String(elementObject.kind);
+
+ if (kind !== "method" && kind !== "field") {
+ throw new TypeError('An element descriptor\'s .kind property must be either "method" or' + ' "field", but a decorator created an element descriptor with' + ' .kind "' + kind + '"');
+ }
+
+ var key = _toPropertyKey(elementObject.key);
+
+ var placement = String(elementObject.placement);
+
+ if (placement !== "static" && placement !== "prototype" && placement !== "own") {
+ throw new TypeError('An element descriptor\'s .placement property must be one of "static",' + ' "prototype" or "own", but a decorator created an element descriptor' + ' with .placement "' + placement + '"');
+ }
+
+ var descriptor = elementObject.descriptor;
+ this.disallowProperty(elementObject, "elements", "An element descriptor");
+ var element = {
+ kind: kind,
+ key: key,
+ placement: placement,
+ descriptor: Object.assign({}, descriptor)
+ };
+
+ if (kind !== "field") {
+ this.disallowProperty(elementObject, "initializer", "A method descriptor");
+ } else {
+ this.disallowProperty(descriptor, "get", "The property descriptor of a field descriptor");
+ this.disallowProperty(descriptor, "set", "The property descriptor of a field descriptor");
+ this.disallowProperty(descriptor, "value", "The property descriptor of a field descriptor");
+ element.initializer = elementObject.initializer;
+ }
+
+ return element;
+ },
+ toElementFinisherExtras: function (elementObject) {
+ var element = this.toElementDescriptor(elementObject);
+
+ var finisher = _optionalCallableProperty(elementObject, "finisher");
+
+ var extras = this.toElementDescriptors(elementObject.extras);
+ return {
+ element: element,
+ finisher: finisher,
+ extras: extras
+ };
+ },
+ fromClassDescriptor: function (elements) {
+ var obj = {
+ kind: "class",
+ elements: elements.map(this.fromElementDescriptor, this)
+ };
+ var desc = {
+ value: "Descriptor",
+ configurable: true
+ };
+ Object.defineProperty(obj, Symbol.toStringTag, desc);
+ return obj;
+ },
+ toClassDescriptor: function (obj) {
+ var kind = String(obj.kind);
+
+ if (kind !== "class") {
+ throw new TypeError('A class descriptor\'s .kind property must be "class", but a decorator' + ' created a class descriptor with .kind "' + kind + '"');
+ }
+
+ this.disallowProperty(obj, "key", "A class descriptor");
+ this.disallowProperty(obj, "placement", "A class descriptor");
+ this.disallowProperty(obj, "descriptor", "A class descriptor");
+ this.disallowProperty(obj, "initializer", "A class descriptor");
+ this.disallowProperty(obj, "extras", "A class descriptor");
+
+ var finisher = _optionalCallableProperty(obj, "finisher");
+
+ var elements = this.toElementDescriptors(obj.elements);
+ return {
+ elements: elements,
+ finisher: finisher
+ };
+ },
+ runClassFinishers: function (constructor, finishers) {
+ for (var i = 0; i < finishers.length; i++) {
+ var newConstructor = (0, finishers[i])(constructor);
+
+ if (newConstructor !== undefined) {
+ if (typeof newConstructor !== "function") {
+ throw new TypeError("Finishers must return a constructor.");
+ }
+
+ constructor = newConstructor;
+ }
+ }
+
+ return constructor;
+ },
+ disallowProperty: function (obj, name, objectType) {
+ if (obj[name] !== undefined) {
+ throw new TypeError(objectType + " can't have a ." + name + " property.");
+ }
+ }
+ };
+ return api;
+}
+
+function _createElementDescriptor(def) {
+ var key = _toPropertyKey(def.key);
+
+ var descriptor;
+
+ if (def.kind === "method") {
+ descriptor = {
+ value: def.value,
+ writable: true,
+ configurable: true,
+ enumerable: false
+ };
+ } else if (def.kind === "get") {
+ descriptor = {
+ get: def.value,
+ configurable: true,
+ enumerable: false
+ };
+ } else if (def.kind === "set") {
+ descriptor = {
+ set: def.value,
+ configurable: true,
+ enumerable: false
+ };
+ } else if (def.kind === "field") {
+ descriptor = {
+ configurable: true,
+ writable: true,
+ enumerable: true
+ };
+ }
+
+ var element = {
+ kind: def.kind === "field" ? "field" : "method",
+ key: key,
+ placement: def.static ? "static" : def.kind === "field" ? "own" : "prototype",
+ descriptor: descriptor
+ };
+ if (def.decorators) element.decorators = def.decorators;
+ if (def.kind === "field") element.initializer = def.value;
+ return element;
+}
+
+function _coalesceGetterSetter(element, other) {
+ if (element.descriptor.get !== undefined) {
+ other.descriptor.get = element.descriptor.get;
+ } else {
+ other.descriptor.set = element.descriptor.set;
+ }
+}
+
+function _coalesceClassElements(elements) {
+ var newElements = [];
+
+ var isSameElement = function (other) {
+ return other.kind === "method" && other.key === element.key && other.placement === element.placement;
+ };
+
+ for (var i = 0; i < elements.length; i++) {
+ var element = elements[i];
+ var other;
+
+ if (element.kind === "method" && (other = newElements.find(isSameElement))) {
+ if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {
+ if (_hasDecorators(element) || _hasDecorators(other)) {
+ throw new ReferenceError("Duplicated methods (" + element.key + ") can't be decorated.");
+ }
+
+ other.descriptor = element.descriptor;
+ } else {
+ if (_hasDecorators(element)) {
+ if (_hasDecorators(other)) {
+ throw new ReferenceError("Decorators can't be placed on different accessors with for " + "the same property (" + element.key + ").");
+ }
+
+ other.decorators = element.decorators;
+ }
+
+ _coalesceGetterSetter(element, other);
+ }
+ } else {
+ newElements.push(element);
+ }
+ }
+
+ return newElements;
+}
+
+function _hasDecorators(element) {
+ return element.decorators && element.decorators.length;
+}
+
+function _isDataDescriptor(desc) {
+ return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);
+}
+
+function _optionalCallableProperty(obj, name) {
+ var value = obj[name];
+
+ if (value !== undefined && typeof value !== "function") {
+ throw new TypeError("Expected '" + name + "' to be a function");
+ }
+
+ return value;
+}
+
+function _classPrivateMethodGet(receiver, privateSet, fn) {
+ if (!privateSet.has(receiver)) {
+ throw new TypeError("attempted to get private field on non-instance");
+ }
+
+ return fn;
+}
+
+function _classPrivateMethodSet() {
+ throw new TypeError("attempted to reassign private method");
+}
+
+function _wrapRegExp(re, groups) {
+ _wrapRegExp = function (re, groups) {
+ return new BabelRegExp(re, undefined, groups);
+ };
+
+ var _RegExp = _wrapNativeSuper(RegExp);
+
+ var _super = RegExp.prototype;
+
+ var _groups = new WeakMap();
+
+ function BabelRegExp(re, flags, groups) {
+ var _this = _RegExp.call(this, re, flags);
+
+ _groups.set(_this, groups || _groups.get(re));
+
+ return _this;
+ }
+
+ _inherits(BabelRegExp, _RegExp);
+
+ BabelRegExp.prototype.exec = function (str) {
+ var result = _super.exec.call(this, str);
+
+ if (result) result.groups = buildGroups(result, this);
+ return result;
+ };
+
+ BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {
+ if (typeof substitution === "string") {
+ var groups = _groups.get(this);
+
+ return _super[Symbol.replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) {
+ return "$" + groups[name];
+ }));
+ } else if (typeof substitution === "function") {
+ var _this = this;
+
+ return _super[Symbol.replace].call(this, str, function () {
+ var args = [];
+ args.push.apply(args, arguments);
+
+ if (typeof args[args.length - 1] !== "object") {
+ args.push(buildGroups(args, _this));
+ }
+
+ return substitution.apply(this, args);
+ });
+ } else {
+ return _super[Symbol.replace].call(this, str, substitution);
+ }
+ };
+
+ function buildGroups(result, re) {
+ var g = _groups.get(re);
+
+ return Object.keys(g).reduce(function (groups, name) {
+ groups[name] = result[g[name]];
+ return groups;
+ }, Object.create(null));
+ }
+
+ return _wrapRegExp.apply(this, arguments);
+}
+
+// Numbers represent type -
+// 1:float 2:vec2 3:vec3 4:vec4
+var geometryFunctions = {
+ sphere: {
+ args: [1]
+ },
+ line: {
+ args: [3, 3, 1]
+ },
+ cone: {
+ args: [1, 1]
+ },
+ roundCone: {
+ args: [3, 3, 1, 1]
+ },
+ plane: {
+ args: [1, 1, 1, 1]
+ }
+};
+var mathFunctions = {
+ nsin: {
+ args: [1],
+ ret: 1
+ },
+ ncos: {
+ args: [1],
+ ret: 1
+ },
+ round: {
+ args: [1],
+ ret: 1
+ },
+ hsv2rgb: {
+ args: [3],
+ ret: 3
+ },
+ rgb2hsv: {
+ args: [3],
+ ret: 3
+ },
+ rotateVec: {
+ args: [3, 3, 1],
+ ret: 3
+ },
+ toSpherical: {
+ args: [3],
+ ret: 3
+ },
+ fromSpherical: {
+ args: [3],
+ ret: 3
+ },
+ getRayDirection: {
+ args: [],
+ ret: 3
+ },
+ osc: {
+ args: [1],
+ ret: 1
+ },
+ _hash33: {
+ args: [3],
+ ret: 3
+ },
+ _hash13: {
+ args: [3],
+ ret: 1
+ },
+ noise: {
+ args: [3],
+ ret: 1
+ },
+ fractalNoise: {
+ args: [3],
+ ret: 1
+ },
+ sphericalDistribution: {
+ args: [3, 1],
+ ret: 4
+ }
+}; // these all have a single input/output and are overloaded for
+// all types so a list of names is all we need to generate them
+
+var glslBuiltInOneToOne = ["sin", "cos", "tan", "asin", "acos", "exp", "log", "exp2", "log2", "sqrt", "inversesqrt", "abs", "sign", "floor", "ceil", "fract"]; // need better overloading system
+
+var glslBuiltInOther = {
+ // overload pow somehow?
+ // pow: { args:[1,1], ret:1 },
+ mod: {
+ args: [1, 1],
+ ret: 1
+ },
+ min: {
+ args: [1, 1],
+ ret: 1
+ },
+ max: {
+ args: [1, 1],
+ ret: 1
+ },
+ atan: {
+ args: [1, 1],
+ ret: 1
+ },
+ clamp: {
+ args: [1, 1, 1],
+ ret: 1
+ },
+ step: {
+ args: [1, 1],
+ ret: 1
+ },
+ smoothstep: {
+ args: [1, 1, 1],
+ ret: 1
+ },
+ // also overload length for vec3 and vec2?
+ length: {
+ args: [3],
+ ret: 1
+ },
+ distance: {
+ args: [3, 3],
+ ret: 1
+ },
+ dot: {
+ args: [3, 3],
+ ret: 1
+ },
+ cross: {
+ args: [3, 3],
+ ret: 3
+ },
+ normalize: {
+ args: [3],
+ ret: 3
+ },
+ reflect: {
+ args: [3, 3],
+ ret: 3
+ },
+ refract: {
+ args: [3, 3],
+ ret: 3
+ }
+}; // let arg = {
+// 'mix' : (a, b, c) => (a.dim === b.dim && (c.dim === 1 || c.dim === a.dim))? a.dim: -1,
+// };
+
+function convertFunctionToString(source) {
+ if (typeof source === "function") {
+ source = source.toString();
+ return source.slice(source.indexOf("{") + 1, source.lastIndexOf("}"));
+ } else if (!(typeof source === "string")) {
+ throw "your Shader Park code requires the source code to be a function, or a string";
+ }
+
+ return source;
+}
+
+var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+function getDefaultExportFromCjs (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+}
+
+function getDefaultExportFromNamespaceIfPresent (n) {
+ return n && Object.prototype.hasOwnProperty.call(n, 'default') ? n['default'] : n;
+}
+
+function getDefaultExportFromNamespaceIfNotNamed (n) {
+ return n && Object.prototype.hasOwnProperty.call(n, 'default') && Object.keys(n).length === 1 ? n['default'] : n;
+}
+
+function getAugmentedNamespace(n) {
+ if (n.__esModule) return n;
+ var a = Object.defineProperty({}, '__esModule', {value: true});
+ Object.keys(n).forEach(function (k) {
+ var d = Object.getOwnPropertyDescriptor(n, k);
+ Object.defineProperty(a, k, d.get ? d : {
+ enumerable: true,
+ get: function () {
+ return n[k];
+ }
+ });
+ });
+ return a;
+}
+
+function createCommonjsModule(fn) {
+ var module = { exports: {} };
+ return fn(module, module.exports), module.exports;
+}
+
+function commonjsRequire (path) {
+ throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
+}
+
+var glslParser = createCommonjsModule(function (module, exports) {
+ // Adapted from https://github.com/cimaron/cwebgl/blob/master/external/glsl2js/glsl.js
+
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+ (function () {
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+ var glsl = {
+ runParse: function runParse(src, options) {
+ var state, result, irs;
+ state = new GlslState(options);
+ state.setSource(src); //Preprocess
+
+ result = this.preprocessor.process(state); //Parse into AST
+
+ if (result) {
+ result = this.parser.parse(state);
+ }
+ /*
+ //Generate IR
+ if (result) {
+ result = this.generate(state);
+ }
+ */
+
+
+ if (result) {
+ state.status = true;
+ }
+
+ return state;
+ },
+
+ /**
+ * Compilation targets
+ */
+ target: {
+ fragment: 0,
+ 'x-fragment': 0,
+ 'x-shader/x-fragment': 0,
+ vertex: 1,
+ 'x-vertex': 1,
+ 'x-shader/x-vertex': 1
+ }
+ }; // Copyright Joyent, Inc. and other Node contributors.
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a
+ // copy of this software and associated documentation files (the
+ // "Software"), to deal in the Software without restriction, including
+ // without limitation the rights to use, copy, modify, merge, publish,
+ // distribute, sublicense, and/or sell copies of the Software, and to permit
+ // persons to whom the Software is furnished to do so, subject to the
+ // following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included
+ // in all copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ // USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ /**
+ * Select node.js util functions
+ */
+
+ var util = {};
+
+ (function (exports) {
+ var formatRegExp = /%[sdj%]/g;
+
+ exports.format = function (f) {
+ if (!isString(f)) {
+ var objects = [];
+
+ for (var i = 0; i < arguments.length; i++) {
+ objects.push(inspect(arguments[i]));
+ }
+
+ return objects.join(' ');
+ }
+
+ var i = 1;
+ var args = arguments;
+ var len = args.length;
+ var str = String(f).replace(formatRegExp, function (x) {
+ if (x === '%%') return '%';
+ if (i >= len) return x;
+
+ switch (x) {
+ case '%s':
+ return String(args[i++]);
+
+ case '%d':
+ return Number(args[i++]);
+
+ case '%j':
+ try {
+ return JSON.stringify(args[i++]);
+ } catch (_) {
+ return '[Circular]';
+ }
+
+ default:
+ return x;
+ }
+ });
+
+ for (var x = args[i]; i < len; x = args[++i]) {
+ //if (isNull(x) || !isObject(x)) {
+ str += ' ' + x; //} else {
+ // str += ' ' + inspect(x);
+ //}
+ }
+
+ return str;
+ };
+
+ function isString(arg) {
+ return typeof arg === 'string';
+ }
+
+ exports.isString = isString;
+ /**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * The Function.prototype.inherits from lang.js rewritten as a standalone
+ * function (not on Function.prototype). NOTE: If this file is to be loaded
+ * during bootstrapping this function needs to be rewritten using some native
+ * functions as prototype setup using normal JavaScript does not work as
+ * expected during bootstrapping (see mirror.js in r114903).
+ *
+ * @param {function} ctor Constructor function which needs to inherit the
+ * prototype.
+ * @param {function} superCtor Constructor function to inherit prototype from.
+ */
+
+ exports.inherits = function (ctor, superCtor) {
+ ctor.super_ = superCtor;
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+ })(util);
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+ function GlslState(options) {
+ var i;
+ this.options = {
+ target: 0,
+ language_version: 100,
+ opt: {
+ fold_constants: true
+ }
+ };
+
+ for (i in options) {
+ this.options[i] = options[i];
+ }
+
+ this.symbols = new SymbolTable();
+ symbol_table_init(this.symbols, options.target);
+ this.status = false;
+ this.translation_unit = "";
+ this.ast = [];
+ this.ir = null;
+ this.errors = [];
+ this.warnings = [];
+ }
+
+ proto = GlslState.prototype = {};
+ /**
+ * Get identifier type
+ *
+ * @param object state GLSL state
+ * @param string name Identifier name
+ * Add error to state
+ *
+ * @return string
+ * @param string msg Message
+ * @param int line Message
+ * @param int column Message
+ */
+
+ proto.classify_identifier = function (state, name) {
+ if (this.symbols.get_variable(name) || this.symbols.get_function(name)) {
+ return 'IDENTIFIER';
+ } else if (this.symbols.get_type(name)) {
+ return 'TYPE_IDENTIFIER';
+ } else {
+ return 'NEW_IDENTIFIER';
+ }
+ };
+
+ proto.setSource = function (src) {
+ this.src = src;
+ };
+
+ proto.getSource = function () {
+ return this.src;
+ };
+
+ proto.setTranslationUnit = function (tu) {
+ this.translation_unit = tu;
+ };
+
+ proto.getTranslationUnit = function () {
+ return this.translation_unit;
+ };
+
+ proto.addAstNode = function (node) {
+ this.ast.push(node);
+ };
+
+ proto.getAst = function () {
+ return this.ast;
+ };
+
+ proto.setIR = function (ir) {
+ this.ir = ir;
+ };
+
+ proto.getIR = function () {
+ return this.ir;
+ };
+
+ proto.getStatus = function () {
+ return this.status;
+ };
+ /**
+ * Add error to state
+ *
+ * @param string msg Message
+ * @param int line Message
+ * @param int column Message
+ */
+
+
+ proto.addError = function (msg, line, column) {
+ var err;
+
+ if (!line && !column) {
+ this.errors.push(msg);
+ return;
+ }
+
+ err = util.format("%s at line %s, column %s", msg, line, column);
+ this.errors.push(err);
+ };
+ /**
+ * Add warning to state
+ *
+ * @param string msg Message
+ * @param int line Message
+ * @param int column Message
+ */
+
+
+ proto.addWarning = function (msg, line, column) {
+ var warn;
+
+ if (!line && !column) {
+ this.warnings.push(msg);
+ return;
+ }
+
+ warn = util.format("%s at line %s, column %s", msg, line, column);
+ this.warnings.push(warn);
+ };
+ /**
+ * Get compile errors
+ *
+ * @return mixed
+ */
+
+
+ proto.getErrors = function () {
+ return this.errors;
+ };
+ /**
+ * Get compile errors
+ *
+ * @return mixed
+ */
+
+
+ proto.getWarnings = function () {
+ return this.warnings;
+ };
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * Preprocessor Class
+ */
+
+
+ function Preprocessor() {}
+
+ Preprocessor.modules = {};
+ var proto = Preprocessor.prototype;
+
+ proto.process = function (state) {
+ var m,
+ out = state.getSource();
+
+ for (m in Preprocessor.modules) {
+ try {
+ out = Preprocessor.modules[m].process(out);
+ } catch (e) {
+ state.addError(e.message, e.lineNumber, e.columnNumber);
+ return false;
+ }
+ }
+
+ state.setTranslationUnit(out);
+ return true;
+ };
+
+ glsl.preprocessor = new Preprocessor();
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ Preprocessor.modules.comments = {
+ process: function process(src) {
+ var i,
+ chr,
+ la,
+ out = "",
+ line = 1,
+ in_single = 0,
+ in_multi = 0;
+
+ for (i = 0; i < src.length; i++) {
+ chr = src.substr(i, 1);
+ la = src.substr(i + 1, 1); //Enter single line comment
+
+ if (chr == '/' && la == '/' && !in_single && !in_multi) {
+ in_single = line;
+ i++;
+ continue;
+ } //Exit single line comment
+
+
+ if (chr == "\n" && in_single) {
+ in_single = 0;
+ } //Enter multi line comment
+
+
+ if (chr == '/' && la == '*' && !in_multi && !in_single) {
+ in_multi = line;
+ i++;
+ continue;
+ } //Exit multi line comment
+
+
+ if (chr == '*' && la == '/' && in_multi) {
+ //Treat single line multi-comment as space
+ if (in_multi == line) {
+ out += " ";
+ }
+
+ in_multi = 0;
+ i++;
+ continue;
+ } //Newlines are preserved
+
+
+ if (!in_multi && !in_single || chr == "\n") {
+ out += chr;
+ line++;
+ }
+ }
+
+ return out;
+ }
+ };
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ Preprocessor.modules.directives = {
+ state: {
+ lines: [],
+ defines: {}
+ },
+ process: function process(src) {
+ var i, l;
+ this.state.lines = src.split("\n");
+ this.state.defines = {
+ GL_ES: '1',
+ __FILE__: '0',
+ __LINE__: '0',
+ __VERSION__: '300'
+ };
+ this.state.cond_stack = [];
+ i = 0;
+ l = this.state.lines.length;
+
+ while (i < l) {
+ this.state.lines[i] = this.processLine(this.state.lines[i], i);
+ i++;
+ }
+
+ return this.state.lines.join("\n");
+ },
+ processLine: function processLine(line, i) {
+ var d, matches, raw, e, sub, cond;
+ matches = line.match(/^([ \t]*)#(.*)$/);
+
+ if (!matches) {
+ if (this.state.cond_stack.length != 0 && !this.state.cond_stack.slice(-1)[0]) {
+ return "";
+ }
+
+ line = this.processDefines(line, i);
+ return line;
+ }
+
+ raw = matches[2];
+
+ if (raw.match(/^\s*$/)) {
+ return "";
+ }
+
+ var lmatches = raw.split(/\s+/);
+
+ try {
+ switch (lmatches[0]) {
+ case 'define':
+ case 'undef':
+ case 'ifdef':
+ case 'endif':
+ this[lmatches[0]](line, lmatches);
+ return "";
+ }
+
+ throw new Error("Invalid directive");
+ } catch (e) {
+ e.lineNumber = i + 1;
+ e.columnNumber = matches[1].length + 1;
+ throw e;
+ }
+ },
+ processDefines: function processDefines(line, i) {
+ this.state.defines.__LINE__ = i + 1;
+
+ for (var d in this.state.defines) {
+ //easy global replace
+ line = line.split(d).join(this.state.defines[d]);
+ }
+
+ return line;
+ },
+ define: function define(line, matches) {
+ if (matches.length <= 1 || matches.length > 3) {
+ throw new Error("Syntax error in #define");
+ }
+
+ this.state.defines[matches[1]] = matches[2] || "";
+ },
+ undef: function undef(line, matches) {
+ if (matches.length != 2) {
+ throw new Error("Syntax error in #undef");
+ }
+
+ delete this.state.defines[matches[1]];
+ },
+ ifdef: function ifdef(line, matches) {
+ var def;
+ def = !!this.state.defines[matches[1]];
+ this.state.cond_stack.push(def);
+ },
+ endif: function endif(line, matches) {
+ if (this.state.cond_stack.length) {
+ this.state.cond_stack.pop();
+ } else {
+ throw new Error("unmatched #endif");
+ }
+ }
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ function Type(name, size, slots, base) {
+ this.name = name;
+ this.size = size;
+ this.slots = slots;
+ this.swizzle = size / slots != 4 ? "xyzw".slice(0, size / slots) : "";
+ this.base = base || name;
+ }
+ /**
+ * Do a cast on a constant
+ *
+ * @param string val Value to cast
+ * @param string from From type
+ * @param string to To type
+ *
+ * @return string
+ */
+
+
+ Type.castTo = function (val, from, to) {
+ var f32;
+
+ switch (to) {
+ case 'int':
+ return "" + parseInt(val);
+
+ case 'float':
+ //Should we keep maximum precision, or use the following to force to 32bit precision??
+
+ /*
+ f32 = new Float32Array(1);
+ f32[0] = parseFloat(val);
+ return "" + f32[0];
+ */
+ return "" + parseFloat(val);
+
+ case 'bool':
+ return parseFloat(val) ? "1" : "0";
+ }
+
+ return val;
+ };
+ /**
+ * Determine if can cast from one type to another
+ *
+ * @param string from From type
+ * @param string to To type
+ *
+ * @return bool
+ */
+
+
+ Type.canCast = function (from, to) {
+ var t1, t2;
+ t1 = types[from];
+ t2 = types[to];
+ return t1.size === 1 && t2.size === 1;
+ };
+
+ var types = {
+ _void: new Type("void", 1, 1),
+ bool: new Type("bool", 1, 1),
+ int: new Type("int", 1, 1),
+ float: new Type("float", 1, 1),
+ vec2: new Type("vec2", 2, 1, 'float'),
+ vec3: new Type("vec3", 3, 1, 'float'),
+ vec4: new Type("vec4", 4, 1, 'float'),
+ bvec2: new Type("bvec2", 2, 1, 'bool'),
+ bvec3: new Type("bvec3", 3, 1, 'bool'),
+ bvec4: new Type("bvec4", 4, 1, 'bool'),
+ ivec2: new Type("ivec2", 2, 1, 'int'),
+ ivec3: new Type("ivec3", 3, 1, 'int'),
+ ivec4: new Type("ivec4", 4, 1, 'int'),
+ mat2: new Type("mat2", 4, 2, 'float'),
+ mat3: new Type("mat3", 9, 3, 'float'),
+ mat4: new Type("mat4", 16, 4, 'float'),
+ sampler2D: new Type("sampler2D", 1, 1),
+ samplerCube: new Type("samplerCube", 1, 1)
+ }; //Compatibility
+
+ types['void'] = types._void;
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * SymbolTableEntry constructor
+ */
+
+ function SymbolTableEntry(name, typedef) {
+ this.depth = null;
+ this.typedef = typedef; //Variable name
+
+ this.name = name; //Type
+
+ this.type = null; //Base type (if array)
+
+ this.base_type = null; //Function definition
+
+ this.definition = []; //Qualifier
+
+ this.qualifier = null; //IR name
+
+ this.out = name; //Constant value
+
+ this.constant = null; //Array size
+
+ this.size = null; //Temp vars for IR generation
+
+ this.code = null;
+ this.Ast = null;
+ }
+
+ SymbolTableEntry.typedef = {
+ variable: 0,
+ func: 1,
+ type: 2
+ };
+
+ SymbolTableEntry.prototype.getType = function () {
+ return types[this.type];
+ };
+ /**
+ * symbol_table constructor
+ */
+
+
+ function SymbolTable() {
+ this.table = {};
+ this.depth = 0;
+ }
+
+ SymbolTable.prototype = {};
+ var proto = SymbolTable.prototype;
+ /**
+ *
+ */
+
+ proto.push_scope = function () {
+ this.depth++;
+ };
+ /**
+ *
+ */
+
+
+ proto.pop_scope = function () {
+ var n, t;
+
+ for (n in this.table) {
+ if (this.table.hasOwnProperty(n)) {
+ t = this.table[n];
+
+ while (t[0] && t[0].depth === this.depth) {
+ t.splice(0, 1);
+ }
+
+ if (t.length === 0) {
+ delete this.table[n];
+ }
+ }
+ }
+
+ this.depth--;
+ };
+ /**
+ *
+ */
+
+
+ proto.name_declared_this_scope = function (name) {
+ var e = this.get_entry(name);
+ return e && e.depth === this.depth;
+ };
+ /**
+ *
+ */
+
+
+ proto.add_variable = function (name, type) {
+ var entry = new SymbolTableEntry(name, SymbolTableEntry.typedef.variable);
+ entry.type = type;
+ return this._add_entry(entry);
+ };
+ /**
+ *
+ */
+
+
+ proto.add_type = function (name, t) {
+ var entry = new SymbolTableEntry(name, SymbolTableEntry.typedef.type);
+ entry.definition = t;
+ return this._add_entry(entry);
+ };
+ /**
+ *
+ */
+
+
+ proto.add_function = function (name, type, def) {
+ var entry;
+ entry = new SymbolTableEntry(name, SymbolTableEntry.typedef.func);
+ entry.type = type;
+
+ if (def) {
+ entry.definition = def;
+ }
+
+ return this._add_entry(entry);
+ };
+ /**
+ *
+ */
+
+
+ proto.get_variable = function (name) {
+ var entry = this.get_entry(name, SymbolTableEntry.typedef.variable);
+ return entry;
+ };
+ /**
+ *
+ */
+
+
+ proto.get_type = function (name) {
+ var entry = this.get_entry(name, SymbolTableEntry.typedef.type);
+ return entry;
+ };
+ /**
+ *
+ */
+
+
+ proto.get_function = function (name, def) {
+ var entry = this.get_entry(name, SymbolTableEntry.typedef.func, def);
+ return entry;
+ };
+ /**
+ * @protected
+ */
+
+
+ proto._match_definition = function (def, entry) {
+ var i;
+
+ if (!def) {
+ return true;
+ }
+
+ if (def.length !== entry.length) {
+ return false;
+ }
+
+ for (i = 0; i < def.length; i++) {
+ if (def[i] !== entry[i]) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+ /**
+ * @protected
+ */
+
+
+ proto._add_entry = function (entry) {
+ if (!this.table[entry.name]) {
+ this.table[entry.name] = [];
+ }
+
+ this.table[entry.name].splice(0, 0, entry);
+ entry.depth = this.depth;
+ return entry;
+ };
+ /**
+ * @protected
+ */
+
+
+ proto.get_entry = function (name, typedef, def) {
+ var t, i, entry;
+ t = this.table[name] || []; //Look for 'void' instead of empty definition list
+
+ if (def && def.length == 0) {
+ def = ["void"];
+ }
+
+ for (i = 0; i < t.length; i++) {
+ entry = t[i]; //Not type of variable we're looking for
+
+ if (entry.typedef !== typedef) {
+ continue;
+ } //Normal variable
+
+
+ if (typedef !== SymbolTableEntry.typedef.func) {
+ return entry;
+ } //Match any function definition
+
+
+ if (!def) {
+ return entry;
+ } //Match specific function definition
+
+
+ if (def.join(',') === entry.definition.join(',')) {
+ return entry;
+ }
+ }
+
+ return null;
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * Base class of all abstract syntax tree nodes
+ */
+
+
+ function AstNode() {
+ //public:
+ this.location = {
+ first_line: 0,
+ first_column: 0,
+ last_line: 0,
+ last_column: 0
+ }; //The following are used during IR generation
+
+ this.Dest = null;
+ this.Type = null;
+ this.Const = false;
+ }
+
+ var proto = AstNode.prototype; //public:
+
+ proto.getLocation = function () {
+ return this.location;
+ };
+
+ proto.setLocation = function (loc) {
+ this.location.first_line = loc.first_line;
+ this.location.first_column = loc.first_column;
+ this.location.last_line = loc.last_line;
+ this.location.last_column = loc.last_column;
+ };
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+
+ proto.toString = function () {
+ return this.constructor.name;
+ };
+
+ proto.ir = function (state, irs) {//throw new Error("Missing ir generator for node of type " + this.constructor.name);
+ }; //inverse of operators
+
+
+ var ast_operators = ["=", "POS", "NEG", "+", "-", "*", "/", "%", "<<", ">>", "<", ">", "<=", ">=", "==", "!=", "&", "^", "|", "~", "&&", "^^", "||", "!", "*=", "/=", "%=", "+=", "-=", "<<=", ">>=", "&=", "^=", "|=", "?:", "++x", "--x", "x++", "x--", ".", "[]", "()", "ident", "float", "int", "bool"];
+ var ast_precision = {
+ none: 0,
+ highp: 1,
+ mediump: 2,
+ lowp: 3
+ };
+ /**
+ * AST Type Specifier Class
+ */
+
+ function AstTypeSpecifier(specifier) {
+ AstNode.apply(this);
+ this.type_specifier = null;
+ this.type_name = null;
+ this.structure = null;
+ this.is_array = 0;
+ this.array_size = null;
+ this.precision = 2;
+ this.is_precision_statement = null;
+
+ if (AstTypeSpecifier[_typeof(specifier)]) {
+ AstTypeSpecifier[_typeof(specifier)].call(this, specifier);
+ }
+ }
+
+ util.inherits(AstTypeSpecifier, AstNode);
+ proto = AstTypeSpecifier.prototype; //overloaded constructors
+
+ AstTypeSpecifier.number = function (specifier) {
+ this.type_specifier = specifier;
+ this.precision = ast_precision.none;
+ this.is_precision_statement = false;
+ this.type_name = types[specifier].name;
+ };
+
+ AstTypeSpecifier.string = function (name) {
+ this.type_specifier = types[name];
+ this.type_name = name;
+ this.is_array = false;
+ this.precision = ast_precision.none;
+ this.is_precision_statement = false;
+ };
+
+ AstTypeSpecifier.object = function (s) {
+ this.type_specifier = types.struct;
+ this.type_name = s.name;
+ this.structure = s;
+ this.is_array = false;
+ this.precision = ast_precision.none;
+ this.is_precision_statement = false;
+ };
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+
+ proto.toString = function () {
+ var i, prec;
+
+ if (this.is_precision_statement) {
+ for (i in ast_precision) {
+ if (ast_precision.hasOwnProperty(i) && ast_precision[i] === this.precision) {
+ prec = i;
+ break;
+ }
+ }
+
+ return util.format("precision %s %s;\n", prec, this.type_name);
+ }
+
+ return (this.type_specifier === types.struct ? this.structure : this.type_name) + (this.is_array ? util.format("[%s]", this.array_size || "") : "");
+ };
+ /**
+ * AST Function Class
+ */
+
+
+ function AstFunction() {
+ AstNode.apply(this);
+ this.return_type = null;
+ this.identifier = null;
+ this.parameters = [];
+ this.entry = null;
+ }
+
+ util.inherits(AstFunction, AstNode);
+ proto = AstFunction.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("%s %s(%s)", this.return_type, this.identifier, this.parameters.join(", "));
+ };
+ /**
+ * AST Expression Class
+ */
+
+
+ function AstExpression(oper, ex0, ex1, ex2) {
+ AstNode.apply(this);
+ this.oper = oper;
+ this.grouped = false;
+ this.subexpressions = [null, null, null];
+ this.primary_expression = {};
+ this.expressions = [];
+
+ if (ast_operators.indexOf(this.oper) === -1) {
+ this.oper = 'ident';
+ this.primary_expression.identifier = oper;
+ } else {
+ this.subexpressions[0] = ex0;
+ this.subexpressions[1] = ex1;
+ this.subexpressions[2] = ex2;
+ }
+ }
+
+ util.inherits(AstExpression, AstNode);
+ proto = AstExpression.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ var output;
+
+ switch (this.oper) {
+ case '=':
+ case '+':
+ case '-':
+ case '*':
+ case '/':
+ case '%':
+ case "<<":
+ case ">>":
+ case "<":
+ case ">":
+ case "<=":
+ case ">=":
+ case "==":
+ case "!=":
+ case "&":
+ case "^":
+ case "|":
+ case "~":
+ case "&&":
+ case "^^":
+ case "||":
+ case '*=':
+ case '/=':
+ case '%=':
+ case '+=':
+ case '-=':
+ case '<<=':
+ case '>>=':
+ case '&=':
+ case '^=':
+ case '|=':
+ output = util.format("%s %s %s", this.subexpressions[0], this.oper, this.subexpressions[1]);
+ break;
+
+ case '.':
+ output = util.format("%s.%s", this.subexpressions[0], this.primary_expression.identifier);
+ break;
+
+ case 'POS':
+ output = util.format("+%s", this.subexpressions[0]);
+ break;
+
+ case 'NEG':
+ output = util.format("-%s", this.subexpressions[0]);
+ break;
+
+ case '~':
+ case '!':
+ output = util.format("%s%s", this.oper, this.subexpressions[0]);
+ break;
+
+ case '++x':
+ case '--x':
+ output = util.format("%s%s", this.oper.replace('x', ''), this.subexpressions[0]);
+ break;
+
+ case 'x++':
+ case 'x--':
+ output = util.format("%s%s", this.subexpressions[0], this.oper.replace('x', ''));
+ break;
+
+ case '?:':
+ output = util.format("%s ? %s : %s", this.subexpressions[0], this.subexpressions[1], this.subexpressions[2]);
+ break;
+
+ case '[]':
+ output = util.format("%s[%s]", this.subexpressions[0], this.subexpressions[1]);
+ break;
+
+ case '()':
+ output = util.format("%s(%s)", this.subexpressions[0], this.expressions.join(", "));
+ break;
+
+ case 'ident':
+ output = util.format("%s", this.primary_expression.identifier);
+ break;
+
+ case 'float':
+ output = util.format("%s", this.primary_expression.float_constant);
+ break;
+
+ case 'int':
+ output = util.format("%s", this.primary_expression.int_constant);
+ break;
+
+ case 'bool':
+ output = util.format("%s", this.primary_expression.bool_constant ? 'true' : 'false');
+ break;
+ }
+
+ return this.grouped ? util.format("(%s)", output) : output;
+ };
+ /**
+ * AST Fully Specified Type Class
+ */
+
+
+ function AstFullySpecifiedType() {
+ AstNode.apply(this);
+ this.qualifier = [];
+ this.specifier = null;
+ }
+
+ util.inherits(AstFullySpecifiedType, AstNode);
+ proto = AstFullySpecifiedType.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ var output;
+ output = this.qualifier.slice(0);
+ output.push(this.specifier);
+ return output.join(' ');
+ };
+ /**
+ * AST Declaration Class
+ */
+
+
+ function AstDeclaration(identifier, is_array, array_size, initializer) {
+ AstNode.apply(this);
+ this.identifier = identifier;
+ this.is_array = is_array;
+ this.array_size = array_size;
+ this.initializer = initializer;
+ }
+
+ util.inherits(AstDeclaration, AstNode);
+ proto = AstDeclaration.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return this.identifier + (this.is_array ? util.format("[%s]", this.array_size === undefined ? '' : this.array_size) : '') + (this.initializer ? util.format(" = %s", this.initializer) : "");
+ };
+ /**
+ * AST Declarator List Class
+ */
+
+
+ function AstDeclaratorList(type) {
+ AstNode.apply(this);
+ this.type = type;
+ this.declarations = [];
+ this.invariant = 0;
+ }
+
+ util.inherits(AstDeclaratorList, AstNode);
+ proto = AstDeclaratorList.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("%s %s;\n", this.type || "invariant ", this.declarations.join(", "));
+ };
+ /**
+ * AST Parameter Declarator Class
+ */
+
+
+ function AstParameterDeclarator() {
+ AstNode.apply(this);
+ this.type = null;
+ this.identifier = null;
+ this.is_array = false;
+ this.array_size = 0;
+ this.formal_parameter = null;
+ this.is_void = null;
+ }
+
+ util.inherits(AstParameterDeclarator, AstNode);
+ proto = AstParameterDeclarator.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return this.type + (this.identifier ? " " + this.identifier : "") + (this.is_array ? util.format("[%s]", this.array_size) : "");
+ };
+ /**
+ * AST Expression Statement Class
+ */
+
+
+ function AstExpressionStatement(ex) {
+ AstNode.apply(this);
+ this.expression = ex;
+ }
+
+ util.inherits(AstExpressionStatement, AstNode);
+ proto = AstExpressionStatement.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("%s;\n", this.expression || "");
+ };
+ /**
+ * AST Compound Statement Class
+ */
+
+
+ function AstCompoundStatement(new_scope, statements) {
+ AstNode.apply(this);
+ this.new_scope = new_scope;
+
+ if (statements) {
+ this.statements = statements;
+ } else {
+ this.statements = [];
+ }
+ }
+
+ util.inherits(AstCompoundStatement, AstNode);
+ proto = AstCompoundStatement.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ var str, stmts, indent;
+ AstCompoundStatement._depth++;
+ indent = new Array(AstCompoundStatement._depth).join(" ");
+ stmts = indent + " " + this.statements.join(indent + " ");
+ str = "\n" + indent + "{\n" + stmts + indent + "}\n";
+ AstCompoundStatement._depth--;
+ return str;
+ }; //Used for toString indentation
+
+
+ AstCompoundStatement._depth = 0;
+ /**
+ * AST Function Definition Class
+ */
+
+ function AstFunctionDefinition() {
+ AstNode.apply(this);
+ this.proto_type = null;
+ this.body = null;
+ }
+
+ util.inherits(AstFunctionDefinition, AstNode);
+ proto = AstFunctionDefinition.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("%s %s", this.proto_type, this.body);
+ };
+ /**
+ * AST Function Definition Class
+ */
+
+
+ function AstExpressionBin(oper, ex0, ex1) {
+ AstExpression.apply(this, [oper, ex0, ex1]);
+ }
+
+ util.inherits(AstExpressionBin, AstExpression);
+ proto = AstExpressionBin.prototype;
+ /**
+ * AST Function Expression Class
+ */
+
+ function AstFunctionExpression(arg) {
+ AstExpression.apply(this);
+ this.cons = false;
+
+ if (arg.constructor.name === 'AstExpression') {
+ this.cons = false;
+ AstExpression.call(this, '()', arg);
+ } else if (arg.constructor.name === 'AstTypeSpecifier') {
+ this.cons = true;
+ AstExpression.call(this, '()', arg);
+ }
+ }
+
+ util.inherits(AstFunctionExpression, AstExpression);
+ proto = AstFunctionExpression.prototype;
+
+ proto.is_constructor = function () {
+ return this.cons;
+ };
+
+ proto.toString = function () {
+ return util.format("%s(%s)", this.subexpressions[0], this.expressions.join(", "));
+ };
+ /**
+ * AST Selection Statement Class
+ */
+
+
+ function AstSelectionStatement(condition, then_statement, else_statement) {
+ AstNode.apply(this);
+ this.condition = condition;
+ this.then_statement = then_statement;
+ this.else_statement = else_statement;
+ }
+
+ util.inherits(AstSelectionStatement, AstNode);
+ proto = AstSelectionStatement.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("if (%s) %s %s", this.condition, this.then_statement, this.else_statement ? util.format("else %s", this.else_statement) : "");
+ };
+ /**
+ * AST Struct Specifier Class
+ */
+
+
+ function AstStructSpecifier(identifier, declarator_list) {
+ AstNode.apply(this);
+ this.name = null;
+ this.declarations = [];
+
+ if (identifier === null) {
+ identifier = util.format("#anon_struct%d", AstStructSpecifier.anon_count);
+ AstStructSpecifier.anon_count++;
+ }
+
+ this.name = identifier;
+ this.declarations = declarator_list.declarations;
+ }
+
+ AstStructSpecifier.anon_count = 1;
+ util.inherits(AstStructSpecifier, AstNode);
+ proto = AstStructSpecifier.prototype;
+ /**
+ * AST Jump
+ */
+
+ function AstJumpStatement(mode, return_value) {
+ AstNode.apply(this);
+ this.opt_return_value = null;
+ this.mode = mode;
+
+ if (mode === 'return') {
+ this.opt_return_value = return_value;
+ }
+ }
+
+ util.inherits(AstJumpStatement, AstNode);
+ proto = AstJumpStatement.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ switch (this.mode) {
+ case 'continue':
+ case 'break':
+ case 'discard':
+ case 'debugger':
+ return this.mode + ";\n";
+
+ case 'return':
+ return util.format("return%s;\n", this.opt_return_value ? " " + this.opt_return_value : "");
+ }
+ };
+
+ glsl.ast = {
+ Node: AstNode,
+ TypeSpecifier: AstTypeSpecifier,
+ Function: AstFunction,
+ Expression: AstExpression,
+ FullySpecifiedType: AstFullySpecifiedType,
+ Declaration: AstDeclaration,
+ DeclaratorList: AstDeclaratorList,
+ ParameterDeclarator: AstParameterDeclarator,
+ ExpressionStatement: AstExpressionStatement,
+ CompoundStatement: AstCompoundStatement,
+ FunctionDefinition: AstFunctionDefinition,
+ ExpressionBin: AstExpressionBin,
+ FunctionExpression: AstFunctionExpression,
+ SelectionStatement: AstSelectionStatement,
+ StructSpecifier: AstStructSpecifier,
+ JumpStatement: AstJumpStatement
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ var builtin = {
+ vars: {
+ vertex: [{
+ position: 0,
+ type: 'vec4',
+ name: 'gl_Position',
+ out: 'result@0'
+ }, {
+ position: 1,
+ type: 'float',
+ name: 'gl_PointSize',
+ out: 'result@1'
+ }],
+ fragment: [{
+ position: 0,
+ type: 'vec4',
+ name: 'gl_FragColor',
+ out: 'result@0'
+ }]
+ },
+
+ /**
+ * List of instructions for operators
+ *
+ * Denoted by operator, then by definition of param types to output type
+ */
+ oper: {
+ "!": {
+ "bool:bool": ["SEQ %1.x %2.x 0.0"]
+ },
+ "+": {
+ "int,int:int": ["ADD %1.x %2.x %3.x"],
+ "float,float:float": ["ADD %1.x %2.x %3.x"],
+ "float,vec2:vec2": ["ADD %1.xy %2.x %3.xy"],
+ "float,vec3:vec3": ["ADD %1.xyz %2.x %3.xyz"],
+ "float,vec4:vec4": ["ADD %1 %2.x %3"],
+ "vec2,float:vec2": ["ADD %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["ADD %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["ADD %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["ADD %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["ADD %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["ADD %1 %2 %3"]
+ },
+ "-": {
+ "int,int:int": ["SUB %1.x %2.x %3.x"],
+ "float,float:float": ["SUB %1.x %2.x %3.x"],
+ "float,vec2:vec2": ["SUB %1.xy %2.x %3.xy"],
+ "float,vec3:vec3": ["SUB %1.xyz %2.x %3.xyz"],
+ "float,vec4:vec4": ["SUB %1 %2.x %3"],
+ "vec2,float:vec2": ["SUB %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["SUB %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["SUB %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["SUB %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["SUB %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["SUB %1 %2 %3"]
+ },
+ "*": {
+ "int,int:int": ["MUL %1.x %2.x %3.x"],
+ "float,float:float": ["MUL %1.x %2.x %3.x"],
+ "float,vec2:vec2": ["MUL %1.xy %2.x %3.xy"],
+ "float,vec3:vec3": ["MUL %1.xyz %2.x %3.xyz"],
+ "float,vec4:vec4": ["MUL %1 %2.x %3"],
+ "vec2,float:vec2": ["MUL %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["MUL %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["MUL %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["MUL %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["MUL %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["MUL %1 %2 %3"],
+ "mat3,vec3:vec3": ["MUL %1.xyz %2.xyz %3.x", "MAD %1.xyz %2@1.xyz %3.y %1", "MAD %1.xyz %2@2.xyz %3.z %1"],
+ "mat4,vec4:vec4": ["MUL %1 %2 %3.x", "MAD %1 %2@1 %3.y %1", "MAD %1 %2@2 %3.z %1", "MAD %1 %2@3 %3.w %1"],
+ "mat4,mat4:mat4": ["MUL %1 %2 %3.x", "MAD %1 %2@1 %3.y %1", "MAD %1 %2@2 %3.z %1", "MAD %1 %2@3 %3.w %1", "MUL %1@1 %2 %3@1.x", "MAD %1@1 %2@1 %3@1.y %1@1", "MAD %1@1 %2@2 %3@1.z %1@1", "MAD %1@1 %2@3 %3@1.w %1@1", "MUL %1@2 %2 %3@2.x", "MAD %1@2 %2@1 %3@2.y %1@2", "MAD %1@2 %2@2 %3@2.z %1@2", "MAD %1@2 %2@3 %3@2.w %1@2", "MUL %1@3 %2 %3@3.x", "MAD %1@3 %2@1 %3@3.y %1@3", "MAD %1@3 %2@2 %3@3.z %1@3", "MAD %1@3 %2@3 %3@3.w %1@3"]
+ },
+ "/": {
+ "int,int:int": ["DIV %1.x %2.x %3.x"],
+ "float,float:float": ["DIV %1.x %2.x %3.x"],
+ "float,vec2:vec2": ["DIV %1.xy %2.x %3.xy"],
+ "float,vec3:vec3": ["DIV %1.xyz %2.x %3.xyz"],
+ "float,vec4:vec4": ["DIV %1 %2.x %3"],
+ "vec2,float:vec2": ["DIV %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["DIV %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["DIV %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["DIV %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["DIV %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["DIV %1 %2 %3"]
+ },
+ "<": {
+ "int,int:bool": ["SLT %1.x %2.x %3.x"],
+ "float,float:bool": ["SLT %1.x %2.x %3.x"]
+ },
+ ">": {
+ "int,int:bool": ["SGT %1.x %2.x %3.x"],
+ "float,float:bool": ["SGT %1.x %2.x %3.x"]
+ },
+ "<=": {
+ "int,int:bool": ["SLE %1.x %2.x %3.x"],
+ "float,float:bool": ["SLE %1.x %2.x %3.x"]
+ },
+ ">=": {
+ "int,int:bool": ["SGE %1.x %2.x %3.x"],
+ "float,float:bool": ["SGE %1.x %2.x %3.x"]
+ },
+ "==": {
+ "int,int:bool": ["SEQ %1.x %2.x %3.x"],
+ "float,float:bool": ["SEQ %1.x %2.x %3.x"]
+ },
+ "!=": {
+ "int,int:bool": ["SNE %1.x %2.x %3.x"],
+ "float,float:bool": ["SNE %1.x %2.x %3.x"]
+ },
+ "&&": {
+ "bool,bool:bool": ["AND %1.x %2.x %3.x", "AND %1.x %1.x 1"]
+ },
+ "^^": {
+ "bool,bool:bool": ["XOR %1.x %2.x %3.x", "AND %1.x %1.x 1"]
+ },
+ "||": {
+ "bool,bool:bool": ["OR %1.x %2.x %3.x", "AND %1.x %1.x 1"]
+ }
+ },
+
+ /**
+ * List of instructions for built in functions
+ *
+ * Denoted by function name, then by definition of param types to output type
+ */
+ func: {
+ "abs": {
+ "float:float": ["ABS %1.x %2.x"],
+ "vec2:vec2": ["ABS %1.xy %2.xy"],
+ "vec3:vec3": ["ABS %1.xyz %2.xyz"],
+ "vec4:vec4": ["ABS %1 %2"]
+ },
+ "ceil": {
+ "float:float": ["CEIL %1.x %2.x"],
+ "vec2:vec2": ["CEIL %1.xy %2.xy"],
+ "vec3:vec3": ["CEIL %1.xyz %2.xyz"],
+ "vec4:vec4": ["CEIL %1 %2"]
+ },
+ "clamp": {
+ "float,float,float:float": ["MAX %1.x %2.x %3.x", "MIN %1.x %1.x %4.x"],
+ "vec2,float,float:vec2": ["MAX %1.xy %2.xy %3.x", "MIN %1.xy %1.xy %4.x"],
+ "vec3,float,float:vec3": ["MAX %1.xyz %2.xyz %3.x", "MIN %1.xyz %1.xyz %4.x"],
+ "vec4,float,float:vec4": ["MAX %1 %2 %3.x", "MIN %1 %1 %4.x"],
+ "vec2,vec2,vec2:vec2": ["MAX %1.xy %2.xy %3.xy", "MIN %1.xy %1.xy %4.xy"],
+ "vec3,vec3,vec3:vec3": ["MAX %1.xyz %2.xyz %3.xyz", "MIN %1.xyz %1.xyz %4.xyz"],
+ "vec4,vec4,vec4:vec4": ["MAX %1 %2 %3", "MIN %1 %1 %4"]
+ },
+ "cos": {
+ "float:float": ["COS %1.x %2.x"],
+ "vec2:vec2": ["COS %1.xy %2.xy"],
+ "vec3:vec3": ["COS %1.xyz %2.xyz"],
+ "vec4:vec4": ["COS %1 %2"]
+ },
+ "degrees": {
+ "float:float": ["MUL %1.x %2.x " + 180 / Math.PI],
+ "vec2:vec2": ["MUL %1.xy %2.xy " + 180 / Math.PI],
+ "vec3:vec3": ["MUL %1.xyz %2.xyz " + 180 / Math.PI],
+ "vec4:vec4": ["MUL %1 %2 " + 180 / Math.PI]
+ },
+ "dot": {
+ "vec2,vec2:float": ["DP2 %1.x %2.xy %3.xy"],
+ "vec3,vec3:float": ["DP3 %1.x %2.xyz %3.xyz"],
+ "vec4,vec4:float": ["DP4 %1.x %2 %3"]
+ },
+ "floor": {
+ "float:float": ["FLR %1.x %2.x"],
+ "vec2:vec2": ["FLR %1.xy %2.xy"],
+ "vec3:vec3": ["FLR %1.xyz %2.xyz"],
+ "vec4:vec4": ["FLR %1 %2"]
+ },
+ "fract": {
+ "float:float": ["FRC %1.x %2.x"],
+ "vec2:vec2": ["FRC %1.xy %2.xy"],
+ "vec3:vec3": ["FRC %1.xyz %2.xyz"],
+ "vec4:vec4": ["FRC %1 %2"]
+ },
+ "max": {
+ "float,float:float": ["MAX %1.x %2.x %3.x"],
+ "vec2,float:vec2": ["MAX %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["MAX %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["MAX %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["MAX %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["MAX %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["MAX %1 %2 %3"]
+ },
+ "min": {
+ "float,float:float": ["MIN %1.x %2.x %3.x"],
+ "vec2,float:vec2": ["MIN %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["MIN %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["MIN %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["MIN %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["MIN %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["MIN %1 %2 %3"]
+ },
+ "mix": {
+ "float,float,float:float": ["MAD %1.x -%2.x %4.x %2.x", "MAD %1.x %3.x %4.x %1.x"],
+ "vec2,vec2,float:vec2": ["MAD %1.xy -%2.xy %4.x %2.xy", "MAD %1.xy %3.xy %4.x %1.xy"],
+ "vec3,vec3,float:vec3": ["MAD %1.xyz -%2.xyz %4.x %2.xyz", "MAD %1.xyz %3.xyz %4.x %1.xyz"],
+ "vec4,vec4,float:vec4": ["MAD %1 -%2 %4.x %2", "MAD %1 %3 %4.x %1"],
+ "vec2,vec2,vec2:vec2": ["MAD %1.xy -%2.xy %4.xy %2.xy", "MAD %1.xy %3.xy %4.xy %1.xy"],
+ "vec3,vec3,vec3:vec3": ["MAD %1.xyz -%2.xyz %4.xyz %2.xyz", "MAD %1.xyz %3.xyz %4.xyz %1.xyz"],
+ "vec4,vec4,vec4:vec4": ["MAD %1 -%2 %4 %2", "MAD %1 %3 %4 %1"]
+ },
+ "mod": {
+ "float,float:float": ["MOD %1.x %2.x %3.x"],
+ "vec2,float:vec2": ["MOD %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["MOD %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["MOD %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["MOD %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["MOD %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["MOD %1 %2 %3"]
+ },
+ "normalize": {
+ "vec3:vec3": ["DP3 %1.x %2 %2", "RSQ %1.x %1.x", "MUL %1.xyz %2.xyz %1.x"],
+ "vec4:vec4": ["DP4 %1.x %2 %2", "RSQ %1.x %1.x", "MUL %1 %2 %1.x"]
+ },
+ "pow": {
+ "float,float:float": ["POW %1.x %2.x %3.x"]
+ },
+ "reflect": {
+ "vec3,vec3:vec3": ["DP3 %1.x %3 %2", "MUL %1.xyz %3 %1.x", "MAD %1.xyz -%1 2.0 %2"]
+ },
+ "radians": {
+ "float:float": ["MUL %1.x %2.x " + Math.PI / 180],
+ "vec2:vec2": ["MUL %1.xy %2.xy " + Math.PI / 180],
+ "vec3:vec3": ["MUL %1.xyz %2.xyz " + Math.PI / 180],
+ "vec4:vec4": ["MUL %1 %2 " + Math.PI / 180]
+ },
+ "sign": {
+ "float:float": ["SGT %t1.x %2.x 0", "SLT %t1.y %2.x 0", "ADD %1.x %t1.x -%t1.y"],
+ "vec2:vec2": ["SGT %t1.xy %2.xy 0", "SLT %t1.zw %2.zw 0", "ADD %1.xy %t1.xy -%t1.zw"],
+ "vec3:vec3": ["SGT %t1.xyz %2.xyz 0", "SLT %t2.xyz %2.xyz 0", "ADD %1.xyz %t1.xyz -%t2.xyz"],
+ "vec4:vec4": ["SGT %t1 %2 0", "SLT %t2 %2 0", "ADD %1 %t1 -%t2"]
+ },
+ "sin": {
+ "float:float": ["SIN %1.x %2.x"],
+ "vec2:vec2": ["SIN %1.xy %2.xy"],
+ "vec3:vec3": ["SIN %1.xyz %2.xyz"],
+ "vec4:vec4": ["SIN %1 %2"]
+ },
+ "step": {
+ "float,float:float": ["SGE %1.x %3.x %2.x"],
+ "float,vec2:vec2": ["SGE %1.xy %3.x %2.xy"],
+ "float,vec3:vec3": ["SGE %1.xyz %3.x %2.xyz"],
+ "float,vec4:vec4": ["SGE %1 %3.x %2"],
+ "vec2,vec2:vec2": ["SGE %1.xy %3.xy %2.xy"],
+ "vec3,vec3:vec3": ["SGE %1.xyz %3.xyz %2.xyz"],
+ "vec4,vec4:vec4": ["SGE %1 %3 %3"]
+ },
+ "tan": {
+ "float:float": ["TAN %1.x %2.x"],
+ "vec2:vec2": ["TAN %1.xy %2.xy"],
+ "vec3:vec3": ["TAN %1.xyz %2.xyz"],
+ "vec4:vec4": ["TAN %1 %2"]
+ },
+ "texture2D": {
+ "sampler2D,vec2:vec4": ["TEX %1 %3 %2 \"2D\""]
+ }
+ }
+ };
+
+ function _builtinParseType(str) {
+ var parts, ret;
+ parts = str.split(":");
+ parts[0] = parts[0].split(",");
+ ret = {
+ src: parts[0],
+ dest: parts[1]
+ };
+ return ret;
+ }
+
+ function symbol_table_init(table, target) {
+ var i, j, vars, v, entry, types, name;
+ vars = target === glsl.target.vertex ? builtin.vars.vertex : builtin.vars.fragment;
+
+ for (i = 0; i < vars.length; i++) {
+ v = vars[i];
+ entry = table.add_variable(v.name, v.type);
+ entry.position = v.position;
+ entry.out = v.out;
+ }
+
+ vars = builtin.func;
+
+ for (name in vars) {
+ v = vars[name];
+
+ for (j in v) {
+ types = _builtinParseType(j);
+ entry = table.add_function(name, types.dest, types.src);
+ entry.code = v[j];
+ }
+ }
+ }
+ /* parser generated by jison 0.4.15 */
+
+ /*
+ Returns a Parser object of the following structure:
+
+ Parser: {
+ yy: {}
+ }
+
+ Parser.prototype: {
+ yy: {},
+ trace: function(),
+ symbols_: {associative list: name ==> number},
+ terminals_: {associative list: number ==> name},
+ productions_: [...],
+ performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+ table: [...],
+ defaultActions: {...},
+ parseError: function(str, hash),
+ parse: function(input),
+
+ lexer: {
+ EOF: 1,
+ parseError: function(str, hash),
+ setInput: function(input),
+ input: function(),
+ unput: function(str),
+ more: function(),
+ less: function(n),
+ pastInput: function(),
+ upcomingInput: function(),
+ showPosition: function(),
+ test_match: function(regex_match_array, rule_index),
+ next: function(),
+ lex: function(),
+ begin: function(condition),
+ popState: function(),
+ _currentRules: function(),
+ topState: function(),
+ pushState: function(condition),
+
+ options: {
+ ranges: boolean (optional: true ==> token location info will include a .range[] member)
+ flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+ backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+ },
+
+ performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+ rules: [...],
+ conditions: {associative list: name ==> set},
+ }
+ }
+
+
+ token location info (@$, _$, etc.): {
+ first_line: n,
+ last_line: n,
+ first_column: n,
+ last_column: n,
+ range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
+ }
+
+
+ the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+ text: (matched text)
+ token: (the produced terminal token, if any)
+ line: (yylineno)
+ }
+ while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+ loc: (yylloc)
+ expected: (string describing the set of expected tokens)
+ recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+ }
+ */
+
+
+ var parser = function () {
+ var o = function o(k, v, _o, l) {
+ for (_o = _o || {}, l = k.length; l--; _o[k[l]] = v) {
+ ;
+ }
+
+ return _o;
+ },
+ $V0 = [13, 14, 15, 16, 17, 21, 22, 47, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $V1 = [1, 18],
+ $V2 = [1, 19],
+ $V3 = [1, 20],
+ $V4 = [1, 21],
+ $V5 = [1, 22],
+ $V6 = [1, 53],
+ $V7 = [1, 54],
+ $V8 = [1, 17],
+ $V9 = [1, 44],
+ $Va = [1, 45],
+ $Vb = [1, 28],
+ $Vc = [1, 47],
+ $Vd = [1, 48],
+ $Ve = [1, 49],
+ $Vf = [1, 50],
+ $Vg = [1, 40],
+ $Vh = [1, 41],
+ $Vi = [1, 42],
+ $Vj = [1, 43],
+ $Vk = [1, 46],
+ $Vl = [1, 55],
+ $Vm = [1, 56],
+ $Vn = [1, 57],
+ $Vo = [1, 58],
+ $Vp = [1, 59],
+ $Vq = [1, 60],
+ $Vr = [1, 61],
+ $Vs = [1, 62],
+ $Vt = [1, 63],
+ $Vu = [1, 64],
+ $Vv = [1, 65],
+ $Vw = [1, 66],
+ $Vx = [1, 67],
+ $Vy = [1, 68],
+ $Vz = [1, 69],
+ $VA = [1, 70],
+ $VB = [1, 71],
+ $VC = [1, 72],
+ $VD = [1, 73],
+ $VE = [1, 74],
+ $VF = [1, 75],
+ $VG = [1, 76],
+ $VH = [1, 37],
+ $VI = [1, 38],
+ $VJ = [1, 39],
+ $VK = [1, 77],
+ $VL = [5, 13, 14, 15, 16, 17, 21, 47, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $VM = [1, 82],
+ $VN = [1, 83],
+ $VO = [1, 84],
+ $VP = [1, 86],
+ $VQ = [1, 87],
+ $VR = [49, 106],
+ $VS = [21, 47, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $VT = [2, 121],
+ $VU = [1, 101],
+ $VV = [1, 102],
+ $VW = [1, 103],
+ $VX = [1, 100],
+ $VY = [2, 159],
+ $VZ = [21, 25, 26, 49, 106],
+ $V_ = [2, 141],
+ $V$ = [21, 25, 26, 30, 32, 49, 106],
+ $V01 = [21, 47, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 169],
+ $V11 = [21, 47, 120, 121, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $V21 = [21, 25, 26, 30, 32, 34, 49, 106],
+ $V31 = [2, 177],
+ $V41 = [2, 12],
+ $V51 = [11, 23, 30, 32, 34, 36, 38, 39, 40, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106, 170],
+ $V61 = [5, 10, 13, 14, 15, 16, 17, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 172, 189, 191, 193, 194, 195, 196, 197, 198, 202, 203, 204, 205, 206],
+ $V71 = [1, 169],
+ $V81 = [1, 170],
+ $V91 = [1, 171],
+ $Va1 = [1, 172],
+ $Vb1 = [1, 156],
+ $Vc1 = [1, 157],
+ $Vd1 = [1, 182],
+ $Ve1 = [1, 163],
+ $Vf1 = [1, 164],
+ $Vg1 = [1, 165],
+ $Vh1 = [1, 166],
+ $Vi1 = [1, 136],
+ $Vj1 = [1, 127],
+ $Vk1 = [1, 138],
+ $Vl1 = [1, 139],
+ $Vm1 = [1, 140],
+ $Vn1 = [1, 141],
+ $Vo1 = [1, 142],
+ $Vp1 = [1, 143],
+ $Vq1 = [1, 144],
+ $Vr1 = [1, 145],
+ $Vs1 = [1, 146],
+ $Vt1 = [1, 147],
+ $Vu1 = [1, 148],
+ $Vv1 = [1, 149],
+ $Vw1 = [32, 49],
+ $Vx1 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 172, 189, 193, 194, 195, 196, 197, 198, 202, 203, 204, 205, 206],
+ $Vy1 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 172, 189, 191, 193, 194, 195, 196, 197, 198, 202, 203, 204, 205, 206],
+ $Vz1 = [1, 216],
+ $VA1 = [23, 32, 36, 49, 106],
+ $VB1 = [23, 32, 36, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $VC1 = [2, 58],
+ $VD1 = [23, 32, 36, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106],
+ $VE1 = [1, 251],
+ $VF1 = [23, 32, 36, 49, 88, 90, 106],
+ $VG1 = [1, 252],
+ $VH1 = [23, 32, 34, 36, 38, 39, 40, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106],
+ $VI1 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $VJ1 = [23, 32, 36, 49, 86, 88, 90, 106],
+ $VK1 = [1, 253],
+ $VL1 = [23, 32, 36, 49, 84, 86, 88, 90, 106],
+ $VM1 = [1, 256],
+ $VN1 = [23, 32, 36, 49, 82, 84, 86, 88, 90, 106],
+ $VO1 = [1, 257],
+ $VP1 = [23, 32, 36, 49, 80, 82, 84, 86, 88, 90, 106],
+ $VQ1 = [1, 261],
+ $VR1 = [23, 32, 36, 49, 78, 80, 82, 84, 86, 88, 90, 106],
+ $VS1 = [1, 264],
+ $VT1 = [1, 265],
+ $VU1 = [10, 21, 25, 26, 28, 29, 30, 32, 39, 40, 47, 51, 57, 58, 59, 60, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $VV1 = [23, 32, 36, 49, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $VW1 = [1, 266],
+ $VX1 = [1, 267],
+ $VY1 = [1, 268],
+ $VZ1 = [1, 269],
+ $V_1 = [23, 32, 36, 49, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $V$1 = [1, 270],
+ $V02 = [1, 271],
+ $V12 = [23, 32, 36, 49, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $V22 = [1, 272],
+ $V32 = [1, 273],
+ $V42 = [23, 32, 36, 49, 57, 58, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $V52 = [1, 274],
+ $V62 = [1, 275],
+ $V72 = [1, 276],
+ $V82 = [21, 47, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 172],
+ $V92 = [1, 306],
+ $Va2 = [30, 34],
+ $Vb2 = [32, 106],
+ $Vc2 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169];
+
+ var parser = {
+ trace: function trace() {},
+ yy: {},
+ symbols_: {
+ "error": 2,
+ "glsl-start": 3,
+ "translation_unit": 4,
+ "EOF": 5,
+ "version_statement": 6,
+ "extension_statement_list": 7,
+ "external_declaration_list": 8,
+ "VERSION": 9,
+ "INTCONSTANT": 10,
+ "EOL": 11,
+ "pragma_statement": 12,
+ "PRAGMA_DEBUG_ON": 13,
+ "PRAGMA_DEBUG_OFF": 14,
+ "PRAGMA_OPTIMIZE_ON": 15,
+ "PRAGMA_OPTIMIZE_OFF": 16,
+ "PRAGMA_INVARIANT_ALL": 17,
+ "extension_statement": 18,
+ "any_identifier": 19,
+ "variable_identifier": 20,
+ "TYPE_IDENTIFIER": 21,
+ "EXTENSION": 22,
+ ":": 23,
+ "external_declaration": 24,
+ "IDENTIFIER": 25,
+ "NEW_IDENTIFIER": 26,
+ "primary_expression": 27,
+ "FLOATCONSTANT": 28,
+ "BOOLCONSTANT": 29,
+ "(": 30,
+ "expression": 31,
+ ")": 32,
+ "postfix_expression": 33,
+ "[": 34,
+ "integer_expression": 35,
+ "]": 36,
+ "function_call": 37,
+ ".": 38,
+ "++": 39,
+ "--": 40,
+ "function_call_or_method": 41,
+ "function_call_generic": 42,
+ "method_call_generic": 43,
+ "function_call_header_with_parameters": 44,
+ "function_call_header_no_parameters": 45,
+ "function_call_header": 46,
+ "VOID": 47,
+ "assignment_expression": 48,
+ ",": 49,
+ "type_specifier": 50,
+ "FIELD_SELECTION": 51,
+ "method_call_header_with_parameters": 52,
+ "method_call_header_no_parameters": 53,
+ "method_call_header": 54,
+ "unary_expression": 55,
+ "unary_operator": 56,
+ "+": 57,
+ "-": 58,
+ "!": 59,
+ "~": 60,
+ "multiplicative_expression": 61,
+ "*": 62,
+ "/": 63,
+ "%": 64,
+ "additive_expression": 65,
+ "shift_expression": 66,
+ "<<": 67,
+ ">>": 68,
+ "relational_expression": 69,
+ "<": 70,
+ ">": 71,
+ "<=": 72,
+ ">=": 73,
+ "equality_expression": 74,
+ "==": 75,
+ "!=": 76,
+ "and_expression": 77,
+ "&": 78,
+ "exclusive_or_expression": 79,
+ "^": 80,
+ "inclusive_or_expression": 81,
+ "|": 82,
+ "logical_and_expression": 83,
+ "&&": 84,
+ "logical_xor_expression": 85,
+ "^^": 86,
+ "logical_or_expression": 87,
+ "||": 88,
+ "conditional_expression": 89,
+ "?": 90,
+ "assignment_operator": 91,
+ "=": 92,
+ "*=": 93,
+ "/=": 94,
+ "%=": 95,
+ "+=": 96,
+ "-=": 97,
+ "<<=": 98,
+ ">>=": 99,
+ "&=": 100,
+ "^=": 101,
+ "|=": 102,
+ "constant_expression": 103,
+ "declaration": 104,
+ "function_prototype": 105,
+ ";": 106,
+ "init_declarator_list": 107,
+ "PRECISION": 108,
+ "precision_qualifier": 109,
+ "type_specifier_no_prec": 110,
+ "function_declarator": 111,
+ "function_header": 112,
+ "function_header_with_parameters": 113,
+ "parameter_declaration": 114,
+ "fully_specified_type": 115,
+ "parameter_declarator": 116,
+ "parameter_type_qualifier": 117,
+ "parameter_qualifier": 118,
+ "parameter_type_specifier": 119,
+ "IN": 120,
+ "OUT": 121,
+ "INOUT": 122,
+ "single_declaration": 123,
+ "initializer": 124,
+ "INVARIANT": 125,
+ "type_qualifier": 126,
+ "layout_qualifier": 127,
+ "LAYOUT": 128,
+ "layout_qualifier_id_list": 129,
+ "layout_qualifier_id": 130,
+ "interpolation_qualifier": 131,
+ "SMOOTH": 132,
+ "FLAT": 133,
+ "NOPERSPECTIVE": 134,
+ "CONST": 135,
+ "storage_qualifier": 136,
+ "ATTRIBUTE": 137,
+ "VARYING": 138,
+ "CENTROID": 139,
+ "UNIFORM": 140,
+ "type_specifier_nonarray": 141,
+ "basic_type_specifier_nonarray": 142,
+ "struct_specifier": 143,
+ "FLOAT": 144,
+ "DOUBLE": 145,
+ "INT": 146,
+ "BOOL": 147,
+ "VEC2": 148,
+ "VEC3": 149,
+ "VEC4": 150,
+ "BVEC2": 151,
+ "BVEC3": 152,
+ "BVEC4": 153,
+ "IVEC2": 154,
+ "IVEC3": 155,
+ "IVEC4": 156,
+ "MAT2X2": 157,
+ "MAT3X3": 158,
+ "MAT4X4": 159,
+ "SAMPLER1D": 160,
+ "SAMPLER2D": 161,
+ "SAMPLER3D": 162,
+ "SAMPLERCUBE": 163,
+ "SAMPLER1DSHADOW": 164,
+ "SAMPLER2DSHADOW": 165,
+ "HIGHP": 166,
+ "MEDIUMP": 167,
+ "LOWP": 168,
+ "STRUCT": 169,
+ "{": 170,
+ "struct_declaration_list": 171,
+ "}": 172,
+ "struct_declaration": 173,
+ "struct_declarator_list": 174,
+ "struct_declarator": 175,
+ "declaration_statement": 176,
+ "statement": 177,
+ "compound_statement": 178,
+ "simple_statement": 179,
+ "expression_statement": 180,
+ "selection_statement": 181,
+ "switch_statement": 182,
+ "case_label": 183,
+ "iteration_statement": 184,
+ "jump_statement": 185,
+ "statement_list": 186,
+ "statement_no_new_scope": 187,
+ "compound_statement_no_new_scope": 188,
+ "IF": 189,
+ "selection_rest_statement": 190,
+ "ELSE": 191,
+ "condition": 192,
+ "SWITCH": 193,
+ "CASE": 194,
+ "DEFAULT": 195,
+ "WHILE": 196,
+ "DO": 197,
+ "FOR": 198,
+ "for_init_statement": 199,
+ "for_rest_statement": 200,
+ "conditionopt": 201,
+ "CONTINUE": 202,
+ "BREAK": 203,
+ "RETURN": 204,
+ "DISCARD": 205,
+ "DEBUGGER": 206,
+ "function_definition": 207,
+ "$accept": 0,
+ "$end": 1
+ },
+ terminals_: {
+ 2: "error",
+ 5: "EOF",
+ 9: "VERSION",
+ 10: "INTCONSTANT",
+ 11: "EOL",
+ 13: "PRAGMA_DEBUG_ON",
+ 14: "PRAGMA_DEBUG_OFF",
+ 15: "PRAGMA_OPTIMIZE_ON",
+ 16: "PRAGMA_OPTIMIZE_OFF",
+ 17: "PRAGMA_INVARIANT_ALL",
+ 21: "TYPE_IDENTIFIER",
+ 22: "EXTENSION",
+ 23: ":",
+ 25: "IDENTIFIER",
+ 26: "NEW_IDENTIFIER",
+ 28: "FLOATCONSTANT",
+ 29: "BOOLCONSTANT",
+ 30: "(",
+ 32: ")",
+ 34: "[",
+ 36: "]",
+ 38: ".",
+ 39: "++",
+ 40: "--",
+ 47: "VOID",
+ 49: ",",
+ 51: "FIELD_SELECTION",
+ 57: "+",
+ 58: "-",
+ 59: "!",
+ 60: "~",
+ 62: "*",
+ 63: "/",
+ 64: "%",
+ 67: "<<",
+ 68: ">>",
+ 70: "<",
+ 71: ">",
+ 72: "<=",
+ 73: ">=",
+ 75: "==",
+ 76: "!=",
+ 78: "&",
+ 80: "^",
+ 82: "|",
+ 84: "&&",
+ 86: "^^",
+ 88: "||",
+ 90: "?",
+ 92: "=",
+ 93: "*=",
+ 94: "/=",
+ 95: "%=",
+ 96: "+=",
+ 97: "-=",
+ 98: "<<=",
+ 99: ">>=",
+ 100: "&=",
+ 101: "^=",
+ 102: "|=",
+ 106: ";",
+ 108: "PRECISION",
+ 120: "IN",
+ 121: "OUT",
+ 122: "INOUT",
+ 125: "INVARIANT",
+ 128: "LAYOUT",
+ 132: "SMOOTH",
+ 133: "FLAT",
+ 134: "NOPERSPECTIVE",
+ 135: "CONST",
+ 137: "ATTRIBUTE",
+ 138: "VARYING",
+ 139: "CENTROID",
+ 140: "UNIFORM",
+ 144: "FLOAT",
+ 145: "DOUBLE",
+ 146: "INT",
+ 147: "BOOL",
+ 148: "VEC2",
+ 149: "VEC3",
+ 150: "VEC4",
+ 151: "BVEC2",
+ 152: "BVEC3",
+ 153: "BVEC4",
+ 154: "IVEC2",
+ 155: "IVEC3",
+ 156: "IVEC4",
+ 157: "MAT2X2",
+ 158: "MAT3X3",
+ 159: "MAT4X4",
+ 160: "SAMPLER1D",
+ 161: "SAMPLER2D",
+ 162: "SAMPLER3D",
+ 163: "SAMPLERCUBE",
+ 164: "SAMPLER1DSHADOW",
+ 165: "SAMPLER2DSHADOW",
+ 166: "HIGHP",
+ 167: "MEDIUMP",
+ 168: "LOWP",
+ 169: "STRUCT",
+ 170: "{",
+ 172: "}",
+ 189: "IF",
+ 191: "ELSE",
+ 193: "SWITCH",
+ 194: "CASE",
+ 195: "DEFAULT",
+ 196: "WHILE",
+ 197: "DO",
+ 198: "FOR",
+ 202: "CONTINUE",
+ 203: "BREAK",
+ 204: "RETURN",
+ 205: "DISCARD",
+ 206: "DEBUGGER"
+ },
+ productions_: [0, [3, 2], [4, 3], [6, 0], [6, 3], [12, 2], [12, 2], [12, 2], [12, 2], [12, 2], [7, 0], [7, 2], [19, 1], [19, 1], [18, 5], [8, 1], [8, 2], [20, 1], [20, 1], [27, 1], [27, 1], [27, 1], [27, 1], [27, 3], [33, 1], [33, 4], [33, 1], [33, 3], [33, 2], [33, 2], [35, 1], [37, 1], [41, 1], [41, 3], [42, 2], [42, 2], [45, 2], [45, 1], [44, 2], [44, 3], [46, 2], [46, 2], [46, 1], [43, 2], [43, 2], [53, 2], [53, 1], [52, 2], [52, 3], [54, 2], [55, 1], [55, 2], [55, 2], [55, 2], [56, 1], [56, 1], [56, 1], [56, 1], [61, 1], [61, 3], [61, 3], [61, 3], [65, 1], [65, 3], [65, 3], [66, 1], [66, 3], [66, 3], [69, 1], [69, 3], [69, 3], [69, 3], [69, 3], [74, 1], [74, 3], [74, 3], [77, 1], [77, 3], [79, 1], [79, 3], [81, 1], [81, 3], [83, 1], [83, 3], [85, 1], [85, 3], [87, 1], [87, 3], [89, 1], [89, 5], [48, 1], [48, 3], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [31, 1], [31, 3], [103, 1], [104, 2], [104, 2], [104, 4], [105, 2], [111, 1], [111, 1], [113, 2], [113, 3], [112, 3], [116, 2], [116, 5], [114, 3], [114, 2], [114, 3], [114, 2], [118, 0], [118, 1], [118, 1], [118, 1], [119, 1], [107, 1], [107, 3], [107, 5], [107, 6], [107, 7], [107, 8], [107, 5], [123, 1], [123, 2], [123, 4], [123, 5], [123, 6], [123, 7], [123, 4], [123, 2], [115, 1], [115, 2], [127, 4], [129, 1], [129, 3], [130, 1], [130, 3], [131, 1], [131, 1], [131, 1], [117, 1], [126, 1], [126, 1], [126, 2], [126, 1], [126, 2], [126, 2], [126, 3], [126, 1], [136, 1], [136, 1], [136, 1], [136, 2], [136, 1], [136, 1], [136, 2], [136, 2], [136, 1], [50, 1], [50, 2], [110, 1], [110, 3], [110, 4], [141, 1], [141, 1], [141, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [109, 1], [109, 1], [109, 1], [143, 5], [143, 4], [171, 1], [171, 2], [173, 3], [174, 1], [174, 3], [175, 1], [175, 4], [124, 1], [176, 1], [177, 1], [177, 1], [179, 1], [179, 1], [179, 1], [179, 1], [179, 1], [179, 1], [179, 1], [178, 2], [178, 3], [187, 1], [187, 1], [188, 2], [188, 3], [186, 1], [186, 2], [180, 1], [180, 2], [181, 5], [190, 3], [190, 1], [192, 1], [192, 4], [182, 5], [183, 3], [183, 2], [184, 5], [184, 7], [184, 6], [199, 1], [199, 1], [201, 1], [201, 0], [200, 2], [200, 3], [185, 2], [185, 2], [185, 2], [185, 3], [185, 2], [185, 2], [24, 1], [24, 1], [24, 1], [207, 2]],
+ performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate
+ /* action[1] */
+ , $$
+ /* vstack */
+ , _$
+ /* lstack */
+ ) {
+ /* this == yyval */
+ var $0 = $$.length - 1;
+
+ switch (yystate) {
+ case 1:
+ return $$[$0 - 1];
+ break;
+
+ case 15:
+ case 16:
+ if ($$[$0] !== null) {
+ yy.state.addAstNode($$[$0]);
+ }
+
+ break;
+
+ case 19:
+ this.$ = new AstExpression('ident');
+ this.$.setLocation(_$[$0]);
+ this.$.primary_expression.identifier = $$[$0];
+ break;
+
+ case 20:
+ this.$ = new AstExpression('int');
+ this.$.setLocation(_$[$0]);
+ this.$.primary_expression.int_constant = $$[$0];
+ this.$.primary_expression.type = 'int';
+ break;
+
+ case 21:
+ this.$ = new AstExpression('float');
+ this.$.setLocation(_$[$0]);
+ this.$.primary_expression.float_constant = $$[$0];
+ this.$.primary_expression.type = 'float';
+ break;
+
+ case 22:
+ this.$ = new AstExpression('bool');
+ this.$.setLocation(_$[$0]);
+ this.$.primary_expression.bool_constant = $$[$0];
+ this.$.primary_expression.type = 'bool';
+ break;
+
+ case 23:
+ this.$ = $$[$0 - 1];
+ this.$.grouped = true;
+ break;
+
+ case 25:
+ this.$ = new AstExpression('[]', $$[$0 - 3], $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 3]);
+ break;
+
+ case 27:
+ this.$ = new AstExpression('.', $$[$0 - 2]);
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.primary_expression.identifier = $$[$0];
+ break;
+
+ case 28:
+ this.$ = new AstExpression('x++', $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 29:
+ this.$ = new AstExpression('x--', $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 38:
+ this.$ = $$[$0 - 1];
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.expressions.push($$[$0]);
+ break;
+
+ case 39:
+ this.$ = $$[$0 - 2];
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.expressions.push($$[$0]);
+ break;
+
+ case 40:
+ this.$ = new AstFunctionExpression($$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 41:
+ var callee = new AstExpression($$[$0 - 1]);
+ this.$ = new AstFunctionExpression(callee);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 51:
+ this.$ = new AstExpression('++x', $$[$0]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 52:
+ this.$ = new AstExpression('--x', $$[$0]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 53:
+ this.$ = new AstExpression($$[$0 - 1], $$[$0]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 54:
+ this.$ = 'POS';
+ break;
+
+ case 55:
+ this.$ = 'NEG';
+ break;
+
+ case 59:
+ case 60:
+ case 61:
+ case 63:
+ case 64:
+ case 66:
+ case 67:
+ case 69:
+ case 70:
+ case 71:
+ case 72:
+ case 74:
+ case 75:
+ case 77:
+ case 79:
+ case 81:
+ case 83:
+ case 85:
+ case 87:
+ this.$ = new AstExpressionBin($$[$0 - 1], $$[$0 - 2], $$[$0]);
+ this.$.setLocation(_$[$0 - 2]);
+ break;
+
+ case 89:
+ this.$ = new AstExpression($$[$0 - 3], $$[$0 - 4], $$[$0 - 2], $$[$0]);
+ this.$.setLocation(_$[$0 - 4]);
+ break;
+
+ case 91:
+ this.$ = new AstExpression($$[$0 - 1], $$[$0 - 2], $$[$0]);
+ this.$.setLocation(_$[$0 - 2]);
+ break;
+
+ case 103:
+ this.$ = $$[$0];
+ break;
+
+ case 104:
+ if ($$[$0 - 2].oper !== $$[$0 - 1]) {
+ this.$ = new AstExpression($$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.expressions.push($$[$0 - 2]);
+ } else {
+ this.$ = $$[$0 - 2];
+ }
+
+ this.$.expressions.push($$[$0]);
+ break;
+
+ case 106:
+ yy.state.symbols.pop_scope();
+ this.$ = $$[$0 - 1];
+ break;
+
+ case 107:
+ this.$ = $$[$0 - 1];
+ break;
+
+ case 108:
+ $$[$0 - 1].precision = $$[$0 - 2];
+ $$[$0 - 1].is_precision_statement = true;
+ this.$ = $$[$0 - 1];
+ break;
+
+ case 112:
+ this.$ = $$[$0 - 1];
+ this.$.parameters.push($$[$0]);
+ break;
+
+ case 113:
+ this.$ = $$[$0 - 2];
+ this.$.parameters.push($$[$0]);
+ break;
+
+ case 114:
+ this.$ = new AstFunction();
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.return_type = $$[$0 - 2];
+ this.$.identifier = $$[$0 - 1]; //Check for duplicates
+
+ if ($$[$0 - 1] == 'main') {
+ if (yy.state.symbols.get_function($$[$0 - 1])) {
+ var e = new Error("Cannot define main() more than once");
+ e.lineNumber = _$[$0 - 2].first_line;
+ e.columnNumber = _$[$0 - 2].first_column;
+ throw e;
+ }
+ }
+
+ this.$.entry = yy.state.symbols.add_function($$[$0 - 1], $$[$0 - 2].specifier.type_name);
+ this.$.entry.Ast = this.$;
+ yy.state.symbols.push_scope();
+ break;
+
+ case 115:
+ this.$ = new AstParameterDeclarator();
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.type = new AstFullySpecifiedType();
+ this.$.type.setLocation(_$[$0 - 1]);
+ this.$.type.specifier = $$[$0 - 1];
+ this.$.identifier = $$[$0];
+ break;
+
+ case 117:
+ $$[$0 - 2].concat($$[$0 - 1]);
+ this.$ = $$[$0];
+ this.$.type.qualifier = $$[$0 - 2];
+ break;
+
+ case 118:
+ this.$ = $$[$0];
+ this.$.type.qualifier = $$[$0 - 1];
+ break;
+
+ case 119:
+ $$[$0 - 2].concat($$[$0 - 1]);
+ this.$ = new AstParameterDeclarator();
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.type = new AstFullySpecifiedType();
+ this.$.type.qualifier = $$[$0 - 2];
+ this.$.type.specifier = $$[$0];
+ break;
+
+ case 120:
+ this.$ = new AstParameterDeclarator();
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.type = new AstFullySpecifiedType();
+ this.$.type.qualifier = $$[$0 - 1];
+ this.$.type.specifier = $$[$0];
+ break;
+
+ case 121:
+ this.$ = [];
+ break;
+
+ case 122:
+ this.$ = ['in'];
+ break;
+
+ case 123:
+ this.$ = ['out'];
+ break;
+
+ case 124:
+ this.$ = ['inout'];
+ break;
+
+ case 127:
+ var decl = new AstDeclaration($$[$0], false);
+ decl.setLocation(_$[$0 - 2]);
+ this.$ = $$[$0 - 2];
+ this.$.declarations.push(decl);
+ /*yy.state.symbols.add_variable($$[$0]);*/
+
+ break;
+
+ case 129:
+ var decl = new AstDeclaration($$[$0 - 3], true, $$[$0 - 1]);
+ decl.setLocation(_$[$0 - 5]);
+ this.$ = $$[$0 - 5];
+ this.$.declarations.push(decl);
+ /*yy.state.symbols.add_variable($$[$0-3]);*/
+
+ break;
+
+ case 132:
+ var decl = new AstDeclaration($$[$0 - 2], false, null, $$[$0]);
+ decl.setLocation(_$[$0 - 4]);
+ this.$ = $$[$0 - 4];
+ this.$.declarations.push(decl);
+ /*yy.state.symbols.add_variable($$[$0-2]);*/
+
+ break;
+
+ case 133:
+ if ($$[$0].specifier.type_specifier !== types.struct) {
+ yy.state.addError("empty declaration list", _$[$0].first_line, _$[$0].first_column);
+ return 0;
+ }
+
+ this.$ = new AstDeclaratorList($$[$0]);
+ this.$.setLocation(_$[$0]);
+ break;
+
+ case 134:
+ var decl = new AstDeclaration($$[$0], false);
+ decl.setLocation(_$[$0]);
+ this.$ = new AstDeclaratorList($$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 135:
+ var decl = new AstDeclaration($$[$0 - 2], true);
+ decl.setLocation(_$[$0 - 2]);
+ this.$ = new AstDeclaratorList($$[$0 - 3]);
+ this.$.setLocation(_$[$0 - 3]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 136:
+ var decl = new AstDeclaration($$[$0 - 3], true, $$[$0 - 1]);
+ decl.setLocation(_$[$0 - 3]);
+ this.$ = new AstDeclaratorList($$[$0 - 4]);
+ this.$.setLocation(_$[$0 - 4]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 137:
+ var decl = new AstDeclaration($$[$0 - 4], true, null, $$[$0]);
+ decl.setLocation(_$[$0 - 4]);
+ this.$ = new AstDeclaratorList($$[$0 - 5]);
+ this.$.setLocation(_$[$0 - 5]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 138:
+ var decl = new AstDeclaration($$[$0 - 5], true, $$[$0 - 3], $$[$0]);
+ decl.setLocation(_$[$0 - 5]);
+ this.$ = new AstDeclaratorList($$[$0 - 6]);
+ this.$.setLocation(_$[$0 - 6]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 139:
+ var decl = new AstDeclaration($$[$0 - 2], false, null, $$[$0]);
+ decl.setLocation(_$[$0 - 2]);
+ this.$ = new AstDeclaratorList($$[$0 - 3]);
+ this.$.setLocation(_$[$0 - 3]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 141:
+ this.$ = new AstFullySpecifiedType();
+ this.$.setLocation(_$[$0]);
+ this.$.specifier = $$[$0];
+ break;
+
+ case 142:
+ this.$ = new AstFullySpecifiedType();
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.qualifier = $$[$0 - 1];
+ this.$.specifier = $$[$0];
+ break;
+
+ case 143:
+ this.$ = $$[$0 - 1];
+ break;
+
+ case 151:
+ case 160:
+ this.$ = ['const'];
+ break;
+
+ case 161:
+ this.$ = ['attribute'];
+ break;
+
+ case 162:
+ this.$ = ['varying'];
+ break;
+
+ case 163:
+ this.$ = ['centroid', 'varying'];
+ break;
+
+ case 164:
+ this.$ = ['in'];
+ break;
+
+ case 165:
+ this.$ = ['out'];
+ break;
+
+ case 166:
+ this.$ = ['centroid', 'in'];
+ break;
+
+ case 167:
+ this.$ = ['centroid', 'out'];
+ break;
+
+ case 168:
+ this.$ = ['uniform'];
+ break;
+
+ case 169:
+ this.$ = $$[$0];
+ break;
+
+ case 170:
+ this.$ = $$[$0];
+ this.$.precision = $$[$0 - 1];
+ break;
+
+ case 174:
+ case 175:
+ case 176:
+ this.$ = new AstTypeSpecifier($$[$0]);
+ this.$.setLocation(_$[$0]);
+ break;
+
+ case 200:
+ this.$ = ast_precision.highp;
+ break;
+
+ case 201:
+ this.$ = ast_precision.mediump;
+ break;
+
+ case 202:
+ this.$ = ast_precision.lowp;
+ break;
+
+ case 203:
+ this.$ = new AstStructSpecifier($$[$0 - 3], $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 4]);
+ yy.state.symbols.add_type($$[$0 - 3], types._void);
+ break;
+
+ case 205:
+ this.$ = [$$[$0]];
+ break;
+
+ case 206:
+ this.$ = $$[$0 - 1];
+ this.$.push($$[$0]);
+ break;
+
+ case 207:
+ var type = new AstFullySpecifiedType();
+ type.setLocation(_$[$0 - 2]);
+ type.specifier = $$[$0 - 2];
+ this.$ = new AstDeclaratorList(type);
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.declarations = $$[$0 - 1];
+ break;
+
+ case 210:
+ this.$ = new AstDeclaration($$[$0], false);
+ this.$.setLocation(_$[$0]);
+ yy.state.symbols.add_variable($$[$0]);
+ break;
+
+ case 219:
+ case 220:
+ case 258:
+ this.$ = null;
+ break;
+
+ case 223:
+ this.$ = new AstCompoundStatement(true);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 224:
+ yy.state.symbols.push_scope();
+ this.$ = new AstCompoundStatement(true, $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 2]);
+ yy.state.symbols.pop_scope();
+ break;
+
+ case 228:
+ this.$ = new AstCompoundStatement(false, $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 2]);
+ break;
+
+ case 229:
+ if ($$[$0] === null) {
+ yy.state.addError(" statement", _$[$0].first_line, _$[$0].first_column);
+ } else {
+ this.$ = [$$[$0]];
+ }
+
+ break;
+
+ case 230:
+ if ($$[$0] === null) {
+ yy.state.addError(" statement", _$[$0 - 1].first_line, _$[$0 - 1].first_column);
+ }
+
+ this.$ = $$[$0 - 1];
+ this.$.push($$[$0]);
+ break;
+
+ case 232:
+ this.$ = new AstExpressionStatement($$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 233:
+ this.$ = new AstSelectionStatement($$[$0 - 2], $$[$0].then_statement, $$[$0].else_statement);
+ this.$.setLocation(_$[$0 - 4]);
+ break;
+
+ case 234:
+ this.$ = {};
+ this.$.then_statement = $$[$0 - 2];
+ this.$.else_statement = $$[$0];
+ break;
+
+ case 235:
+ this.$.then_statement = $$[$0];
+ break;
+
+ case 250:
+ this.$ = new AstJumpStatement('continue');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 251:
+ this.$ = new AstJumpStatement('break');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 252:
+ this.$ = new AstJumpStatement('return');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 253:
+ this.$ = new AstJumpStatement('return', $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 2]);
+ break;
+
+ case 254:
+ /* Fragment shader only.*/
+ this.$ = new AstJumpStatement('discard');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 255:
+ this.$ = new AstJumpStatement('debugger');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 256:
+ case 257:
+ this.$ = $$[$0];
+ break;
+
+ case 259:
+ this.$ = new AstFunctionDefinition();
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.proto_type = $$[$0 - 1];
+ this.$.body = $$[$0];
+ yy.state.symbols.pop_scope();
+ break;
+ }
+ },
+ table: [o($V0, [2, 3], {
+ 3: 1,
+ 4: 2,
+ 6: 3,
+ 9: [1, 4]
+ }), {
+ 1: [3]
+ }, {
+ 5: [1, 5]
+ }, o($V0, [2, 10], {
+ 7: 6
+ }), {
+ 10: [1, 7]
+ }, {
+ 1: [2, 1]
+ }, {
+ 8: 8,
+ 12: 14,
+ 13: $V1,
+ 14: $V2,
+ 15: $V3,
+ 16: $V4,
+ 17: $V5,
+ 18: 9,
+ 21: $V6,
+ 22: [1, 11],
+ 24: 10,
+ 47: $V7,
+ 50: 29,
+ 104: 13,
+ 105: 15,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 207: 12
+ }, {
+ 11: [1, 78]
+ }, {
+ 5: [2, 2],
+ 12: 14,
+ 13: $V1,
+ 14: $V2,
+ 15: $V3,
+ 16: $V4,
+ 17: $V5,
+ 21: $V6,
+ 24: 79,
+ 47: $V7,
+ 50: 29,
+ 104: 13,
+ 105: 15,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 207: 12
+ }, o($V0, [2, 11]), o($VL, [2, 15]), {
+ 19: 80,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }, o($VL, [2, 256]), o($VL, [2, 257]), o($VL, [2, 258]), {
+ 106: $VP,
+ 170: $VQ,
+ 188: 85
+ }, {
+ 49: [1, 89],
+ 106: [1, 88]
+ }, {
+ 109: 90,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ
+ }, {
+ 11: [1, 91]
+ }, {
+ 11: [1, 92]
+ }, {
+ 11: [1, 93]
+ }, {
+ 11: [1, 94]
+ }, {
+ 11: [1, 95]
+ }, {
+ 32: [1, 96]
+ }, o($VR, [2, 126]), o($VS, $VT, {
+ 114: 97,
+ 117: 98,
+ 118: 99,
+ 32: [2, 110],
+ 120: $VU,
+ 121: $VV,
+ 122: $VW,
+ 135: $VX
+ }), {
+ 32: [2, 111],
+ 49: [1, 104]
+ }, o($VR, [2, 133], {
+ 19: 105,
+ 20: 106,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }), o($VS, $VY, {
+ 20: 107,
+ 136: 108,
+ 131: 109,
+ 25: $VN,
+ 26: $VO,
+ 120: $V9,
+ 121: $Va,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }), o($VZ, $V_), {
+ 21: $V6,
+ 47: $V7,
+ 50: 110,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($V$, [2, 169]), {
+ 21: $V6,
+ 47: $V7,
+ 110: 111,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 169: $VK
+ }, o($VS, [2, 152]), o($VS, [2, 153], {
+ 136: 112,
+ 120: $V9,
+ 121: $Va,
+ 135: $Vg,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }), o($VS, [2, 155], {
+ 136: 113,
+ 120: $V9,
+ 121: $Va,
+ 135: $Vg,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }), o($V$, [2, 171], {
+ 34: [1, 114]
+ }), o($V01, [2, 200]), o($V01, [2, 201]), o($V01, [2, 202]), o($VS, [2, 160]), o($VS, [2, 161]), o($VS, [2, 162]), {
+ 120: [1, 116],
+ 121: [1, 117],
+ 138: [1, 115]
+ }, o($VS, [2, 164]), o($VS, [2, 165]), o($VS, [2, 168]), {
+ 30: [1, 118]
+ }, o($V11, [2, 148]), o($V11, [2, 149]), o($V11, [2, 150]), o($V21, [2, 174]), o($V21, [2, 175]), o($V21, [2, 176]), o($V21, $V31), o($V21, [2, 178]), o($V21, [2, 179]), o($V21, [2, 180]), o($V21, [2, 181]), o($V21, [2, 182]), o($V21, [2, 183]), o($V21, [2, 184]), o($V21, [2, 185]), o($V21, [2, 186]), o($V21, [2, 187]), o($V21, [2, 188]), o($V21, [2, 189]), o($V21, [2, 190]), o($V21, [2, 191]), o($V21, [2, 192]), o($V21, [2, 193]), o($V21, [2, 194]), o($V21, [2, 195]), o($V21, [2, 196]), o($V21, [2, 197]), o($V21, [2, 198]), o($V21, [2, 199]), {
+ 19: 119,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 170: [1, 120]
+ }, o($V0, [2, 4]), o($VL, [2, 16]), {
+ 23: [1, 121]
+ }, o([11, 23, 32, 34, 49, 92, 106, 170], $V41), o([11, 23, 32, 34, 36, 38, 39, 40, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106, 170], [2, 13]), o($V51, [2, 17]), o($V51, [2, 18]), o($VL, [2, 259]), o($V61, [2, 106]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 172: [1, 122],
+ 176: 128,
+ 177: 124,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 186: 123,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($V61, [2, 107]), {
+ 19: 187,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 110: 188,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 169: $VK
+ }, o($VL, [2, 5]), o($VL, [2, 6]), o($VL, [2, 7]), o($VL, [2, 8]), o($VL, [2, 9]), o([106, 170], [2, 109]), o($Vw1, [2, 112]), o($VS, $VT, {
+ 118: 189,
+ 120: $VU,
+ 121: $VV,
+ 122: $VW
+ }), {
+ 21: $V6,
+ 47: $V7,
+ 50: 192,
+ 109: 32,
+ 110: 31,
+ 116: 190,
+ 119: 191,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o([21, 47, 120, 121, 122, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], [2, 151]), o($VS, [2, 122]), o($VS, [2, 123]), o($VS, [2, 124]), o($VS, $VT, {
+ 117: 98,
+ 118: 99,
+ 114: 193,
+ 120: $VU,
+ 121: $VV,
+ 122: $VW,
+ 135: $VX
+ }), o($VR, [2, 134], {
+ 34: [1, 194],
+ 92: [1, 195]
+ }), o([34, 49, 92, 106], $V41, {
+ 30: [1, 196]
+ }), o($VR, [2, 140]), o($VS, [2, 157]), {
+ 120: $V9,
+ 121: $Va,
+ 135: $Vg,
+ 136: 197,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }, o($VZ, [2, 142]), o($V$, [2, 170]), o($VS, [2, 154]), o($VS, [2, 156]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 36: [1, 198],
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 199,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VS, [2, 163]), o($VS, [2, 166]), o($VS, [2, 167]), {
+ 19: 205,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 129: 203,
+ 130: 204
+ }, {
+ 170: [1, 206]
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 50: 209,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 171: 207,
+ 173: 208
+ }, {
+ 19: 210,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }, o($V61, [2, 227]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 172: [1, 211],
+ 176: 128,
+ 177: 212,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($Vx1, [2, 229]), o($Vy1, [2, 214]), o($Vy1, [2, 215]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 172: [1, 213],
+ 176: 128,
+ 177: 124,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 186: 214,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($Vy1, [2, 216]), o($Vy1, [2, 217]), o($Vy1, [2, 218]), o($Vy1, [2, 219]), o($Vy1, [2, 220]), o($Vy1, [2, 221]), o($Vy1, [2, 222]), o($Vy1, [2, 213]), o($Vy1, [2, 231]), {
+ 49: $Vz1,
+ 106: [1, 215]
+ }, {
+ 30: [1, 217]
+ }, {
+ 30: [1, 218]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 219,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 23: [1, 220]
+ }, {
+ 30: [1, 221]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 176: 128,
+ 177: 222,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, {
+ 30: [1, 223]
+ }, {
+ 106: [1, 224]
+ }, {
+ 106: [1, 225]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 227,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 106: [1, 226],
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 106: [1, 228]
+ }, {
+ 106: [1, 229]
+ }, {
+ 106: $VP
+ }, o($VA1, [2, 103]), o($VA1, [2, 90]), o($VB1, $VC1, {
+ 91: 230,
+ 92: [1, 231],
+ 93: [1, 232],
+ 94: [1, 233],
+ 95: [1, 234],
+ 96: [1, 235],
+ 97: [1, 236],
+ 98: [1, 237],
+ 99: [1, 238],
+ 100: [1, 239],
+ 101: [1, 240],
+ 102: [1, 241]
+ }), o($VA1, [2, 88], {
+ 88: [1, 243],
+ 90: [1, 242]
+ }), o($VD1, [2, 50], {
+ 34: [1, 244],
+ 38: [1, 245],
+ 39: [1, 246],
+ 40: [1, 247]
+ }), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 248,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 249,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 250,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VZ, $V_, {
+ 30: $VE1
+ }), o($VF1, [2, 86], {
+ 86: $VG1
+ }), o($VH1, [2, 24]), o($VH1, [2, 26]), o($VI1, [2, 54]), o($VI1, [2, 55]), o($VI1, [2, 56]), o($VI1, [2, 57]), o($VJ1, [2, 84], {
+ 84: $VK1
+ }), o($VH1, [2, 19], {
+ 30: [1, 254]
+ }), o($VH1, [2, 20]), o($VH1, [2, 21]), o($VH1, [2, 22]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 255,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 31]), o($VL1, [2, 82], {
+ 82: $VM1
+ }), o($VH1, [2, 32]), o($VN1, [2, 80], {
+ 80: $VO1
+ }), {
+ 32: [1, 258],
+ 49: [1, 259]
+ }, {
+ 32: [1, 260]
+ }, o($VP1, [2, 78], {
+ 78: $VQ1
+ }), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 32: [2, 37],
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: [1, 263],
+ 48: 262,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VR1, [2, 76], {
+ 75: $VS1,
+ 76: $VT1
+ }), o($VU1, [2, 42]), o($VV1, [2, 73], {
+ 70: $VW1,
+ 71: $VX1,
+ 72: $VY1,
+ 73: $VZ1
+ }), o($V_1, [2, 68], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V12, [2, 65], {
+ 57: $V22,
+ 58: $V32
+ }), o($V42, [2, 62], {
+ 62: $V52,
+ 63: $V62,
+ 64: $V72
+ }), o($VR, [2, 127], {
+ 34: [1, 277],
+ 92: [1, 278]
+ }), {
+ 106: [1, 279]
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 50: 192,
+ 109: 32,
+ 110: 31,
+ 116: 280,
+ 119: 281,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($Vw1, [2, 118]), o($Vw1, [2, 120]), o($Vw1, [2, 125], {
+ 20: 81,
+ 19: 282,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }), o($Vw1, [2, 113]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 36: [1, 283],
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 284,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 285,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o([21, 32, 47, 120, 121, 122, 135, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], [2, 114]), o($VS, [2, 158]), o($V$, [2, 172]), {
+ 36: [1, 287]
+ }, {
+ 36: [2, 105]
+ }, o($VB1, $VC1), {
+ 30: $VE1
+ }, {
+ 32: [1, 288],
+ 49: [1, 289]
+ }, o($Vw1, [2, 144]), o($Vw1, [2, 146], {
+ 92: [1, 290]
+ }), {
+ 21: $V6,
+ 47: $V7,
+ 50: 209,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 171: 291,
+ 173: 208
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 50: 209,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 172: [1, 292],
+ 173: 293
+ }, o($V82, [2, 205]), {
+ 19: 296,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 174: 294,
+ 175: 295
+ }, {
+ 11: [1, 297]
+ }, o($V61, [2, 228]), o($Vx1, [2, 230]), o($Vy1, [2, 223]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 172: [1, 298],
+ 176: 128,
+ 177: 212,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($Vy1, [2, 232]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 299,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 300,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 301,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 23: [1, 302],
+ 49: $Vz1
+ }, o($Vy1, [2, 240]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 304,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 115: 305,
+ 120: $V9,
+ 121: $Va,
+ 125: $V92,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 192: 303
+ }, {
+ 196: [1, 307]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 176: 310,
+ 180: 309,
+ 199: 308
+ }, o($Vy1, [2, 250]), o($Vy1, [2, 251]), o($Vy1, [2, 252]), {
+ 49: $Vz1,
+ 106: [1, 311]
+ }, o($Vy1, [2, 254]), o($Vy1, [2, 255]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 312,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VI1, [2, 92]), o($VI1, [2, 93]), o($VI1, [2, 94]), o($VI1, [2, 95]), o($VI1, [2, 96]), o($VI1, [2, 97]), o($VI1, [2, 98]), o($VI1, [2, 99]), o($VI1, [2, 100]), o($VI1, [2, 101]), o($VI1, [2, 102]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 313,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 314,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 316,
+ 33: 155,
+ 35: 315,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 19: 317,
+ 20: 319,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 43: 318,
+ 52: 320,
+ 53: 321,
+ 54: 322
+ }, o($VH1, [2, 28]), o($VH1, [2, 29]), o($VD1, [2, 51]), o($VD1, [2, 52]), o($VD1, [2, 53]), o($VU1, [2, 40]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 323,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 324,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VU1, [2, 41]), {
+ 32: [1, 325],
+ 49: $Vz1
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 326,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 327,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 34]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 328,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 35]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 329,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($Vw1, [2, 38]), o($Va2, $V31, {
+ 32: [2, 36]
+ }), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 330,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 331,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 332,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 333,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 334,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 335,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 336,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 337,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 338,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 339,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 340,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 341,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 342,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 36: [1, 343],
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 344,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 345,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($V61, [2, 108]), o($Vw1, [2, 117]), o($Vw1, [2, 119]), o($Vw1, [2, 115], {
+ 34: [1, 346]
+ }), o($VR, [2, 135], {
+ 92: [1, 347]
+ }), {
+ 36: [1, 348]
+ }, o($VR, [2, 139]), o([32, 49, 106], [2, 212]), o($V$, [2, 173]), o($V11, [2, 143]), {
+ 19: 205,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 130: 349
+ }, {
+ 10: [1, 350]
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 50: 209,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 172: [1, 351],
+ 173: 293
+ }, o($V21, [2, 204]), o($V82, [2, 206]), {
+ 49: [1, 353],
+ 106: [1, 352]
+ }, o($VR, [2, 208]), o($VR, [2, 210], {
+ 34: [1, 354]
+ }), o($V0, [2, 14]), o($Vy1, [2, 224]), o($VA1, [2, 104]), {
+ 32: [1, 355],
+ 49: $Vz1
+ }, {
+ 32: [1, 356],
+ 49: $Vz1
+ }, o($Vy1, [2, 239]), {
+ 32: [1, 357]
+ }, o($Vb2, [2, 236], {
+ 49: $Vz1
+ }), {
+ 19: 358,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }, o($VS, $VY, {
+ 136: 108,
+ 131: 109,
+ 120: $V9,
+ 121: $Va,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }), {
+ 30: [1, 359]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 304,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 106: [2, 247],
+ 109: 32,
+ 110: 31,
+ 115: 305,
+ 120: $V9,
+ 121: $Va,
+ 125: $V92,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 192: 362,
+ 200: 360,
+ 201: 361
+ }, o($Vc2, [2, 244]), o($Vc2, [2, 245]), o($Vy1, [2, 253]), o($VA1, [2, 91]), {
+ 23: [1, 363],
+ 49: $Vz1
+ }, o($VF1, [2, 87], {
+ 86: $VG1
+ }), {
+ 36: [1, 364]
+ }, {
+ 36: [2, 30],
+ 49: $Vz1
+ }, o($VH1, [2, 27]), o($VH1, [2, 33]), o($VH1, $V41, {
+ 30: [1, 365]
+ }), {
+ 32: [1, 366],
+ 49: [1, 367]
+ }, {
+ 32: [1, 368]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 32: [2, 46],
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: [1, 370],
+ 48: 369,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VJ1, [2, 85], {
+ 84: $VK1
+ }), o($VL1, [2, 83], {
+ 82: $VM1
+ }), o($VH1, [2, 23]), o($VN1, [2, 81], {
+ 80: $VO1
+ }), o($VP1, [2, 79], {
+ 78: $VQ1
+ }), o($Vw1, [2, 39]), o($VR1, [2, 77], {
+ 75: $VS1,
+ 76: $VT1
+ }), o($VV1, [2, 74], {
+ 70: $VW1,
+ 71: $VX1,
+ 72: $VY1,
+ 73: $VZ1
+ }), o($VV1, [2, 75], {
+ 70: $VW1,
+ 71: $VX1,
+ 72: $VY1,
+ 73: $VZ1
+ }), o($V_1, [2, 69], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V_1, [2, 70], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V_1, [2, 71], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V_1, [2, 72], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V12, [2, 66], {
+ 57: $V22,
+ 58: $V32
+ }), o($V12, [2, 67], {
+ 57: $V22,
+ 58: $V32
+ }), o($V42, [2, 63], {
+ 62: $V52,
+ 63: $V62,
+ 64: $V72
+ }), o($V42, [2, 64], {
+ 62: $V52,
+ 63: $V62,
+ 64: $V72
+ }), o($VB1, [2, 59]), o($VB1, [2, 60]), o($VB1, [2, 61]), o($VR, [2, 128], {
+ 92: [1, 371]
+ }), {
+ 36: [1, 372]
+ }, o($VR, [2, 132]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 373,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 374,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VR, [2, 136], {
+ 92: [1, 375]
+ }), o($Vw1, [2, 145]), o($Vw1, [2, 147]), o($V21, [2, 203]), o($V82, [2, 207]), {
+ 19: 296,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 175: 376
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 377,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 176: 128,
+ 177: 379,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 190: 378,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, {
+ 170: $Vj1,
+ 178: 380
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $VQ,
+ 176: 128,
+ 179: 383,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 187: 381,
+ 188: 382,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, {
+ 92: [1, 384]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 385,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 32: [1, 386]
+ }, {
+ 106: [1, 387]
+ }, {
+ 106: [2, 246]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 388,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 25]), o($VU1, [2, 49]), o($VH1, [2, 43]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 389,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 44]), o($Vw1, [2, 47]), o($Va2, $V31, {
+ 32: [2, 45]
+ }), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 390,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VR, [2, 129], {
+ 92: [1, 391]
+ }), {
+ 36: [1, 392]
+ }, o($VR, [2, 137]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 393,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VR, [2, 209]), {
+ 36: [1, 394]
+ }, o($Vy1, [2, 233]), o($Vx1, [2, 235], {
+ 191: [1, 395]
+ }), o($Vy1, [2, 238]), o($Vy1, [2, 241]), o($Vy1, [2, 225]), o($Vy1, [2, 226]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 396,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 32: [1, 397],
+ 49: $Vz1
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $VQ,
+ 176: 128,
+ 179: 383,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 187: 398,
+ 188: 382,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 399,
+ 32: [2, 248],
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VA1, [2, 89]), o($Vw1, [2, 48]), o($VR, [2, 130]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 400,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($Vw1, [2, 116]), o($VR, [2, 138]), o($VR, [2, 211]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 176: 128,
+ 177: 401,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($Vb2, [2, 237]), {
+ 106: [1, 402]
+ }, o($Vy1, [2, 243]), {
+ 32: [2, 249],
+ 49: $Vz1
+ }, o($VR, [2, 131]), o($Vy1, [2, 234]), o($Vy1, [2, 242])],
+ defaultActions: {
+ 5: [2, 1],
+ 200: [2, 105],
+ 362: [2, 246]
+ },
+ parseError: function parseError(str, hash) {
+ if (hash.recoverable) {
+ this.trace(str);
+ } else {
+ throw new Error(str);
+ }
+ },
+ parse: function parse(input) {
+ var self = this,
+ stack = [0],
+ tstack = [],
+ vstack = [null],
+ lstack = [],
+ table = this.table,
+ yytext = '',
+ yylineno = 0,
+ yyleng = 0,
+ recovering = 0,
+ TERROR = 2,
+ EOF = 1;
+ var args = lstack.slice.call(arguments, 1);
+ var lexer = Object.create(this.lexer);
+ var sharedState = {
+ yy: {}
+ };
+
+ for (var k in this.yy) {
+ if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+ sharedState.yy[k] = this.yy[k];
+ }
+ }
+
+ lexer.setInput(input, sharedState.yy);
+ sharedState.yy.lexer = lexer;
+ sharedState.yy.parser = this;
+
+ if (typeof lexer.yylloc == 'undefined') {
+ lexer.yylloc = {};
+ }
+
+ var yyloc = lexer.yylloc;
+ lstack.push(yyloc);
+ var ranges = lexer.options && lexer.options.ranges;
+
+ if (typeof sharedState.yy.parseError === 'function') {
+ this.parseError = sharedState.yy.parseError;
+ } else {
+ this.parseError = Object.getPrototypeOf(this).parseError;
+ }
+
+ function popStack(n) {
+ stack.length = stack.length - 2 * n;
+ vstack.length = vstack.length - n;
+ lstack.length = lstack.length - n;
+ }
+
+ function lex() {
+ var token;
+ token = lexer.lex() || EOF;
+
+ if (typeof token !== 'number') {
+ token = self.symbols_[token] || token;
+ }
+
+ return token;
+ }
+
+ var symbol,
+ preErrorSymbol,
+ state,
+ action,
+ a,
+ r,
+ yyval = {},
+ p,
+ len,
+ newState,
+ expected;
+
+ while (true) {
+ state = stack[stack.length - 1];
+
+ if (this.defaultActions[state]) {
+ action = this.defaultActions[state];
+ } else {
+ if (symbol === null || typeof symbol == 'undefined') {
+ symbol = lex();
+ }
+
+ action = table[state] && table[state][symbol];
+ }
+
+ if (typeof action === 'undefined' || !action.length || !action[0]) {
+ var errStr = '';
+ expected = [];
+
+ for (p in table[state]) {
+ if (this.terminals_[p] && p > TERROR) {
+ expected.push('\'' + this.terminals_[p] + '\'');
+ }
+ }
+
+ if (lexer.showPosition) {
+ errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+ } else {
+ errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+ }
+
+ this.parseError(errStr, {
+ text: lexer.match,
+ token: this.terminals_[symbol] || symbol,
+ line: lexer.yylineno,
+ loc: yyloc,
+ expected: expected
+ });
+ }
+
+ if (action[0] instanceof Array && action.length > 1) {
+ throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+ }
+
+ switch (action[0]) {
+ case 1:
+ stack.push(symbol);
+ vstack.push(lexer.yytext);
+ lstack.push(lexer.yylloc);
+ stack.push(action[1]);
+ symbol = null;
+
+ if (!preErrorSymbol) {
+ yyleng = lexer.yyleng;
+ yytext = lexer.yytext;
+ yylineno = lexer.yylineno;
+ yyloc = lexer.yylloc;
+
+ if (recovering > 0) {
+ recovering--;
+ }
+ } else {
+ symbol = preErrorSymbol;
+ preErrorSymbol = null;
+ }
+
+ break;
+
+ case 2:
+ len = this.productions_[action[1]][1];
+ yyval.$ = vstack[vstack.length - len];
+ yyval._$ = {
+ first_line: lstack[lstack.length - (len || 1)].first_line,
+ last_line: lstack[lstack.length - 1].last_line,
+ first_column: lstack[lstack.length - (len || 1)].first_column,
+ last_column: lstack[lstack.length - 1].last_column
+ };
+
+ if (ranges) {
+ yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
+ }
+
+ r = this.performAction.apply(yyval, [yytext, yyleng, yylineno, sharedState.yy, action[1], vstack, lstack].concat(args));
+
+ if (typeof r !== 'undefined') {
+ return r;
+ }
+
+ if (len) {
+ stack = stack.slice(0, -1 * len * 2);
+ vstack = vstack.slice(0, -1 * len);
+ lstack = lstack.slice(0, -1 * len);
+ }
+
+ stack.push(this.productions_[action[1]][0]);
+ vstack.push(yyval.$);
+ lstack.push(yyval._$);
+ newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+ stack.push(newState);
+ break;
+
+ case 3:
+ return true;
+ }
+ }
+
+ return true;
+ }
+ };
+
+ function Parser() {
+ this.yy = {};
+ }
+
+ Parser.prototype = parser;
+ parser.Parser = Parser;
+ return new Parser();
+ }();
+
+ if (typeof commonjsRequire !== 'undefined' && 'object' !== 'undefined') {
+ exports.parser = parser;
+ exports.Parser = parser.Parser;
+
+ exports.parse = function () {
+ return parser.parse.apply(parser, arguments);
+ };
+ }
+ /* generated by jison-lex 0.3.4 */
+
+
+ var lexer = function () {
+ var lexer = {
+ EOF: 1,
+ parseError: function parseError(str, hash) {
+ if (this.yy.parser) {
+ this.yy.parser.parseError(str, hash);
+ } else {
+ throw new Error(str);
+ }
+ },
+ // resets the lexer, sets new input
+ setInput: function setInput(input, yy) {
+ this.yy = yy || this.yy || {};
+ this._input = input;
+ this._more = this._backtrack = this.done = false;
+ this.yylineno = this.yyleng = 0;
+ this.yytext = this.matched = this.match = '';
+ this.conditionStack = ['INITIAL'];
+ this.yylloc = {
+ first_line: 1,
+ first_column: 0,
+ last_line: 1,
+ last_column: 0
+ };
+
+ if (this.options.ranges) {
+ this.yylloc.range = [0, 0];
+ }
+
+ this.offset = 0;
+ return this;
+ },
+ // consumes and returns one char from the input
+ input: function input() {
+ var ch = this._input[0];
+ this.yytext += ch;
+ this.yyleng++;
+ this.offset++;
+ this.match += ch;
+ this.matched += ch;
+ var lines = ch.match(/(?:\r\n?|\n).*/g);
+
+ if (lines) {
+ this.yylineno++;
+ this.yylloc.last_line++;
+ } else {
+ this.yylloc.last_column++;
+ }
+
+ if (this.options.ranges) {
+ this.yylloc.range[1]++;
+ }
+
+ this._input = this._input.slice(1);
+ return ch;
+ },
+ // unshifts one char (or a string) into the input
+ unput: function unput(ch) {
+ var len = ch.length;
+ var lines = ch.split(/(?:\r\n?|\n)/g);
+ this._input = ch + this._input;
+ this.yytext = this.yytext.substr(0, this.yytext.length - len); //this.yyleng -= len;
+
+ this.offset -= len;
+ var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+ this.match = this.match.substr(0, this.match.length - 1);
+ this.matched = this.matched.substr(0, this.matched.length - 1);
+
+ if (lines.length - 1) {
+ this.yylineno -= lines.length - 1;
+ }
+
+ var r = this.yylloc.range;
+ this.yylloc = {
+ first_line: this.yylloc.first_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.first_column,
+ last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len
+ };
+
+ if (this.options.ranges) {
+ this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+ }
+
+ this.yyleng = this.yytext.length;
+ return this;
+ },
+ // When called from action, caches matched text and appends it on next action
+ more: function more() {
+ this._more = true;
+ return this;
+ },
+ // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+ reject: function reject() {
+ if (this.options.backtrack_lexer) {
+ this._backtrack = true;
+ } else {
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+ text: "",
+ token: null,
+ line: this.yylineno
+ });
+ }
+
+ return this;
+ },
+ // retain first n characters of the match
+ less: function less(n) {
+ this.unput(this.match.slice(n));
+ },
+ // displays already matched input, i.e. for error messages
+ pastInput: function pastInput() {
+ var past = this.matched.substr(0, this.matched.length - this.match.length);
+ return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\n/g, "");
+ },
+ // displays upcoming input, i.e. for error messages
+ upcomingInput: function upcomingInput() {
+ var next = this.match;
+
+ if (next.length < 20) {
+ next += this._input.substr(0, 20 - next.length);
+ }
+
+ return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+ },
+ // displays the character position where the lexing error occurred, i.e. for error messages
+ showPosition: function showPosition() {
+ var pre = this.pastInput();
+ var c = new Array(pre.length + 1).join("-");
+ return pre + this.upcomingInput() + "\n" + c + "^";
+ },
+ // test the lexed token: return FALSE when not a match, otherwise return token
+ test_match: function test_match(match, indexed_rule) {
+ var token, lines, backup;
+
+ if (this.options.backtrack_lexer) {
+ // save context
+ backup = {
+ yylineno: this.yylineno,
+ yylloc: {
+ first_line: this.yylloc.first_line,
+ last_line: this.last_line,
+ first_column: this.yylloc.first_column,
+ last_column: this.yylloc.last_column
+ },
+ yytext: this.yytext,
+ match: this.match,
+ matches: this.matches,
+ matched: this.matched,
+ yyleng: this.yyleng,
+ offset: this.offset,
+ _more: this._more,
+ _input: this._input,
+ yy: this.yy,
+ conditionStack: this.conditionStack.slice(0),
+ done: this.done
+ };
+
+ if (this.options.ranges) {
+ backup.yylloc.range = this.yylloc.range.slice(0);
+ }
+ }
+
+ lines = match[0].match(/(?:\r\n?|\n).*/g);
+
+ if (lines) {
+ this.yylineno += lines.length;
+ }
+
+ this.yylloc = {
+ first_line: this.yylloc.last_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.last_column,
+ last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length
+ };
+ this.yytext += match[0];
+ this.match += match[0];
+ this.matches = match;
+ this.yyleng = this.yytext.length;
+
+ if (this.options.ranges) {
+ this.yylloc.range = [this.offset, this.offset += this.yyleng];
+ }
+
+ this._more = false;
+ this._backtrack = false;
+ this._input = this._input.slice(match[0].length);
+ this.matched += match[0];
+ token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+
+ if (this.done && this._input) {
+ this.done = false;
+ }
+
+ if (token) {
+ return token;
+ } else if (this._backtrack) {
+ // recover context
+ for (var k in backup) {
+ this[k] = backup[k];
+ }
+
+ return false; // rule action called reject() implying the next rule should be tested instead.
+ }
+
+ return false;
+ },
+ // return next match in input
+ next: function next() {
+ if (this.done) {
+ return this.EOF;
+ }
+
+ if (!this._input) {
+ this.done = true;
+ }
+
+ var token, match, tempMatch, index;
+
+ if (!this._more) {
+ this.yytext = '';
+ this.match = '';
+ }
+
+ var rules = this._currentRules();
+
+ for (var i = 0; i < rules.length; i++) {
+ tempMatch = this._input.match(this.rules[rules[i]]);
+
+ if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+ match = tempMatch;
+ index = i;
+
+ if (this.options.backtrack_lexer) {
+ token = this.test_match(tempMatch, rules[i]);
+
+ if (token !== false) {
+ return token;
+ } else if (this._backtrack) {
+ match = false;
+ continue; // rule action called reject() implying a rule MISmatch.
+ } else {
+ // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+ return false;
+ }
+ } else if (!this.options.flex) {
+ break;
+ }
+ }
+ }
+
+ if (match) {
+ token = this.test_match(match, rules[index]);
+
+ if (token !== false) {
+ return token;
+ } // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+
+
+ return false;
+ }
+
+ if (this._input === "") {
+ return this.EOF;
+ } else {
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+ text: "",
+ token: null,
+ line: this.yylineno
+ });
+ }
+ },
+ // return next match that has a token
+ lex: function lex() {
+ var r = this.next();
+
+ if (r) {
+ return r;
+ } else {
+ return this.lex();
+ }
+ },
+ // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+ begin: function begin(condition) {
+ this.conditionStack.push(condition);
+ },
+ // pop the previously active lexer condition state off the condition stack
+ popState: function popState() {
+ var n = this.conditionStack.length - 1;
+
+ if (n > 0) {
+ return this.conditionStack.pop();
+ } else {
+ return this.conditionStack[0];
+ }
+ },
+ // produce the lexer rule set which is active for the currently active lexer condition state
+ _currentRules: function _currentRules() {
+ if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+ return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+ } else {
+ return this.conditions["INITIAL"].rules;
+ }
+ },
+ // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+ topState: function topState(n) {
+ n = this.conditionStack.length - 1 - Math.abs(n || 0);
+
+ if (n >= 0) {
+ return this.conditionStack[n];
+ } else {
+ return "INITIAL";
+ }
+ },
+ // alias for begin(condition)
+ pushState: function pushState(condition) {
+ this.begin(condition);
+ },
+ // return the number of states currently on the stack
+ stateStackSize: function stateStackSize() {
+ return this.conditionStack.length;
+ },
+ options: {
+ "moduleName": ""
+ },
+ performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {
+ var YYSTATE = YY_START;
+
+ switch ($avoiding_name_collisions) {
+ case 0:
+ ;
+ break;
+
+ case 1:
+ break;
+
+ case 2:
+ this.begin('PP');
+ return 'VERSION';
+ break;
+
+ case 3:
+ this.begin('PP');
+ return 'EXTENSION';
+ break;
+
+ case 4:
+ /* Eat characters until the first digit is
+ * encountered
+ */
+ var ptr = 0;
+
+ while (yy_.yytext.slice(0, 1) < '0' || yy_.yytext.slice(0, 1) > '9') {
+ ptr++;
+ }
+ /* Subtract one from the line number because
+ * yy_.yylineno is zero-based instead of
+ * one-based.
+ */
+
+
+ yy_.yylineno = parseInt(yy_.yytext.slice(0, 1), 10) - 1;
+ yy_.yylloc.source = parseInt(yy_.yytext.slice(0), 10);
+ break;
+
+ case 5:
+ /* Eat characters until the first digit is
+ * encountered
+ */
+ var ptr = 0;
+
+ while (yy_.yytext.slice(0, 1) < '0' || yy_.yytext.slice(0, 1) > '9') {
+ ptr++;
+ }
+ /* Subtract one from the line number because
+ * yy_.yylineno is zero-based instead of
+ * one-based.
+ */
+
+
+ yy_.yylineno = parseInt(yy_.yytext.slice(0, 1), 10) - 1;
+ break;
+
+ case 6:
+ this.begin('PP');
+ return 'PRAGMA_DEBUG_ON';
+ break;
+
+ case 7:
+ this.begin('PP');
+ return 'PRAGMA_DEBUG_OFF';
+ break;
+
+ case 8:
+ this.begin('PP');
+ return 'PRAGMA_OPTIMIZE_ON';
+ break;
+
+ case 9:
+ this.begin('PP');
+ return 'PRAGMA_OPTIMIZE_OFF';
+ break;
+
+ case 10:
+ this.begin('PP');
+ return 'PRAGMA_INVARIANT_ALL';
+ break;
+
+ case 11:
+ this.begin('PRAGMA');
+ break;
+
+ case 12:
+ this.begin('INITIAL');
+ yy_.yylineno++;
+ yycolumn = 0;
+ break;
+
+ case 13:
+ break;
+
+ case 14:
+ break;
+
+ case 15:
+ break;
+
+ case 16:
+ return ":";
+ break;
+
+ case 17:
+ yylval.identifier = strdup(yy_.yytext);
+ return 'IDENTIFIER';
+ break;
+
+ case 18:
+ yylval.n = parseInt(yy_.yytext);
+ return 'INTCONSTANT';
+ break;
+
+ case 19:
+ this.begin('INITIAL');
+ yy_.yylineno++;
+ yycolumn = 0;
+ return 'EOL';
+ break;
+
+ case 20:
+ /*yy_.yylineno++; yycolumn = 0;*/
+ break;
+
+ case 21:
+ return 'ATTRIBUTE';
+ break;
+
+ case 22:
+ return 'CONST';
+ break;
+
+ case 23:
+ return 'BOOL';
+ break;
+
+ case 24:
+ return 'FLOAT';
+ break;
+
+ case 25:
+ return 'INT';
+ break;
+
+ case 26:
+ return 'BREAK';
+ break;
+
+ case 27:
+ return 'CONTINUE';
+ break;
+
+ case 28:
+ return 'DO';
+ break;
+
+ case 29:
+ return 'WHILE';
+ break;
+
+ case 30:
+ return 'ELSE';
+ break;
+
+ case 31:
+ return 'FOR';
+ break;
+
+ case 32:
+ return 'IF';
+ break;
+
+ case 33:
+ return 'DISCARD';
+ break;
+
+ case 34:
+ return 'RETURN';
+ break;
+
+ case 35:
+ return 'DEBUGGER';
+ break;
+
+ case 36:
+ return 'BVEC2';
+ break;
+
+ case 37:
+ return 'BVEC3';
+ break;
+
+ case 38:
+ return 'BVEC4';
+ break;
+
+ case 39:
+ return 'IVEC2';
+ break;
+
+ case 40:
+ return 'IVEC3';
+ break;
+
+ case 41:
+ return 'IVEC4';
+ break;
+
+ case 42:
+ return 'VEC2';
+ break;
+
+ case 43:
+ return 'VEC3';
+ break;
+
+ case 44:
+ return 'VEC4';
+ break;
+
+ case 45:
+ return 'MAT2X2';
+ break;
+
+ case 46:
+ return 'MAT3X3';
+ break;
+
+ case 47:
+ return 'MAT4X4';
+ break;
+
+ case 48:
+ return 'IN';
+ break;
+
+ case 49:
+ return 'OUT';
+ break;
+
+ case 50:
+ return 'INOUT';
+ break;
+
+ case 51:
+ return 'UNIFORM';
+ break;
+
+ case 52:
+ return 'VARYING';
+ break;
+
+ case 53:
+ return 'INVARIANT';
+ break;
+
+ case 54:
+ return 'FLAT';
+ break;
+
+ case 55:
+ return 'SMOOTH';
+ break;
+
+ case 56:
+ return 'SAMPLER1D';
+ break;
+
+ case 57:
+ return 'SAMPLER2D';
+ break;
+
+ case 58:
+ return 'SAMPLER3D';
+ break;
+
+ case 59:
+ return 'SAMPLERCUBE';
+ break;
+
+ case 60:
+ return 'SAMPLER1DSHADOW';
+ break;
+
+ case 61:
+ return 'SAMPLER2DSHADOW';
+ break;
+
+ case 62:
+ return 'STRUCT';
+ break;
+
+ case 63:
+ return 'VOID';
+ break;
+
+ case 64:
+ /*copy manually*/
+ break;
+
+ case 65:
+ return '++';
+ break;
+
+ case 66:
+ return '--';
+ break;
+
+ case 67:
+ return '<=';
+ break;
+
+ case 68:
+ return '>=';
+ break;
+
+ case 69:
+ return '==';
+ break;
+
+ case 70:
+ return '!=';
+ break;
+
+ case 71:
+ return '&&';
+ break;
+
+ case 72:
+ return '||';
+ break;
+
+ case 73:
+ return '^^';
+ break;
+
+ case 74:
+ return '<<';
+ break;
+
+ case 75:
+ return '>>';
+ break;
+
+ case 76:
+ return '*=';
+ break;
+
+ case 77:
+ return '/=';
+ break;
+
+ case 78:
+ return '+=';
+ break;
+
+ case 79:
+ return '%=';
+ break;
+
+ case 80:
+ return '<<=';
+ break;
+
+ case 81:
+ return '>>=';
+ break;
+
+ case 82:
+ return '&=';
+ break;
+
+ case 83:
+ return '^=';
+ break;
+
+ case 84:
+ return '|=';
+ break;
+
+ case 85:
+ return '-=';
+ break;
+
+ case 86:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 87:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 88:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 89:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 90:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 91:
+ this.yylval = parseInt(yy_.yytext + 2, 16);
+ return 'INTCONSTANT';
+ break;
+
+ case 92:
+ this.yylval = parseInt(yy_.yytext, 8);
+ return 'INTCONSTANT';
+ break;
+
+ case 93:
+ this.yylval = parseInt(yy_.yytext);
+ return 'INTCONSTANT';
+ break;
+
+ case 94:
+ this.yylval = 1;
+ return 'BOOLCONSTANT';
+ break;
+
+ case 95:
+ this.yylval = 0;
+ return 'BOOLCONSTANT';
+ break;
+
+ case 96:
+ return 'ASM';
+ break;
+
+ case 97:
+ return 'CLASS';
+ break;
+
+ case 98:
+ return 'UNION';
+ break;
+
+ case 99:
+ return 'ENUM';
+ break;
+
+ case 100:
+ return 'TYPEDEF';
+ break;
+
+ case 101:
+ return 'TEMPLATE';
+ break;
+
+ case 102:
+ return 'THIS';
+ break;
+
+ case 103:
+ return 'PACKED';
+ break;
+
+ case 104:
+ return 'GOTO';
+ break;
+
+ case 105:
+ return 'SWITCH';
+ break;
+
+ case 106:
+ return 'DEFAULT';
+ break;
+
+ case 107:
+ return 'INLINE';
+ break;
+
+ case 108:
+ return 'NOINLINE';
+ break;
+
+ case 109:
+ return 'VOLATILE';
+ break;
+
+ case 110:
+ return 'PUBLIC';
+ break;
+
+ case 111:
+ return 'STATIC';
+ break;
+
+ case 112:
+ return 'EXTERN';
+ break;
+
+ case 113:
+ return 'EXTERNAL';
+ break;
+
+ case 114:
+ return 'INTERFACE';
+ break;
+
+ case 115:
+ return 'LONG';
+ break;
+
+ case 116:
+ return 'SHORT';
+ break;
+
+ case 117:
+ return 'DOUBLE';
+ break;
+
+ case 118:
+ return 'HALF';
+ break;
+
+ case 119:
+ return 'FIXED';
+ break;
+
+ case 120:
+ return 'UNSIGNED';
+ break;
+
+ case 121:
+ return 'INPUT';
+ break;
+
+ case 122:
+ return 'OUTPUT';
+ break;
+
+ case 123:
+ return 'HVEC2';
+ break;
+
+ case 124:
+ return 'HVEC3';
+ break;
+
+ case 125:
+ return 'HVEC4';
+ break;
+
+ case 126:
+ return 'DVEC2';
+ break;
+
+ case 127:
+ return 'DVEC3';
+ break;
+
+ case 128:
+ return 'DVEC4';
+ break;
+
+ case 129:
+ return 'FVEC2';
+ break;
+
+ case 130:
+ return 'FVEC3';
+ break;
+
+ case 131:
+ return 'FVEC4';
+ break;
+
+ case 132:
+ return 'SAMPLER2DRECT';
+ break;
+
+ case 133:
+ return 'SAMPLER3DRECT';
+ break;
+
+ case 134:
+ return 'SAMPLER2DRECTSHADOW';
+ break;
+
+ case 135:
+ return 'SIZEOF';
+ break;
+
+ case 136:
+ return 'CAST';
+ break;
+
+ case 137:
+ return 'NAMESPACE';
+ break;
+
+ case 138:
+ return 'USING';
+ break;
+
+ case 139:
+ return 'LOWP';
+ break;
+
+ case 140:
+ return 'MEDIUMP';
+ break;
+
+ case 141:
+ return 'HIGHP';
+ break;
+
+ case 142:
+ return 'PRECISION';
+ break;
+
+ case 143:
+ yy.yylval = yy_.yytext;
+ return yy.state.classify_identifier(yy.state, yy_.yytext);
+ break;
+
+ case 144:
+ return yy_.yytext;
+ break;
+
+ case 145:
+ return 'EOF';
+ break;
+ }
+ },
+ rules: [/^(?:[ \r\t]+)/, /^(?:[ \t]*#[ \t]*$)/, /^(?:[ \t]*#[ \t]*version\b)/, /^(?:[ \t]*#[ \t]*extension\b)/, /^(?:(^([ \t]*)([ \t]*))line([ \t]+)((([1-9][0-9]*)|([xX][0-9a-fA-F]+)|([0-7]*)))([ \t]+)((([1-9][0-9]*)|([xX][0-9a-fA-F]+)|([0-7]*)))([ \t]*)$)/, /^(?:(^([ \t]*)([ \t]*))line([ \t]+)((([1-9][0-9]*)|([xX][0-9a-fA-F]+)|([0-7]*)))([ \t]*)$)/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)debug([ \t]*)\(([ \t]*)on([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)debug([ \t]*)\(([ \t]*)off([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)optimize([ \t]*)\(([ \t]*)on([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)optimize([ \t]*)\(([ \t]*)off([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)STDGL([ \t]+)invariant([ \t]*)\(([ \t]*)all([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+))/, /^(?:[\n])/, /^(?:.)/, /^(?:\/\/[^\n]*)/, /^(?:[ \t\r]*)/, /^(?::)/, /^(?:[_a-zA-Z][_a-zA-Z0-9]*)/, /^(?:[1-9][0-9]*)/, /^(?:[\n])/, /^(?:[\n])/, /^(?:attribute\b)/, /^(?:const\b)/, /^(?:bool\b)/, /^(?:float\b)/, /^(?:int\b)/, /^(?:break\b)/, /^(?:continue\b)/, /^(?:do\b)/, /^(?:while\b)/, /^(?:else\b)/, /^(?:for\b)/, /^(?:if\b)/, /^(?:discard\b)/, /^(?:return\b)/, /^(?:debugger\b)/, /^(?:bvec2\b)/, /^(?:bvec3\b)/, /^(?:bvec4\b)/, /^(?:ivec2\b)/, /^(?:ivec3\b)/, /^(?:ivec4\b)/, /^(?:vec2\b)/, /^(?:vec3\b)/, /^(?:vec4\b)/, /^(?:mat2\b)/, /^(?:mat3\b)/, /^(?:mat4\b)/, /^(?:in\b)/, /^(?:out\b)/, /^(?:inout\b)/, /^(?:uniform\b)/, /^(?:varying\b)/, /^(?:invariant\b)/, /^(?:flat\b)/, /^(?:smooth\b)/, /^(?:sampler1D\b)/, /^(?:sampler2D\b)/, /^(?:sampler3D\b)/, /^(?:samplerCube\b)/, /^(?:sampler1DShadow\b)/, /^(?:sampler2DShadow\b)/, /^(?:struct\b)/, /^(?:void\b)/, /^(?:layout\b)/, /^(?:\+\+)/, /^(?:--)/, /^(?:<=)/, /^(?:>=)/, /^(?:==)/, /^(?:!=)/, /^(?:&&)/, /^(?:\|\|)/, /^(?:\^\^)/, /^(?:<<)/, /^(?:>>)/, /^(?:\*=)/, /^(?:\/=)/, /^(?:\+=)/, /^(?:%=)/, /^(?:<<=)/, /^(?:>>=)/, /^(?:&=)/, /^(?:\^=)/, /^(?:\|=)/, /^(?:-=)/, /^(?:[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]?)/, /^(?:\.[0-9]+([eE][+-]?[0-9]+)?[fF]?)/, /^(?:[0-9]+\.([eE][+-]?[0-9]+)?[fF]?)/, /^(?:[0-9]+[eE][+-]?[0-9]+[fF]?)/, /^(?:[0-9]+[fF])/, /^(?:0[xX][0-9a-fA-F]+)/, /^(?:0[0-7]*)/, /^(?:[1-9][0-9]*)/, /^(?:true\b)/, /^(?:false\b)/, /^(?:asm\b)/, /^(?:class\b)/, /^(?:union\b)/, /^(?:enum\b)/, /^(?:typedef\b)/, /^(?:template\b)/, /^(?:this\b)/, /^(?:packed\b)/, /^(?:goto\b)/, /^(?:switch\b)/, /^(?:default\b)/, /^(?:inline\b)/, /^(?:noinline\b)/, /^(?:volatile\b)/, /^(?:public\b)/, /^(?:static\b)/, /^(?:extern\b)/, /^(?:external\b)/, /^(?:interface\b)/, /^(?:long\b)/, /^(?:short\b)/, /^(?:double\b)/, /^(?:half\b)/, /^(?:fixed\b)/, /^(?:unsigned\b)/, /^(?:input\b)/, /^(?:output\b)/, /^(?:hvec2\b)/, /^(?:hvec3\b)/, /^(?:hvec4\b)/, /^(?:dvec2\b)/, /^(?:dvec3\b)/, /^(?:dvec4\b)/, /^(?:fvec2\b)/, /^(?:fvec3\b)/, /^(?:fvec4\b)/, /^(?:sampler2DRect\b)/, /^(?:sampler3DRect\b)/, /^(?:sampler2DRectShadow\b)/, /^(?:sizeof\b)/, /^(?:cast\b)/, /^(?:namespace\b)/, /^(?:using\b)/, /^(?:lowp\b)/, /^(?:mediump\b)/, /^(?:highp\b)/, /^(?:precision\b)/, /^(?:[_a-zA-Z][_a-zA-Z0-9]*)/, /^(?:.)/, /^(?:$)/],
+ conditions: {
+ "PRAGMA": {
+ "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145],
+ "inclusive": true
+ },
+ "PP": {
+ "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145],
+ "inclusive": true
+ },
+ "INITIAL": {
+ "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145],
+ "inclusive": true
+ }
+ }
+ };
+ return lexer;
+ }();
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * GLSL Parser Class
+ */
+
+
+ function GlslParser() {
+ //Jison Global
+ this.jison = parser;
+ this.jison.lexer = lexer;
+ }
+
+ var proto = GlslParser.prototype;
+ /**
+ * Parse Program
+ */
+
+ proto.parse = function (state) {
+ var result;
+ this.jison.yy = {
+ test: 1,
+ state: state
+ };
+
+ try {
+ this.jison.parse(state.getTranslationUnit());
+ } catch (e) {
+ state.addError(e.message, e.lineNumber, e.columnNumber);
+ return false;
+ }
+
+ return true;
+ };
+
+ glsl.parser = new GlslParser();
+ /**
+ * External Parse
+ *
+ * @param string src Source code
+ * @param object options Compilation options
+ *
+ * @return object
+ */
+
+ glsl.parse = function (src, options) {
+ var state, result, irs;
+ state = new GlslState(options);
+ state.setSource(src); //Preprocess
+
+ result = this.preprocessor.process(state); //Parse into AST
+
+ if (result) {
+ result = this.parser.parse(state);
+ }
+
+ if (result) {
+ state.status = true;
+ }
+
+ return state;
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * Constructs a program's object code from an ast and symbol table
+ *
+ * @param string The error message
+ * @param AstNode The error AstNode
+ *
+ * @return string
+ */
+
+
+ glsl.generate = function (state) {
+ var irs, ast, i, main;
+ irs = new Ir(state.options.target);
+ ast = state.getAst();
+
+ try {
+ for (i = 0; i < ast.length; i++) {
+ ast[i].ir(state, irs);
+ }
+
+ main = state.symbols.get_function('main'); //Accept main, but warn if params not void
+
+ if (main.definition.join(",") !== "void") {
+ state.addWarning("main() should take no parameters");
+ }
+
+ state.symbols.add_variable("", irs.getTemp(main.getType().slots));
+
+ if (main.type != 'void') {
+ state.addWarning("main() should be type void");
+ }
+
+ if (!main) {
+ state.addError("main() is not defined");
+ return false;
+ }
+
+ main.Ast.body.ir(state, irs);
+ } catch (e) {
+ if (!e.ir) {
+ e.message = "compiler error: " + e.message;
+ }
+
+ state.addError(e.message, e.lineNumber, e.columnNumber);
+ return false;
+ }
+
+ state.setIR(irs);
+ return true;
+ };
+ /**
+ * Constructs an error message
+ *
+ * @param string The error message
+ * @param AstNode The error AstNode
+ *
+ * @return string
+ */
+
+
+ AstNode.prototype.ir_error = function (message) {
+ var e = new IrError();
+
+ if (this.location) {
+ e.lineNumber = this.location.first_line;
+ e.columnNumber = this.location.first_column;
+ e.message = message;
+ }
+
+ throw e;
+ };
+ /**
+ * Default IR
+ */
+
+
+ AstNode.prototype.irx = function (state, irs) {
+ this.ir_error(util.format("Can't generate ir for %s", this.typeOf()));
+ };
+ /**
+ * Constructs a type specifier code block
+ *
+ * @param object state parser state
+ */
+
+
+ AstTypeSpecifier.prototype.ir = function (state, irs) {
+ if (this.is_precision_statement) {
+ return;
+ } // this.ir_error("Cannot generate type specifier");
+
+ };
+ /**
+ * Constructs a declaration list
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstDeclaratorList.prototype.ir = function (state, irs) {
+ var i;
+
+ for (i = 0; i < this.declarations.length; i++) {
+ this.declarations[i].ir(state, irs, this.type);
+ }
+ };
+ /**
+ * Constructs a declaration
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstDeclaration.prototype.ir = function (state, irs, type) {
+ var qualifier, name, entry, constant, assign, lhs, size;
+
+ if (type.qualifier) {
+ qualifier = type.qualifier;
+ }
+
+ name = this.identifier; //add symbol table entry
+
+ entry = state.symbols.add_variable(name);
+ entry.type = type.specifier.type_name;
+ entry.qualifier = qualifier;
+
+ if (qualifier.indexOf('uniform') !== -1) {
+ entry.out = irs.getUniform(entry);
+ } else if (qualifier.indexOf('attribute') !== -1) {
+ entry.out = irs.getAttribute(entry);
+ } else if (qualifier.indexOf('varying') !== -1) {
+ entry.out = irs.getVarying(entry);
+ } else {
+ entry.out = irs.getTemp(entry.getType().slots);
+ }
+
+ constant = qualifier === 'const';
+
+ if (this.is_array) {
+ this.array_size.ir(state, irs);
+
+ if (this.array_size.Type != 'int') {
+ this.ir_error("array size must be an integer");
+ }
+
+ if (!this.array_size.Const) {
+ this.ir_error("array size must be constant");
+ }
+
+ size = parseInt(this.array_size.Dest);
+
+ if (size < 1) {
+ this.ir_error("array size cannot be less than 1");
+ }
+
+ entry.size = size; //Change the type of the entry so that expressions without indexing will fail
+
+ entry.base_type = entry.type;
+ entry.type += '[]';
+ }
+
+ if (this.initializer) {
+ //@todo: generate constants at compile time (this may be able to be taken care of in the generator)
+ if (constant) {//entry.constant = this.initializer.Dest;
+ } else {
+ lhs = new AstExpression('ident');
+ lhs.primary_expression.identifier = name;
+ assign = new AstExpression('=', lhs, this.initializer);
+ assign.setLocation(this.location);
+ assign.ir(state, irs);
+ }
+ } else {
+ if (constant) {
+ this.ir_error("Declaring const without initialier");
+ }
+ }
+ };
+ /**
+ * Constructs a function definition block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstFunctionDefinition.prototype.ir = function (state, irs) {
+ //handle function proto
+ this.proto_type.ir(state, irs);
+ this.proto_type.entry.Ast = this;
+ };
+ /**
+ * Constructs a function header code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstFunction.prototype.ir = function (state, irs) {
+ var i;
+
+ if (this.parameters.length == 0) {
+ this.entry.definition.push('void');
+ } //generate param list
+
+
+ for (i = 0; i < this.parameters.length; i++) {
+ this.entry.definition.push(this.parameters[i].type.specifier.type_name);
+ }
+ };
+ /**
+ * Constructs a compound statement code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstCompoundStatement.prototype.ir = function (state, irs) {
+ var i, stmt, retd_entry, maybe_returned;
+ retd_entry = state.symbols.get_variable("");
+ maybe_returned = false;
+
+ for (i = 0; i < this.statements.length; i++) {
+ stmt = this.statements[i];
+ stmt.ir(state, irs);
+
+ if (stmt instanceof AstJumpStatement && stmt.mode == 'return') {
+ //Returning from block, set return status, and skip following instructions in block (unreachable)
+ retd_entry.Passed = true;
+ irs.push(new IrInstruction("MOV", retd_entry.out + ".x", "1.0"));
+ break;
+ }
+
+ if (!maybe_returned && retd_entry.Passed) {
+ maybe_returned = true;
+ irs.push(new IrInstruction("IF", retd_entry.out + ".x"));
+ }
+ }
+
+ if (maybe_returned) {
+ irs.push(new IrInstruction("ENDIF"));
+ }
+ };
+ /**
+ * Constructs an expression statement code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpressionStatement.prototype.ir = function (state, irs) {
+ this.expression.ir(state, irs);
+ };
+ /**
+ * Constructs an expression code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir = function (state, irs) {
+ var i; //simple (variable, or value)
+
+ for (i in this.primary_expression) {
+ return this.ir_simple(state, irs);
+ } //operator
+
+
+ if (this.oper) {
+ return this.ir_op(state, irs);
+ } //cast
+
+
+ if (this.constructor.name == 'AstTypeSpecifier') {
+ this.Type = this.type_specifier;
+ return;
+ }
+
+ this.ir_error("Could not translate unknown expression type");
+ };
+ /**
+ * Constructs an operator expression code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_op = function (state, irs) {
+ var se, temp, ops;
+
+ if (se = this.subexpressions) {
+ se[0] ? se[0].ir(state, irs) : null;
+ se[1] ? se[1].ir(state, irs) : null;
+ se[2] ? se[2].ir(state, irs) : null;
+ }
+
+ switch (this.oper) {
+ //case '+=':
+ case '=':
+ this.ir_assign(state, irs);
+ break;
+
+ case 'POS':
+ //useless
+ this.Dest = se[0].Dest;
+ this.Type = se[0].Type;
+ break;
+
+ case 'NEG':
+ if (se[0].Dest.substring(0, 1) != '-') {
+ this.Dest = "-" + se[0].Dest;
+ } else {
+ this.Dest = se[0].Dest.substring(1);
+ }
+
+ this.Type = se[0].Type;
+
+ if (se[0].Const) {
+ this.Const = se[0].Const;
+ }
+
+ break;
+ //Arithmetic
+
+ case '+':
+ case '-':
+ case '*':
+ case '/':
+ case '%':
+ case '&':
+ case '^':
+ case '|':
+ case '~':
+ case '<<':
+ case '>>':
+ this.ir_generate(state, irs, 2, true);
+ break;
+ //Boolean
+
+ case '<':
+ case '>':
+ case '<=':
+ case '>=':
+ case '==':
+ case '!=':
+ case '&&':
+ case '^^':
+ case '||':
+ this.ir_generate(state, irs, 2);
+ break;
+
+ case '!':
+ this.ir_generate(state, irs, 1);
+ break;
+
+ /*
+ case '*=':
+ case '/=':
+ case '%=':
+ case '+=':
+ case '-=':
+ case '<<=':
+ case '>>=':
+ case '&=':
+ case '^=':
+ case '|=':
+ break;
+ case '?:':
+ break;
+ */
+ //Increment / Decrement
+
+ case '++x':
+ case '--x':
+ case 'x++':
+ case 'x--':
+ this.ir_incdec(state, irs);
+ break;
+ //case '.': break;
+
+ case '[]':
+ this.ir_arr_index(state, irs);
+ break;
+
+ /*
+ case 'VAR':
+ case 'int':
+ case 'float':
+ case 'bool':
+ ir_expression_simple(e, se);
+ break;
+ */
+
+ default:
+ this.ir_error(util.format("Could not translate unknown expression %s (%s)", this, this.oper));
+ }
+ };
+ /**
+ * Constructs an assignment expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_assign = function (state, irs, skip_comment
+ /*, local*/
+ ) {
+ var cond, ir, temp, size, slots, swz, i, entry, lhs, rhs, com;
+ lhs = this.subexpressions[0];
+ rhs = this.subexpressions[1];
+
+ if (lhs.Type != rhs.Type || rhs.Const) {
+ this.ir_cast.apply(rhs, [state, irs, lhs.Type]);
+ }
+
+ this.Type = lhs.Type;
+
+ if (lhs.Entry && lhs.Entry.constant) {
+ this.ir_error(util.format("Cannot assign value to constant %s", lhs.Dest));
+ }
+
+ if (!skip_comment) {
+ com = util.format("%s => %s %s <%s>", rhs.Dest, lhs.Type, lhs.Dest, lhs.toString());
+ irs.push(new IrComment(com, this.location));
+ }
+
+ size = types[this.Type].size;
+ slots = types[this.Type].slots; //get the swizzle for each slot
+
+ swz = Ir.swizzles[0].substring(0, 4 - (slots * 4 - size) / slots); //all components are used up in all slots
+
+ if (swz == Ir.swizzles[0]) {
+ swz = "";
+ }
+
+ for (i = 0; i < slots; i++) {
+ /*
+ if (cond && !local) {
+ ir = new IR('CMP', se[0].Dest, "-" + cond, se[1].Dest, se[0].Dest);
+ ir.addOffset(i);
+ ir.setSwizzle(swz);
+ irs.push(ir);
+ } else {
+ */
+ ir = new IrInstruction('MOV', lhs.Dest, rhs.Dest);
+ ir.addOffset(i);
+ ir.setSwizzle(swz);
+ irs.push(ir);
+ /*
+ }
+ */
+ }
+ };
+ /**
+ * Constructs a cast operation
+ */
+
+
+ AstExpression.prototype.ir_cast = function (state, irs, type) {
+ //Can cast to type?
+ if (Type.canCast(this.Type, type)) {
+ //Simple case, constant
+ if (this.Const) {
+ this.Dest = Type.castTo(this.Dest, this.Type, type);
+ this.Type = type;
+ } else {
+ //@todo: generate cast instructions
+ this.ir_error(util.format("Could not assign value of type %s to %s", this.Type, type));
+ }
+ } else {
+ this.ir_error(util.format("Could not assign value of type %s to %s", this.Type, type));
+ }
+ };
+ /**
+ * Constructs a simple expression code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_simple = function (state, irs) {
+ var name, entry, t;
+
+ if (this.oper == '.') {
+ this.ir_field(state, irs);
+ return;
+ } //identifier
+
+
+ if (name = this.primary_expression.identifier) {
+ //lookup identifier in symbol table
+ entry = state.symbols.get_variable(name) || state.symbols.get_function(name);
+
+ if (!entry
+ /*|| !entry.type*/
+ ) {
+ this.ir_error(util.format("%s is undefined", name));
+ }
+
+ this.Type = entry.type;
+ this.Entry = entry;
+
+ if (entry.constant) {
+ this.Dest = entry.constant;
+ } else {
+ this.Dest = entry.out;
+ }
+
+ return;
+ } //float constant
+
+
+ if (this.primary_expression.type == 'float') {
+ this.Type = 'float';
+ this.Dest = this.primary_expression.float_constant;
+ this.Const = true;
+ return;
+ } //int constant
+
+
+ if (this.primary_expression.type == 'int') {
+ this.Type = 'int';
+ this.Dest = this.primary_expression.int_constant;
+ this.Const = true;
+ return;
+ }
+
+ this.ir_error("Cannot translate unknown simple expression type");
+ };
+ /**
+ * Constructs the code for an expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_generate = function (state, irs, len, arith) {
+ var table, se, oprd_types, dest, i, j, def, match, comment, cnst;
+
+ if (!(table = builtin.oper[this.oper])) {
+ this.ir_error(util.format("Could not generate operation %s", this.oper));
+ }
+
+ se = this.subexpressions; //Fold constants
+
+ if (state.options.opt.fold_constants && arith) {
+ if (se[0].Const && se[1].Const) {
+ cnst = eval(se[0].Dest + this.oper + se[1].Dest); //If the calculation results in an error, resume normal IR generation and let it be handled at runtime
+
+ if (Number.isFinite(cnst)) {
+ this.Dest = "" + cnst;
+ this.Type = 'float';
+ this.Const = true;
+ return;
+ }
+ }
+ }
+
+ oprd_types = [];
+ dest = [];
+
+ for (i = 0; i < len; i++) {
+ oprd_types.push(se[i].Type);
+ dest.push(se[i].Dest);
+ }
+
+ def = new RegExp(oprd_types.join(",") + "\:(.*)");
+
+ for (j in table) {
+ if (match = j.match(def)) {
+ break;
+ }
+ }
+
+ if (!match) {
+ this.ir_error(util.format("Could not apply operation %s to %s", this.oper, oprd_types.join(", ")));
+ }
+
+ this.Type = match[1];
+ this.Dest = irs.getTemp(types[this.Type].slots);
+ dest.splice(0, 0, this.Dest);
+
+ if (len <= 4) {//this.Dest += util.format(".%s", swizzles[0].substring(0, glsl.type.size[this.Type]));
+ }
+
+ if (len == 1) {
+ comment = util.format("(%s %s %s) => %s %s", this.oper, se[0].Type, se[0].Dest, this.Type, this.Dest);
+ } else if (len == 2) {
+ comment = util.format("(%s %s %s %s %s) => %s %s", se[0].Type, se[0].Dest, this.oper, se[1].Type, se[1].Dest, this.Type, this.Dest);
+ } else if (len == 3) {
+ comment = util.format("(%s %s ? %s %s : %s %s) => %s %s", se[0].Type, se[0].Dest, se[1].Type, se[1].Dest, se[2].Type, se[2].Dest, this.Type, this.Dest);
+ }
+
+ irs.push(new IrComment(comment, this.location));
+ irs.build(table[j], dest);
+ };
+ /**
+ * Constructs an pre/post increment/decrement expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_incdec = function (state, irs) {
+ var se, op, ins, post, type, i, ir;
+ se = this.subexpressions[0];
+ op = this.oper.replace('x', '');
+ ins = op === '++' ? 'ADD' : 'SUB';
+ post = this.oper.indexOf('x') === 0;
+ type = types[se.Type]; //Type check: base type must be int or float
+
+ if (type.base != 'int' && type.base != 'float') {
+ this.ir_error(util.format("Could not apply operation %s to %s", op, se.Type));
+ }
+
+ this.Type = se.Type;
+
+ if (post) {
+ //For post increment, the returned happens before the increment, so we need a temp to store it
+ this.Dest = irs.getTemp(type.slots);
+ } else {
+ this.Dest = se.Dest;
+ }
+
+ irs.push(new IrComment(util.format("(%s%s) => %s %s", post ? se.Dest : op, post ? op : se.Dest, this.Type, this.Dest), this.location));
+
+ for (i = 0; i < type.slots; i++) {
+ if (post) {
+ this.Dest = irs.getTemp(type.slots);
+ ir = new IrInstruction('MOV', this.Dest, se.Dest);
+ ir.addOffset(i);
+ ir.setSwizzle(type.swizzle);
+ irs.push(ir);
+ }
+
+ ir = new IrInstruction(ins, se.Dest, se.Dest, "1.0");
+ ir.addOffset(i);
+ ir.setSwizzle(type.swizzle);
+ irs.push(ir);
+ }
+ };
+ /**
+ * Constructs an array index expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_arr_index = function (state, irs) {
+ var arr, idx, entry, size, cnst, oprd;
+ arr = this.subexpressions[0];
+ idx = this.subexpressions[1];
+ entry = arr.Entry; //Ensure array index is integer
+
+ if (idx.Type != 'int') {
+ this.ir_error("array index out of bounds");
+ } //@todo: Need to implement array indexing syntax for vector components
+
+
+ if (!entry.size) {
+ this.ir_error("cannot index a non-array value");
+ } //@todo: Need to implement array indexing for matrices
+
+
+ if (types[entry.base_type].slots > 1) {
+ this.ir_error("array indexing for matrices not implemented yet");
+ }
+
+ this.Type = entry.base_type; //If constant index, we can do some additional error checking
+
+ if (idx.Const) {
+ cnst = parseInt(idx.Dest);
+
+ if (cnst < 0 || cnst >= entry.size) {
+ this.ir_error("array index out of bounds");
+ }
+
+ oprd = new IrOperand(arr.Dest);
+ oprd.index = cnst;
+ this.Dest = oprd.toString();
+ } else {
+ //@todo: variable indexing is permitted by spec, but behavior is undefined for out of bounds
+ this.ir_error("variable indexing not implemented yet");
+ }
+ };
+ /**
+ * Constructs a function expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstFunctionExpression.prototype.ir = function (state, irs) {
+ var i, e, name, entry, ret_entry, retd_entry, call_types, operands, param, proto, loc;
+
+ if (this.cons) {
+ return this.ir_constructor(state, irs);
+ }
+
+ name = this.subexpressions[0].primary_expression.identifier;
+ operands = [];
+ call_types = [];
+
+ for (i = 0; i < this.expressions.length; i++) {
+ e = this.expressions[i];
+ e.ir(state, irs);
+ call_types.push(e.Type);
+ operands.push(e.Dest);
+ }
+
+ entry = state.symbols.get_function(name, call_types);
+
+ if (!entry) {
+ this.ir_error(util.format("Function %s(%s) is not defined", name, call_types.join(", ")));
+ }
+
+ this.Type = entry.type;
+ this.Dest = irs.getTemp(entry.getType().slots);
+ irs.push(new IrComment(util.format("%s(%s) => %s %s", name, operands.join(", "), this.Type, this.Dest), this.location));
+
+ if (entry.code) {
+ //Use function template
+ operands.unshift(this.Dest);
+ irs.build(entry.code, operands);
+ } else if (entry.Ast) {
+ //Rebuild inline function from AST
+ state.symbols.push_scope(); //Enter vars into local symbol table
+
+ proto = entry.Ast.proto_type;
+
+ for (i = 0; i < proto.parameters.length; i++) {
+ param = proto.parameters[i];
+ loc = state.symbols.add_variable(param.identifier, param.type.specifier.type_name);
+ loc.out = irs.getTemp(loc.getType().slots); //Add MOV operation from called param to local param
+
+ irs.push(new IrComment(util.format("PARAM %s => %s %s", operands[i], loc.out, param.type.specifier.type_name), param.location)); //Piggy-back off assignment generation
+
+ lhs = new AstExpression('');
+ lhs.setLocation(this.getLocation());
+ lhs.Type = loc.type;
+ lhs.Dest = loc.out;
+ assign = new AstExpression('=', lhs, this.expressions[i]);
+ assign.setLocation(this.getLocation());
+ assign.ir_assign(state, irs, true);
+ } //Create a return entry for the new call scope
+
+
+ ret_entry = state.symbols.add_variable("", this.Type);
+ ret_entry.out = this.Dest;
+ retd_entry = state.symbols.add_variable("", "bool");
+ retd_entry.out = irs.getTemp(retd_entry.getType().slots);
+ entry.Ast.body.ir(state, irs);
+ state.symbols.pop_scope();
+ }
+ };
+ /**
+ * Constructs a type constructor
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstFunctionExpression.prototype.ir_constructor = function (state, irs) {
+ var type, comment_text, comment, i, expr, src_expr, src_i, src_c, oprd, dest;
+ type = this.subexpressions[0].type_specifier;
+ this.Type = type.name;
+ this.Dest = irs.getTemp(type.slots);
+ comment_text = [];
+ comment = new IrComment("", this.location);
+ irs.push(comment); //Prepare components
+
+ for (i = 0; i < this.expressions.length; i++) {
+ expr = this.expressions[i];
+
+ if (expr) {
+ expr.ir(state, irs);
+ comment_text.push(expr.Dest);
+ }
+ }
+
+ src_expr = this.expressions[0];
+ src_i = 0; //Source expression index
+
+ src_c = 0; //Component of source expression
+
+ for (dest_i = 0; dest_i < type.size; dest_i++) {
+ if (!src_expr) {
+ this.ir_error("Not enough parameters to constructor");
+ } //@todo: need to add support for > vec4
+
+
+ if (types[src_expr.Type].size > 4) {
+ this.ir_error("Matrix components not implemented yet");
+ } //compute destination
+
+
+ dest = util.format("%s.%s", this.Dest, Ir.swizzles[0][dest_i]); //compute source
+
+ oprd = new IrOperand(src_expr.Dest);
+
+ if (!oprd.swizzle) {
+ oprd.swizzle = Ir.swizzles[0][src_c];
+ }
+
+ irs.push(new IrInstruction('MOV', dest, oprd.toString()));
+ src_c++; //Get next source component expression
+
+ if (src_c >= types[src_expr.Type].size) {
+ if (this.expressions[src_i + 1]) {
+ src_i++;
+ src_expr = this.expressions[src_i];
+ src_c = 0;
+ }
+ }
+ }
+
+ comment.comment = util.format("%s(%s) => %s %s", this.Type, comment_text.join(", "), this.Type, this.Dest);
+ };
+ /**
+ * Constructs a field selection code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_field = function (state, irs) {
+ var field, swz, base, se; //pick swizzle set
+
+ field = this.primary_expression.identifier;
+ se = this.subexpressions[0];
+ se.ir(state, irs);
+
+ if (Ir.isSwizzle(field)) {
+ base = types[se.Type].base;
+
+ if (field.length > 1) {
+ if (base == 'int') {
+ base = 'ivec' + field.length;
+ }
+
+ if (base == 'bool') {
+ base = 'bvec' + field.length;
+ }
+
+ if (base == 'float') {
+ base = 'vec' + field.length;
+ }
+ }
+
+ this.Type = base;
+
+ if (field.length > 4 || !this.Type) {
+ this.ir_error(util.format("Invalid field selection %s.%s", se, field));
+ }
+
+ this.Dest = util.format("%s.%s", se.Dest, Ir.normalizeSwizzle(field));
+ }
+ };
+ /**
+ * Constructs a selection statement
+ *
+ * @param ast_node Statement
+ */
+
+
+ AstSelectionStatement.prototype.ir = function (state, irs) {
+ var ir, cond;
+ this.condition.ir(state, irs); //@todo: add a check that condition is bool type?
+
+ irs.push(new IrComment(util.format("if %s then", this.condition.Dest), this.location)); //set a flag based on the result
+
+ ir = new IrInstruction('IF', this.condition.Dest);
+
+ if (['bool', 'int', 'float'].indexOf(this.condition.Type) === -1) {
+ this.ir_error("boolean expression expected");
+ }
+
+ if (!ir.d.swizzle) {
+ ir.d.swizzle = 'x';
+ }
+
+ irs.push(ir);
+ this.then_statement.ir(state, irs);
+
+ if (this.else_statement) {
+ irs.push(new IrInstruction('ELSE'));
+ this.else_statement.ir(state, irs);
+ }
+
+ irs.push(new IrInstruction('ENDIF'));
+ };
+ /**
+ * Constructs a jump statement
+ *
+ * Note: jump semantics are a bit different in glsl as there is no true "jumping":
+ * functions are inlined, loops are unrolled, etc.
+ *
+ * @param ast_node Statement
+ */
+
+
+ AstJumpStatement.prototype.ir = function (state, irs) {
+ var ret, ret_entry, assign, lhs;
+
+ switch (this.mode) {
+ case 'return':
+ ret = this.opt_return_value;
+
+ if (ret) {
+ ret.ir(state, irs);
+ ret_entry = state.symbols.get_variable(''); //@todo: need to compare return value type with current function type
+
+ irs.push(new IrComment(util.format("return => %s %s", ret.Dest, ret.Type), this.location)); //Piggy-back off assignment generation
+
+ lhs = new AstExpression('');
+ lhs.setLocation(this.getLocation());
+ lhs.Type = ret.Type;
+ lhs.Dest = ret_entry.out;
+ assign = new AstExpression('=', lhs, ret);
+ assign.setLocation(this.getLocation());
+ assign.ir_assign(state, irs, true);
+ } else {
+ irs.push(new IrComment("return", this.location));
+ }
+
+ break;
+
+ case 'debugger':
+ irs.push(new IrComment("debugger", this.location));
+ irs.push(new IrInstruction("DBGR"));
+ break;
+
+ default: //@todo:
+
+ }
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * IR Class
+ *
+ * Stores IR code tree
+ */
+
+
+ function Ir(target) {
+ this.target = target;
+ this.symbols = {
+ uniform: {
+ next: 0,
+ entries: {}
+ },
+ attribute: {
+ next: 0,
+ entries: {}
+ },
+ varying: {
+ next: 0,
+ entries: {}
+ },
+ temp: {
+ next: 0
+ }
+ };
+ this.code = [];
+ this.last = null;
+ }
+
+ Ir.prototype.getTemp = function (n) {
+ var t;
+ n = n || 1;
+ t = 'temp@' + this.symbols.temp.next;
+ this.symbols.temp.next += n;
+ return t;
+ };
+ /**
+ * Add a symbol table entry into the local symbol table and return a new IR identifier
+ *
+ * @param object entry Symbol table entry
+ *
+ * @return string
+ */
+
+
+ Ir.prototype.getUniform = function (entry) {
+ var table = this.symbols.uniform,
+ out;
+
+ if (!table.entries[entry.name]) {
+ table.entries[entry.name] = entry;
+ entry.out = 'uniform@' + table.next;
+ table.next += entry.getType().slots;
+ }
+
+ return entry.out;
+ };
+ /**
+ * Add a symbol table entry into the local symbol table and return a new IR identifier
+ *
+ * @param object entry Symbol table entry
+ *
+ * @return string
+ */
+
+
+ Ir.prototype.getAttribute = function (entry) {
+ var table = this.symbols.attribute,
+ out;
+
+ if (!table.entries[entry.name]) {
+ table.entries[entry.name] = entry;
+ entry.out = 'attribute@' + table.next;
+ table.next += entry.getType().slots;
+ }
+
+ return entry.out;
+ };
+ /**
+ * Add a symbol table entry into the local symbol table and return a new IR identifier
+ *
+ * @param object entry Symbol table entry
+ *
+ * @return string
+ */
+
+
+ Ir.prototype.getVarying = function (entry) {
+ var table = this.symbols.varying,
+ out;
+
+ if (!table.entries[entry.name]) {
+ table.entries[entry.name] = entry;
+ entry.out = 'varying@' + table.next;
+ table.next += entry.getType().slots;
+ }
+
+ return entry.out;
+ };
+
+ Ir.prototype.get = function (i) {
+ return this.code[i];
+ };
+
+ Ir.prototype.push = function (ir) {
+ this.code.push(ir);
+ this.last = ir;
+ };
+
+ Ir.isSwizzle = function (swz) {
+ if (swz.match(/[xyzw]+/)) {
+ return true;
+ }
+
+ if (swz.match(/[rgba]+/)) {
+ return true;
+ }
+
+ if (swz.match(/[stpq]+/)) {
+ return true;
+ }
+ };
+
+ Ir.normalizeSwizzle = function (swz) {
+ var n;
+
+ if (!this.isSwizzle(swz)) {
+ return null;
+ }
+
+ n = swz.replace(/[rs]/g, 'x').replace(/[gt]/g, 'y').replace(/[bp]/g, 'z').replace(/[aq]/g, 'w');
+ return n;
+ };
+
+ Ir.swizzles = ["xyzw", "rgba", "stpq"];
+ /**
+ * Replaces all instances of an operand name and base index in all instructions after start
+ *
+ * @param integer Starting instruction number
+ * @param string Old name to search for
+ * @param string New name to replace with
+ * @param integer Add offset
+ * @param boolean True if replacing with a completely new operand
+ */
+
+ Ir.prototype.replaceName = function (start, old, nw, index, repl) {
+ var i, j, ir, f, name, neg_const;
+ neg_const = old.match(/^\-([0-9]+\.[0-9]+)/);
+
+ if (neg_const) {
+ old = neg_const[1];
+ neg_const = true;
+ }
+
+ for (i = start; i < this.code.length; i++) {
+ ir = this.code[i]; //foreach each operand field
+
+ for (j = 0; j < IR.operands.length; j++) {
+ f = IR.operands[j];
+
+ if (ir[f] && ir[f].name == old) {
+ if (repl) {
+ ir[f] = new Ir.Operand(ir[f].neg + nw);
+ } else {
+ ir[f].name = nw;
+ ir[f].addOffset(index);
+ }
+
+ if (neg_const && ir[f].neg) {
+ ir[f].neg = "";
+ }
+ }
+ }
+ }
+ };
+
+ Ir.prototype.toString = function () {
+ return this.code.join("\n");
+ };
+ /**
+ * Builds instructions from code table record
+ *
+ * @param array List of instruction strings
+ * @param array List of operands
+ */
+
+
+ Ir.prototype.build = function (code, oprds) {
+ var dest, i, j, k, o, n, t, oprd, ir, new_swz, temps; //Parse operands
+
+ for (i = 0; i < oprds.length; i++) {
+ oprd = new IrOperand(oprds[i]);
+
+ if (oprd.swizzle) {
+ //need a new temp to move the swizzle so our code pattern works
+ new_swz = Ir.swizzles[0].substring(0, oprd.swizzle.length);
+
+ if (oprd.swizzle != new_swz) {
+ dest = this.getTemp();
+ ir = new IrInstruction('MOV', util.format("%s.%s", dest, new_swz), oprd.full);
+ this.push(ir);
+ oprd = new IrOperand(dest);
+ }
+ }
+
+ oprds[i] = oprd;
+ }
+
+ temps = []; //Merge template with passed operands
+
+ for (i = 0; i < code.length; i++) {
+ ir = new IrInstruction(code[i]); //For each operand
+
+ for (j = 0; j < IrInstruction.operands.length; j++) {
+ o = IrInstruction.operands[j];
+ oprd = ir[o];
+
+ if (!oprd) {
+ break;
+ } //Normal src/dest
+
+
+ n = oprd.name.match(/%(\d+)/);
+
+ if (n) {
+ n = parseInt(n[1]);
+ ir[o] = new IrOperand(oprds[n - 1].toString());
+ ir[o].addOffset(oprd.address);
+ ir[o].swizzle = oprd.swizzle;
+ ir[o].neg = oprd.neg;
+ } //Need temp
+
+
+ t = oprd.name.match(/%t(\d+)/);
+
+ if (t) {
+ //Build up enough temps
+ t = parseInt(t[1]);
+
+ while (temps.length < t) {
+ temps.push(this.getTemp());
+ }
+
+ t = temps[t - 1].split('@');
+ oprd.name = t[0];
+ oprd.address = t[1];
+ oprd.full = oprd.toString();
+ }
+ }
+
+ this.push(ir);
+ }
+ };
+ /**
+ * Ir Error Class
+ *
+ * Used to differentiate between a compilation error and a compiler error
+ */
+
+
+ function IrError(msg) {
+ this.msg = msg;
+ this.ir = true;
+ }
+
+ IrError.prototype = Error.prototype;
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * IR Instruction Class
+ *
+ * Represents a single assembly-like instruction
+ */
+
+ function IrInstruction(op, d, s1, s2, s3) {
+ var args;
+ this.str = null;
+ this.line = null;
+
+ if (arguments.length == 1) {
+ args = op.split(/[\s,]/);
+ op = args[0];
+ d = args[1];
+ s1 = args[2];
+ s2 = args[3];
+ s3 = args[4];
+ }
+
+ this.op = op;
+ this.d = this.operand(d);
+ this.s1 = this.operand(s1);
+ this.s2 = this.operand(s2);
+ this.s3 = this.operand(s3);
+ }
+
+ IrInstruction.operands = ['d', 's1', 's2', 's3'];
+
+ IrInstruction.prototype.operand = function (opr) {
+ return opr ? new IrOperand(opr) : "";
+ };
+ /**
+ * Adds the offset to all operands
+ *
+ * @param integer The offset to set
+ */
+
+
+ IrInstruction.prototype.addOffset = function (offset) {
+ var i, o;
+
+ for (i = 0; i < IrInstruction.operands.length; i++) {
+ o = IrInstruction.operands[i];
+
+ if (this[o]) {
+ this[o].addOffset(offset);
+ }
+ }
+ };
+ /**
+ * Set the swizzle components on all operands
+ *
+ * @param string The swizzle to set
+ */
+
+
+ IrInstruction.prototype.setSwizzle = function (swz) {
+ var i, o;
+
+ for (i = 0; i < IrInstruction.operands.length; i++) {
+ o = IrInstruction.operands[i];
+
+ if (this[o] && !this[o].swizzle) {
+ this[o].swizzle = swz;
+ }
+ }
+ };
+ /**
+ * toString method
+ *
+ * @return string
+ */
+
+
+ IrInstruction.prototype.toString = function () {
+ var out;
+ out = util.format("%s%s%s%s%s;", this.op, this.d ? ' ' + this.d : '', this.s1 ? ', ' + this.s1 : '', this.s2 ? ', ' + this.s2 : '', this.s3 ? ', ' + this.s3 : '');
+ return out;
+ };
+ /**
+ * IR Comment Class
+ *
+ * Represents a single comment
+ */
+
+
+ function IrComment(comment, loc) {
+ this.comment = comment;
+ this.loc = loc;
+ }
+
+ IrComment.prototype.toString = function () {
+ var c = this.comment;
+
+ if (this.loc) {
+ c = util.format("%s [%s:%s-%s:%s]", c, this.loc.first_line, this.loc.first_column, this.loc.last_line, this.loc.last_column);
+ }
+
+ c = "\n# " + c;
+ return c;
+ };
+ /**
+ * IR Operand Class
+ *
+ * Represents a single operand
+ */
+
+
+ function IrOperand(str, raw) {
+ this.full = "";
+ this.neg = "";
+ this.name = "";
+ this.address = "";
+ this.swizzle = "";
+ this.number = "";
+ this.raw = "";
+ this.index = "";
+
+ if (raw) {
+ this.full = str;
+ this.raw = str;
+ } else {
+ this.parse(str);
+ }
+ }
+ /**
+ * Parses operand string
+ *
+ * @param string string that represents a single variable
+ */
+
+
+ IrOperand.prototype.parse = function (str) {
+ var parts, regex;
+
+ if (!str) {
+ return;
+ }
+
+ if (!isNaN(parseFloat(str))) {
+ this.raw = str;
+ return;
+ } //neg
+
+
+ regex = "(\-)?"; //name (include '%' for our code substitution rules)
+
+ regex += "([\\w%]+)"; //number
+
+ regex += "(?:@(\\d+))?"; //index
+
+ regex += "(?:\\[(\\d+)\\])?"; //swizzle
+
+ regex += "(?:\\.([xyzw]+))?";
+ regex = new RegExp("^" + regex + "$");
+
+ if (parts = str.match(regex)) {
+ this.neg = parts[1] || "";
+ this.name = parts[2];
+ this.address = parseInt(parts[3]) || 0;
+ this.index = parseInt(parts[4]) || 0;
+ this.swizzle = parts[5] || "";
+ } else {
+ if (parts = str.match(/^"(.*)"$/)) {
+ this.raw = parts[1];
+ } else {
+ this.raw = str;
+ }
+ }
+
+ this.full = this.toString();
+ };
+ /**
+ * Adds an offset
+ *
+ * @param integer Offset to add
+ */
+
+
+ IrOperand.prototype.addOffset = function (offset) {
+ this.address = this.address || 0;
+ this.address += offset;
+ };
+ /**
+ * toString method
+ *
+ * @return string
+ */
+
+
+ IrOperand.prototype.toString = function () {
+ var str;
+
+ if (this.raw) {
+ str = this.raw;
+ } else {
+ str = this.neg + this.name + ("@" + this.address) + (this.index !== "" ? "[" + this.index + "]" : "") + (this.swizzle ? "." + this.swizzle : "");
+ }
+
+ return str;
+ };
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * GlslProgramJavascript class
+ */
+
+
+ function GlslProgramJavascript() {
+ this.vertex_code = [];
+ this.fragment_code = [];
+ this.symbols = new GlslProgramJavascriptVars();
+ this.context = new GlslProgramJavascriptContext();
+ this.library = {
+ tex: function tex(dest, i, sampler, src, j, dim) {
+ dest[i] = 0;
+ dest[i + 1] = 0;
+ dest[i + 2] = 0;
+ dest[i + 3] = 1;
+ }
+ };
+ this.vertex = null;
+ this.shader = null;
+ }
+
+ var proto = GlslProgramJavascript.prototype;
+ GlslProgramJavascript.translation_table = {
+ 'ABS': '%1.* = Math.abs(%2.*);',
+ 'ADD': '%1.* = %2.* + %3.*;',
+ 'AND': '%1.* = %2.* & %3.*;',
+ //'ARL' : false,
+ 'CEIL': '%1.* = Math.ceil(%2.*);',
+ 'CMP': '%1.* = (%2.* < 0.0) ? %3.* : %4.*;',
+ 'COS': '%1.* = Math.cos(%2.*);',
+ 'DIV': '%1.* = %2.* / %3.*;',
+ 'DBGR': 'debugger;',
+ 'DP2': '%1.x = (%2.x * %3.x) + (%2.y * %3.y);',
+ 'DP3': '%1.x = (%2.x * %3.x) + (%2.y * %3.y) + (%2.z * %3.z);',
+ 'DP4': '%1.x = (%2.x * %3.x) + (%2.y * %3.y) + (%2.z * %3.z) + (%2.w * %3.w);',
+ //'DPH' : '%1.* = (%2.x * %3.x + %2.y * %3.y + %2.z + %3.z + %3.w);',
+ //'DST' : '%1.* = [1, %2.y * %3.y, %2.z, %3.w];',
+ 'ELSE': '} else {',
+ 'ENDIF': '}',
+ 'FLR': '%1.* = Math.floor(%2.*);',
+ 'FRC': '%1.* = %2.* - Math.floor(%2.*);',
+ 'IF': 'if (%1.x) {',
+ 'MAD': '%1.* = (%2.* * %3.*) + %4.*;',
+ 'MAX': '%1.* = Math.max(%2.*, %3.*);',
+ 'MIN': '%1.* = Math.min(%2.*, %3.*);',
+ 'MOD': '%1.* = %2.* % %3.*;',
+ 'MOV': '%1.* = %2.*;',
+ 'MUL': '%1.* = %2.* * %3.*;',
+ 'OR': '%1.* = %2.* | %3.*;',
+ 'POW': '%1.x = Math.pow(%2.x, %3.x);',
+ 'RET': 'return;',
+ 'RSQ': '%1.* = (1.0 / Math.sqrt(%2.*));',
+ 'SEQ': '%1.* = (%2.* === %3.*) ? 1.0 : 0.0;',
+ 'SGE': '%1.* = (%2.* >= %3.*) ? 1.0 : 0.0;',
+ 'SGT': '%1.* = (%2.* > %3.*) ? 1.0 : 0.0;',
+ 'SIN': '%1.* = Math.sin(%2.*);',
+ 'SLE': '%1.* = (%2.* <= %3.*) ? 1.0 : 0.0;',
+ 'SLT': '%1.* = (%2.* < %3.*) ? 1.0 : 0.0;',
+ 'SNE': '%1.* = (%2.* !== %3.*) ? 1.0 : 0.0;',
+ 'SUB': '%1.* = %2.* - %3.*;',
+ 'TAN': '%1.* = Math.tan(%2.*);',
+ //Non-standard opcode for NV_gpu
+ 'TEX': 'tex(%1, %4, %2, %5, %3.x, 0);',
+ //%4 = address of %1, %5 = address of %2
+ 'XOR': '%1.* = %2.* ^ %3.*;'
+ };
+ /**
+ * Return string representation of program
+ *
+ * @param int target target
+ *
+ * @return string
+ */
+
+ proto.toString = function (target) {
+ if (target === glsl.target.fragment) {
+ return this.fragment_code.join("\n");
+ } else if (target === glsl.target.vertex) {
+ return this.vertex_code.join("\n");
+ } else {
+ return this.current.join("\n");
+ }
+ };
+ /**
+ * Translates IR code into a javascript representation
+ *
+ * @return bool true if there were no errors
+ */
+
+
+ proto.addObjectCode = function (object, target) {
+ var i, errors; //optimize(irs, symbols);
+
+ this.mergeSymbols(object);
+ this.current = [];
+
+ for (i = 0; i < object.code.length; i++) {
+ try {
+ this.instruction(object.code[i]);
+ } catch (e) {
+ this.error = util.format("%s at %s:%s", e.message, e.lineNumber, e.columnNumber);
+ return false;
+ }
+ }
+
+ if (target == glsl.target.vertex) {
+ this.vertex_code = this.current;
+ } else if (target == glsl.target.fragment) {
+ this.fragment_code = this.current;
+ }
+
+ return true;
+ };
+ /**
+ * Merge symbol code into program table
+ */
+
+
+ proto.mergeSymbols = function (object) {
+ var s, t, n, entry, sym, start, slots, comp;
+
+ for (s in object.symbols) {
+ t = object.symbols[s].entries;
+
+ for (n in t) {
+ entry = t[n];
+ start = parseInt(entry.out.split('@')[1]);
+ slots = entry.getType().slots;
+ comp = entry.getType().size / slots;
+
+ if (s == 'uniform') {
+ sym = this.symbols.addUniform(entry.name, start, slots, comp);
+
+ if (this.findSymbolCollision(this.symbols.uniform, sym)) {
+ this.rewriteSymbol(this.symbols.uniform, sym, object);
+ }
+ } else if (s == 'attribute') {
+ this.symbols.addAttribute(entry.name, start, slots, comp);
+ } else if (s == 'varying') {
+ this.symbols.addVarying(entry.name, start, slots, comp);
+ }
+ }
+ }
+ };
+ /**
+ * Scan symbol table to find collisions
+ */
+
+
+ proto.findSymbolCollision = function (table, symbol) {
+ var i, my_start, my_end, start, end;
+ my_start = symbol.pos;
+ my_end = my_start + symbol.slots - 1;
+
+ for (i in table) {
+ if (i == symbol.name) {
+ continue;
+ }
+
+ start = table[i].pos;
+ end = start + table[i].slots - 1;
+
+ if (my_start >= start && my_start <= end || my_end >= start && my_end <= end) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+ /**
+ * Rewrite symbol table entry position in code
+ */
+
+
+ proto.findNewSymbolPosition = function (table, symbol) {
+ var i, size, addresses, last, next;
+ addresses = []; //find new address
+
+ for (i in table) {
+ if (symbol.name == i) {
+ continue;
+ } //start address
+
+
+ addresses.push(table[i].pos); //end address
+
+ addresses.push(table[i].pos + table[i].slots - 1);
+ }
+
+ addresses.sort(); //Can insert at beginning
+
+ if (addresses[0] >= symbol.slots) {
+ return 0;
+ } //Can insert in between
+
+
+ for (i = 1; i < addresses.length; i += 2) {
+ last = addresses[i];
+ next = addresses[i];
+
+ if (next - last - 1 > symbol.slots) {
+ return last + 1;
+ }
+ } //Can insert at end
+
+
+ return addresses.slice(-1)[0] + 1;
+ };
+ /**
+ * Rewrite symbol table entry position in code
+ */
+
+
+ proto.rewriteSymbol = function (table, symbol, object) {
+ var pos, old_start, old_end, diff, i, ins;
+ old_start = symbol.pos;
+ old_end = old_start + symbol.slots - 1;
+ symbol.pos = this.findNewSymbolPosition(table, symbol);
+ diff = symbol.pos - old_start;
+
+ for (i = 0; i < object.code.length; i++) {
+ ins = object.code[i];
+
+ if (!(ins instanceof IrInstruction)) {
+ continue;
+ }
+
+ this.rewriteOperandAddress(ins.d, old_start, old_end, diff, symbol);
+ this.rewriteOperandAddress(ins.s1, old_start, old_end, diff, symbol);
+ this.rewriteOperandAddress(ins.s2, old_start, old_end, diff, symbol);
+ this.rewriteOperandAddress(ins.s3, old_start, old_end, diff, symbol);
+ }
+ };
+ /**
+ * Rewrite symbol table entry position in code
+ */
+
+
+ proto.rewriteOperandAddress = function (oprd, old_start, old_end, diff, symbol) {
+ var diff;
+
+ if (!oprd) {
+ return;
+ }
+
+ if (oprd.name != symbol.type) {
+ return;
+ }
+
+ if (oprd.address >= old_start && oprd.address <= old_end) {
+ oprd.address += diff;
+ }
+ };
+ /**
+ * Build a program
+ *
+ * @return function
+ */
+
+
+ proto.build = function () {
+ var module, shaders;
+ module = new Function("stdlib", "foreign", "heap", "//\"use asm\";\n" + "var\n" + "uniform_f32 = new stdlib.Float32Array(heap, 0, 128),\n" + "attribute_f32 = new stdlib.Float32Array(heap, 512, 128),\n" + "varying_f32 = new stdlib.Float32Array(heap, 1024, 128),\n" + "result_f32 = new stdlib.Float32Array(heap, 1536, 128),\n" + "temp_f32 = new stdlib.Float32Array(heap, 2048, 128),\n" + "jstemp = new stdlib.Float32Array(heap, 2544, 4),\n" + "tex = foreign.tex;\n" + ";\n" + "function vs() {\n" + this.vertex_code.join("\n") + "\n" + "}\n" + "function fs() {\n" + this.fragment_code.join("\n") + "\n" + "}\n" + "return { fragment : fs, vertex : vs };");
+ shaders = module(window, this.library, this.context.heap);
+ this.vertex = shaders.vertex;
+ this.fragment = shaders.fragment;
+ };
+ /**
+ * Translates ASM instruction into output format
+ *
+ * @param string string that represents a single instruction
+ */
+
+
+ proto.instruction = function (ins) {
+ var tpl, dest, src, i, j, k, code, js;
+
+ if (ins instanceof IrComment) {
+ this.current.push('// ' + ins.toString().replace("\n", ""));
+ return;
+ }
+
+ this.current.push('// ' + ins.toString());
+
+ if (!(tpl = GlslProgramJavascript.translation_table[ins.op])) {
+ throw new Error(util.format("Could not translate opcode '%s'", ins.op));
+ } //variables
+
+
+ dest = this.buildComponents(ins.d, true);
+
+ if (!dest) {
+ this.current.push(tpl);
+ return;
+ }
+
+ src = [];
+ src.push(this.buildComponents(ins.s1));
+ src.push(this.buildComponents(ins.s2));
+ src.push(this.buildComponents(ins.s3));
+
+ if (ins.op == 'TEX') {
+ js = tpl.replace(/%1/g, dest.name);
+ js = js.replace(/%2/g, src[0].name);
+ js = this.replaceOperand(js, '%3', src[1], 0);
+ js = js.replace(/%4/g, dest.start);
+ js = js.replace(/%5/g, src[0].start);
+ this.current.push(js);
+ this.current.push("");
+ return;
+ }
+
+ this.generateTemp(dest, src, tpl);
+
+ for (i = 0; i < dest.components.length; i++) {
+ js = this.replaceOperand(tpl, '%1', dest, i);
+
+ for (j = 0; j < 3; j++) {
+ if (src[j]) {
+ js = this.replaceOperand(js, '%' + (j + 2), src[j], i);
+ }
+ }
+
+ this.current.push(js);
+ }
+
+ this.current.push("");
+ };
+ /**
+ * Replace an operand into code template
+ *
+ * @param string tpl Template
+ * @param string from Template operand
+ * @param object op Operand info
+ * @param int n Current component iteration
+ */
+
+
+ proto.replaceOperand = function (tpl, from, op, n) {
+ var i,
+ out,
+ name,
+ addr,
+ swz = ['x', 'y', 'z', 'w'];
+
+ if (op.raw) {
+ name = op.name;
+ } else {
+ if (op.jstemp && op.jstemp[n]) {
+ name = 'jstemp';
+ addr = n;
+ } else {
+ name = op.name;
+
+ if (op.components) {
+ addr = op.start + op.components[n];
+ }
+ }
+ }
+
+ if (op.components) {
+ out = tpl.replace(from + '.*', util.format("%s[%s]", name, addr));
+ } else {
+ out = tpl.replace(from + '.*', name);
+ }
+
+ for (i = 0; i < swz.length; i++) {
+ out = out.replace(new RegExp(from + '\.' + swz[i], 'g'), util.format("%s[%s]", name, op.start + i));
+ }
+
+ return out;
+ };
+ /**
+ * Prepares info on IR operand
+ *
+ * @param IrOperand opr Operand
+ * @param bool dest Is destination?
+ *
+ * @return object
+ */
+
+
+ proto.buildComponents = function (opr, dest) {
+ var i, swz, out;
+
+ if (!opr) {
+ return null;
+ }
+
+ out = {};
+
+ if (opr.raw) {
+ out.name = opr.raw;
+ out.raw = true;
+ return out;
+ }
+
+ out.name = opr.neg + opr.name + '_f32';
+ out.start = 4 * opr.address + 4 * opr.index;
+ out.components = [];
+ out.jstemp = []; //generate array representation of swizzle components, expanding if necessary
+
+ swz = opr.swizzle || "xyzw";
+ swz = swz.split("");
+
+ for (i = 0; i < 4; i++) {
+ //exact swizzle specified and less than 4 components, grab last one
+ if (swz.length <= i) {
+ if (!dest) {
+ //repeat last one
+ out.components.push(out.components[i - 1]);
+ out.jstemp.push(null);
+ }
+ } else {
+ out.components.push("xyzw".indexOf(swz[i]));
+ out.jstemp.push(null);
+ }
+ }
+
+ return out;
+ };
+
+ proto.generateTemp = function (dest, src, tpl) {
+ var i, c, op, written;
+
+ for (i = 0; i < dest.components.length; i++) {
+ written = dest.components.slice(0, i);
+
+ for (c = 0; c < src.length; c++) {
+ op = src[c];
+
+ if (op && op.name == dest.name && op.start == dest.start && written.indexOf(op.components[i]) != -1) {
+ op.jstemp[i] = true;
+ this.current.push(util.format("jstemp[%s] = %s[%s]", i, op.name, op.start + op.components[i]));
+ }
+ }
+ } //console.log(tpl, dest, src);
+ //debugger;
+
+ };
+ /**
+ * Get Uniform Location
+ *
+ * @param string name Name
+ *
+ * @return int
+ */
+
+
+ proto.getUniformLocation = function (name) {
+ if (this.symbols.uniform[name]) {
+ return this.symbols.uniform[name].start;
+ }
+
+ return false;
+ };
+ /**
+ * Get Uniform Size
+ *
+ * @param string name Name
+ *
+ * @return int
+ */
+
+
+ proto.getUniformSize = function (name) {
+ if (this.symbols.uniform[name]) {
+ return this.symbols.uniform[name].size;
+ }
+
+ return false;
+ };
+ /**
+ * Set Uniform data
+ *
+ * @param string name Name
+ * @param array data Data
+ */
+
+
+ proto.setUniformData = function (name, data) {
+ var i, l, s, d;
+ d = data.length;
+ l = this.getUniformSize(name);
+ s = this.getUniformLocation(name);
+
+ if (l === false) {
+ return;
+ }
+
+ this.context.uniform_f32.set(data, i + s);
+ };
+ /**
+ * Get Attribute Location
+ *
+ * @param string name Name
+ *
+ * @return int
+ */
+
+
+ proto.getAttributeLocation = function (name) {
+ if (this.symbols.attribute[name]) {
+ return this.symbols.attribute[name].start;
+ }
+
+ return false;
+ };
+ /**
+ * Get Attribute Size
+ *
+ * @param string name Name
+ *
+ * @return int
+ */
+
+
+ proto.getAttributeSize = function (name) {
+ if (this.symbols.attribute[name]) {
+ return this.symbols.attribute[name].size;
+ }
+
+ return false;
+ };
+ /**
+ * Set Attribute data
+ *
+ * @param string name Name
+ * @param array data Data
+ */
+
+
+ proto.setAttributeData = function (name, data) {
+ var i, l, s, d;
+ d = data.length;
+ l = this.getAttributeSize(name);
+ s = this.getAttributeLocation(name);
+
+ if (l === false) {
+ return;
+ }
+
+ this.context.attribute_f32.set(data, i + s);
+ };
+ /**
+ * Get result data
+ *
+ * @param int start Start pos
+ * @param int size Size
+ *
+ * @return array
+ */
+
+
+ proto.getResultData = function (start, size) {
+ var res;
+ res = Array.prototype.slice.apply(this.context.result_f32, [start, size]);
+ return res;
+ };
+ /**
+ * Set TEX lookup function
+ *
+ *
+ */
+
+
+ proto.setTexFunction = function (func) {
+ this.library.tex = func;
+ };
+
+ glsl.program = GlslProgramJavascript;
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * GlslProgramJavascriptContext class
+ */
+
+ function GlslProgramJavascriptContext() {
+ this.heap = new ArrayBuffer(640 * 4);
+ this.uniform_f32 = new Float32Array(this.heap, 0, 128);
+ this.attribute_f32 = new Float32Array(this.heap, 128 * 4, 128);
+ this.varying_f32 = new Float32Array(this.heap, 256 * 4, 128);
+ this.result_f32 = new Float32Array(this.heap, 384 * 4, 128);
+ }
+
+ var proto = GlslProgramJavascriptContext.prototype;
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * GlslProgramJavascriptVars Class
+ */
+
+ function GlslProgramJavascriptVars() {
+ this.uniform = {};
+ this.attribute = {};
+ this.varying = {};
+ }
+
+ var proto = GlslProgramJavascriptVars.prototype;
+ /**
+ * Add uniform variable
+ */
+
+ proto.addUniform = function (name, pos, slots, comp) {
+ this.uniform[name] = new GlslProgramJavascriptVar(name, pos, slots, comp, 'uniform');
+ return this.uniform[name];
+ };
+ /**
+ * Add attribute variable
+ */
+
+
+ proto.addAttribute = function (name, pos, slots, comp) {
+ this.attribute[name] = new GlslProgramJavascriptVar(name, pos, slots, comp, 'attribute');
+ return this.attribute[name];
+ };
+ /**
+ * Add varying variable
+ */
+
+
+ proto.addVarying = function (name, pos, slots, comp) {
+ this.varying[name] = new GlslProgramJavascriptVar(name, pos, slots, comp, 'varying');
+ return this.varying[name];
+ };
+ /**
+ * GlslProgramJavascriptVar Class
+ */
+
+
+ function GlslProgramJavascriptVar(name, pos, slots, comp, type) {
+ this.name = name;
+ this.pos = pos;
+ this.slots = slots;
+ this.components = comp;
+ this.type = type;
+ } //this.glsl = glsl;
+
+
+ if ('object' !== 'undefined') {
+ module.exports = glsl;
+ }
+ })();
+});
+
+var ast$1 = createCommonjsModule(function (module, exports) {
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.makeEveryOtherGenerator = exports.makeGenerator = exports.visit = exports.evaluate = void 0;
+var isNode = function (node) { return !!(node === null || node === void 0 ? void 0 : node.type); };
+var isTraversable = function (node) { return isNode(node) || Array.isArray(node); };
+var evaluate = function (ast, visitors) {
+ var visit = function (node) {
+ var visitor = visitors[node.type];
+ if (!visitor) {
+ throw new Error("No evaluate() visitor for " + node.type);
+ }
+ return visitors[node.type](node, visit);
+ };
+ return visit(ast);
+};
+exports.evaluate = evaluate;
+var makePath = function (node, parent, parentPath, key, index) { return ({
+ node: node,
+ parent: parent,
+ parentPath: parentPath,
+ key: key,
+ index: index,
+ skip: function () {
+ this.skipped = true;
+ },
+ remove: function () {
+ this.removed = true;
+ },
+ replaceWith: function (replacer) {
+ this.replaced = replacer;
+ },
+ findParent: function (test) {
+ return !parentPath
+ ? parentPath
+ : test(parentPath)
+ ? parentPath
+ : parentPath.findParent(test);
+ },
+}); };
+/**
+ * Apply the visitor pattern to an AST that conforms to this compiler's spec
+ */
+var visit = function (ast, visitors) {
+ var visitNode = function (node, parent, parentPath, key, index) {
+ var _a;
+ var visitor = visitors[node.type];
+ var path = makePath(node, parent, parentPath, key, index);
+ if (visitor === null || visitor === void 0 ? void 0 : visitor.enter) {
+ visitor.enter(path);
+ if (path.removed) {
+ if (!key || !parent) {
+ throw new Error("Asked to remove " + node.id + " but no parent key was present in " + (parent === null || parent === void 0 ? void 0 : parent.id));
+ }
+ if (typeof index === 'number') {
+ parent[key].splice(index, 1);
+ }
+ else {
+ parent[key] = null;
+ }
+ return path;
+ }
+ if (path.replaced) {
+ if (!key || !parent) {
+ throw new Error("Asked to remove " + node.id + " but no parent key was present in " + (parent === null || parent === void 0 ? void 0 : parent.id));
+ }
+ if (typeof index === 'number') {
+ parent[key].splice(index, 1, path.replaced);
+ }
+ else {
+ parent[key] = path.replaced;
+ }
+ }
+ if (path.skipped) {
+ return path;
+ }
+ }
+ Object.entries(node)
+ .filter(function (_a) {
+ var nodeKey = _a[0], nodeValue = _a[1];
+ return isTraversable(nodeValue);
+ })
+ .forEach(function (_a) {
+ var nodeKey = _a[0], nodeValue = _a[1];
+ if (Array.isArray(nodeValue)) {
+ for (var i = 0, offset = 0; i - offset < nodeValue.length; i++) {
+ var child = nodeValue[i - offset];
+ var res = visitNode(child, node, path, nodeKey, i - offset);
+ if (res === null || res === void 0 ? void 0 : res.removed) {
+ offset += 1;
+ }
+ }
+ }
+ else {
+ visitNode(nodeValue, node, path, nodeKey);
+ }
+ });
+ (_a = visitor === null || visitor === void 0 ? void 0 : visitor.exit) === null || _a === void 0 ? void 0 : _a.call(visitor, path);
+ // visitor?.exit?.(node, parent, key, index);
+ };
+ return visitNode(ast);
+};
+exports.visit = visit;
+/**
+ * Stringify an AST
+ */
+var makeGenerator = function (generators) {
+ var gen = function (ast) {
+ return typeof ast === 'string'
+ ? ast
+ : ast === null || ast === undefined
+ ? ''
+ : Array.isArray(ast)
+ ? ast.map(gen).join('')
+ : ast.type in generators
+ ? generators[ast.type](ast)
+ : "NO GENERATOR FOR " + ast.type + ast;
+ };
+ return gen;
+};
+exports.makeGenerator = makeGenerator;
+var makeEveryOtherGenerator = function (generate) {
+ var everyOther = function (nodes, eo) {
+ return nodes.reduce(function (output, node, index) {
+ return output +
+ generate(node) +
+ (index === nodes.length - 1 ? '' : generate(eo[index]));
+ }, '');
+ };
+ return everyOther;
+};
+exports.makeEveryOtherGenerator = makeEveryOtherGenerator;
+});
+
+var ast$2 = /*@__PURE__*/getDefaultExportFromCjs(ast$1);
+
+"use strict";
+
+
+var generators = {
+ program: function (node) { return generate(node.ws) + generate(node.program); },
+ preprocessor: function (node) { return generate(node.line) + generate(node._); },
+ keyword: function (node) { return generate(node.token) + generate(node.whitespace); },
+ precision: function (node) {
+ return generate(node.prefix) + generate(node.qualifier) + generate(node.specifier);
+ },
+ // Statements
+ expression_statement: function (node) {
+ return generate(node.expression) + generate(node.semi);
+ },
+ if_statement: function (node) {
+ return generate(node.if) +
+ generate(node.lp) +
+ generate(node.condition) +
+ generate(node.rp) +
+ generate(node.body) +
+ generate(node.else);
+ },
+ switch_statement: function (node) {
+ return generate(node.switch) +
+ generate(node.lp) +
+ generate(node.expression) +
+ generate(node.rp) +
+ generate(node.lb) +
+ generate(node.cases) +
+ generate(node.rb);
+ },
+ break_statement: function (node) { return generate(node.break) + generate(node.semi); },
+ do_statement: function (node) {
+ return generate(node.do) +
+ generate(node.body) +
+ generate(node.while) +
+ generate(node.lp) +
+ generate(node.expression) +
+ generate(node.rp) +
+ generate(node.semi);
+ },
+ continue_statement: function (node) { return generate(node.continue) + generate(node.semi); },
+ return_statement: function (node) {
+ return generate(node.return) + generate(node.expression) + generate(node.semi);
+ },
+ discard_statement: function (node) { return generate(node.discard) + generate(node.semi); },
+ while_statement: function (node) {
+ return generate(node.while) +
+ generate(node.lp) +
+ generate(node.condition) +
+ generate(node.rp) +
+ generate(node.body);
+ },
+ for_statement: function (node) {
+ return generate(node.for) +
+ generate(node.lp) +
+ generate(node.init) +
+ generate(node.initSemi) +
+ generate(node.condition) +
+ generate(node.conditionSemi) +
+ generate(node.operation) +
+ generate(node.rp) +
+ generate(node.body);
+ },
+ condition_expression: function (node) {
+ return generate(node.specified_type) +
+ generate(node.identifier) +
+ generate(node.declarator) +
+ generate(node.op) +
+ generate(node.initializer);
+ },
+ declaration_statement: function (node) {
+ return generate(node.declaration) + generate(node.semi);
+ },
+ fully_specified_type: function (node) {
+ return generate(node.qualifiers) + generate(node.specifier);
+ },
+ layout_qualifier: function (node) {
+ return generate(node.layout) +
+ generate(node.lp) +
+ generateWithEveryOther(node.qualifiers, node.commas) +
+ generate(node.rp);
+ },
+ layout_qualifier_id: function (node) {
+ return generate(node.identifier) +
+ generate(node.operator) +
+ generate(node.expression);
+ },
+ switch_case: function (node) {
+ return generate(node.case) +
+ generate(node.test) +
+ generate(node.colon) +
+ generate(node.statements);
+ },
+ default_case: function (node) {
+ return generate(node.default) + generate(node.colon) + generate(node.statements);
+ },
+ declaration: function (node) {
+ return generate(node.specified_type) +
+ generate(node.identifier) +
+ generate(node.quantifier) +
+ generate(node.operator) +
+ generate(node.initializer);
+ },
+ declarator_list: function (node) {
+ return generate(node.specified_type) +
+ generateWithEveryOther(node.declarations, node.commas);
+ },
+ declarator: function (node) {
+ return generate(node.specified_type) +
+ generate(node.identifier) +
+ generate(node.qualifiers) +
+ generate(node.quantifier);
+ },
+ type_specifier: function (node) {
+ return generate(node.specifier) +
+ generate(node.quantifier) +
+ generate(node.declarations);
+ },
+ array_specifiers: function (node) { return generate(node.specifiers); },
+ array_specifier: function (node) {
+ return generate(node.lb) + generate(node.expression) + generate(node.rb);
+ },
+ identifier: function (node) { return node.identifier + generate(node.whitespace); },
+ function: function (node) {
+ return generate(node['prototype']) + generate(node.body) + generate(node.rp);
+ },
+ function_header: function (node) {
+ return generate(node.returnType) + generate(node.name) + generate(node.lp);
+ },
+ function_prototype: function (node) {
+ return generate(node.header.returnType) +
+ generate(node.header.name) +
+ generate(node.header.lp) +
+ (node.parameters
+ ? generateWithEveryOther(node.parameters, node.commas)
+ : '') +
+ generate(node.rp);
+ },
+ parameter_declaration: function (node) {
+ return generate(node.qualifier) + generate(node.declaration);
+ },
+ compound_statement: function (node) {
+ return generate(node.lb) + generate(node.statements) + generate(node.rb);
+ },
+ function_call: function (node) {
+ return generate(node.identifier) +
+ generate(node.lp) +
+ generate(node.args) +
+ generate(node.rp);
+ },
+ parameter_declarator: function (node) {
+ return generate(node.qualifier) +
+ generate(node.specifier) +
+ generate(node.identifier) +
+ generate(node.quantifier);
+ },
+ postfix: function (node) { return generate(node.expr) + generate(node.postfix); },
+ quantifier: function (node) {
+ return generate(node.lb) + generate(node.expr) + generate(node.rb);
+ },
+ quantified_identifier: function (node) {
+ return generate(node.identifier) + generate(node.quantifier);
+ },
+ field_selection: function (node) { return generate(node.dot) + generate(node.selection); },
+ subroutine_qualifier: function (node) {
+ return generate(node.subroutine) +
+ generate(node.lp) +
+ generate(node.type_names) +
+ generate(node.commas) +
+ generate(node.rp);
+ },
+ assignment: function (node) {
+ return generate(node.left) + generate(node.operator) + generate(node.right);
+ },
+ ternary: function (node) {
+ return generate(node.expr) +
+ generate(node.question) +
+ generate(node.left) +
+ generate(node.colon) +
+ generate(node.right);
+ },
+ binary: function (node) {
+ return generate(node.left) + generate(node.operator) + generate(node.right);
+ },
+ group: function (node) {
+ return generate(node.lp) + generate(node.expression) + generate(node.rp);
+ },
+ unary: function (node) { return generate(node.operator) + generate(node.expression); },
+ float_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ double_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ int_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ uint_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ bool_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ literal: function (node) { return generate(node.literal) + generate(node.whitespace); },
+ struct: function (node) {
+ return generate(node.struct) +
+ generate(node.typeName) +
+ generate(node.lb) +
+ generate(node.declarations) +
+ generate(node.rb);
+ },
+ struct_declaration: function (node) {
+ return generate(node.declaration) + generate(node.semi);
+ },
+ interface_declarator: function (node) {
+ return generate(node.qualifiers) +
+ generate(node.interface_type) +
+ generate(node.lp) +
+ generate(node.declarations) +
+ generate(node.rp) +
+ generate(node.identifier);
+ },
+ struct_declarator: function (node) {
+ return generate(node.specified_type) +
+ generateWithEveryOther(node.declarations, node.commas);
+ },
+ initializer_list: function (node) {
+ return generate(node.lb) +
+ generateWithEveryOther(node.initializers, node.commas) +
+ generate(node.rb);
+ },
+ qualifier_declarator: function (node) {
+ return generate(node.qualifiers) +
+ generateWithEveryOther(node.declarations, node.commas);
+ },
+};
+var generate = (0, ast$1.makeGenerator)(generators);
+var generateWithEveryOther = (0, ast$1.makeEveryOtherGenerator)(generate);
+var _default = generate;
+
+var generator = /*#__PURE__*/Object.defineProperty({
+ default: _default
+}, '__esModule', {value: true});
+
+// Generated by Peggy 1.2.0.
+//
+// https://peggyjs.org/
+
+"use strict";
+
+function peg$subclass(child, parent) {
+ function C() { this.constructor = child; }
+ C.prototype = parent.prototype;
+ child.prototype = new C();
+}
+
+function peg$SyntaxError(message, expected, found, location) {
+ var self = Error.call(this, message);
+ if (Object.setPrototypeOf) {
+ Object.setPrototypeOf(self, peg$SyntaxError.prototype);
+ }
+ self.expected = expected;
+ self.found = found;
+ self.location = location;
+ self.name = "SyntaxError";
+ return self;
+}
+
+peg$subclass(peg$SyntaxError, Error);
+
+function peg$padEnd(str, targetLength, padString) {
+ padString = padString || " ";
+ if (str.length > targetLength) { return str; }
+ targetLength -= str.length;
+ padString += padString.repeat(targetLength);
+ return str + padString.slice(0, targetLength);
+}
+
+peg$SyntaxError.prototype.format = function(sources) {
+ var str = "Error: " + this.message;
+ if (this.location) {
+ var src = null;
+ var k;
+ for (k = 0; k < sources.length; k++) {
+ if (sources[k].source === this.location.source) {
+ src = sources[k].text.split(/\r\n|\n|\r/g);
+ break;
+ }
+ }
+ var s = this.location.start;
+ var loc = this.location.source + ":" + s.line + ":" + s.column;
+ if (src) {
+ var e = this.location.end;
+ var filler = peg$padEnd("", s.line.toString().length);
+ var line = src[s.line - 1];
+ var last = s.line === e.line ? e.column : line.length + 1;
+ str += "\n --> " + loc + "\n"
+ + filler + " |\n"
+ + s.line + " | " + line + "\n"
+ + filler + " | " + peg$padEnd("", s.column - 1)
+ + peg$padEnd("", last - s.column, "^");
+ } else {
+ str += "\n at " + loc;
+ }
+ }
+ return str;
+};
+
+peg$SyntaxError.buildMessage = function(expected, found) {
+ var DESCRIBE_EXPECTATION_FNS = {
+ literal: function(expectation) {
+ return "\"" + literalEscape(expectation.text) + "\"";
+ },
+
+ class: function(expectation) {
+ var escapedParts = expectation.parts.map(function(part) {
+ return Array.isArray(part)
+ ? classEscape(part[0]) + "-" + classEscape(part[1])
+ : classEscape(part);
+ });
+
+ return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
+ },
+
+ any: function() {
+ return "any character";
+ },
+
+ end: function() {
+ return "end of input";
+ },
+
+ other: function(expectation) {
+ return expectation.description;
+ }
+ };
+
+ function hex(ch) {
+ return ch.charCodeAt(0).toString(16).toUpperCase();
+ }
+
+ function literalEscape(s) {
+ return s
+ .replace(/\\/g, "\\\\")
+ .replace(/"/g, "\\\"")
+ .replace(/\0/g, "\\0")
+ .replace(/\t/g, "\\t")
+ .replace(/\n/g, "\\n")
+ .replace(/\r/g, "\\r")
+ .replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); })
+ .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); });
+ }
+
+ function classEscape(s) {
+ return s
+ .replace(/\\/g, "\\\\")
+ .replace(/\]/g, "\\]")
+ .replace(/\^/g, "\\^")
+ .replace(/-/g, "\\-")
+ .replace(/\0/g, "\\0")
+ .replace(/\t/g, "\\t")
+ .replace(/\n/g, "\\n")
+ .replace(/\r/g, "\\r")
+ .replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); })
+ .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); });
+ }
+
+ function describeExpectation(expectation) {
+ return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
+ }
+
+ function describeExpected(expected) {
+ var descriptions = expected.map(describeExpectation);
+ var i, j;
+
+ descriptions.sort();
+
+ if (descriptions.length > 0) {
+ for (i = 1, j = 1; i < descriptions.length; i++) {
+ if (descriptions[i - 1] !== descriptions[i]) {
+ descriptions[j] = descriptions[i];
+ j++;
+ }
+ }
+ descriptions.length = j;
+ }
+
+ switch (descriptions.length) {
+ case 1:
+ return descriptions[0];
+
+ case 2:
+ return descriptions[0] + " or " + descriptions[1];
+
+ default:
+ return descriptions.slice(0, -1).join(", ")
+ + ", or "
+ + descriptions[descriptions.length - 1];
+ }
+ }
+
+ function describeFound(found) {
+ return found ? "\"" + literalEscape(found) + "\"" : "end of input";
+ }
+
+ return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
+};
+
+function peg$parse(input, options) {
+ options = options !== undefined ? options : {};
+
+ var peg$FAILED = {};
+ var peg$source = options.grammarSource;
+
+ var peg$startRuleFunctions = { start: peg$parsestart };
+ var peg$startRuleFunction = peg$parsestart;
+
+ var peg$c0 = "attribute";
+ var peg$c1 = "varying";
+ var peg$c2 = "const";
+ var peg$c3 = "bool";
+ var peg$c4 = "float";
+ var peg$c5 = "double";
+ var peg$c6 = "int";
+ var peg$c7 = "uint";
+ var peg$c8 = "break";
+ var peg$c9 = "continue";
+ var peg$c10 = "do";
+ var peg$c11 = "else";
+ var peg$c12 = "for";
+ var peg$c13 = "if";
+ var peg$c14 = "discard";
+ var peg$c15 = "return";
+ var peg$c16 = "switch";
+ var peg$c17 = "case";
+ var peg$c18 = "default";
+ var peg$c19 = "subroutine";
+ var peg$c20 = "bvec2";
+ var peg$c21 = "bvec3";
+ var peg$c22 = "bvec4";
+ var peg$c23 = "ivec2";
+ var peg$c24 = "ivec3";
+ var peg$c25 = "ivec4";
+ var peg$c26 = "uvec2";
+ var peg$c27 = "uvec3";
+ var peg$c28 = "uvec4";
+ var peg$c29 = "vec2";
+ var peg$c30 = "vec3";
+ var peg$c31 = "vec4";
+ var peg$c32 = "mat2";
+ var peg$c33 = "mat3";
+ var peg$c34 = "mat4";
+ var peg$c35 = "centroid";
+ var peg$c36 = "in";
+ var peg$c37 = "out";
+ var peg$c38 = "inout";
+ var peg$c39 = "uniform";
+ var peg$c40 = "patch";
+ var peg$c41 = "sample";
+ var peg$c42 = "buffer";
+ var peg$c43 = "shared";
+ var peg$c44 = "coherent";
+ var peg$c45 = "volatile";
+ var peg$c46 = "restrict";
+ var peg$c47 = "readonly";
+ var peg$c48 = "writeonly";
+ var peg$c49 = "dvec2";
+ var peg$c50 = "dvec3";
+ var peg$c51 = "dvec4";
+ var peg$c52 = "dmat2";
+ var peg$c53 = "dmat3";
+ var peg$c54 = "dmat4";
+ var peg$c55 = "noperspective";
+ var peg$c56 = "flat";
+ var peg$c57 = "smooth";
+ var peg$c58 = "layout";
+ var peg$c59 = "mat2x2";
+ var peg$c60 = "mat2x3";
+ var peg$c61 = "mat2x4";
+ var peg$c62 = "mat3x2";
+ var peg$c63 = "mat3x3";
+ var peg$c64 = "mat3x4";
+ var peg$c65 = "mat4x2";
+ var peg$c66 = "mat4x3";
+ var peg$c67 = "mat4x4";
+ var peg$c68 = "dmat2x2";
+ var peg$c69 = "dmat2x3";
+ var peg$c70 = "dmat2x4";
+ var peg$c71 = "dmat3x2";
+ var peg$c72 = "dmat3x3";
+ var peg$c73 = "dmat3x4";
+ var peg$c74 = "dmat4x2";
+ var peg$c75 = "dmat4x3";
+ var peg$c76 = "dmat4x4";
+ var peg$c77 = "atomic_uint";
+ var peg$c78 = "sampler1D";
+ var peg$c79 = "sampler2D";
+ var peg$c80 = "sampler3D";
+ var peg$c81 = "samplerCube";
+ var peg$c82 = "sampler1DShadow";
+ var peg$c83 = "sampler2DShadow";
+ var peg$c84 = "samplerCubeShadow";
+ var peg$c85 = "sampler1DArray";
+ var peg$c86 = "sampler2DArray";
+ var peg$c87 = "sampler1DArrayShadow";
+ var peg$c88 = "sampler2DArrayshadow";
+ var peg$c89 = "isampler1D";
+ var peg$c90 = "isampler2D";
+ var peg$c91 = "isampler3D";
+ var peg$c92 = "isamplerCube";
+ var peg$c93 = "isampler1Darray";
+ var peg$c94 = "isampler2DArray";
+ var peg$c95 = "usampler1D";
+ var peg$c96 = "usampler2D";
+ var peg$c97 = "usampler3D";
+ var peg$c98 = "usamplerCube";
+ var peg$c99 = "usampler1DArray";
+ var peg$c100 = "usampler2DArray";
+ var peg$c101 = "sampler2DRect";
+ var peg$c102 = "sampler2DRectshadow";
+ var peg$c103 = "isampler2DRect";
+ var peg$c104 = "usampler2DRect";
+ var peg$c105 = "samplerBuffer";
+ var peg$c106 = "isamplerBuffer";
+ var peg$c107 = "usamplerBuffer";
+ var peg$c108 = "samplerCubeArray";
+ var peg$c109 = "samplerCubeArrayShadow";
+ var peg$c110 = "isamplerCubeArray";
+ var peg$c111 = "usamplerCubeArray";
+ var peg$c112 = "sampler2DMS";
+ var peg$c113 = "isampler2DMS";
+ var peg$c114 = "usampler2DMS";
+ var peg$c115 = "sampler2DMSArray";
+ var peg$c116 = "isampler2DMSArray";
+ var peg$c117 = "usampler2DMSArray";
+ var peg$c118 = "image1D";
+ var peg$c119 = "iimage1D";
+ var peg$c120 = "uimage1D";
+ var peg$c121 = "image2D";
+ var peg$c122 = "iimage2D";
+ var peg$c123 = "uimage2D";
+ var peg$c124 = "image3D";
+ var peg$c125 = "iimage3D";
+ var peg$c126 = "uimage3D";
+ var peg$c127 = "image2DRect";
+ var peg$c128 = "iimage2DRect";
+ var peg$c129 = "uimage2DRect";
+ var peg$c130 = "imageCube";
+ var peg$c131 = "iimageCube";
+ var peg$c132 = "uimageCube";
+ var peg$c133 = "imageBuffer";
+ var peg$c134 = "iimageBuffer";
+ var peg$c135 = "uimageBuffer";
+ var peg$c136 = "image1DArray";
+ var peg$c137 = "iimage1DArray";
+ var peg$c138 = "uimage1DArray";
+ var peg$c139 = "image2DArray";
+ var peg$c140 = "iimage2DArray";
+ var peg$c141 = "uimage2DArray";
+ var peg$c142 = "imageCubeArray";
+ var peg$c143 = "iimageCubeArray";
+ var peg$c144 = "uimageCubeArray";
+ var peg$c145 = "image2DMS";
+ var peg$c146 = "iimage2DMS";
+ var peg$c147 = "uimage2DMS";
+ var peg$c148 = "image2DMArray";
+ var peg$c149 = "iimage2DMSArray";
+ var peg$c150 = "uimage2DMSArray";
+ var peg$c151 = "struct";
+ var peg$c152 = "void";
+ var peg$c153 = "while";
+ var peg$c154 = "invariant";
+ var peg$c155 = "precise";
+ var peg$c156 = "highp";
+ var peg$c157 = "mediump";
+ var peg$c158 = "lowp";
+ var peg$c159 = "precision";
+ var peg$c160 = "true";
+ var peg$c161 = "false";
+ var peg$c162 = "<<";
+ var peg$c163 = ">>";
+ var peg$c164 = "++";
+ var peg$c165 = "--";
+ var peg$c166 = "<=";
+ var peg$c167 = ">=";
+ var peg$c168 = "==";
+ var peg$c169 = "!=";
+ var peg$c170 = "&&";
+ var peg$c171 = "||";
+ var peg$c172 = "^^";
+ var peg$c173 = "*=";
+ var peg$c174 = "/=";
+ var peg$c175 = "+=";
+ var peg$c176 = "%=";
+ var peg$c177 = "<<=";
+ var peg$c178 = ">>=";
+ var peg$c179 = "&=";
+ var peg$c180 = "^=";
+ var peg$c181 = "|=";
+ var peg$c182 = "-=";
+ var peg$c183 = "(";
+ var peg$c184 = ")";
+ var peg$c185 = "[";
+ var peg$c186 = "]";
+ var peg$c187 = "{";
+ var peg$c188 = "}";
+ var peg$c189 = ".";
+ var peg$c190 = ",";
+ var peg$c191 = ":";
+ var peg$c192 = "=";
+ var peg$c193 = ";";
+ var peg$c194 = "!";
+ var peg$c195 = "-";
+ var peg$c196 = "~";
+ var peg$c197 = "+";
+ var peg$c198 = "*";
+ var peg$c199 = "/";
+ var peg$c200 = "%";
+ var peg$c201 = "<";
+ var peg$c202 = ">";
+ var peg$c203 = "|";
+ var peg$c204 = "^";
+ var peg$c205 = "&";
+ var peg$c206 = "?";
+ var peg$c207 = "0";
+ var peg$c208 = "lf";
+ var peg$c209 = "LF";
+ var peg$c210 = "#";
+ var peg$c211 = "//";
+ var peg$c212 = "/*";
+ var peg$c213 = "*/";
+
+ var peg$r0 = /^[A-Za-z_]/;
+ var peg$r1 = /^[A-Za-z_0-9]/;
+ var peg$r2 = /^[uU]/;
+ var peg$r3 = /^[1-9]/;
+ var peg$r4 = /^[0-7]/;
+ var peg$r5 = /^[xX]/;
+ var peg$r6 = /^[0-9a-fA-F]/;
+ var peg$r7 = /^[0-9]/;
+ var peg$r8 = /^[eE]/;
+ var peg$r9 = /^[+\-]/;
+ var peg$r10 = /^[fF]/;
+ var peg$r11 = /^[^\n]/;
+ var peg$r12 = /^[ \t\n\r]/;
+
+ var peg$e0 = peg$literalExpectation("attribute", false);
+ var peg$e1 = peg$literalExpectation("varying", false);
+ var peg$e2 = peg$literalExpectation("const", false);
+ var peg$e3 = peg$literalExpectation("bool", false);
+ var peg$e4 = peg$literalExpectation("float", false);
+ var peg$e5 = peg$literalExpectation("double", false);
+ var peg$e6 = peg$literalExpectation("int", false);
+ var peg$e7 = peg$literalExpectation("uint", false);
+ var peg$e8 = peg$literalExpectation("break", false);
+ var peg$e9 = peg$literalExpectation("continue", false);
+ var peg$e10 = peg$literalExpectation("do", false);
+ var peg$e11 = peg$literalExpectation("else", false);
+ var peg$e12 = peg$literalExpectation("for", false);
+ var peg$e13 = peg$literalExpectation("if", false);
+ var peg$e14 = peg$literalExpectation("discard", false);
+ var peg$e15 = peg$literalExpectation("return", false);
+ var peg$e16 = peg$literalExpectation("switch", false);
+ var peg$e17 = peg$literalExpectation("case", false);
+ var peg$e18 = peg$literalExpectation("default", false);
+ var peg$e19 = peg$literalExpectation("subroutine", false);
+ var peg$e20 = peg$literalExpectation("bvec2", false);
+ var peg$e21 = peg$literalExpectation("bvec3", false);
+ var peg$e22 = peg$literalExpectation("bvec4", false);
+ var peg$e23 = peg$literalExpectation("ivec2", false);
+ var peg$e24 = peg$literalExpectation("ivec3", false);
+ var peg$e25 = peg$literalExpectation("ivec4", false);
+ var peg$e26 = peg$literalExpectation("uvec2", false);
+ var peg$e27 = peg$literalExpectation("uvec3", false);
+ var peg$e28 = peg$literalExpectation("uvec4", false);
+ var peg$e29 = peg$literalExpectation("vec2", false);
+ var peg$e30 = peg$literalExpectation("vec3", false);
+ var peg$e31 = peg$literalExpectation("vec4", false);
+ var peg$e32 = peg$literalExpectation("mat2", false);
+ var peg$e33 = peg$literalExpectation("mat3", false);
+ var peg$e34 = peg$literalExpectation("mat4", false);
+ var peg$e35 = peg$literalExpectation("centroid", false);
+ var peg$e36 = peg$literalExpectation("in", false);
+ var peg$e37 = peg$literalExpectation("out", false);
+ var peg$e38 = peg$literalExpectation("inout", false);
+ var peg$e39 = peg$literalExpectation("uniform", false);
+ var peg$e40 = peg$literalExpectation("patch", false);
+ var peg$e41 = peg$literalExpectation("sample", false);
+ var peg$e42 = peg$literalExpectation("buffer", false);
+ var peg$e43 = peg$literalExpectation("shared", false);
+ var peg$e44 = peg$literalExpectation("coherent", false);
+ var peg$e45 = peg$literalExpectation("volatile", false);
+ var peg$e46 = peg$literalExpectation("restrict", false);
+ var peg$e47 = peg$literalExpectation("readonly", false);
+ var peg$e48 = peg$literalExpectation("writeonly", false);
+ var peg$e49 = peg$literalExpectation("dvec2", false);
+ var peg$e50 = peg$literalExpectation("dvec3", false);
+ var peg$e51 = peg$literalExpectation("dvec4", false);
+ var peg$e52 = peg$literalExpectation("dmat2", false);
+ var peg$e53 = peg$literalExpectation("dmat3", false);
+ var peg$e54 = peg$literalExpectation("dmat4", false);
+ var peg$e55 = peg$literalExpectation("noperspective", false);
+ var peg$e56 = peg$literalExpectation("flat", false);
+ var peg$e57 = peg$literalExpectation("smooth", false);
+ var peg$e58 = peg$literalExpectation("layout", false);
+ var peg$e59 = peg$literalExpectation("mat2x2", false);
+ var peg$e60 = peg$literalExpectation("mat2x3", false);
+ var peg$e61 = peg$literalExpectation("mat2x4", false);
+ var peg$e62 = peg$literalExpectation("mat3x2", false);
+ var peg$e63 = peg$literalExpectation("mat3x3", false);
+ var peg$e64 = peg$literalExpectation("mat3x4", false);
+ var peg$e65 = peg$literalExpectation("mat4x2", false);
+ var peg$e66 = peg$literalExpectation("mat4x3", false);
+ var peg$e67 = peg$literalExpectation("mat4x4", false);
+ var peg$e68 = peg$literalExpectation("dmat2x2", false);
+ var peg$e69 = peg$literalExpectation("dmat2x3", false);
+ var peg$e70 = peg$literalExpectation("dmat2x4", false);
+ var peg$e71 = peg$literalExpectation("dmat3x2", false);
+ var peg$e72 = peg$literalExpectation("dmat3x3", false);
+ var peg$e73 = peg$literalExpectation("dmat3x4", false);
+ var peg$e74 = peg$literalExpectation("dmat4x2", false);
+ var peg$e75 = peg$literalExpectation("dmat4x3", false);
+ var peg$e76 = peg$literalExpectation("dmat4x4", false);
+ var peg$e77 = peg$literalExpectation("atomic_uint", false);
+ var peg$e78 = peg$literalExpectation("sampler1D", false);
+ var peg$e79 = peg$literalExpectation("sampler2D", false);
+ var peg$e80 = peg$literalExpectation("sampler3D", false);
+ var peg$e81 = peg$literalExpectation("samplerCube", false);
+ var peg$e82 = peg$literalExpectation("sampler1DShadow", false);
+ var peg$e83 = peg$literalExpectation("sampler2DShadow", false);
+ var peg$e84 = peg$literalExpectation("samplerCubeShadow", false);
+ var peg$e85 = peg$literalExpectation("sampler1DArray", false);
+ var peg$e86 = peg$literalExpectation("sampler2DArray", false);
+ var peg$e87 = peg$literalExpectation("sampler1DArrayShadow", false);
+ var peg$e88 = peg$literalExpectation("sampler2DArrayshadow", false);
+ var peg$e89 = peg$literalExpectation("isampler1D", false);
+ var peg$e90 = peg$literalExpectation("isampler2D", false);
+ var peg$e91 = peg$literalExpectation("isampler3D", false);
+ var peg$e92 = peg$literalExpectation("isamplerCube", false);
+ var peg$e93 = peg$literalExpectation("isampler1Darray", false);
+ var peg$e94 = peg$literalExpectation("isampler2DArray", false);
+ var peg$e95 = peg$literalExpectation("usampler1D", false);
+ var peg$e96 = peg$literalExpectation("usampler2D", false);
+ var peg$e97 = peg$literalExpectation("usampler3D", false);
+ var peg$e98 = peg$literalExpectation("usamplerCube", false);
+ var peg$e99 = peg$literalExpectation("usampler1DArray", false);
+ var peg$e100 = peg$literalExpectation("usampler2DArray", false);
+ var peg$e101 = peg$literalExpectation("sampler2DRect", false);
+ var peg$e102 = peg$literalExpectation("sampler2DRectshadow", false);
+ var peg$e103 = peg$literalExpectation("isampler2DRect", false);
+ var peg$e104 = peg$literalExpectation("usampler2DRect", false);
+ var peg$e105 = peg$literalExpectation("samplerBuffer", false);
+ var peg$e106 = peg$literalExpectation("isamplerBuffer", false);
+ var peg$e107 = peg$literalExpectation("usamplerBuffer", false);
+ var peg$e108 = peg$literalExpectation("samplerCubeArray", false);
+ var peg$e109 = peg$literalExpectation("samplerCubeArrayShadow", false);
+ var peg$e110 = peg$literalExpectation("isamplerCubeArray", false);
+ var peg$e111 = peg$literalExpectation("usamplerCubeArray", false);
+ var peg$e112 = peg$literalExpectation("sampler2DMS", false);
+ var peg$e113 = peg$literalExpectation("isampler2DMS", false);
+ var peg$e114 = peg$literalExpectation("usampler2DMS", false);
+ var peg$e115 = peg$literalExpectation("sampler2DMSArray", false);
+ var peg$e116 = peg$literalExpectation("isampler2DMSArray", false);
+ var peg$e117 = peg$literalExpectation("usampler2DMSArray", false);
+ var peg$e118 = peg$literalExpectation("image1D", false);
+ var peg$e119 = peg$literalExpectation("iimage1D", false);
+ var peg$e120 = peg$literalExpectation("uimage1D", false);
+ var peg$e121 = peg$literalExpectation("image2D", false);
+ var peg$e122 = peg$literalExpectation("iimage2D", false);
+ var peg$e123 = peg$literalExpectation("uimage2D", false);
+ var peg$e124 = peg$literalExpectation("image3D", false);
+ var peg$e125 = peg$literalExpectation("iimage3D", false);
+ var peg$e126 = peg$literalExpectation("uimage3D", false);
+ var peg$e127 = peg$literalExpectation("image2DRect", false);
+ var peg$e128 = peg$literalExpectation("iimage2DRect", false);
+ var peg$e129 = peg$literalExpectation("uimage2DRect", false);
+ var peg$e130 = peg$literalExpectation("imageCube", false);
+ var peg$e131 = peg$literalExpectation("iimageCube", false);
+ var peg$e132 = peg$literalExpectation("uimageCube", false);
+ var peg$e133 = peg$literalExpectation("imageBuffer", false);
+ var peg$e134 = peg$literalExpectation("iimageBuffer", false);
+ var peg$e135 = peg$literalExpectation("uimageBuffer", false);
+ var peg$e136 = peg$literalExpectation("image1DArray", false);
+ var peg$e137 = peg$literalExpectation("iimage1DArray", false);
+ var peg$e138 = peg$literalExpectation("uimage1DArray", false);
+ var peg$e139 = peg$literalExpectation("image2DArray", false);
+ var peg$e140 = peg$literalExpectation("iimage2DArray", false);
+ var peg$e141 = peg$literalExpectation("uimage2DArray", false);
+ var peg$e142 = peg$literalExpectation("imageCubeArray", false);
+ var peg$e143 = peg$literalExpectation("iimageCubeArray", false);
+ var peg$e144 = peg$literalExpectation("uimageCubeArray", false);
+ var peg$e145 = peg$literalExpectation("image2DMS", false);
+ var peg$e146 = peg$literalExpectation("iimage2DMS", false);
+ var peg$e147 = peg$literalExpectation("uimage2DMS", false);
+ var peg$e148 = peg$literalExpectation("image2DMArray", false);
+ var peg$e149 = peg$literalExpectation("iimage2DMSArray", false);
+ var peg$e150 = peg$literalExpectation("uimage2DMSArray", false);
+ var peg$e151 = peg$literalExpectation("struct", false);
+ var peg$e152 = peg$literalExpectation("void", false);
+ var peg$e153 = peg$literalExpectation("while", false);
+ var peg$e154 = peg$literalExpectation("invariant", false);
+ var peg$e155 = peg$literalExpectation("precise", false);
+ var peg$e156 = peg$literalExpectation("highp", false);
+ var peg$e157 = peg$literalExpectation("mediump", false);
+ var peg$e158 = peg$literalExpectation("lowp", false);
+ var peg$e159 = peg$literalExpectation("precision", false);
+ var peg$e160 = peg$literalExpectation("true", false);
+ var peg$e161 = peg$literalExpectation("false", false);
+ var peg$e162 = peg$otherExpectation("keyword");
+ var peg$e163 = peg$literalExpectation("<<", false);
+ var peg$e164 = peg$literalExpectation(">>", false);
+ var peg$e165 = peg$literalExpectation("++", false);
+ var peg$e166 = peg$literalExpectation("--", false);
+ var peg$e167 = peg$literalExpectation("<=", false);
+ var peg$e168 = peg$literalExpectation(">=", false);
+ var peg$e169 = peg$literalExpectation("==", false);
+ var peg$e170 = peg$literalExpectation("!=", false);
+ var peg$e171 = peg$literalExpectation("&&", false);
+ var peg$e172 = peg$literalExpectation("||", false);
+ var peg$e173 = peg$literalExpectation("^^", false);
+ var peg$e174 = peg$literalExpectation("*=", false);
+ var peg$e175 = peg$literalExpectation("/=", false);
+ var peg$e176 = peg$literalExpectation("+=", false);
+ var peg$e177 = peg$literalExpectation("%=", false);
+ var peg$e178 = peg$literalExpectation("<<=", false);
+ var peg$e179 = peg$literalExpectation(">>=", false);
+ var peg$e180 = peg$literalExpectation("&=", false);
+ var peg$e181 = peg$literalExpectation("^=", false);
+ var peg$e182 = peg$literalExpectation("|=", false);
+ var peg$e183 = peg$literalExpectation("-=", false);
+ var peg$e184 = peg$literalExpectation("(", false);
+ var peg$e185 = peg$literalExpectation(")", false);
+ var peg$e186 = peg$literalExpectation("[", false);
+ var peg$e187 = peg$literalExpectation("]", false);
+ var peg$e188 = peg$literalExpectation("{", false);
+ var peg$e189 = peg$literalExpectation("}", false);
+ var peg$e190 = peg$literalExpectation(".", false);
+ var peg$e191 = peg$literalExpectation(",", false);
+ var peg$e192 = peg$literalExpectation(":", false);
+ var peg$e193 = peg$literalExpectation("=", false);
+ var peg$e194 = peg$literalExpectation(";", false);
+ var peg$e195 = peg$literalExpectation("!", false);
+ var peg$e196 = peg$literalExpectation("-", false);
+ var peg$e197 = peg$literalExpectation("~", false);
+ var peg$e198 = peg$literalExpectation("+", false);
+ var peg$e199 = peg$literalExpectation("*", false);
+ var peg$e200 = peg$literalExpectation("/", false);
+ var peg$e201 = peg$literalExpectation("%", false);
+ var peg$e202 = peg$literalExpectation("<", false);
+ var peg$e203 = peg$literalExpectation(">", false);
+ var peg$e204 = peg$literalExpectation("|", false);
+ var peg$e205 = peg$literalExpectation("^", false);
+ var peg$e206 = peg$literalExpectation("&", false);
+ var peg$e207 = peg$literalExpectation("?", false);
+ var peg$e208 = peg$classExpectation([["A", "Z"], ["a", "z"], "_"], false, false);
+ var peg$e209 = peg$classExpectation([["A", "Z"], ["a", "z"], "_", ["0", "9"]], false, false);
+ var peg$e210 = peg$classExpectation(["u", "U"], false, false);
+ var peg$e211 = peg$classExpectation([["1", "9"]], false, false);
+ var peg$e212 = peg$literalExpectation("0", false);
+ var peg$e213 = peg$classExpectation([["0", "7"]], false, false);
+ var peg$e214 = peg$classExpectation(["x", "X"], false, false);
+ var peg$e215 = peg$classExpectation([["0", "9"], ["a", "f"], ["A", "F"]], false, false);
+ var peg$e216 = peg$classExpectation([["0", "9"]], false, false);
+ var peg$e217 = peg$otherExpectation("exponent");
+ var peg$e218 = peg$classExpectation(["e", "E"], false, false);
+ var peg$e219 = peg$classExpectation(["+", "-"], false, false);
+ var peg$e220 = peg$classExpectation(["f", "F"], false, false);
+ var peg$e221 = peg$literalExpectation("lf", false);
+ var peg$e222 = peg$literalExpectation("LF", false);
+ var peg$e223 = peg$otherExpectation("primary expression");
+ var peg$e224 = peg$otherExpectation("unary expression");
+ var peg$e225 = peg$otherExpectation("equality expression");
+ var peg$e226 = peg$otherExpectation("and expression");
+ var peg$e227 = peg$otherExpectation("asignment");
+ var peg$e228 = peg$otherExpectation("expression");
+ var peg$e229 = peg$otherExpectation("precision statement");
+ var peg$e230 = peg$otherExpectation("function prototype");
+ var peg$e231 = peg$otherExpectation("function header");
+ var peg$e232 = peg$otherExpectation("function parameters");
+ var peg$e233 = peg$otherExpectation("parameter declaration");
+ var peg$e234 = peg$otherExpectation("parameter declarator");
+ var peg$e235 = peg$otherExpectation("single type qualifier");
+ var peg$e236 = peg$otherExpectation("interpolation qualifier");
+ var peg$e237 = peg$otherExpectation("storage qualifier");
+ var peg$e238 = peg$otherExpectation("type specifier");
+ var peg$e239 = peg$otherExpectation("array specifier");
+ var peg$e240 = peg$otherExpectation("precision qualifier");
+ var peg$e241 = peg$otherExpectation("struct specifier");
+ var peg$e242 = peg$otherExpectation("iteration statement");
+ var peg$e243 = peg$otherExpectation("jump statement");
+ var peg$e244 = peg$otherExpectation("prepocessor");
+ var peg$e245 = peg$literalExpectation("#", false);
+ var peg$e246 = peg$classExpectation(["\n"], true, false);
+ var peg$e247 = peg$otherExpectation("whitespace");
+ var peg$e248 = peg$literalExpectation("//", false);
+ var peg$e249 = peg$literalExpectation("/*", false);
+ var peg$e250 = peg$literalExpectation("*/", false);
+ var peg$e251 = peg$anyExpectation();
+ var peg$e252 = peg$classExpectation([" ", "\t", "\n", "\r"], false, false);
+
+ var peg$f0 = function(ws, program) {
+ return { type: 'program', ws, program, scopes };
+ };
+ var peg$f1 = function(token, t) { return node('keyword', { token, whitespace: t }); };
+ var peg$f2 = function(token, _) { return node('float_constant', { token, whitespace: _ }); };
+ var peg$f3 = function(token, _) { return node('double_constant', { token, whitespace: _ }); };
+ var peg$f4 = function(token, _) { return node('int_constant', { token, whitespace: _ }); };
+ var peg$f5 = function(token, _) { return node('uint_constant', { token, whitespace: _ }); };
+ var peg$f6 = function(token, _) { return node('bool_constant', { token, whitespace:_ }); };
+ var peg$f7 = function(token, _) { return node('literal', { literal: token, whitespace: _ }); };
+ var peg$f8 = function(identifier, _) { return node('identifier', { identifier, whitespace: _ }); };
+ var peg$f9 = function(ident) {
+ const { identifier } = ident;
+
+ // We do scope checking and parsing all in one pass. In the case of calling an
+ // undefined function, here, we don't know that we're in a function, so we
+ // can't warn appropriately. If we return false for the missing typename, the
+ // program won't parse, since the function call node won't match since it uses
+ // type_name for the function_identifier. So all we can do here is go on our
+ // merry way if the type isn't known.
+
+ // This only applies to structs. I'm not sure if it's right. Because TYPE_NAME
+ // is used in lots of places, it's easier to put this check here.
+ let found;
+ if(found = findTypeScope(scope, identifier)) {
+ addTypeReference(found, identifier, ident);
+ // I removed this because a type name reference here can't be renamed because
+ // it's just a string and we don't know the parent node. This might apply
+ // to the type reference above as well
+ // } else if(found = findFunctionScope(scope, identifier)) {
+ // addFunctionReference(found, identifier, identifier);
+ }
+
+ return ident;
+ };
+ var peg$f10 = function(lp, expression, rp) {
+ return node('group', { lp, expression, rp });
+ };
+ var peg$f11 = function(ident) {
+ const { identifier } = ident;
+ addBindingReference(scope, identifier, ident);
+ return ident;
+ };
+ var peg$f12 = function(body) {
+ // Postfix becomes a left associative tree
+ return body.flat().reduceRight((postfix, expr) =>
+ postfix ?
+ node('postfix', { expr, postfix }) :
+ expr
+ );
+ };
+ var peg$f13 = function(lb, expr, rb) {
+ return node('quantifier', { lb, expr, rb });
+ };
+ var peg$f14 = function(dot, selection) {
+ return node('field_selection', { dot, selection });
+ };
+ var peg$f15 = function(identifier, args, rp) {
+ // Warning: This may be brittle. The langauge spec says that a
+ // function_call name is a "type_specifier" which can be "float[3](...)"
+ // or a TYPE_NAME. If it's a TYPE_NAME, it will have an identifier, so
+ // add it to the referenced scope. If it's a constructor (the "float"
+ // case) it won't, so don't add a reference ot it
+ const fnName = (identifier.identifier.type === 'postfix') ?
+ identifier.identifier.expr.identifier.specifier.identifier :
+ identifier.identifier.specifier.identifier;
+
+ const n = node('function_call', { ...identifier, args, rp });
+
+ // struct constructors are stored in scope types, not scope functions,
+ // skip them (the isDeclaredType check)
+ if(fnName && !isDeclaredType(scope, fnName) && !builtIns.has(fnName)) {
+ if(!isDeclaredFunction(scope, fnName)) {
+ warn(`Warning: Function "${fnName}" has not been declared`);
+ }
+ addFunctionReference(scope, fnName, n);
+ }
+
+ return n;
+ };
+ var peg$f16 = function(v) {
+ return [v];
+ };
+ var peg$f17 = function(head, tail) {
+ // For convenience, we don't store commas as trees, but rather flatten
+ // into an array
+ return [head, ...tail.flat()];
+ };
+ var peg$f18 = function(head, suffix, lp) {
+ return { head: [head, suffix], lp };
+ };
+ var peg$f19 = function(identifier) {
+ return {
+ lp: identifier.lp,
+ identifier: [identifier.head].flat().reduceRight((postfix, expr) =>
+ postfix ?
+ node('postfix', { expr, postfix }) :
+ expr
+ )
+ };
+ };
+ var peg$f20 = function(identifier, lp, args, rp) {
+ return node('function_call', { identifier, lp, args, rp });
+ };
+ var peg$f21 = function(operator, expression) {
+ return node('unary', { operator, expression });
+ };
+ var peg$f22 = function(head, tail) {
+ return leftAssociate(head, tail);
+ };
+ var peg$f23 = function(expr, question, left, colon, right) {
+ return { question, left, right, colon };
+ };
+ var peg$f24 = function(expr, suffix) {
+ // ? and : operators are right associative, which happens automatically
+ // in pegjs grammar
+ return suffix ?
+ node('ternary', { expr, ...suffix }) :
+ expr
+ };
+ var peg$f25 = function(left, operator, right) {
+ return node('assignment', { left, operator, right });
+ };
+ var peg$f26 = function(declaration) {
+ return node(
+ 'declaration_statement',
+ {
+ declaration: declaration[0],
+ semi: declaration[1],
+ }
+ );
+ };
+ var peg$f27 = function(qualifiers, head, tail) {
+ return node(
+ 'qualifier_declarator',
+ {
+ qualifiers,
+ // Head is optional, so remove falsey
+ declarations: xnil([head, ...tail.map(t => t[1])]),
+ commas: tail.map(t => t[0])
+ }
+ );
+ };
+ var peg$f28 = function(qualifiers, interface_type, lp, declarations, rp, identifier) {
+ const n = node(
+ 'interface_declarator',
+ { qualifiers, interface_type, lp, declarations, rp, identifier }
+ );
+ createBindings(scope, [interface_type.identifier, n]);
+ return n;
+ };
+ var peg$f29 = function(prefix, qualifier, specifier) {
+ return node('precision', { prefix, qualifier, specifier });
+ };
+ var peg$f30 = function(header, params, rp) {
+ const bindings = (params?.parameters || [])
+ // Ignore any param without an identifier, aka main(void)
+ .filter(p => !!p.declaration.identifier)
+ .map(p => [p.declaration.identifier.identifier, p]);
+ createBindings(scope, ...bindings);
+ return node('function_prototype', { header, ...params, rp });
+ };
+ var peg$f31 = function(returnType, name, lp) {
+ const n = node(
+ 'function_header',
+ { returnType, name, lp }
+ );
+ addFunctionReference(scope, name.identifier, n);
+ scope = pushScope(makeScope(name.identifier, scope));
+ return n;
+ };
+ var peg$f32 = function(head, tail) {
+ return {
+ parameters: [head, ...tail.map(t => t[1])],
+ commas: tail.map(t => t[0])
+ }
+ };
+ var peg$f33 = function(qualifier, declaration) {
+ return node(
+ 'parameter_declaration',
+ { qualifier, declaration }
+ );
+ };
+ var peg$f34 = function(specifier, identifier, quantifier) {
+ return node(
+ 'parameter_declarator',
+ { specifier, identifier, quantifier }
+ );
+ };
+ var peg$f35 = function(head, tail) {
+ const declarations = [
+ head.declaration, ...tail.map(t => t[1])
+ ].filter(decl => !!decl.identifier);
+
+ createBindings(scope, ...declarations.map(decl => [decl.identifier.identifier, decl]));
+
+ // TODO: I might need to start storing node parents for easy traversal
+ return node(
+ 'declarator_list',
+ {
+ specified_type: head.specified_type,
+ declarations,
+ commas: tail.map(t => t[0])
+ }
+ );
+ };
+ var peg$f36 = function(identifier, quantifier, suffix) {
+ const [operator, initializer] = suffix || [];
+ return node(
+ 'declaration',
+ { identifier, quantifier, operator, initializer }
+ );
+ };
+ var peg$f37 = function(specified_type, suffix) {
+ // No gaurantee of a suffix because fully_specified_type contains a
+ // type_specifier which includes structs and type_names (IDENTIFIERs)
+ const [identifier, quantifier, suffix_tail] = suffix || [];
+ const [operator, initializer] = suffix_tail || [];
+
+ // Break out the specified type so it can be grouped into the
+ // declarator_list
+ return {
+ declaration: node(
+ 'declaration',
+ { identifier, quantifier, operator, initializer }
+ ),
+ specified_type
+ };
+ };
+ var peg$f38 = function(qualifiers, specifier) {
+ return node(
+ 'fully_specified_type',
+ { qualifiers, specifier }
+ );
+ };
+ var peg$f39 = function(layout, lp, head, tail) {
+ return {
+ qualifiers: [head, ...tail.map(t => t[1])],
+ commas: tail.map(t => t[0])
+ };
+ };
+ var peg$f40 = function(layout, lp, qualifiers, rp) {
+ return node(
+ 'layout_qualifier',
+ { layout, lp, ...qualifiers, rp }
+ );
+ };
+ var peg$f41 = function(identifier, tail) {
+ const [operator, expression] = tail || [];
+ return node('layout_qualifier_id', { identifier, operator, expression });
+ };
+ var peg$f42 = function(subroutine, lp, head, tail, rp) {
+ return {
+ lp,
+ type_names: [head, ...tail.map(t => t[1])],
+ commas: tail.map(t => t[0]),
+ rp,
+ };
+ };
+ var peg$f43 = function(subroutine, type_names) {
+ return node(
+ 'subroutine_qualifier',
+ {
+ subroutine,
+ ...type_names,
+ }
+ );
+ };
+ var peg$f44 = function(specifier, quantifier) {
+ return node('type_specifier', { specifier, quantifier });
+ };
+ var peg$f45 = function(lb, expression, rb) {
+ return node('array_specifier', { lb, expression, rb });
+ };
+ var peg$f46 = function(specifiers) {
+ return node('array_specifiers', { specifiers });
+ };
+ var peg$f47 = function(struct, typeName, lb, declarations, rb) {
+ const n = node('struct', { lb, declarations, rb, struct, typeName });
+ // Anonymous structs don't get a type name
+ if(typeName) {
+ addTypes(scope, [typeName.identifier, n]);
+
+ // Struct names also become constructors for functions. Needing to track
+ // this as both a type and a function makes me think my scope data model
+ // is probably wrong
+ // addFunctionReference(scope, typeName.identifier, n);
+ }
+ return n;
+ };
+ var peg$f48 = function(declaration, semi) {
+ return node('struct_declaration', { declaration, semi });
+ };
+ var peg$f49 = function(specified_type, head, tail) {
+ return node(
+ 'struct_declarator',
+ {
+ specified_type,
+ declarations: [head, ...tail.map(t => t[1])],
+ commas: tail.map(t => t[0])
+ }
+ );
+ };
+ var peg$f50 = function(identifier, quantifier) {
+ return node('quantified_identifier', { identifier, quantifier });
+ };
+ var peg$f51 = function(lb, head, tail, trailing, rb) {
+ // TODO: Scope
+ return node(
+ 'initializer_list',
+ {
+ lb,
+ initializers: [head, ...tail.map(t => t[1])],
+ commas: xnil(tail.map(t => t[0]), trailing),
+ rb
+ }
+ );
+ };
+ var peg$f52 = function(sym) {
+ // Apparently peggy can't handle an open curly brace in a string
+ scope = pushScope(makeScope(OPEN_CURLY, scope));
+ return sym;
+ };
+ var peg$f53 = function(lb, statements, rb) {
+ scope = popScope(scope);
+ return node(
+ 'compound_statement',
+ { lb, statements: (statements || []).flat(), rb }
+ );
+ };
+ var peg$f54 = function(lb, statements, rb) {
+ return node(
+ 'compound_statement',
+ { lb, statements: (statements || []).flat(), rb }
+ );
+ };
+ var peg$f55 = function(expression, semi) {
+ return node('expression_statement', { expression, semi });
+ };
+ var peg$f56 = function(ifSymbol, lp, condition, rp, tail) {
+ const [body, elseBranch] = tail;
+ return node(
+ 'if_statement',
+ {
+ 'if': ifSymbol,
+ body,
+ lp,
+ condition,
+ rp,
+ ...elseBranch && { 'else': elseBranch.flat() },
+ });
+ };
+ var peg$f57 = function(switchSymbol, lp, expression, rp, lb, statements, rb) {
+ // TODO: Scope?
+ return node(
+ 'switch_statement',
+ {
+ switch: switchSymbol,
+ lp,
+ expression,
+ rp,
+ lb,
+ cases: groupCases(statements),
+ rb
+ }
+ );
+ };
+ var peg$f58 = function(caseSymbol, test, colon) {
+ return node('case_label', { 'case': caseSymbol, test, colon });
+ };
+ var peg$f59 = function(defaultSymbol, colon) {
+ return node('default_label', { default: defaultSymbol, colon });
+ };
+ var peg$f60 = function(sym) {
+ scope = pushScope(makeScope('while', scope));
+ return sym;
+ };
+ var peg$f61 = function(whileSymbol, lp, condition, rp, body) {
+ scope = popScope(scope);
+ return node(
+ 'while_statement',
+ {
+ while: whileSymbol,
+ lp,
+ condition,
+ rp,
+ body
+ }
+ );
+ };
+ var peg$f62 = function(doSymbol, body, whileSymbol, lp, expression, rp, semi) {
+ return node(
+ 'do_statement',
+ {
+ do: doSymbol,
+ body,
+ while: whileSymbol,
+ lp,
+ expression,
+ rp,
+ semi
+ }
+ );
+ };
+ var peg$f63 = function(sym) {
+ scope = pushScope(makeScope('for', scope));
+ return sym;
+ };
+ var peg$f64 = function(forSymbol, lp, init, condition, conditionSemi, operation, rp, body) {
+ scope = popScope(scope);
+ return node(
+ 'for_statement',
+ {
+ 'for': forSymbol,
+ body,
+ lp,
+ init: init.expression || init.declaration,
+ initSemi: init.semi,
+ condition,
+ conditionSemi,
+ operation,
+ rp,
+ body
+ }
+ );
+ };
+ var peg$f65 = function(specified_type, identifier, op, initializer) {
+ const n = node(
+ 'condition_expression',
+ { specified_type, identifier, op, initializer }
+ );
+ createBindings(scope, [identifier.identifier, n]);
+ return n;
+ };
+ var peg$f66 = function(jump, semi) {
+ return node('continue_statement', { continue: jump, semi });
+ };
+ var peg$f67 = function(jump, semi) {
+ return node('break_statement', { break: jump, semi });
+ };
+ var peg$f68 = function(jump, expression, semi) {
+ return node('return_statement', { return: jump, expression, semi });
+ };
+ var peg$f69 = function(jump, semi) { // Fragment shader only.
+ return node('discard_statement', { discard: jump, semi });
+ };
+ var peg$f70 = function(line, _) { return node('preprocessor', { line, _ }); };
+ var peg$f71 = function(prototype, body) {
+ const n = node('function', { prototype, body });
+ scope = popScope(scope);
+ // addFunctionReference(scope, prototype.header.name.identifier, n);
+ return n;
+ };
+ var peg$f72 = function(w, rest) {
+ return collapse(w, rest);
+ };
+ var peg$f73 = function(a, x, cc) { return xnil(x, cc); };
+ var peg$f74 = function(a, d) { return xnil(a, d.flat()); };
+ var peg$f75 = function(i) { return i; };
+ var peg$f76 = function(_) { return _; };
+
+ var peg$currPos = 0;
+ var peg$savedPos = 0;
+ var peg$posDetailsCache = [{ line: 1, column: 1 }];
+ var peg$maxFailPos = 0;
+ var peg$maxFailExpected = [];
+ var peg$silentFails = 0;
+
+ var peg$resultsCache = {};
+
+ var peg$result;
+
+ if ("startRule" in options) {
+ if (!(options.startRule in peg$startRuleFunctions)) {
+ throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
+ }
+
+ peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
+ }
+
+ function text() {
+ return input.substring(peg$savedPos, peg$currPos);
+ }
+
+ function offset() {
+ return peg$savedPos;
+ }
+
+ function range() {
+ return {
+ source: peg$source,
+ start: peg$savedPos,
+ end: peg$currPos
+ };
+ }
+
+ function location() {
+ return peg$computeLocation(peg$savedPos, peg$currPos);
+ }
+
+ function expected(description, location) {
+ location = location !== undefined
+ ? location
+ : peg$computeLocation(peg$savedPos, peg$currPos);
+
+ throw peg$buildStructuredError(
+ [peg$otherExpectation(description)],
+ input.substring(peg$savedPos, peg$currPos),
+ location
+ );
+ }
+
+ function error(message, location) {
+ location = location !== undefined
+ ? location
+ : peg$computeLocation(peg$savedPos, peg$currPos);
+
+ throw peg$buildSimpleError(message, location);
+ }
+
+ function peg$literalExpectation(text, ignoreCase) {
+ return { type: "literal", text: text, ignoreCase: ignoreCase };
+ }
+
+ function peg$classExpectation(parts, inverted, ignoreCase) {
+ return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
+ }
+
+ function peg$anyExpectation() {
+ return { type: "any" };
+ }
+
+ function peg$endExpectation() {
+ return { type: "end" };
+ }
+
+ function peg$otherExpectation(description) {
+ return { type: "other", description: description };
+ }
+
+ function peg$computePosDetails(pos) {
+ var details = peg$posDetailsCache[pos];
+ var p;
+
+ if (details) {
+ return details;
+ } else {
+ p = pos - 1;
+ while (!peg$posDetailsCache[p]) {
+ p--;
+ }
+
+ details = peg$posDetailsCache[p];
+ details = {
+ line: details.line,
+ column: details.column
+ };
+
+ while (p < pos) {
+ if (input.charCodeAt(p) === 10) {
+ details.line++;
+ details.column = 1;
+ } else {
+ details.column++;
+ }
+
+ p++;
+ }
+
+ peg$posDetailsCache[pos] = details;
+
+ return details;
+ }
+ }
+
+ function peg$computeLocation(startPos, endPos) {
+ var startPosDetails = peg$computePosDetails(startPos);
+ var endPosDetails = peg$computePosDetails(endPos);
+
+ return {
+ source: peg$source,
+ start: {
+ offset: startPos,
+ line: startPosDetails.line,
+ column: startPosDetails.column
+ },
+ end: {
+ offset: endPos,
+ line: endPosDetails.line,
+ column: endPosDetails.column
+ }
+ };
+ }
+
+ function peg$fail(expected) {
+ if (peg$currPos < peg$maxFailPos) { return; }
+
+ if (peg$currPos > peg$maxFailPos) {
+ peg$maxFailPos = peg$currPos;
+ peg$maxFailExpected = [];
+ }
+
+ peg$maxFailExpected.push(expected);
+ }
+
+ function peg$buildSimpleError(message, location) {
+ return new peg$SyntaxError(message, null, null, location);
+ }
+
+ function peg$buildStructuredError(expected, found, location) {
+ return new peg$SyntaxError(
+ peg$SyntaxError.buildMessage(expected, found),
+ expected,
+ found,
+ location
+ );
+ }
+
+ function peg$parsestart() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 0;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parse_();
+ s2 = peg$parsetranslation_unit();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f0(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseATTRIBUTE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 1;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c0) {
+ s1 = peg$c0;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e0); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVARYING() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 2;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c1) {
+ s1 = peg$c1;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e1); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCONST() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 3;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c2) {
+ s1 = peg$c2;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e2); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBOOL() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 4;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c3) {
+ s1 = peg$c3;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e3); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseFLOAT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 5;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c4) {
+ s1 = peg$c4;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e4); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDOUBLE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 6;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c5) {
+ s1 = peg$c5;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e5); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 7;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c6) {
+ s1 = peg$c6;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e6); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUINT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 8;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c7) {
+ s1 = peg$c7;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e7); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBREAK() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 9;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c8) {
+ s1 = peg$c8;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e8); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCONTINUE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 10;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c9) {
+ s1 = peg$c9;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e9); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDO() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 11;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c10) {
+ s1 = peg$c10;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e10); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseELSE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 12;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c11) {
+ s1 = peg$c11;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e11); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseFOR() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 13;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c12) {
+ s1 = peg$c12;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e12); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIF() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 14;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c13) {
+ s1 = peg$c13;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e13); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDISCARD() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 15;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c14) {
+ s1 = peg$c14;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e14); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRETURN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 16;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c15) {
+ s1 = peg$c15;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e15); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSWITCH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 17;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c16) {
+ s1 = peg$c16;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e16); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCASE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 18;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c17) {
+ s1 = peg$c17;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e17); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDEFAULT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 19;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c18) {
+ s1 = peg$c18;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e18); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSUBROUTINE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 20;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c19) {
+ s1 = peg$c19;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e19); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 21;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c20) {
+ s1 = peg$c20;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e20); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 22;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c21) {
+ s1 = peg$c21;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e21); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 23;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c22) {
+ s1 = peg$c22;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e22); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 24;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c23) {
+ s1 = peg$c23;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e23); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 25;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c24) {
+ s1 = peg$c24;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e24); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 26;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c25) {
+ s1 = peg$c25;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e25); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 27;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c26) {
+ s1 = peg$c26;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e26); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 28;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c27) {
+ s1 = peg$c27;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e27); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 29;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c28) {
+ s1 = peg$c28;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e28); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 30;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c29) {
+ s1 = peg$c29;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e29); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 31;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c30) {
+ s1 = peg$c30;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e30); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 32;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c31) {
+ s1 = peg$c31;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e31); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 33;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c32) {
+ s1 = peg$c32;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e32); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 34;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c33) {
+ s1 = peg$c33;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e33); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 35;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c34) {
+ s1 = peg$c34;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e34); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCENTROID() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 36;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c35) {
+ s1 = peg$c35;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e35); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 37;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c36) {
+ s1 = peg$c36;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e36); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseOUT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 38;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c37) {
+ s1 = peg$c37;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e37); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINOUT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 39;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c38) {
+ s1 = peg$c38;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e38); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUNIFORM() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 40;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c39) {
+ s1 = peg$c39;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e39); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePATCH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 41;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c40) {
+ s1 = peg$c40;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e40); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 42;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c41) {
+ s1 = peg$c41;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e41); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 43;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c42) {
+ s1 = peg$c42;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e42); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSHARED() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 44;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c43) {
+ s1 = peg$c43;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e43); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCOHERENT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 45;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c44) {
+ s1 = peg$c44;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e44); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVOLATILE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 46;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c45) {
+ s1 = peg$c45;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e45); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRESTRICT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 47;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c46) {
+ s1 = peg$c46;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e46); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseREADONLY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 48;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c47) {
+ s1 = peg$c47;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e47); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseWRITEONLY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 49;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c48) {
+ s1 = peg$c48;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e48); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 50;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c49) {
+ s1 = peg$c49;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e49); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 51;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c50) {
+ s1 = peg$c50;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e50); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 52;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c51) {
+ s1 = peg$c51;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e51); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 53;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c52) {
+ s1 = peg$c52;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e52); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 54;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c53) {
+ s1 = peg$c53;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e53); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 55;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c54) {
+ s1 = peg$c54;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e54); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseNOPERSPECTIVE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 56;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c55) {
+ s1 = peg$c55;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e55); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseFLAT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 57;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c56) {
+ s1 = peg$c56;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e56); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSMOOTH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 58;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c57) {
+ s1 = peg$c57;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e57); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLAYOUT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 59;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c58) {
+ s1 = peg$c58;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e58); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT2X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 60;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c59) {
+ s1 = peg$c59;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e59); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT2X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 61;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c60) {
+ s1 = peg$c60;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e60); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT2X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 62;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c61) {
+ s1 = peg$c61;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e61); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT3X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 63;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c62) {
+ s1 = peg$c62;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e62); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT3X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 64;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c63) {
+ s1 = peg$c63;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e63); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT3X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 65;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c64) {
+ s1 = peg$c64;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e64); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT4X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 66;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c65) {
+ s1 = peg$c65;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e65); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT4X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 67;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c66) {
+ s1 = peg$c66;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e66); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT4X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 68;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c67) {
+ s1 = peg$c67;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e67); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT2X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 69;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c68) {
+ s1 = peg$c68;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e68); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT2X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 70;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c69) {
+ s1 = peg$c69;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e69); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT2X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 71;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c70) {
+ s1 = peg$c70;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e70); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT3X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 72;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c71) {
+ s1 = peg$c71;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e71); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT3X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 73;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c72) {
+ s1 = peg$c72;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e72); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT3X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 74;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c73) {
+ s1 = peg$c73;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e73); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT4X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 75;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c74) {
+ s1 = peg$c74;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e74); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT4X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 76;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c75) {
+ s1 = peg$c75;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e75); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT4X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 77;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c76) {
+ s1 = peg$c76;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e76); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseATOMIC_UINT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 78;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c77) {
+ s1 = peg$c77;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e77); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 79;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c78) {
+ s1 = peg$c78;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e78); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 80;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c79) {
+ s1 = peg$c79;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e79); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 81;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c80) {
+ s1 = peg$c80;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e80); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERCUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 82;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c81) {
+ s1 = peg$c81;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e81); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER1DSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 83;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c82) {
+ s1 = peg$c82;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e82); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 84;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c83) {
+ s1 = peg$c83;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e83); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERCUBESHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 85;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c84) {
+ s1 = peg$c84;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e84); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 86;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c85) {
+ s1 = peg$c85;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e85); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 87;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c86) {
+ s1 = peg$c86;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e86); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER1DARRAYSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 88;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 20) === peg$c87) {
+ s1 = peg$c87;
+ peg$currPos += 20;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e87); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DARRAYSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 89;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 20) === peg$c88) {
+ s1 = peg$c88;
+ peg$currPos += 20;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e88); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 90;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c89) {
+ s1 = peg$c89;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e89); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 91;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c90) {
+ s1 = peg$c90;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e90); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 92;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c91) {
+ s1 = peg$c91;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e91); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLERCUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 93;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c92) {
+ s1 = peg$c92;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e92); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 94;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c93) {
+ s1 = peg$c93;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e93); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 95;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c94) {
+ s1 = peg$c94;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e94); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 96;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c95) {
+ s1 = peg$c95;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e95); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 97;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c96) {
+ s1 = peg$c96;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e96); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 98;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c97) {
+ s1 = peg$c97;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e97); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLERCUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 99;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c98) {
+ s1 = peg$c98;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e98); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 100;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c99) {
+ s1 = peg$c99;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e99); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 101;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c100) {
+ s1 = peg$c100;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e100); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 102;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c101) {
+ s1 = peg$c101;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e101); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DRECTSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 103;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 19) === peg$c102) {
+ s1 = peg$c102;
+ peg$currPos += 19;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e102); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 104;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c103) {
+ s1 = peg$c103;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e103); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 105;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c104) {
+ s1 = peg$c104;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e104); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 106;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c105) {
+ s1 = peg$c105;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e105); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLERBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 107;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c106) {
+ s1 = peg$c106;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e106); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLERBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 108;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c107) {
+ s1 = peg$c107;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e107); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERCUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 109;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 16) === peg$c108) {
+ s1 = peg$c108;
+ peg$currPos += 16;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e108); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERCUBEARRAYSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 110;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 22) === peg$c109) {
+ s1 = peg$c109;
+ peg$currPos += 22;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e109); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLERCUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 111;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c110) {
+ s1 = peg$c110;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e110); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLERCUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 112;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c111) {
+ s1 = peg$c111;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e111); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 113;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c112) {
+ s1 = peg$c112;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e112); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 114;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c113) {
+ s1 = peg$c113;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e113); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 115;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c114) {
+ s1 = peg$c114;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e114); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 116;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 16) === peg$c115) {
+ s1 = peg$c115;
+ peg$currPos += 16;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e115); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 117;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c116) {
+ s1 = peg$c116;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e116); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 118;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c117) {
+ s1 = peg$c117;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e117); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 119;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c118) {
+ s1 = peg$c118;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e118); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 120;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c119) {
+ s1 = peg$c119;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e119); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 121;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c120) {
+ s1 = peg$c120;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e120); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 122;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c121) {
+ s1 = peg$c121;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e121); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 123;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c122) {
+ s1 = peg$c122;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e122); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 124;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c123) {
+ s1 = peg$c123;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e123); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 125;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c124) {
+ s1 = peg$c124;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e124); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 126;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c125) {
+ s1 = peg$c125;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e125); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 127;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c126) {
+ s1 = peg$c126;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e126); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 128;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c127) {
+ s1 = peg$c127;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e127); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 129;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c128) {
+ s1 = peg$c128;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e128); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 130;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c129) {
+ s1 = peg$c129;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e129); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGECUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 131;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c130) {
+ s1 = peg$c130;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e130); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGECUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 132;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c131) {
+ s1 = peg$c131;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e131); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGECUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 133;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c132) {
+ s1 = peg$c132;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e132); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGEBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 134;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c133) {
+ s1 = peg$c133;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e133); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGEBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 135;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c134) {
+ s1 = peg$c134;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e134); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGEBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 136;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c135) {
+ s1 = peg$c135;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e135); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 137;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c136) {
+ s1 = peg$c136;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e136); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 138;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c137) {
+ s1 = peg$c137;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e137); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 139;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c138) {
+ s1 = peg$c138;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e138); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 140;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c139) {
+ s1 = peg$c139;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e139); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 141;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c140) {
+ s1 = peg$c140;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e140); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 142;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c141) {
+ s1 = peg$c141;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e141); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGECUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 143;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c142) {
+ s1 = peg$c142;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e142); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGECUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 144;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c143) {
+ s1 = peg$c143;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e143); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGECUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 145;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c144) {
+ s1 = peg$c144;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e144); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 146;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c145) {
+ s1 = peg$c145;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e145); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 147;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c146) {
+ s1 = peg$c146;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e146); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 148;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c147) {
+ s1 = peg$c147;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e147); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 149;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c148) {
+ s1 = peg$c148;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e148); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 150;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c149) {
+ s1 = peg$c149;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e149); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 151;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c150) {
+ s1 = peg$c150;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e150); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSTRUCT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 152;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c151) {
+ s1 = peg$c151;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e151); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVOID() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 153;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c152) {
+ s1 = peg$c152;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e152); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseWHILE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 154;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c153) {
+ s1 = peg$c153;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e153); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINVARIANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 155;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c154) {
+ s1 = peg$c154;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e154); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePRECISE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 156;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c155) {
+ s1 = peg$c155;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e155); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseHIGH_PRECISION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 157;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c156) {
+ s1 = peg$c156;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e156); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMEDIUM_PRECISION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 158;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c157) {
+ s1 = peg$c157;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e157); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLOW_PRECISION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 159;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c158) {
+ s1 = peg$c158;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e158); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePRECISION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 160;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c159) {
+ s1 = peg$c159;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e159); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseFLOATCONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 161;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefloating_constant();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f2(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDOUBLECONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 162;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefloating_constant();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f3(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINTCONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 163;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseinteger_constant();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f4(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUINTCONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 164;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseinteger_constant();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f5(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBOOLCONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 165;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c160) {
+ s1 = peg$c160;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e160); }
+ }
+ if (s1 === peg$FAILED) {
+ if (input.substr(peg$currPos, 5) === peg$c161) {
+ s1 = peg$c161;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e161); }
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f6(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsekeyword() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 166;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseATTRIBUTE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVARYING();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCONST();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBOOL();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFLOAT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDOUBLE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBREAK();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCONTINUE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDO();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseELSE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFOR();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIF();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDISCARD();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRETURN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSWITCH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCASE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDEFAULT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSUBROUTINE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCENTROID();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUNIFORM();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePATCH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSHARED();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCOHERENT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVOLATILE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRESTRICT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseREADONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseWRITEONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseNOPERSPECTIVE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFLAT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSMOOTH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseLAYOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseATOMIC_UINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBESHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DRECTSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBEARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSTRUCT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVOID();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseWHILE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINVARIANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePRECISE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseHIGH_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMEDIUM_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseLOW_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePRECISION();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e162); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 167;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c162) {
+ s1 = peg$c162;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e163); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 168;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c163) {
+ s1 = peg$c163;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e164); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINC_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 169;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c164) {
+ s1 = peg$c164;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e165); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDEC_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 170;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c165) {
+ s1 = peg$c165;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e166); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLE_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 171;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c166) {
+ s1 = peg$c166;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e167); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseGE_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 172;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c167) {
+ s1 = peg$c167;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e168); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseEQ_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 173;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c168) {
+ s1 = peg$c168;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e169); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseNE_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 174;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c169) {
+ s1 = peg$c169;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e170); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseAND_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 175;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c170) {
+ s1 = peg$c170;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e171); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseOR_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 176;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c171) {
+ s1 = peg$c171;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e172); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseXOR_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 177;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c172) {
+ s1 = peg$c172;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e173); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMUL_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 178;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c173) {
+ s1 = peg$c173;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e174); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDIV_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 179;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c174) {
+ s1 = peg$c174;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e175); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseADD_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 180;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c175) {
+ s1 = peg$c175;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e176); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMOD_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 181;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c176) {
+ s1 = peg$c176;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e177); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 182;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c177) {
+ s1 = peg$c177;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e178); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 183;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c178) {
+ s1 = peg$c178;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e179); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseAND_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 184;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c179) {
+ s1 = peg$c179;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e180); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseXOR_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 185;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c180) {
+ s1 = peg$c180;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e181); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseOR_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 186;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c181) {
+ s1 = peg$c181;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e182); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSUB_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 187;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c182) {
+ s1 = peg$c182;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e183); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_PAREN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 188;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 40) {
+ s1 = peg$c183;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e184); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_PAREN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 189;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 41) {
+ s1 = peg$c184;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e185); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_BRACKET() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 190;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 91) {
+ s1 = peg$c185;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e186); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_BRACKET() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 191;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 93) {
+ s1 = peg$c186;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e187); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_BRACE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 192;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 123) {
+ s1 = peg$c187;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e188); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_BRACE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 193;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 125) {
+ s1 = peg$c188;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e189); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDOT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 194;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 46) {
+ s1 = peg$c189;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e190); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCOMMA() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 195;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 44) {
+ s1 = peg$c190;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e191); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCOLON() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 196;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 58) {
+ s1 = peg$c191;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e192); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseEQUAL() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 197;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 61) {
+ s1 = peg$c192;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e193); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSEMICOLON() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 198;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 59) {
+ s1 = peg$c193;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e194); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBANG() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 199;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 33) {
+ s1 = peg$c194;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e195); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDASH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 200;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 45) {
+ s1 = peg$c195;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e196); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseTILDE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 201;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 126) {
+ s1 = peg$c196;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e197); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePLUS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 202;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 43) {
+ s1 = peg$c197;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e198); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSTAR() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 203;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 42) {
+ s1 = peg$c198;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e199); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSLASH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 204;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 47) {
+ s1 = peg$c199;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e200); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePERCENT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 205;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 37) {
+ s1 = peg$c200;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e201); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_ANGLE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 206;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 60) {
+ s1 = peg$c201;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e202); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_ANGLE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 207;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 62) {
+ s1 = peg$c202;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e203); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVERTICAL_BAR() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 208;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 124) {
+ s1 = peg$c203;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e204); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCARET() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 209;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 94) {
+ s1 = peg$c204;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e205); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseAMPERSAND() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 210;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 38) {
+ s1 = peg$c205;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e206); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseQUESTION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 211;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 63) {
+ s1 = peg$c206;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e207); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIDENTIFIER() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 212;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ peg$silentFails++;
+ s2 = peg$parsekeyword();
+ peg$silentFails--;
+ if (s2 === peg$FAILED) {
+ s1 = undefined;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$currPos;
+ if (peg$r0.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e208); }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = [];
+ if (peg$r1.test(input.charAt(peg$currPos))) {
+ s6 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e209); }
+ }
+ while (s6 !== peg$FAILED) {
+ s5.push(s6);
+ if (peg$r1.test(input.charAt(peg$currPos))) {
+ s6 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e209); }
+ }
+ }
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ if (s3 !== peg$FAILED) {
+ s2 = input.substring(s2, peg$currPos);
+ } else {
+ s2 = s3;
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f8(s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseTYPE_NAME() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 213;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ peg$silentFails++;
+ s2 = peg$parsekeyword();
+ peg$silentFails--;
+ if (s2 === peg$FAILED) {
+ s1 = undefined;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f9(s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinteger_constant() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 214;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsedecimal_constant();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseinteger_suffix();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parseoctal_constant();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseinteger_suffix();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsehexadecimal_constant();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseinteger_suffix();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinteger_suffix() {
+ var s0;
+
+ var key = peg$currPos * 305 + 215;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ if (peg$r2.test(input.charAt(peg$currPos))) {
+ s0 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e210); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedecimal_constant() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 216;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ if (peg$r3.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e211); }
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$parsedigit();
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$parsedigit();
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseoctal_constant() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 217;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 48) {
+ s1 = peg$c207;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e212); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ if (peg$r4.test(input.charAt(peg$currPos))) {
+ s3 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e213); }
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ if (peg$r4.test(input.charAt(peg$currPos))) {
+ s3 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e213); }
+ }
+ }
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsehexadecimal_constant() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 218;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 48) {
+ s1 = peg$c207;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e212); }
+ }
+ if (s1 !== peg$FAILED) {
+ if (peg$r5.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e214); }
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ if (peg$r6.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e215); }
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ if (peg$r6.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e215); }
+ }
+ }
+ s1 = [s1, s2, s3];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedigit() {
+ var s0;
+
+ var key = peg$currPos * 305 + 219;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ if (peg$r7.test(input.charAt(peg$currPos))) {
+ s0 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e216); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefloating_constant() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 220;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsefractional_constant();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexponent_part();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parsefloating_suffix();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsedigit_sequence();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexponent_part();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsefloating_suffix();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefractional_constant() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 221;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsedigit_sequence();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ if (input.charCodeAt(peg$currPos) === 46) {
+ s3 = peg$c189;
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e190); }
+ }
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsedigit_sequence();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexponent_part() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 222;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ if (peg$r8.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e218); }
+ }
+ if (s2 !== peg$FAILED) {
+ if (peg$r9.test(input.charAt(peg$currPos))) {
+ s3 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e219); }
+ }
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parsedigit_sequence();
+ if (s4 !== peg$FAILED) {
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e217); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedigit_sequence() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 223;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = [];
+ s2 = peg$parsedigit();
+ if (s2 !== peg$FAILED) {
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ s2 = peg$parsedigit();
+ }
+ } else {
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefloating_suffix() {
+ var s0;
+
+ var key = peg$currPos * 305 + 224;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ if (peg$r10.test(input.charAt(peg$currPos))) {
+ s0 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e220); }
+ }
+ if (s0 === peg$FAILED) {
+ if (input.substr(peg$currPos, 2) === peg$c208) {
+ s0 = peg$c208;
+ peg$currPos += 2;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e221); }
+ }
+ if (s0 === peg$FAILED) {
+ if (input.substr(peg$currPos, 2) === peg$c209) {
+ s0 = peg$c209;
+ peg$currPos += 2;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e222); }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseprimary_expression() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 225;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseFLOATCONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINTCONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUINTCONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBOOLCONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDOUBLECONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseLEFT_PAREN();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseexpression();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseRIGHT_PAREN();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f10(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseIDENTIFIER();
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f11(s1);
+ }
+ s0 = s1;
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e223); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsepostfix_expression() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 226;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsefunction_call();
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$parsepostfix_expression_suffix();
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$parsepostfix_expression_suffix();
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 === peg$FAILED) {
+ s1 = peg$currPos;
+ s2 = peg$parseprimary_expression();
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$parsepostfix_expression_suffix();
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$parsepostfix_expression_suffix();
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f12(s1);
+ }
+ s0 = s1;
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsepostfix_expression_suffix() {
+ var s0;
+
+ var key = peg$currPos * 305 + 227;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseinteger_index();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsefield_selection();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINC_OP();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDEC_OP();
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinteger_index() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 228;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseLEFT_BRACKET();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseexpression();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseRIGHT_BRACKET();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f13(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefield_selection() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 229;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseDOT();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f14(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_call() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 230;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefunction_identifier();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsefunction_arguments();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseRIGHT_PAREN();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f15(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_arguments() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 231;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseVOID();
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f16(s1);
+ }
+ s0 = s1;
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseassignment_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseassignment_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseassignment_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f17(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_identifier() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 232;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsechained_function_call();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsefunction_suffix();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseLEFT_PAREN();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s1 = peg$f18(s2, s3, s4);
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 === peg$FAILED) {
+ s1 = peg$currPos;
+ s2 = peg$parsetype_specifier();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsefunction_suffix();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parseLEFT_PAREN();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s1 = peg$f18(s2, s3, s4);
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f19(s1);
+ }
+ s0 = s1;
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_suffix() {
+ var s0;
+
+ var key = peg$currPos * 305 + 233;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseinteger_index();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsefield_selection();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsechained_function_call() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 234;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsetype_specifier();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsefunction_arguments();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f20(s1, s2, s3, s4);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseunary_expression() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 235;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parsepostfix_expression();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseINC_OP();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parseDEC_OP();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsePLUS();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parseDASH();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parseBANG();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parseTILDE();
+ }
+ }
+ }
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseunary_expression();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f21(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e224); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsemultiplicative_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 236;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseunary_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseSTAR();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseSLASH();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parsePERCENT();
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseunary_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseSTAR();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseSLASH();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parsePERCENT();
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseunary_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseadditive_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 237;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsemultiplicative_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parsePLUS();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseDASH();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsemultiplicative_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parsePLUS();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseDASH();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsemultiplicative_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseshift_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 238;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseadditive_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseRIGHT_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseLEFT_OP();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseadditive_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseRIGHT_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseLEFT_OP();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseadditive_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parserelational_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 239;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseshift_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseLE_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseGE_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseLEFT_ANGLE();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseRIGHT_ANGLE();
+ }
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseshift_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseLE_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseGE_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseLEFT_ANGLE();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseRIGHT_ANGLE();
+ }
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseshift_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseequality_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 240;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parserelational_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseEQ_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseNE_OP();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parserelational_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseEQ_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseNE_OP();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parserelational_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e225); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseand_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 241;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseequality_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseAMPERSAND();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseequality_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseAMPERSAND();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseequality_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e226); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexclusive_or_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 242;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseand_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCARET();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseand_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCARET();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseand_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinclusive_or_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 243;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseexclusive_or_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseVERTICAL_BAR();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseexclusive_or_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseVERTICAL_BAR();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseexclusive_or_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselogical_and_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 244;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseinclusive_or_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseAND_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseinclusive_or_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseAND_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseinclusive_or_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselogical_xor_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 245;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parselogical_and_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseXOR_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parselogical_and_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseXOR_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parselogical_and_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselogical_or_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 246;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parselogical_xor_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseOR_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parselogical_xor_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseOR_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parselogical_xor_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseternary_expression() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 247;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parselogical_or_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$parseQUESTION();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseexpression();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseCOLON();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseassignment_expression();
+ if (s6 !== peg$FAILED) {
+ peg$savedPos = s2;
+ s2 = peg$f23(s1, s3, s4, s5, s6);
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f24(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseassignment_expression() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 248;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseunary_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseassignment_operator();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseassignment_expression();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f25(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseternary_expression();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseassignment_operator() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 249;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseEQUAL();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMUL_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDIV_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMOD_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseADD_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSUB_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseLEFT_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRIGHT_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseAND_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseXOR_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseOR_ASSIGN();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e227); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexpression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 250;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseassignment_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseassignment_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseassignment_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e228); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedeclaration_statement() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 251;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsedeclaration();
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f26(s1);
+ }
+ s0 = s1;
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedeclaration() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 252;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefunction_prototype();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseprecision_declarator();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseinterface_declarator();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parsequalifier_declarator();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseinit_declarator_list();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsequalifier_declarator() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 253;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsetype_qualifiers();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = [];
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseIDENTIFIER();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseIDENTIFIER();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f27(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinterface_declarator() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 254;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsetype_qualifiers();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseLEFT_BRACE();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsestruct_declaration_list();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseRIGHT_BRACE();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsequantified_identifier();
+ if (s6 === peg$FAILED) {
+ s6 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f28(s1, s2, s3, s4, s5, s6);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseprecision_declarator() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 255;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsePRECISION();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseprecision_qualifier();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsetype_specifier();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f29(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e229); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_prototype() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 256;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsefunction_header();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsefunction_parameters();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseRIGHT_PAREN();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f30(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e230); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_header() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 257;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsefully_specified_type();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseLEFT_PAREN();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f31(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e231); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_parameters() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 258;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseparameter_declaration();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseparameter_declaration();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseparameter_declaration();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f32(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e232); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseparameter_declaration() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 259;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = [];
+ s2 = peg$parseparameter_qualifier();
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ s2 = peg$parseparameter_qualifier();
+ }
+ s2 = peg$parseparameter_declarator();
+ if (s2 === peg$FAILED) {
+ s2 = peg$parsetype_specifier();
+ }
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f33(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e233); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseparameter_declarator() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 260;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsetype_specifier();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsearray_specifier();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f34(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e234); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseparameter_qualifier() {
+ var s0;
+
+ var key = peg$currPos * 305 + 261;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseCONST();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsememory_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseprecision_qualifier();
+ }
+ }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsememory_qualifier() {
+ var s0;
+
+ var key = peg$currPos * 305 + 262;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseCOHERENT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVOLATILE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRESTRICT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseREADONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseWRITEONLY();
+ }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinit_declarator_list() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 263;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseinitial_declaration();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsesubsequent_declaration();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsesubsequent_declaration();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f35(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsesubsequent_declaration() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 264;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseIDENTIFIER();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsearray_specifier();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$currPos;
+ s4 = peg$parseEQUAL();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseinitializer();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f36(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinitial_declaration() {
+ var s0, s1, s2, s3, s4, s5, s6, s7;
+
+ var key = peg$currPos * 305 + 265;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefully_specified_type();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$parseIDENTIFIER();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsearray_specifier();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$currPos;
+ s6 = peg$parseEQUAL();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$parseinitializer();
+ if (s7 !== peg$FAILED) {
+ s6 = [s6, s7];
+ s5 = s6;
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ if (s5 === peg$FAILED) {
+ s5 = null;
+ }
+ s3 = [s3, s4, s5];
+ s2 = s3;
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f37(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefully_specified_type() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 266;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsetype_qualifiers();
+ if (s1 === peg$FAILED) {
+ s1 = null;
+ }
+ s2 = peg$parsetype_specifier();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f38(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselayout_qualifier() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8;
+
+ var key = peg$currPos * 305 + 267;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseLAYOUT();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$currPos;
+ s4 = peg$parselayout_qualifier_id();
+ if (s4 !== peg$FAILED) {
+ s5 = [];
+ s6 = peg$currPos;
+ s7 = peg$parseCOMMA();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parselayout_qualifier_id();
+ if (s8 !== peg$FAILED) {
+ s7 = [s7, s8];
+ s6 = s7;
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ while (s6 !== peg$FAILED) {
+ s5.push(s6);
+ s6 = peg$currPos;
+ s7 = peg$parseCOMMA();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parselayout_qualifier_id();
+ if (s8 !== peg$FAILED) {
+ s7 = [s7, s8];
+ s6 = s7;
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s3;
+ s3 = peg$f39(s1, s2, s4, s5);
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f40(s1, s2, s3, s4);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselayout_qualifier_id() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 268;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseIDENTIFIER();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$parseEQUAL();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseternary_expression();
+ if (s4 !== peg$FAILED) {
+ s3 = [s3, s4];
+ s2 = s3;
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f41(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSHARED();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsetype_qualifiers() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 269;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = [];
+ s1 = peg$parsesingle_type_qualifier();
+ if (s1 !== peg$FAILED) {
+ while (s1 !== peg$FAILED) {
+ s0.push(s1);
+ s1 = peg$parsesingle_type_qualifier();
+ }
+ } else {
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsesingle_type_qualifier() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 270;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parsestorage_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parselayout_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseprecision_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseinterpolation_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINVARIANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePRECISE();
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e235); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinterpolation_qualifier() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 271;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseSMOOTH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFLAT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseNOPERSPECTIVE();
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e236); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestorage_qualifier() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8;
+
+ var key = peg$currPos * 305 + 272;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseCONST();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCENTROID();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePATCH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUNIFORM();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSHARED();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCOHERENT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVOLATILE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRESTRICT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseREADONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseWRITEONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVARYING();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseATTRIBUTE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseSUBROUTINE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$parseLEFT_PAREN();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseTYPE_NAME();
+ if (s4 !== peg$FAILED) {
+ s5 = [];
+ s6 = peg$currPos;
+ s7 = peg$parseCOMMA();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parseTYPE_NAME();
+ if (s8 !== peg$FAILED) {
+ s7 = [s7, s8];
+ s6 = s7;
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ while (s6 !== peg$FAILED) {
+ s5.push(s6);
+ s6 = peg$currPos;
+ s7 = peg$parseCOMMA();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parseTYPE_NAME();
+ if (s8 !== peg$FAILED) {
+ s7 = [s7, s8];
+ s6 = s7;
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ }
+ s6 = peg$parseRIGHT_PAREN();
+ if (s6 !== peg$FAILED) {
+ peg$savedPos = s2;
+ s2 = peg$f42(s1, s3, s4, s5, s6);
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f43(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e237); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsetype_specifier() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 273;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsetype_specifier_nonarray();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsearray_specifier();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f44(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e238); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsetype_specifier_nonarray() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 274;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseVOID();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFLOAT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDOUBLE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBOOL();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseATOMIC_UINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBESHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBEARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DRECTSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsestruct_specifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseTYPE_NAME();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e238); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsearray_specifier() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 275;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = [];
+ s2 = peg$currPos;
+ s3 = peg$parseLEFT_BRACKET();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseternary_expression();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$parseRIGHT_BRACKET();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s2;
+ s2 = peg$f45(s3, s4, s5);
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 !== peg$FAILED) {
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ s2 = peg$currPos;
+ s3 = peg$parseLEFT_BRACKET();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseternary_expression();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$parseRIGHT_BRACKET();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s2;
+ s2 = peg$f45(s3, s4, s5);
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ }
+ } else {
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f46(s1);
+ }
+ s0 = s1;
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e239); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseprecision_qualifier() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 276;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseHIGH_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMEDIUM_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseLOW_PRECISION();
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e240); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestruct_specifier() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 277;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseSTRUCT();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseLEFT_BRACE();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsestruct_declaration_list();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseRIGHT_BRACE();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f47(s1, s2, s3, s4, s5);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e241); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestruct_declaration_list() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 278;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = [];
+ s1 = peg$currPos;
+ s2 = peg$parsestruct_declaration();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseSEMICOLON();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s1 = peg$f48(s2, s3);
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ while (s1 !== peg$FAILED) {
+ s0.push(s1);
+ s1 = peg$currPos;
+ s2 = peg$parsestruct_declaration();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseSEMICOLON();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s1 = peg$f48(s2, s3);
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ }
+ } else {
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestruct_declaration() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 279;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefully_specified_type();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsequantified_identifier();
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsequantified_identifier();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsequantified_identifier();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f49(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsequantified_identifier() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 280;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseIDENTIFIER();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsearray_specifier();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f50(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinitializer() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 281;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseassignment_expression();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseLEFT_BRACE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseinitializer();
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseinitializer();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseinitializer();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ }
+ s4 = peg$parseCOMMA();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$parseRIGHT_BRACE();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f51(s1, s2, s3, s4, s5);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestatement() {
+ var s0;
+
+ var key = peg$currPos * 305 + 282;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsecompound_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsesimple_statement();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsesimple_statement() {
+ var s0;
+
+ var key = peg$currPos * 305 + 283;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsejump_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsedeclaration_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseexpression_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseif_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseswitch_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsecase_label();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseiteration_statement();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecompound_statement() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 284;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parseLEFT_BRACE();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s2 = peg$f52(s2);
+ }
+ s1 = s2;
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsestatement_list();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseRIGHT_BRACE();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f53(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecompound_statement_no_new_scope() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 285;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseLEFT_BRACE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsestatement_list();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseRIGHT_BRACE();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f54(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestatement_no_new_scope() {
+ var s0;
+
+ var key = peg$currPos * 305 + 286;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsecompound_statement_no_new_scope();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsesimple_statement();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestatement_list() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 287;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = [];
+ s1 = peg$parsestatement();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsepreprocessor();
+ }
+ if (s1 !== peg$FAILED) {
+ while (s1 !== peg$FAILED) {
+ s0.push(s1);
+ s1 = peg$parsestatement();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsepreprocessor();
+ }
+ }
+ } else {
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexpression_statement() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 288;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseexpression();
+ if (s1 === peg$FAILED) {
+ s1 = null;
+ }
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f55(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseif_statement() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
+
+ var key = peg$currPos * 305 + 289;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseIF();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexpression();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$currPos;
+ s6 = peg$parsestatement();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$currPos;
+ s8 = peg$parseELSE();
+ if (s8 !== peg$FAILED) {
+ s9 = peg$parsestatement();
+ if (s9 !== peg$FAILED) {
+ s8 = [s8, s9];
+ s7 = s8;
+ } else {
+ peg$currPos = s7;
+ s7 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s7;
+ s7 = peg$FAILED;
+ }
+ if (s7 === peg$FAILED) {
+ s7 = null;
+ }
+ s6 = [s6, s7];
+ s5 = s6;
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f56(s1, s2, s3, s4, s5);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseswitch_statement() {
+ var s0, s1, s2, s3, s4, s5, s6, s7;
+
+ var key = peg$currPos * 305 + 290;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseSWITCH();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexpression();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseLEFT_BRACE();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsestatement_list();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$parseRIGHT_BRACE();
+ if (s7 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f57(s1, s2, s3, s4, s5, s6, s7);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecase_label() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 291;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseCASE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseexpression();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseCOLON();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f58(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseDEFAULT();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseCOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f59(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseiteration_statement() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8;
+
+ var key = peg$currPos * 305 + 292;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parseWHILE();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s2 = peg$f60(s2);
+ }
+ s1 = s2;
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsecondition();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsestatement_no_new_scope();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f61(s1, s2, s3, s4, s5);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseDO();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsestatement();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseWHILE();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseLEFT_PAREN();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseexpression();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseRIGHT_PAREN();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$parseSEMICOLON();
+ if (s7 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f62(s1, s2, s3, s4, s5, s6, s7);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parseFOR();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s2 = peg$f63(s2);
+ }
+ s1 = s2;
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexpression_statement();
+ if (s3 === peg$FAILED) {
+ s3 = peg$parsedeclaration_statement();
+ }
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parsecondition();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$parseSEMICOLON();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseexpression();
+ if (s6 === peg$FAILED) {
+ s6 = null;
+ }
+ s7 = peg$parseRIGHT_PAREN();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parsestatement_no_new_scope();
+ if (s8 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f64(s1, s2, s3, s4, s5, s6, s7, s8);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e242); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecondition() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 293;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefully_specified_type();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseEQUAL();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseinitializer();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f65(s1, s2, s3, s4);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseexpression();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsejump_statement() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 294;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseCONTINUE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f66(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseBREAK();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f67(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseRETURN();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseexpression();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseSEMICOLON();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f68(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseDISCARD();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f69(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e243); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsepreprocessor() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 295;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 35) {
+ s3 = peg$c210;
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e245); }
+ }
+ if (s3 !== peg$FAILED) {
+ s4 = [];
+ if (peg$r11.test(input.charAt(peg$currPos))) {
+ s5 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s5 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e246); }
+ }
+ while (s5 !== peg$FAILED) {
+ s4.push(s5);
+ if (peg$r11.test(input.charAt(peg$currPos))) {
+ s5 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s5 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e246); }
+ }
+ }
+ s3 = [s3, s4];
+ s2 = s3;
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 !== peg$FAILED) {
+ s1 = input.substring(s1, peg$currPos);
+ } else {
+ s1 = s2;
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f70(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e244); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsetranslation_unit() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 296;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = [];
+ s1 = peg$parseexternal_declaration();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsepreprocessor();
+ }
+ if (s1 !== peg$FAILED) {
+ while (s1 !== peg$FAILED) {
+ s0.push(s1);
+ s1 = peg$parseexternal_declaration();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsepreprocessor();
+ }
+ }
+ } else {
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexternal_declaration() {
+ var s0;
+
+ var key = peg$currPos * 305 + 297;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsefunction_definition();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsedeclaration_statement();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_definition() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 298;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefunction_prototype();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsecompound_statement_no_new_scope();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f71(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parse_() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 299;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsewhitespace();
+ if (s1 === peg$FAILED) {
+ s1 = null;
+ }
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parsecomment();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsewhitespace();
+ if (s5 === peg$FAILED) {
+ s5 = null;
+ }
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parsecomment();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsewhitespace();
+ if (s5 === peg$FAILED) {
+ s5 = null;
+ }
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f72(s1, s2);
+ peg$silentFails--;
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e247); }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecomment() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 300;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsesingle_comment();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parsemultiline_comment();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parsewhitespace();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsecomment();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s3;
+ s3 = peg$f73(s1, s4, s5);
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parsewhitespace();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsecomment();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s3;
+ s3 = peg$f73(s1, s4, s5);
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f74(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsesingle_comment() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 301;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c211) {
+ s2 = peg$c211;
+ peg$currPos += 2;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e248); }
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ if (peg$r11.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e246); }
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ if (peg$r11.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e246); }
+ }
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsemultiline_comment() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 302;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c212) {
+ s2 = peg$c212;
+ peg$currPos += 2;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e249); }
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$currPos;
+ s5 = peg$currPos;
+ peg$silentFails++;
+ if (input.substr(peg$currPos, 2) === peg$c213) {
+ s6 = peg$c213;
+ peg$currPos += 2;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e250); }
+ }
+ peg$silentFails--;
+ if (s6 === peg$FAILED) {
+ s5 = undefined;
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ if (s5 !== peg$FAILED) {
+ if (input.length > peg$currPos) {
+ s6 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e251); }
+ }
+ if (s6 !== peg$FAILED) {
+ peg$savedPos = s4;
+ s4 = peg$f75(s6);
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$currPos;
+ s5 = peg$currPos;
+ peg$silentFails++;
+ if (input.substr(peg$currPos, 2) === peg$c213) {
+ s6 = peg$c213;
+ peg$currPos += 2;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e250); }
+ }
+ peg$silentFails--;
+ if (s6 === peg$FAILED) {
+ s5 = undefined;
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ if (s5 !== peg$FAILED) {
+ if (input.length > peg$currPos) {
+ s6 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e251); }
+ }
+ if (s6 !== peg$FAILED) {
+ peg$savedPos = s4;
+ s4 = peg$f75(s6);
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ }
+ if (input.substr(peg$currPos, 2) === peg$c213) {
+ s4 = peg$c213;
+ peg$currPos += 2;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e250); }
+ }
+ if (s4 !== peg$FAILED) {
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsewhitespace() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 303;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = [];
+ if (peg$r12.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e252); }
+ }
+ if (s2 !== peg$FAILED) {
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ if (peg$r12.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e252); }
+ }
+ }
+ } else {
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseterminal() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 304;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ peg$silentFails++;
+ if (peg$r1.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e209); }
+ }
+ peg$silentFails--;
+ if (s2 === peg$FAILED) {
+ s1 = undefined;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f76(s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+
+ const OPEN_CURLY = String.fromCharCode(123);
+
+ const makeScope = (name, parent) => ({
+ name,
+ parent,
+ bindings: {},
+ types: {},
+ functions: {},
+ });
+ const pushScope = scope => {
+ // console.log('pushing scope at ',text());
+ scopes.push(scope);
+ return scope;
+ };
+ const popScope = scope => {
+ // console.log('popping scope at ',text());
+ if(!scope.parent) {
+ throw new Error('popped bad scope', scope, 'at', text());
+ }
+ return scope.parent;
+ };
+
+ const warn = (...args) => !options.quiet && console.warn(...args);
+
+ // Types (aka struct) scope
+ const addTypes = (scope, ...types) => {
+ types.forEach(([identifier, type]) => {
+ scope.types[identifier] = {
+ references: [type]
+ };
+ });
+ };
+ const addTypeReference = (scope, name, reference) => {
+ scope.types[name].references.push(reference);
+ };
+ const findTypeScope = (scope, typeName) => {
+ if(!scope) {
+ return null;
+ }
+ if(typeName in scope.types) {
+ return scope;
+ }
+ return findTypeScope(scope.parent, typeName);
+ };
+ const isDeclaredType = (scope, typeName) => findTypeScope(scope, typeName) !== null;
+
+ // Bindings (aka variables, parameters) scope
+ const createBindings = (scope, ...bindings) => {
+ bindings.forEach(([identifier, binding]) => {
+ const newBinding = scope.bindings[identifier] || { references: [] };
+ newBinding.initializer = binding;
+ newBinding.references.unshift(binding);
+ scope.bindings[identifier] = newBinding;
+ });
+ };
+ const addBindingReference = (scope, name, reference) => {
+ // In the case of "float a = 1, b = a;" we parse the final "a" before the
+ // parent declarator list is parsed. So we might need to add the final "a"
+ // to the scope first.
+ const foundScope = findBindingScope(scope, name);
+ if(foundScope) {
+ foundScope.bindings[name].references.push(reference);
+ } else {
+ createBindings(scope, [name, reference]);
+ }
+ };
+ const findBindingScope = (scope, name) => {
+ if(!scope) {
+ return null;
+ }
+ if(name in scope.bindings) {
+ return scope;
+ }
+ return findBindingScope(scope.parent, name);
+ };
+
+ // Function scope
+ const createFunction = (scope, name, declaration) => {
+ scope.functions[name] = { references: [declaration] };
+ };
+ const addFunctionReference = (scope, name, reference) => {
+ const global = findGlobalScope(scope);
+ if(name in global.functions) {
+ global.functions[name].references.push(reference);
+ } else {
+ createFunction(scope, name, reference);
+ }
+ };
+ const findGlobalScope = scope => scope.parent ? findGlobalScope(scope.parent) : scope;
+ const isDeclaredFunction = (scope, fnName) => fnName in findGlobalScope(scope).functions;
+
+ let scopes = [makeScope('global')];
+ let scope = scopes[0];
+
+ const node = (type, attrs) => ({
+ type,
+ ...attrs
+ });
+
+ // Filter out "empty" elements from an array
+ const xnil = (...args) => args.flat().filter(e =>
+ e !== undefined && e !== null && e !== '' && e.length !== 0
+ );
+
+ // Given an array of nodes with potential null empty values, convert to text.
+ // Kind of like $(rule) but filters out empty rules
+ const toText = (...args) => xnil(args).join('');
+
+ const ifOnly = arr => arr.length > 1 ? arr : arr[0];
+
+ // Remove empty elements and return value if only 1 element remains
+ const collapse = (...args) => ifOnly(xnil(args));
+
+ // Create a left associative tree of nodes
+ const leftAssociate = (...nodes) =>
+ nodes.flat().reduce((current, [operator, expr]) => ({
+ type: "binary",
+ operator: operator,
+ left: current,
+ right: expr
+ }));
+
+ // No longer needed?
+ // const without = (obj, ...keys) => Object.entries(obj).reduce((acc, [key, value]) => ({
+ // ...acc,
+ // ...(!keys.includes(key) && { [key]: value })
+ // }), {});
+
+ // Group the statements in a switch statement into cases / default arrays
+ const groupCases = (statements) => statements.reduce((cases, stmt) => {
+ if(stmt.type === 'case_label') {
+ return [
+ ...cases,
+ node(
+ 'switch_case',
+ {
+ statements: [],
+ case: stmt.case,
+ test: stmt.test,
+ colon: stmt.colon,
+ }
+ )
+ ];
+ } else if(stmt.type === 'default_label') {
+ return [
+ ...cases,
+ node(
+ 'default_case',
+ {
+ statements: [],
+ default: stmt.default,
+ colon: stmt.colon,
+ }
+ )
+ ];
+ // It would be nice to encode this in the grammar instead of a manual check
+ } else if(!cases.length) {
+ throw new Error('A switch statement body must start with a case or default label');
+ } else {
+ const tail = cases.slice(-1)[0];
+ return [...cases.slice(0, -1), {
+ ...tail,
+ statements: [
+ ...tail.statements,
+ stmt
+ ]
+ }];
+ }
+ }, []);
+
+
+ // From https://www.khronos.org/registry/OpenGL-Refpages/gl4/index.php
+ // excluding gl_ prefixed builtins, which don't appear to be functions
+ const builtIns = new Set([
+ 'abs',
+ 'acos',
+ 'acosh',
+ 'all',
+ 'any',
+ 'asin',
+ 'asinh',
+ 'atan',
+ 'atanh',
+ 'atomicAdd',
+ 'atomicAnd',
+ 'atomicCompSwap',
+ 'atomicCounter',
+ 'atomicCounterDecrement',
+ 'atomicCounterIncrement',
+ 'atomicExchange',
+ 'atomicMax',
+ 'atomicMin',
+ 'atomicOr',
+ 'atomicXor',
+ 'barrier',
+ 'bitCount',
+ 'bitfieldExtract',
+ 'bitfieldInsert',
+ 'bitfieldReverse',
+ 'ceil',
+ 'clamp',
+ 'cos',
+ 'cosh',
+ 'cross',
+ 'degrees',
+ 'determinant',
+ 'dFdx',
+ 'dFdxCoarse',
+ 'dFdxFine',
+ 'dFdy',
+ 'dFdyCoarse',
+ 'dFdyFine',
+ 'distance',
+ 'dot',
+ 'EmitStreamVertex',
+ 'EmitVertex',
+ 'EndPrimitive',
+ 'EndStreamPrimitive',
+ 'equal',
+ 'exp',
+ 'exp2',
+ 'faceforward',
+ 'findLSB',
+ 'findMSB',
+ 'floatBitsToInt',
+ 'floatBitsToUint',
+ 'floor',
+ 'fma',
+ 'fract',
+ 'frexp',
+ 'fwidth',
+ 'fwidthCoarse',
+ 'fwidthFine',
+ 'greaterThan',
+ 'greaterThanEqual',
+ 'groupMemoryBarrier',
+ 'imageAtomicAdd',
+ 'imageAtomicAnd',
+ 'imageAtomicCompSwap',
+ 'imageAtomicExchange',
+ 'imageAtomicMax',
+ 'imageAtomicMin',
+ 'imageAtomicOr',
+ 'imageAtomicXor',
+ 'imageLoad',
+ 'imageSamples',
+ 'imageSize',
+ 'imageStore',
+ 'imulExtended',
+ 'intBitsToFloat',
+ 'interpolateAtCentroid',
+ 'interpolateAtOffset',
+ 'interpolateAtSample',
+ 'inverse',
+ 'inversesqrt',
+ 'isinf',
+ 'isnan',
+ 'ldexp',
+ 'length',
+ 'lessThan',
+ 'lessThanEqual',
+ 'log',
+ 'log2',
+ 'matrixCompMult',
+ 'max',
+ 'memoryBarrier',
+ 'memoryBarrierAtomicCounter',
+ 'memoryBarrierBuffer',
+ 'memoryBarrierImage',
+ 'memoryBarrierShared',
+ 'min',
+ 'mix',
+ 'mod',
+ 'modf',
+ 'noise',
+ 'noise1',
+ 'noise2',
+ 'noise3',
+ 'noise4',
+ 'normalize',
+ 'not',
+ 'notEqual',
+ 'outerProduct',
+ 'packDouble2x32',
+ 'packHalf2x16',
+ 'packSnorm2x16',
+ 'packSnorm4x8',
+ 'packUnorm',
+ 'packUnorm2x16',
+ 'packUnorm4x8',
+ 'pow',
+ 'radians',
+ 'reflect',
+ 'refract',
+ 'round',
+ 'roundEven',
+ 'sign',
+ 'sin',
+ 'sinh',
+ 'smoothstep',
+ 'sqrt',
+ 'step',
+ 'tan',
+ 'tanh',
+ 'texelFetch',
+ 'texelFetchOffset',
+ 'texture',
+ 'textureGather',
+ 'textureGatherOffset',
+ 'textureGatherOffsets',
+ 'textureGrad',
+ 'textureGradOffset',
+ 'textureLod',
+ 'textureLodOffset',
+ 'textureOffset',
+ 'textureProj',
+ 'textureProjGrad',
+ 'textureProjGradOffset',
+ 'textureProjLod',
+ 'textureProjLodOffset',
+ 'textureProjOffset',
+ 'textureQueryLevels',
+ 'textureQueryLod',
+ 'textureSamples',
+ 'textureSize',
+ 'transpose',
+ 'trunc',
+ 'uaddCarry',
+ 'uintBitsToFloat',
+ 'umulExtended',
+ 'unpackDouble2x32',
+ 'unpackHalf2x16',
+ 'unpackSnorm2x16',
+ 'unpackSnorm4x8',
+ 'unpackUnorm',
+ 'unpackUnorm2x16',
+ 'unpackUnorm4x8',
+ 'usubBorrow',
+ // GLSL ES 1.00
+ 'texture2D', 'textureCube'
+ ]);
+
+
+ peg$result = peg$startRuleFunction();
+
+ if (peg$result !== peg$FAILED && peg$currPos === input.length) {
+ return peg$result;
+ } else {
+ if (peg$result !== peg$FAILED && peg$currPos < input.length) {
+ peg$fail(peg$endExpectation());
+ }
+
+ throw peg$buildStructuredError(
+ peg$maxFailExpected,
+ peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
+ peg$maxFailPos < input.length
+ ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
+ : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
+ );
+ }
+}
+
+var parser = {
+ SyntaxError: peg$SyntaxError,
+ parse: peg$parse
+};
+
+"use strict";
+var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var generator_1 = __importDefault(generator);
+var parser_1 = __importDefault(parser);
+var dist = { generate: generator_1.default, parser: parser_1.default };
+
+// Format is Key (Javascript function name), Value: GLSL Source
+// SDFs from
+// https://iquilezles.org/www/articles/distfunctions/distfunctions.htm
+// Make sure to destruct the name in sculpt.js (search for DESTRUCT SDFs)
+var sdfs = {
+ boxFrame: "float sdBoxFrame( vec3 p, vec3 b, float e )\n{\n p = abs(p )-b;\nvec3 q = abs(p+e)-e;\nreturn min(min(\n length(max(vec3(p.x,q.y,q.z),0.0))+min(max(p.x,max(q.y,q.z)),0.0),\n length(max(vec3(q.x,p.y,q.z),0.0))+min(max(q.x,max(p.y,q.z)),0.0)),\n length(max(vec3(q.x,q.y,p.z),0.0))+min(max(q.x,max(q.y,p.z)),0.0));\n}",
+ link: "float sdLink( vec3 p, float le, float r1, float r2 )\n{\n vec3 q = vec3( p.x, max(abs(p.y)-le,0.0), p.z );\n return length(vec2(length(q.xy)-r1,q.z)) - r2;\n}",
+ cappedTorus: "\nfloat sdCappedTorus(in vec3 p, in vec2 sc, in float ra, in float rb)\n{\n p.x = abs(p.x);\n float k = (sc.y*p.x>sc.x*p.y) ? dot(p.xy,sc) : length(p.xy);\n return sqrt( dot(p,p) + ra*ra - 2.0*ra*k ) - rb;\n}\n"
+};
+
+const name$1="estraverse";const description$1="ECMAScript JS AST traversal functions";const homepage$1="https://github.com/estools/estraverse";const main$1="estraverse.js";const version$1="4.3.0";const engines$1={node:">=4.0"};const maintainers$1=[{name:"Yusuke Suzuki",email:"utatane.tea@gmail.com",web:"http://github.com/Constellation"}];const repository$1={type:"git",url:"http://github.com/estools/estraverse.git"};const devDependencies$1={"babel-preset-env":"^1.6.1","babel-register":"^6.3.13",chai:"^2.1.1",espree:"^1.11.0",gulp:"^3.8.10","gulp-bump":"^0.2.2","gulp-filter":"^2.0.0","gulp-git":"^1.0.1","gulp-tag-version":"^1.3.0",jshint:"^2.5.6",mocha:"^2.1.0"};const license$1="BSD-2-Clause";const scripts$1={test:"npm run-script lint && npm run-script unit-test",lint:"jshint estraverse.js","unit-test":"mocha --compilers js:babel-register"};var require$$0 = {name:name$1,description:description$1,homepage:homepage$1,main:main$1,version:version$1,engines:engines$1,maintainers:maintainers$1,repository:repository$1,devDependencies:devDependencies$1,license:license$1,scripts:scripts$1};
+
+/*
+ Copyright (C) 2012-2013 Yusuke Suzuki
+ Copyright (C) 2012 Ariya Hidayat
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var estraverse = createCommonjsModule(function (module, exports) {
+/*jslint vars:false, bitwise:true*/
+/*jshint indent:4*/
+/*global exports:true*/
+(function clone(exports) {
+ 'use strict';
+
+ var Syntax,
+ VisitorOption,
+ VisitorKeys,
+ BREAK,
+ SKIP,
+ REMOVE;
+
+ function deepCopy(obj) {
+ var ret = {}, key, val;
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ val = obj[key];
+ if (typeof val === 'object' && val !== null) {
+ ret[key] = deepCopy(val);
+ } else {
+ ret[key] = val;
+ }
+ }
+ }
+ return ret;
+ }
+
+ // based on LLVM libc++ upper_bound / lower_bound
+ // MIT License
+
+ function upperBound(array, func) {
+ var diff, len, i, current;
+
+ len = array.length;
+ i = 0;
+
+ while (len) {
+ diff = len >>> 1;
+ current = i + diff;
+ if (func(array[current])) {
+ len = diff;
+ } else {
+ i = current + 1;
+ len -= diff + 1;
+ }
+ }
+ return i;
+ }
+
+ Syntax = {
+ AssignmentExpression: 'AssignmentExpression',
+ AssignmentPattern: 'AssignmentPattern',
+ ArrayExpression: 'ArrayExpression',
+ ArrayPattern: 'ArrayPattern',
+ ArrowFunctionExpression: 'ArrowFunctionExpression',
+ AwaitExpression: 'AwaitExpression', // CAUTION: It's deferred to ES7.
+ BlockStatement: 'BlockStatement',
+ BinaryExpression: 'BinaryExpression',
+ BreakStatement: 'BreakStatement',
+ CallExpression: 'CallExpression',
+ CatchClause: 'CatchClause',
+ ClassBody: 'ClassBody',
+ ClassDeclaration: 'ClassDeclaration',
+ ClassExpression: 'ClassExpression',
+ ComprehensionBlock: 'ComprehensionBlock', // CAUTION: It's deferred to ES7.
+ ComprehensionExpression: 'ComprehensionExpression', // CAUTION: It's deferred to ES7.
+ ConditionalExpression: 'ConditionalExpression',
+ ContinueStatement: 'ContinueStatement',
+ DebuggerStatement: 'DebuggerStatement',
+ DirectiveStatement: 'DirectiveStatement',
+ DoWhileStatement: 'DoWhileStatement',
+ EmptyStatement: 'EmptyStatement',
+ ExportAllDeclaration: 'ExportAllDeclaration',
+ ExportDefaultDeclaration: 'ExportDefaultDeclaration',
+ ExportNamedDeclaration: 'ExportNamedDeclaration',
+ ExportSpecifier: 'ExportSpecifier',
+ ExpressionStatement: 'ExpressionStatement',
+ ForStatement: 'ForStatement',
+ ForInStatement: 'ForInStatement',
+ ForOfStatement: 'ForOfStatement',
+ FunctionDeclaration: 'FunctionDeclaration',
+ FunctionExpression: 'FunctionExpression',
+ GeneratorExpression: 'GeneratorExpression', // CAUTION: It's deferred to ES7.
+ Identifier: 'Identifier',
+ IfStatement: 'IfStatement',
+ ImportExpression: 'ImportExpression',
+ ImportDeclaration: 'ImportDeclaration',
+ ImportDefaultSpecifier: 'ImportDefaultSpecifier',
+ ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
+ ImportSpecifier: 'ImportSpecifier',
+ Literal: 'Literal',
+ LabeledStatement: 'LabeledStatement',
+ LogicalExpression: 'LogicalExpression',
+ MemberExpression: 'MemberExpression',
+ MetaProperty: 'MetaProperty',
+ MethodDefinition: 'MethodDefinition',
+ ModuleSpecifier: 'ModuleSpecifier',
+ NewExpression: 'NewExpression',
+ ObjectExpression: 'ObjectExpression',
+ ObjectPattern: 'ObjectPattern',
+ Program: 'Program',
+ Property: 'Property',
+ RestElement: 'RestElement',
+ ReturnStatement: 'ReturnStatement',
+ SequenceExpression: 'SequenceExpression',
+ SpreadElement: 'SpreadElement',
+ Super: 'Super',
+ SwitchStatement: 'SwitchStatement',
+ SwitchCase: 'SwitchCase',
+ TaggedTemplateExpression: 'TaggedTemplateExpression',
+ TemplateElement: 'TemplateElement',
+ TemplateLiteral: 'TemplateLiteral',
+ ThisExpression: 'ThisExpression',
+ ThrowStatement: 'ThrowStatement',
+ TryStatement: 'TryStatement',
+ UnaryExpression: 'UnaryExpression',
+ UpdateExpression: 'UpdateExpression',
+ VariableDeclaration: 'VariableDeclaration',
+ VariableDeclarator: 'VariableDeclarator',
+ WhileStatement: 'WhileStatement',
+ WithStatement: 'WithStatement',
+ YieldExpression: 'YieldExpression'
+ };
+
+ VisitorKeys = {
+ AssignmentExpression: ['left', 'right'],
+ AssignmentPattern: ['left', 'right'],
+ ArrayExpression: ['elements'],
+ ArrayPattern: ['elements'],
+ ArrowFunctionExpression: ['params', 'body'],
+ AwaitExpression: ['argument'], // CAUTION: It's deferred to ES7.
+ BlockStatement: ['body'],
+ BinaryExpression: ['left', 'right'],
+ BreakStatement: ['label'],
+ CallExpression: ['callee', 'arguments'],
+ CatchClause: ['param', 'body'],
+ ClassBody: ['body'],
+ ClassDeclaration: ['id', 'superClass', 'body'],
+ ClassExpression: ['id', 'superClass', 'body'],
+ ComprehensionBlock: ['left', 'right'], // CAUTION: It's deferred to ES7.
+ ComprehensionExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.
+ ConditionalExpression: ['test', 'consequent', 'alternate'],
+ ContinueStatement: ['label'],
+ DebuggerStatement: [],
+ DirectiveStatement: [],
+ DoWhileStatement: ['body', 'test'],
+ EmptyStatement: [],
+ ExportAllDeclaration: ['source'],
+ ExportDefaultDeclaration: ['declaration'],
+ ExportNamedDeclaration: ['declaration', 'specifiers', 'source'],
+ ExportSpecifier: ['exported', 'local'],
+ ExpressionStatement: ['expression'],
+ ForStatement: ['init', 'test', 'update', 'body'],
+ ForInStatement: ['left', 'right', 'body'],
+ ForOfStatement: ['left', 'right', 'body'],
+ FunctionDeclaration: ['id', 'params', 'body'],
+ FunctionExpression: ['id', 'params', 'body'],
+ GeneratorExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.
+ Identifier: [],
+ IfStatement: ['test', 'consequent', 'alternate'],
+ ImportExpression: ['source'],
+ ImportDeclaration: ['specifiers', 'source'],
+ ImportDefaultSpecifier: ['local'],
+ ImportNamespaceSpecifier: ['local'],
+ ImportSpecifier: ['imported', 'local'],
+ Literal: [],
+ LabeledStatement: ['label', 'body'],
+ LogicalExpression: ['left', 'right'],
+ MemberExpression: ['object', 'property'],
+ MetaProperty: ['meta', 'property'],
+ MethodDefinition: ['key', 'value'],
+ ModuleSpecifier: [],
+ NewExpression: ['callee', 'arguments'],
+ ObjectExpression: ['properties'],
+ ObjectPattern: ['properties'],
+ Program: ['body'],
+ Property: ['key', 'value'],
+ RestElement: [ 'argument' ],
+ ReturnStatement: ['argument'],
+ SequenceExpression: ['expressions'],
+ SpreadElement: ['argument'],
+ Super: [],
+ SwitchStatement: ['discriminant', 'cases'],
+ SwitchCase: ['test', 'consequent'],
+ TaggedTemplateExpression: ['tag', 'quasi'],
+ TemplateElement: [],
+ TemplateLiteral: ['quasis', 'expressions'],
+ ThisExpression: [],
+ ThrowStatement: ['argument'],
+ TryStatement: ['block', 'handler', 'finalizer'],
+ UnaryExpression: ['argument'],
+ UpdateExpression: ['argument'],
+ VariableDeclaration: ['declarations'],
+ VariableDeclarator: ['id', 'init'],
+ WhileStatement: ['test', 'body'],
+ WithStatement: ['object', 'body'],
+ YieldExpression: ['argument']
+ };
+
+ // unique id
+ BREAK = {};
+ SKIP = {};
+ REMOVE = {};
+
+ VisitorOption = {
+ Break: BREAK,
+ Skip: SKIP,
+ Remove: REMOVE
+ };
+
+ function Reference(parent, key) {
+ this.parent = parent;
+ this.key = key;
+ }
+
+ Reference.prototype.replace = function replace(node) {
+ this.parent[this.key] = node;
+ };
+
+ Reference.prototype.remove = function remove() {
+ if (Array.isArray(this.parent)) {
+ this.parent.splice(this.key, 1);
+ return true;
+ } else {
+ this.replace(null);
+ return false;
+ }
+ };
+
+ function Element(node, path, wrap, ref) {
+ this.node = node;
+ this.path = path;
+ this.wrap = wrap;
+ this.ref = ref;
+ }
+
+ function Controller() { }
+
+ // API:
+ // return property path array from root to current node
+ Controller.prototype.path = function path() {
+ var i, iz, j, jz, result, element;
+
+ function addToPath(result, path) {
+ if (Array.isArray(path)) {
+ for (j = 0, jz = path.length; j < jz; ++j) {
+ result.push(path[j]);
+ }
+ } else {
+ result.push(path);
+ }
+ }
+
+ // root node
+ if (!this.__current.path) {
+ return null;
+ }
+
+ // first node is sentinel, second node is root element
+ result = [];
+ for (i = 2, iz = this.__leavelist.length; i < iz; ++i) {
+ element = this.__leavelist[i];
+ addToPath(result, element.path);
+ }
+ addToPath(result, this.__current.path);
+ return result;
+ };
+
+ // API:
+ // return type of current node
+ Controller.prototype.type = function () {
+ var node = this.current();
+ return node.type || this.__current.wrap;
+ };
+
+ // API:
+ // return array of parent elements
+ Controller.prototype.parents = function parents() {
+ var i, iz, result;
+
+ // first node is sentinel
+ result = [];
+ for (i = 1, iz = this.__leavelist.length; i < iz; ++i) {
+ result.push(this.__leavelist[i].node);
+ }
+
+ return result;
+ };
+
+ // API:
+ // return current node
+ Controller.prototype.current = function current() {
+ return this.__current.node;
+ };
+
+ Controller.prototype.__execute = function __execute(callback, element) {
+ var previous, result;
+
+ result = undefined;
+
+ previous = this.__current;
+ this.__current = element;
+ this.__state = null;
+ if (callback) {
+ result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node);
+ }
+ this.__current = previous;
+
+ return result;
+ };
+
+ // API:
+ // notify control skip / break
+ Controller.prototype.notify = function notify(flag) {
+ this.__state = flag;
+ };
+
+ // API:
+ // skip child nodes of current node
+ Controller.prototype.skip = function () {
+ this.notify(SKIP);
+ };
+
+ // API:
+ // break traversals
+ Controller.prototype['break'] = function () {
+ this.notify(BREAK);
+ };
+
+ // API:
+ // remove node
+ Controller.prototype.remove = function () {
+ this.notify(REMOVE);
+ };
+
+ Controller.prototype.__initialize = function(root, visitor) {
+ this.visitor = visitor;
+ this.root = root;
+ this.__worklist = [];
+ this.__leavelist = [];
+ this.__current = null;
+ this.__state = null;
+ this.__fallback = null;
+ if (visitor.fallback === 'iteration') {
+ this.__fallback = Object.keys;
+ } else if (typeof visitor.fallback === 'function') {
+ this.__fallback = visitor.fallback;
+ }
+
+ this.__keys = VisitorKeys;
+ if (visitor.keys) {
+ this.__keys = Object.assign(Object.create(this.__keys), visitor.keys);
+ }
+ };
+
+ function isNode(node) {
+ if (node == null) {
+ return false;
+ }
+ return typeof node === 'object' && typeof node.type === 'string';
+ }
+
+ function isProperty(nodeType, key) {
+ return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key;
+ }
+
+ Controller.prototype.traverse = function traverse(root, visitor) {
+ var worklist,
+ leavelist,
+ element,
+ node,
+ nodeType,
+ ret,
+ key,
+ current,
+ current2,
+ candidates,
+ candidate,
+ sentinel;
+
+ this.__initialize(root, visitor);
+
+ sentinel = {};
+
+ // reference
+ worklist = this.__worklist;
+ leavelist = this.__leavelist;
+
+ // initialize
+ worklist.push(new Element(root, null, null, null));
+ leavelist.push(new Element(null, null, null, null));
+
+ while (worklist.length) {
+ element = worklist.pop();
+
+ if (element === sentinel) {
+ element = leavelist.pop();
+
+ ret = this.__execute(visitor.leave, element);
+
+ if (this.__state === BREAK || ret === BREAK) {
+ return;
+ }
+ continue;
+ }
+
+ if (element.node) {
+
+ ret = this.__execute(visitor.enter, element);
+
+ if (this.__state === BREAK || ret === BREAK) {
+ return;
+ }
+
+ worklist.push(sentinel);
+ leavelist.push(element);
+
+ if (this.__state === SKIP || ret === SKIP) {
+ continue;
+ }
+
+ node = element.node;
+ nodeType = node.type || element.wrap;
+ candidates = this.__keys[nodeType];
+ if (!candidates) {
+ if (this.__fallback) {
+ candidates = this.__fallback(node);
+ } else {
+ throw new Error('Unknown node type ' + nodeType + '.');
+ }
+ }
+
+ current = candidates.length;
+ while ((current -= 1) >= 0) {
+ key = candidates[current];
+ candidate = node[key];
+ if (!candidate) {
+ continue;
+ }
+
+ if (Array.isArray(candidate)) {
+ current2 = candidate.length;
+ while ((current2 -= 1) >= 0) {
+ if (!candidate[current2]) {
+ continue;
+ }
+ if (isProperty(nodeType, candidates[current])) {
+ element = new Element(candidate[current2], [key, current2], 'Property', null);
+ } else if (isNode(candidate[current2])) {
+ element = new Element(candidate[current2], [key, current2], null, null);
+ } else {
+ continue;
+ }
+ worklist.push(element);
+ }
+ } else if (isNode(candidate)) {
+ worklist.push(new Element(candidate, key, null, null));
+ }
+ }
+ }
+ }
+ };
+
+ Controller.prototype.replace = function replace(root, visitor) {
+ var worklist,
+ leavelist,
+ node,
+ nodeType,
+ target,
+ element,
+ current,
+ current2,
+ candidates,
+ candidate,
+ sentinel,
+ outer,
+ key;
+
+ function removeElem(element) {
+ var i,
+ key,
+ nextElem,
+ parent;
+
+ if (element.ref.remove()) {
+ // When the reference is an element of an array.
+ key = element.ref.key;
+ parent = element.ref.parent;
+
+ // If removed from array, then decrease following items' keys.
+ i = worklist.length;
+ while (i--) {
+ nextElem = worklist[i];
+ if (nextElem.ref && nextElem.ref.parent === parent) {
+ if (nextElem.ref.key < key) {
+ break;
+ }
+ --nextElem.ref.key;
+ }
+ }
+ }
+ }
+
+ this.__initialize(root, visitor);
+
+ sentinel = {};
+
+ // reference
+ worklist = this.__worklist;
+ leavelist = this.__leavelist;
+
+ // initialize
+ outer = {
+ root: root
+ };
+ element = new Element(root, null, null, new Reference(outer, 'root'));
+ worklist.push(element);
+ leavelist.push(element);
+
+ while (worklist.length) {
+ element = worklist.pop();
+
+ if (element === sentinel) {
+ element = leavelist.pop();
+
+ target = this.__execute(visitor.leave, element);
+
+ // node may be replaced with null,
+ // so distinguish between undefined and null in this place
+ if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
+ // replace
+ element.ref.replace(target);
+ }
+
+ if (this.__state === REMOVE || target === REMOVE) {
+ removeElem(element);
+ }
+
+ if (this.__state === BREAK || target === BREAK) {
+ return outer.root;
+ }
+ continue;
+ }
+
+ target = this.__execute(visitor.enter, element);
+
+ // node may be replaced with null,
+ // so distinguish between undefined and null in this place
+ if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
+ // replace
+ element.ref.replace(target);
+ element.node = target;
+ }
+
+ if (this.__state === REMOVE || target === REMOVE) {
+ removeElem(element);
+ element.node = null;
+ }
+
+ if (this.__state === BREAK || target === BREAK) {
+ return outer.root;
+ }
+
+ // node may be null
+ node = element.node;
+ if (!node) {
+ continue;
+ }
+
+ worklist.push(sentinel);
+ leavelist.push(element);
+
+ if (this.__state === SKIP || target === SKIP) {
+ continue;
+ }
+
+ nodeType = node.type || element.wrap;
+ candidates = this.__keys[nodeType];
+ if (!candidates) {
+ if (this.__fallback) {
+ candidates = this.__fallback(node);
+ } else {
+ throw new Error('Unknown node type ' + nodeType + '.');
+ }
+ }
+
+ current = candidates.length;
+ while ((current -= 1) >= 0) {
+ key = candidates[current];
+ candidate = node[key];
+ if (!candidate) {
+ continue;
+ }
+
+ if (Array.isArray(candidate)) {
+ current2 = candidate.length;
+ while ((current2 -= 1) >= 0) {
+ if (!candidate[current2]) {
+ continue;
+ }
+ if (isProperty(nodeType, candidates[current])) {
+ element = new Element(candidate[current2], [key, current2], 'Property', new Reference(candidate, current2));
+ } else if (isNode(candidate[current2])) {
+ element = new Element(candidate[current2], [key, current2], null, new Reference(candidate, current2));
+ } else {
+ continue;
+ }
+ worklist.push(element);
+ }
+ } else if (isNode(candidate)) {
+ worklist.push(new Element(candidate, key, null, new Reference(node, key)));
+ }
+ }
+ }
+
+ return outer.root;
+ };
+
+ function traverse(root, visitor) {
+ var controller = new Controller();
+ return controller.traverse(root, visitor);
+ }
+
+ function replace(root, visitor) {
+ var controller = new Controller();
+ return controller.replace(root, visitor);
+ }
+
+ function extendCommentRange(comment, tokens) {
+ var target;
+
+ target = upperBound(tokens, function search(token) {
+ return token.range[0] > comment.range[0];
+ });
+
+ comment.extendedRange = [comment.range[0], comment.range[1]];
+
+ if (target !== tokens.length) {
+ comment.extendedRange[1] = tokens[target].range[0];
+ }
+
+ target -= 1;
+ if (target >= 0) {
+ comment.extendedRange[0] = tokens[target].range[1];
+ }
+
+ return comment;
+ }
+
+ function attachComments(tree, providedComments, tokens) {
+ // At first, we should calculate extended comment ranges.
+ var comments = [], comment, len, i, cursor;
+
+ if (!tree.range) {
+ throw new Error('attachComments needs range information');
+ }
+
+ // tokens array is empty, we attach comments to tree as 'leadingComments'
+ if (!tokens.length) {
+ if (providedComments.length) {
+ for (i = 0, len = providedComments.length; i < len; i += 1) {
+ comment = deepCopy(providedComments[i]);
+ comment.extendedRange = [0, tree.range[0]];
+ comments.push(comment);
+ }
+ tree.leadingComments = comments;
+ }
+ return tree;
+ }
+
+ for (i = 0, len = providedComments.length; i < len; i += 1) {
+ comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens));
+ }
+
+ // This is based on John Freeman's implementation.
+ cursor = 0;
+ traverse(tree, {
+ enter: function (node) {
+ var comment;
+
+ while (cursor < comments.length) {
+ comment = comments[cursor];
+ if (comment.extendedRange[1] > node.range[0]) {
+ break;
+ }
+
+ if (comment.extendedRange[1] === node.range[0]) {
+ if (!node.leadingComments) {
+ node.leadingComments = [];
+ }
+ node.leadingComments.push(comment);
+ comments.splice(cursor, 1);
+ } else {
+ cursor += 1;
+ }
+ }
+
+ // already out of owned node
+ if (cursor === comments.length) {
+ return VisitorOption.Break;
+ }
+
+ if (comments[cursor].extendedRange[0] > node.range[1]) {
+ return VisitorOption.Skip;
+ }
+ }
+ });
+
+ cursor = 0;
+ traverse(tree, {
+ leave: function (node) {
+ var comment;
+
+ while (cursor < comments.length) {
+ comment = comments[cursor];
+ if (node.range[1] < comment.extendedRange[0]) {
+ break;
+ }
+
+ if (node.range[1] === comment.extendedRange[0]) {
+ if (!node.trailingComments) {
+ node.trailingComments = [];
+ }
+ node.trailingComments.push(comment);
+ comments.splice(cursor, 1);
+ } else {
+ cursor += 1;
+ }
+ }
+
+ // already out of owned node
+ if (cursor === comments.length) {
+ return VisitorOption.Break;
+ }
+
+ if (comments[cursor].extendedRange[0] > node.range[1]) {
+ return VisitorOption.Skip;
+ }
+ }
+ });
+
+ return tree;
+ }
+
+ exports.version = require$$0.version;
+ exports.Syntax = Syntax;
+ exports.traverse = traverse;
+ exports.replace = replace;
+ exports.attachComments = attachComments;
+ exports.VisitorKeys = VisitorKeys;
+ exports.VisitorOption = VisitorOption;
+ exports.Controller = Controller;
+ exports.cloneEnvironment = function () { return clone({}); };
+
+ return exports;
+}(exports));
+/* vim: set sw=4 ts=4 et tw=80 : */
+});
+
+/*
+ Copyright (C) 2013 Yusuke Suzuki
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var ast = createCommonjsModule(function (module) {
+(function () {
+ 'use strict';
+
+ function isExpression(node) {
+ if (node == null) { return false; }
+ switch (node.type) {
+ case 'ArrayExpression':
+ case 'AssignmentExpression':
+ case 'BinaryExpression':
+ case 'CallExpression':
+ case 'ConditionalExpression':
+ case 'FunctionExpression':
+ case 'Identifier':
+ case 'Literal':
+ case 'LogicalExpression':
+ case 'MemberExpression':
+ case 'NewExpression':
+ case 'ObjectExpression':
+ case 'SequenceExpression':
+ case 'ThisExpression':
+ case 'UnaryExpression':
+ case 'UpdateExpression':
+ return true;
+ }
+ return false;
+ }
+
+ function isIterationStatement(node) {
+ if (node == null) { return false; }
+ switch (node.type) {
+ case 'DoWhileStatement':
+ case 'ForInStatement':
+ case 'ForStatement':
+ case 'WhileStatement':
+ return true;
+ }
+ return false;
+ }
+
+ function isStatement(node) {
+ if (node == null) { return false; }
+ switch (node.type) {
+ case 'BlockStatement':
+ case 'BreakStatement':
+ case 'ContinueStatement':
+ case 'DebuggerStatement':
+ case 'DoWhileStatement':
+ case 'EmptyStatement':
+ case 'ExpressionStatement':
+ case 'ForInStatement':
+ case 'ForStatement':
+ case 'IfStatement':
+ case 'LabeledStatement':
+ case 'ReturnStatement':
+ case 'SwitchStatement':
+ case 'ThrowStatement':
+ case 'TryStatement':
+ case 'VariableDeclaration':
+ case 'WhileStatement':
+ case 'WithStatement':
+ return true;
+ }
+ return false;
+ }
+
+ function isSourceElement(node) {
+ return isStatement(node) || node != null && node.type === 'FunctionDeclaration';
+ }
+
+ function trailingStatement(node) {
+ switch (node.type) {
+ case 'IfStatement':
+ if (node.alternate != null) {
+ return node.alternate;
+ }
+ return node.consequent;
+
+ case 'LabeledStatement':
+ case 'ForStatement':
+ case 'ForInStatement':
+ case 'WhileStatement':
+ case 'WithStatement':
+ return node.body;
+ }
+ return null;
+ }
+
+ function isProblematicIfStatement(node) {
+ var current;
+
+ if (node.type !== 'IfStatement') {
+ return false;
+ }
+ if (node.alternate == null) {
+ return false;
+ }
+ current = node.consequent;
+ do {
+ if (current.type === 'IfStatement') {
+ if (current.alternate == null) {
+ return true;
+ }
+ }
+ current = trailingStatement(current);
+ } while (current);
+
+ return false;
+ }
+
+ module.exports = {
+ isExpression: isExpression,
+ isStatement: isStatement,
+ isIterationStatement: isIterationStatement,
+ isSourceElement: isSourceElement,
+ isProblematicIfStatement: isProblematicIfStatement,
+
+ trailingStatement: trailingStatement
+ };
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
+});
+
+/*
+ Copyright (C) 2013-2014 Yusuke Suzuki
+ Copyright (C) 2014 Ivan Nikulin
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var code = createCommonjsModule(function (module) {
+(function () {
+ 'use strict';
+
+ var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch;
+
+ // See `tools/generate-identifier-regex.js`.
+ ES5Regex = {
+ // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierStart:
+ NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,
+ // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierPart:
+ NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/
+ };
+
+ ES6Regex = {
+ // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierStart:
+ NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
+ // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierPart:
+ NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
+ };
+
+ function isDecimalDigit(ch) {
+ return 0x30 <= ch && ch <= 0x39; // 0..9
+ }
+
+ function isHexDigit(ch) {
+ return 0x30 <= ch && ch <= 0x39 || // 0..9
+ 0x61 <= ch && ch <= 0x66 || // a..f
+ 0x41 <= ch && ch <= 0x46; // A..F
+ }
+
+ function isOctalDigit(ch) {
+ return ch >= 0x30 && ch <= 0x37; // 0..7
+ }
+
+ // 7.2 White Space
+
+ NON_ASCII_WHITESPACES = [
+ 0x1680,
+ 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A,
+ 0x202F, 0x205F,
+ 0x3000,
+ 0xFEFF
+ ];
+
+ function isWhiteSpace(ch) {
+ return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 ||
+ ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0;
+ }
+
+ // 7.3 Line Terminators
+
+ function isLineTerminator(ch) {
+ return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;
+ }
+
+ // 7.6 Identifier Names and Identifiers
+
+ function fromCodePoint(cp) {
+ if (cp <= 0xFFFF) { return String.fromCharCode(cp); }
+ var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800);
+ var cu2 = String.fromCharCode(((cp - 0x10000) % 0x400) + 0xDC00);
+ return cu1 + cu2;
+ }
+
+ IDENTIFIER_START = new Array(0x80);
+ for(ch = 0; ch < 0x80; ++ch) {
+ IDENTIFIER_START[ch] =
+ ch >= 0x61 && ch <= 0x7A || // a..z
+ ch >= 0x41 && ch <= 0x5A || // A..Z
+ ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore)
+ }
+
+ IDENTIFIER_PART = new Array(0x80);
+ for(ch = 0; ch < 0x80; ++ch) {
+ IDENTIFIER_PART[ch] =
+ ch >= 0x61 && ch <= 0x7A || // a..z
+ ch >= 0x41 && ch <= 0x5A || // A..Z
+ ch >= 0x30 && ch <= 0x39 || // 0..9
+ ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore)
+ }
+
+ function isIdentifierStartES5(ch) {
+ return ch < 0x80 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
+ }
+
+ function isIdentifierPartES5(ch) {
+ return ch < 0x80 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
+ }
+
+ function isIdentifierStartES6(ch) {
+ return ch < 0x80 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
+ }
+
+ function isIdentifierPartES6(ch) {
+ return ch < 0x80 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
+ }
+
+ module.exports = {
+ isDecimalDigit: isDecimalDigit,
+ isHexDigit: isHexDigit,
+ isOctalDigit: isOctalDigit,
+ isWhiteSpace: isWhiteSpace,
+ isLineTerminator: isLineTerminator,
+ isIdentifierStartES5: isIdentifierStartES5,
+ isIdentifierPartES5: isIdentifierPartES5,
+ isIdentifierStartES6: isIdentifierStartES6,
+ isIdentifierPartES6: isIdentifierPartES6
+ };
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
+});
+
+/*
+ Copyright (C) 2013 Yusuke Suzuki
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var keyword = createCommonjsModule(function (module) {
+(function () {
+ 'use strict';
+
+ var code$1 = code;
+
+ function isStrictModeReservedWordES6(id) {
+ switch (id) {
+ case 'implements':
+ case 'interface':
+ case 'package':
+ case 'private':
+ case 'protected':
+ case 'public':
+ case 'static':
+ case 'let':
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ function isKeywordES5(id, strict) {
+ // yield should not be treated as keyword under non-strict mode.
+ if (!strict && id === 'yield') {
+ return false;
+ }
+ return isKeywordES6(id, strict);
+ }
+
+ function isKeywordES6(id, strict) {
+ if (strict && isStrictModeReservedWordES6(id)) {
+ return true;
+ }
+
+ switch (id.length) {
+ case 2:
+ return (id === 'if') || (id === 'in') || (id === 'do');
+ case 3:
+ return (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try');
+ case 4:
+ return (id === 'this') || (id === 'else') || (id === 'case') ||
+ (id === 'void') || (id === 'with') || (id === 'enum');
+ case 5:
+ return (id === 'while') || (id === 'break') || (id === 'catch') ||
+ (id === 'throw') || (id === 'const') || (id === 'yield') ||
+ (id === 'class') || (id === 'super');
+ case 6:
+ return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
+ (id === 'switch') || (id === 'export') || (id === 'import');
+ case 7:
+ return (id === 'default') || (id === 'finally') || (id === 'extends');
+ case 8:
+ return (id === 'function') || (id === 'continue') || (id === 'debugger');
+ case 10:
+ return (id === 'instanceof');
+ default:
+ return false;
+ }
+ }
+
+ function isReservedWordES5(id, strict) {
+ return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict);
+ }
+
+ function isReservedWordES6(id, strict) {
+ return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict);
+ }
+
+ function isRestrictedWord(id) {
+ return id === 'eval' || id === 'arguments';
+ }
+
+ function isIdentifierNameES5(id) {
+ var i, iz, ch;
+
+ if (id.length === 0) { return false; }
+
+ ch = id.charCodeAt(0);
+ if (!code$1.isIdentifierStartES5(ch)) {
+ return false;
+ }
+
+ for (i = 1, iz = id.length; i < iz; ++i) {
+ ch = id.charCodeAt(i);
+ if (!code$1.isIdentifierPartES5(ch)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function decodeUtf16(lead, trail) {
+ return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
+ }
+
+ function isIdentifierNameES6(id) {
+ var i, iz, ch, lowCh, check;
+
+ if (id.length === 0) { return false; }
+
+ check = code$1.isIdentifierStartES6;
+ for (i = 0, iz = id.length; i < iz; ++i) {
+ ch = id.charCodeAt(i);
+ if (0xD800 <= ch && ch <= 0xDBFF) {
+ ++i;
+ if (i >= iz) { return false; }
+ lowCh = id.charCodeAt(i);
+ if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) {
+ return false;
+ }
+ ch = decodeUtf16(ch, lowCh);
+ }
+ if (!check(ch)) {
+ return false;
+ }
+ check = code$1.isIdentifierPartES6;
+ }
+ return true;
+ }
+
+ function isIdentifierES5(id, strict) {
+ return isIdentifierNameES5(id) && !isReservedWordES5(id, strict);
+ }
+
+ function isIdentifierES6(id, strict) {
+ return isIdentifierNameES6(id) && !isReservedWordES6(id, strict);
+ }
+
+ module.exports = {
+ isKeywordES5: isKeywordES5,
+ isKeywordES6: isKeywordES6,
+ isReservedWordES5: isReservedWordES5,
+ isReservedWordES6: isReservedWordES6,
+ isRestrictedWord: isRestrictedWord,
+ isIdentifierNameES5: isIdentifierNameES5,
+ isIdentifierNameES6: isIdentifierNameES6,
+ isIdentifierES5: isIdentifierES5,
+ isIdentifierES6: isIdentifierES6
+ };
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
+});
+
+/*
+ Copyright (C) 2013 Yusuke Suzuki
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var utils = createCommonjsModule(function (module, exports) {
+(function () {
+ 'use strict';
+
+ exports.ast = ast;
+ exports.code = code;
+ exports.keyword = keyword;
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
+});
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
+
+/**
+ * Encode an integer in the range of 0 to 63 to a single base 64 digit.
+ */
+var encode$1 = function (number) {
+ if (0 <= number && number < intToCharMap.length) {
+ return intToCharMap[number];
+ }
+ throw new TypeError("Must be between 0 and 63: " + number);
+};
+
+/**
+ * Decode a single base 64 character code digit to an integer. Returns -1 on
+ * failure.
+ */
+var decode$1 = function (charCode) {
+ var bigA = 65; // 'A'
+ var bigZ = 90; // 'Z'
+
+ var littleA = 97; // 'a'
+ var littleZ = 122; // 'z'
+
+ var zero = 48; // '0'
+ var nine = 57; // '9'
+
+ var plus = 43; // '+'
+ var slash = 47; // '/'
+
+ var littleOffset = 26;
+ var numberOffset = 52;
+
+ // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ if (bigA <= charCode && charCode <= bigZ) {
+ return (charCode - bigA);
+ }
+
+ // 26 - 51: abcdefghijklmnopqrstuvwxyz
+ if (littleA <= charCode && charCode <= littleZ) {
+ return (charCode - littleA + littleOffset);
+ }
+
+ // 52 - 61: 0123456789
+ if (zero <= charCode && charCode <= nine) {
+ return (charCode - zero + numberOffset);
+ }
+
+ // 62: +
+ if (charCode == plus) {
+ return 62;
+ }
+
+ // 63: /
+ if (charCode == slash) {
+ return 63;
+ }
+
+ // Invalid base64 digit.
+ return -1;
+};
+
+var base64 = {
+ encode: encode$1,
+ decode: decode$1
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ *
+ * Based on the Base 64 VLQ implementation in Closure Compiler:
+ * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
+ *
+ * Copyright 2011 The Closure Compiler Authors. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+
+// A single base 64 digit can contain 6 bits of data. For the base 64 variable
+// length quantities we use in the source map spec, the first bit is the sign,
+// the next four bits are the actual value, and the 6th bit is the
+// continuation bit. The continuation bit tells us whether there are more
+// digits in this value following this digit.
+//
+// Continuation
+// | Sign
+// | |
+// V V
+// 101011
+
+var VLQ_BASE_SHIFT = 5;
+
+// binary: 100000
+var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+
+// binary: 011111
+var VLQ_BASE_MASK = VLQ_BASE - 1;
+
+// binary: 100000
+var VLQ_CONTINUATION_BIT = VLQ_BASE;
+
+/**
+ * Converts from a two-complement value to a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+ * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+ */
+function toVLQSigned(aValue) {
+ return aValue < 0
+ ? ((-aValue) << 1) + 1
+ : (aValue << 1) + 0;
+}
+
+/**
+ * Converts to a two-complement value from a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
+ * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
+ */
+function fromVLQSigned(aValue) {
+ var isNegative = (aValue & 1) === 1;
+ var shifted = aValue >> 1;
+ return isNegative
+ ? -shifted
+ : shifted;
+}
+
+/**
+ * Returns the base 64 VLQ encoded value.
+ */
+var encode = function base64VLQ_encode(aValue) {
+ var encoded = "";
+ var digit;
+
+ var vlq = toVLQSigned(aValue);
+
+ do {
+ digit = vlq & VLQ_BASE_MASK;
+ vlq >>>= VLQ_BASE_SHIFT;
+ if (vlq > 0) {
+ // There are still more digits in this value, so we must make sure the
+ // continuation bit is marked.
+ digit |= VLQ_CONTINUATION_BIT;
+ }
+ encoded += base64.encode(digit);
+ } while (vlq > 0);
+
+ return encoded;
+};
+
+/**
+ * Decodes the next base 64 VLQ value from the given string and returns the
+ * value and the rest of the string via the out parameter.
+ */
+var decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
+ var strLen = aStr.length;
+ var result = 0;
+ var shift = 0;
+ var continuation, digit;
+
+ do {
+ if (aIndex >= strLen) {
+ throw new Error("Expected more digits in base 64 VLQ value.");
+ }
+
+ digit = base64.decode(aStr.charCodeAt(aIndex++));
+ if (digit === -1) {
+ throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
+ }
+
+ continuation = !!(digit & VLQ_CONTINUATION_BIT);
+ digit &= VLQ_BASE_MASK;
+ result = result + (digit << shift);
+ shift += VLQ_BASE_SHIFT;
+ } while (continuation);
+
+ aOutParam.value = fromVLQSigned(result);
+ aOutParam.rest = aIndex;
+};
+
+var base64Vlq = {
+ encode: encode,
+ decode: decode
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+var util = createCommonjsModule(function (module, exports) {
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+/**
+ * This is a helper function for getting values from parameter/options
+ * objects.
+ *
+ * @param args The object we are extracting values from
+ * @param name The name of the property we are getting.
+ * @param defaultValue An optional value to return if the property is missing
+ * from the object. If this is not specified and the property is missing, an
+ * error will be thrown.
+ */
+function getArg(aArgs, aName, aDefaultValue) {
+ if (aName in aArgs) {
+ return aArgs[aName];
+ } else if (arguments.length === 3) {
+ return aDefaultValue;
+ } else {
+ throw new Error('"' + aName + '" is a required argument.');
+ }
+}
+exports.getArg = getArg;
+
+var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
+var dataUrlRegexp = /^data:.+\,.+$/;
+
+function urlParse(aUrl) {
+ var match = aUrl.match(urlRegexp);
+ if (!match) {
+ return null;
+ }
+ return {
+ scheme: match[1],
+ auth: match[2],
+ host: match[3],
+ port: match[4],
+ path: match[5]
+ };
+}
+exports.urlParse = urlParse;
+
+function urlGenerate(aParsedUrl) {
+ var url = '';
+ if (aParsedUrl.scheme) {
+ url += aParsedUrl.scheme + ':';
+ }
+ url += '//';
+ if (aParsedUrl.auth) {
+ url += aParsedUrl.auth + '@';
+ }
+ if (aParsedUrl.host) {
+ url += aParsedUrl.host;
+ }
+ if (aParsedUrl.port) {
+ url += ":" + aParsedUrl.port;
+ }
+ if (aParsedUrl.path) {
+ url += aParsedUrl.path;
+ }
+ return url;
+}
+exports.urlGenerate = urlGenerate;
+
+/**
+ * Normalizes a path, or the path portion of a URL:
+ *
+ * - Replaces consecutive slashes with one slash.
+ * - Removes unnecessary '.' parts.
+ * - Removes unnecessary '/..' parts.
+ *
+ * Based on code in the Node.js 'path' core module.
+ *
+ * @param aPath The path or url to normalize.
+ */
+function normalize(aPath) {
+ var path = aPath;
+ var url = urlParse(aPath);
+ if (url) {
+ if (!url.path) {
+ return aPath;
+ }
+ path = url.path;
+ }
+ var isAbsolute = exports.isAbsolute(path);
+
+ var parts = path.split(/\/+/);
+ for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
+ part = parts[i];
+ if (part === '.') {
+ parts.splice(i, 1);
+ } else if (part === '..') {
+ up++;
+ } else if (up > 0) {
+ if (part === '') {
+ // The first part is blank if the path is absolute. Trying to go
+ // above the root is a no-op. Therefore we can remove all '..' parts
+ // directly after the root.
+ parts.splice(i + 1, up);
+ up = 0;
+ } else {
+ parts.splice(i, 2);
+ up--;
+ }
+ }
+ }
+ path = parts.join('/');
+
+ if (path === '') {
+ path = isAbsolute ? '/' : '.';
+ }
+
+ if (url) {
+ url.path = path;
+ return urlGenerate(url);
+ }
+ return path;
+}
+exports.normalize = normalize;
+
+/**
+ * Joins two paths/URLs.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be joined with the root.
+ *
+ * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
+ * scheme-relative URL: Then the scheme of aRoot, if any, is prepended
+ * first.
+ * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
+ * is updated with the result and aRoot is returned. Otherwise the result
+ * is returned.
+ * - If aPath is absolute, the result is aPath.
+ * - Otherwise the two paths are joined with a slash.
+ * - Joining for example 'http://' and 'www.example.com' is also supported.
+ */
+function join(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+ if (aPath === "") {
+ aPath = ".";
+ }
+ var aPathUrl = urlParse(aPath);
+ var aRootUrl = urlParse(aRoot);
+ if (aRootUrl) {
+ aRoot = aRootUrl.path || '/';
+ }
+
+ // `join(foo, '//www.example.org')`
+ if (aPathUrl && !aPathUrl.scheme) {
+ if (aRootUrl) {
+ aPathUrl.scheme = aRootUrl.scheme;
+ }
+ return urlGenerate(aPathUrl);
+ }
+
+ if (aPathUrl || aPath.match(dataUrlRegexp)) {
+ return aPath;
+ }
+
+ // `join('http://', 'www.example.com')`
+ if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
+ aRootUrl.host = aPath;
+ return urlGenerate(aRootUrl);
+ }
+
+ var joined = aPath.charAt(0) === '/'
+ ? aPath
+ : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
+
+ if (aRootUrl) {
+ aRootUrl.path = joined;
+ return urlGenerate(aRootUrl);
+ }
+ return joined;
+}
+exports.join = join;
+
+exports.isAbsolute = function (aPath) {
+ return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
+};
+
+/**
+ * Make a path relative to a URL or another path.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be made relative to aRoot.
+ */
+function relative(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+
+ aRoot = aRoot.replace(/\/$/, '');
+
+ // It is possible for the path to be above the root. In this case, simply
+ // checking whether the root is a prefix of the path won't work. Instead, we
+ // need to remove components from the root one by one, until either we find
+ // a prefix that fits, or we run out of components to remove.
+ var level = 0;
+ while (aPath.indexOf(aRoot + '/') !== 0) {
+ var index = aRoot.lastIndexOf("/");
+ if (index < 0) {
+ return aPath;
+ }
+
+ // If the only part of the root that is left is the scheme (i.e. http://,
+ // file:///, etc.), one or more slashes (/), or simply nothing at all, we
+ // have exhausted all components, so the path is not relative to the root.
+ aRoot = aRoot.slice(0, index);
+ if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
+ return aPath;
+ }
+
+ ++level;
+ }
+
+ // Make sure we add a "../" for each component we removed from the root.
+ return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
+}
+exports.relative = relative;
+
+var supportsNullProto = (function () {
+ var obj = Object.create(null);
+ return !('__proto__' in obj);
+}());
+
+function identity (s) {
+ return s;
+}
+
+/**
+ * Because behavior goes wacky when you set `__proto__` on objects, we
+ * have to prefix all the strings in our set with an arbitrary character.
+ *
+ * See https://github.com/mozilla/source-map/pull/31 and
+ * https://github.com/mozilla/source-map/issues/30
+ *
+ * @param String aStr
+ */
+function toSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return '$' + aStr;
+ }
+
+ return aStr;
+}
+exports.toSetString = supportsNullProto ? identity : toSetString;
+
+function fromSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return aStr.slice(1);
+ }
+
+ return aStr;
+}
+exports.fromSetString = supportsNullProto ? identity : fromSetString;
+
+function isProtoString(s) {
+ if (!s) {
+ return false;
+ }
+
+ var length = s.length;
+
+ if (length < 9 /* "__proto__".length */) {
+ return false;
+ }
+
+ if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 2) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 4) !== 116 /* 't' */ ||
+ s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
+ s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
+ s.charCodeAt(length - 8) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 9) !== 95 /* '_' */) {
+ return false;
+ }
+
+ for (var i = length - 10; i >= 0; i--) {
+ if (s.charCodeAt(i) !== 36 /* '$' */) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Comparator between two mappings where the original positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same original source/line/column, but different generated
+ * line and column the same. Useful when searching for a mapping with a
+ * stubbed out mapping.
+ */
+function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
+ var cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByOriginalPositions = compareByOriginalPositions;
+
+/**
+ * Comparator between two mappings with deflated source and name indices where
+ * the generated positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same generated line and column, but different
+ * source/name/original line and column the same. Useful when searching for a
+ * mapping with a stubbed out mapping.
+ */
+function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0 || onlyCompareGenerated) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 === null) {
+ return 1; // aStr2 !== null
+ }
+
+ if (aStr2 === null) {
+ return -1; // aStr1 !== null
+ }
+
+ if (aStr1 > aStr2) {
+ return 1;
+ }
+
+ return -1;
+}
+
+/**
+ * Comparator between two mappings with inflated source and name strings where
+ * the generated positions are compared.
+ */
+function compareByGeneratedPositionsInflated(mappingA, mappingB) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
+
+/**
+ * Strip any JSON XSSI avoidance prefix from the string (as documented
+ * in the source maps specification), and then parse the string as
+ * JSON.
+ */
+function parseSourceMapInput(str) {
+ return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
+}
+exports.parseSourceMapInput = parseSourceMapInput;
+
+/**
+ * Compute the URL of a source given the the source root, the source's
+ * URL, and the source map's URL.
+ */
+function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+ sourceURL = sourceURL || '';
+
+ if (sourceRoot) {
+ // This follows what Chrome does.
+ if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
+ sourceRoot += '/';
+ }
+ // The spec says:
+ // Line 4: An optional source root, useful for relocating source
+ // files on a server or removing repeated values in the
+ // “sources” entry. This value is prepended to the individual
+ // entries in the “source” field.
+ sourceURL = sourceRoot + sourceURL;
+ }
+
+ // Historically, SourceMapConsumer did not take the sourceMapURL as
+ // a parameter. This mode is still somewhat supported, which is why
+ // this code block is conditional. However, it's preferable to pass
+ // the source map URL to SourceMapConsumer, so that this function
+ // can implement the source URL resolution algorithm as outlined in
+ // the spec. This block is basically the equivalent of:
+ // new URL(sourceURL, sourceMapURL).toString()
+ // ... except it avoids using URL, which wasn't available in the
+ // older releases of node still supported by this library.
+ //
+ // The spec says:
+ // If the sources are not absolute URLs after prepending of the
+ // “sourceRoot”, the sources are resolved relative to the
+ // SourceMap (like resolving script src in a html document).
+ if (sourceMapURL) {
+ var parsed = urlParse(sourceMapURL);
+ if (!parsed) {
+ throw new Error("sourceMapURL could not be parsed");
+ }
+ if (parsed.path) {
+ // Strip the last path component, but keep the "/".
+ var index = parsed.path.lastIndexOf('/');
+ if (index >= 0) {
+ parsed.path = parsed.path.substring(0, index + 1);
+ }
+ }
+ sourceURL = join(urlGenerate(parsed), sourceURL);
+ }
+
+ return normalize(sourceURL);
+}
+exports.computeSourceURL = computeSourceURL;
+});
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+var has = Object.prototype.hasOwnProperty;
+var hasNativeMap = typeof Map !== "undefined";
+
+/**
+ * A data structure which is a combination of an array and a set. Adding a new
+ * member is O(1), testing for membership is O(1), and finding the index of an
+ * element is O(1). Removing elements from the set is not supported. Only
+ * strings are supported for membership.
+ */
+function ArraySet$2() {
+ this._array = [];
+ this._set = hasNativeMap ? new Map() : Object.create(null);
+}
+
+/**
+ * Static method for creating ArraySet instances from an existing array.
+ */
+ArraySet$2.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
+ var set = new ArraySet$2();
+ for (var i = 0, len = aArray.length; i < len; i++) {
+ set.add(aArray[i], aAllowDuplicates);
+ }
+ return set;
+};
+
+/**
+ * Return how many unique items are in this ArraySet. If duplicates have been
+ * added, than those do not count towards the size.
+ *
+ * @returns Number
+ */
+ArraySet$2.prototype.size = function ArraySet_size() {
+ return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
+};
+
+/**
+ * Add the given string to this set.
+ *
+ * @param String aStr
+ */
+ArraySet$2.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
+ var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
+ var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
+ var idx = this._array.length;
+ if (!isDuplicate || aAllowDuplicates) {
+ this._array.push(aStr);
+ }
+ if (!isDuplicate) {
+ if (hasNativeMap) {
+ this._set.set(aStr, idx);
+ } else {
+ this._set[sStr] = idx;
+ }
+ }
+};
+
+/**
+ * Is the given string a member of this set?
+ *
+ * @param String aStr
+ */
+ArraySet$2.prototype.has = function ArraySet_has(aStr) {
+ if (hasNativeMap) {
+ return this._set.has(aStr);
+ } else {
+ var sStr = util.toSetString(aStr);
+ return has.call(this._set, sStr);
+ }
+};
+
+/**
+ * What is the index of the given string in the array?
+ *
+ * @param String aStr
+ */
+ArraySet$2.prototype.indexOf = function ArraySet_indexOf(aStr) {
+ if (hasNativeMap) {
+ var idx = this._set.get(aStr);
+ if (idx >= 0) {
+ return idx;
+ }
+ } else {
+ var sStr = util.toSetString(aStr);
+ if (has.call(this._set, sStr)) {
+ return this._set[sStr];
+ }
+ }
+
+ throw new Error('"' + aStr + '" is not in the set.');
+};
+
+/**
+ * What is the element at the given index?
+ *
+ * @param Number aIdx
+ */
+ArraySet$2.prototype.at = function ArraySet_at(aIdx) {
+ if (aIdx >= 0 && aIdx < this._array.length) {
+ return this._array[aIdx];
+ }
+ throw new Error('No element indexed by ' + aIdx);
+};
+
+/**
+ * Returns the array representation of this set (which has the proper indices
+ * indicated by indexOf). Note that this is a copy of the internal array used
+ * for storing the members so that no one can mess with internal state.
+ */
+ArraySet$2.prototype.toArray = function ArraySet_toArray() {
+ return this._array.slice();
+};
+
+var ArraySet_1 = ArraySet$2;
+
+var arraySet = {
+ ArraySet: ArraySet_1
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+/*
+ * Copyright 2014 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+
+/**
+ * Determine whether mappingB is after mappingA with respect to generated
+ * position.
+ */
+function generatedPositionAfter(mappingA, mappingB) {
+ // Optimized for most common case
+ var lineA = mappingA.generatedLine;
+ var lineB = mappingB.generatedLine;
+ var columnA = mappingA.generatedColumn;
+ var columnB = mappingB.generatedColumn;
+ return lineB > lineA || lineB == lineA && columnB >= columnA ||
+ util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
+}
+
+/**
+ * A data structure to provide a sorted view of accumulated mappings in a
+ * performance conscious manner. It trades a neglibable overhead in general
+ * case for a large speedup in case of mappings being added in order.
+ */
+function MappingList$1() {
+ this._array = [];
+ this._sorted = true;
+ // Serves as infimum
+ this._last = {generatedLine: -1, generatedColumn: 0};
+}
+
+/**
+ * Iterate through internal items. This method takes the same arguments that
+ * `Array.prototype.forEach` takes.
+ *
+ * NOTE: The order of the mappings is NOT guaranteed.
+ */
+MappingList$1.prototype.unsortedForEach =
+ function MappingList_forEach(aCallback, aThisArg) {
+ this._array.forEach(aCallback, aThisArg);
+ };
+
+/**
+ * Add the given source mapping.
+ *
+ * @param Object aMapping
+ */
+MappingList$1.prototype.add = function MappingList_add(aMapping) {
+ if (generatedPositionAfter(this._last, aMapping)) {
+ this._last = aMapping;
+ this._array.push(aMapping);
+ } else {
+ this._sorted = false;
+ this._array.push(aMapping);
+ }
+};
+
+/**
+ * Returns the flat, sorted array of mappings. The mappings are sorted by
+ * generated position.
+ *
+ * WARNING: This method returns internal data without copying, for
+ * performance. The return value must NOT be mutated, and should be treated as
+ * an immutable borrow. If you want to take ownership, you must make your own
+ * copy.
+ */
+MappingList$1.prototype.toArray = function MappingList_toArray() {
+ if (!this._sorted) {
+ this._array.sort(util.compareByGeneratedPositionsInflated);
+ this._sorted = true;
+ }
+ return this._array;
+};
+
+var MappingList_1 = MappingList$1;
+
+var mappingList = {
+ MappingList: MappingList_1
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+
+var ArraySet$1 = arraySet.ArraySet;
+var MappingList = mappingList.MappingList;
+
+/**
+ * An instance of the SourceMapGenerator represents a source map which is
+ * being built incrementally. You may pass an object with the following
+ * properties:
+ *
+ * - file: The filename of the generated source.
+ * - sourceRoot: A root for all relative URLs in this source map.
+ */
+function SourceMapGenerator$2(aArgs) {
+ if (!aArgs) {
+ aArgs = {};
+ }
+ this._file = util.getArg(aArgs, 'file', null);
+ this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
+ this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
+ this._sources = new ArraySet$1();
+ this._names = new ArraySet$1();
+ this._mappings = new MappingList();
+ this._sourcesContents = null;
+}
+
+SourceMapGenerator$2.prototype._version = 3;
+
+/**
+ * Creates a new SourceMapGenerator based on a SourceMapConsumer
+ *
+ * @param aSourceMapConsumer The SourceMap.
+ */
+SourceMapGenerator$2.fromSourceMap =
+ function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
+ var sourceRoot = aSourceMapConsumer.sourceRoot;
+ var generator = new SourceMapGenerator$2({
+ file: aSourceMapConsumer.file,
+ sourceRoot: sourceRoot
+ });
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ var newMapping = {
+ generated: {
+ line: mapping.generatedLine,
+ column: mapping.generatedColumn
+ }
+ };
+
+ if (mapping.source != null) {
+ newMapping.source = mapping.source;
+ if (sourceRoot != null) {
+ newMapping.source = util.relative(sourceRoot, newMapping.source);
+ }
+
+ newMapping.original = {
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ };
+
+ if (mapping.name != null) {
+ newMapping.name = mapping.name;
+ }
+ }
+
+ generator.addMapping(newMapping);
+ });
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var sourceRelative = sourceFile;
+ if (sourceRoot !== null) {
+ sourceRelative = util.relative(sourceRoot, sourceFile);
+ }
+
+ if (!generator._sources.has(sourceRelative)) {
+ generator._sources.add(sourceRelative);
+ }
+
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ generator.setSourceContent(sourceFile, content);
+ }
+ });
+ return generator;
+ };
+
+/**
+ * Add a single mapping from original source line and column to the generated
+ * source's line and column for this source map being created. The mapping
+ * object should have the following properties:
+ *
+ * - generated: An object with the generated line and column positions.
+ * - original: An object with the original line and column positions.
+ * - source: The original source file (relative to the sourceRoot).
+ * - name: An optional original token name for this mapping.
+ */
+SourceMapGenerator$2.prototype.addMapping =
+ function SourceMapGenerator_addMapping(aArgs) {
+ var generated = util.getArg(aArgs, 'generated');
+ var original = util.getArg(aArgs, 'original', null);
+ var source = util.getArg(aArgs, 'source', null);
+ var name = util.getArg(aArgs, 'name', null);
+
+ if (!this._skipValidation) {
+ this._validateMapping(generated, original, source, name);
+ }
+
+ if (source != null) {
+ source = String(source);
+ if (!this._sources.has(source)) {
+ this._sources.add(source);
+ }
+ }
+
+ if (name != null) {
+ name = String(name);
+ if (!this._names.has(name)) {
+ this._names.add(name);
+ }
+ }
+
+ this._mappings.add({
+ generatedLine: generated.line,
+ generatedColumn: generated.column,
+ originalLine: original != null && original.line,
+ originalColumn: original != null && original.column,
+ source: source,
+ name: name
+ });
+ };
+
+/**
+ * Set the source content for a source file.
+ */
+SourceMapGenerator$2.prototype.setSourceContent =
+ function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
+ var source = aSourceFile;
+ if (this._sourceRoot != null) {
+ source = util.relative(this._sourceRoot, source);
+ }
+
+ if (aSourceContent != null) {
+ // Add the source content to the _sourcesContents map.
+ // Create a new _sourcesContents map if the property is null.
+ if (!this._sourcesContents) {
+ this._sourcesContents = Object.create(null);
+ }
+ this._sourcesContents[util.toSetString(source)] = aSourceContent;
+ } else if (this._sourcesContents) {
+ // Remove the source file from the _sourcesContents map.
+ // If the _sourcesContents map is empty, set the property to null.
+ delete this._sourcesContents[util.toSetString(source)];
+ if (Object.keys(this._sourcesContents).length === 0) {
+ this._sourcesContents = null;
+ }
+ }
+ };
+
+/**
+ * Applies the mappings of a sub-source-map for a specific source file to the
+ * source map being generated. Each mapping to the supplied source file is
+ * rewritten using the supplied source map. Note: The resolution for the
+ * resulting mappings is the minimium of this map and the supplied map.
+ *
+ * @param aSourceMapConsumer The source map to be applied.
+ * @param aSourceFile Optional. The filename of the source file.
+ * If omitted, SourceMapConsumer's file property will be used.
+ * @param aSourceMapPath Optional. The dirname of the path to the source map
+ * to be applied. If relative, it is relative to the SourceMapConsumer.
+ * This parameter is needed when the two source maps aren't in the same
+ * directory, and the source map to be applied contains relative source
+ * paths. If so, those relative source paths need to be rewritten
+ * relative to the SourceMapGenerator.
+ */
+SourceMapGenerator$2.prototype.applySourceMap =
+ function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
+ var sourceFile = aSourceFile;
+ // If aSourceFile is omitted, we will use the file property of the SourceMap
+ if (aSourceFile == null) {
+ if (aSourceMapConsumer.file == null) {
+ throw new Error(
+ 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
+ 'or the source map\'s "file" property. Both were omitted.'
+ );
+ }
+ sourceFile = aSourceMapConsumer.file;
+ }
+ var sourceRoot = this._sourceRoot;
+ // Make "sourceFile" relative if an absolute Url is passed.
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ // Applying the SourceMap can add and remove items from the sources and
+ // the names array.
+ var newSources = new ArraySet$1();
+ var newNames = new ArraySet$1();
+
+ // Find mappings for the "sourceFile"
+ this._mappings.unsortedForEach(function (mapping) {
+ if (mapping.source === sourceFile && mapping.originalLine != null) {
+ // Check if it can be mapped by the source map, then update the mapping.
+ var original = aSourceMapConsumer.originalPositionFor({
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ });
+ if (original.source != null) {
+ // Copy mapping
+ mapping.source = original.source;
+ if (aSourceMapPath != null) {
+ mapping.source = util.join(aSourceMapPath, mapping.source);
+ }
+ if (sourceRoot != null) {
+ mapping.source = util.relative(sourceRoot, mapping.source);
+ }
+ mapping.originalLine = original.line;
+ mapping.originalColumn = original.column;
+ if (original.name != null) {
+ mapping.name = original.name;
+ }
+ }
+ }
+
+ var source = mapping.source;
+ if (source != null && !newSources.has(source)) {
+ newSources.add(source);
+ }
+
+ var name = mapping.name;
+ if (name != null && !newNames.has(name)) {
+ newNames.add(name);
+ }
+
+ }, this);
+ this._sources = newSources;
+ this._names = newNames;
+
+ // Copy sourcesContents of applied map.
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aSourceMapPath != null) {
+ sourceFile = util.join(aSourceMapPath, sourceFile);
+ }
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ this.setSourceContent(sourceFile, content);
+ }
+ }, this);
+ };
+
+/**
+ * A mapping can have one of the three levels of data:
+ *
+ * 1. Just the generated position.
+ * 2. The Generated position, original position, and original source.
+ * 3. Generated and original position, original source, as well as a name
+ * token.
+ *
+ * To maintain consistency, we validate that any new mapping being added falls
+ * in to one of these categories.
+ */
+SourceMapGenerator$2.prototype._validateMapping =
+ function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
+ aName) {
+ // When aOriginal is truthy but has empty values for .line and .column,
+ // it is most likely a programmer error. In this case we throw a very
+ // specific error message to try to guide them the right way.
+ // For example: https://github.com/Polymer/polymer-bundler/pull/519
+ if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
+ throw new Error(
+ 'original.line and original.column are not numbers -- you probably meant to omit ' +
+ 'the original mapping entirely and only map the generated position. If so, pass ' +
+ 'null for the original mapping instead of an object with empty or null values.'
+ );
+ }
+
+ if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && !aOriginal && !aSource && !aName) {
+ // Case 1.
+ return;
+ }
+ else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aOriginal && 'line' in aOriginal && 'column' in aOriginal
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && aOriginal.line > 0 && aOriginal.column >= 0
+ && aSource) {
+ // Cases 2 and 3.
+ return;
+ }
+ else {
+ throw new Error('Invalid mapping: ' + JSON.stringify({
+ generated: aGenerated,
+ source: aSource,
+ original: aOriginal,
+ name: aName
+ }));
+ }
+ };
+
+/**
+ * Serialize the accumulated mappings in to the stream of base 64 VLQs
+ * specified by the source map format.
+ */
+SourceMapGenerator$2.prototype._serializeMappings =
+ function SourceMapGenerator_serializeMappings() {
+ var previousGeneratedColumn = 0;
+ var previousGeneratedLine = 1;
+ var previousOriginalColumn = 0;
+ var previousOriginalLine = 0;
+ var previousName = 0;
+ var previousSource = 0;
+ var result = '';
+ var next;
+ var mapping;
+ var nameIdx;
+ var sourceIdx;
+
+ var mappings = this._mappings.toArray();
+ for (var i = 0, len = mappings.length; i < len; i++) {
+ mapping = mappings[i];
+ next = '';
+
+ if (mapping.generatedLine !== previousGeneratedLine) {
+ previousGeneratedColumn = 0;
+ while (mapping.generatedLine !== previousGeneratedLine) {
+ next += ';';
+ previousGeneratedLine++;
+ }
+ }
+ else {
+ if (i > 0) {
+ if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
+ continue;
+ }
+ next += ',';
+ }
+ }
+
+ next += base64Vlq.encode(mapping.generatedColumn
+ - previousGeneratedColumn);
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (mapping.source != null) {
+ sourceIdx = this._sources.indexOf(mapping.source);
+ next += base64Vlq.encode(sourceIdx - previousSource);
+ previousSource = sourceIdx;
+
+ // lines are stored 0-based in SourceMap spec version 3
+ next += base64Vlq.encode(mapping.originalLine - 1
+ - previousOriginalLine);
+ previousOriginalLine = mapping.originalLine - 1;
+
+ next += base64Vlq.encode(mapping.originalColumn
+ - previousOriginalColumn);
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (mapping.name != null) {
+ nameIdx = this._names.indexOf(mapping.name);
+ next += base64Vlq.encode(nameIdx - previousName);
+ previousName = nameIdx;
+ }
+ }
+
+ result += next;
+ }
+
+ return result;
+ };
+
+SourceMapGenerator$2.prototype._generateSourcesContent =
+ function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
+ return aSources.map(function (source) {
+ if (!this._sourcesContents) {
+ return null;
+ }
+ if (aSourceRoot != null) {
+ source = util.relative(aSourceRoot, source);
+ }
+ var key = util.toSetString(source);
+ return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
+ ? this._sourcesContents[key]
+ : null;
+ }, this);
+ };
+
+/**
+ * Externalize the source map.
+ */
+SourceMapGenerator$2.prototype.toJSON =
+ function SourceMapGenerator_toJSON() {
+ var map = {
+ version: this._version,
+ sources: this._sources.toArray(),
+ names: this._names.toArray(),
+ mappings: this._serializeMappings()
+ };
+ if (this._file != null) {
+ map.file = this._file;
+ }
+ if (this._sourceRoot != null) {
+ map.sourceRoot = this._sourceRoot;
+ }
+ if (this._sourcesContents) {
+ map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
+ }
+
+ return map;
+ };
+
+/**
+ * Render the source map being generated to a string.
+ */
+SourceMapGenerator$2.prototype.toString =
+ function SourceMapGenerator_toString() {
+ return JSON.stringify(this.toJSON());
+ };
+
+var SourceMapGenerator_1 = SourceMapGenerator$2;
+
+var sourceMapGenerator = {
+ SourceMapGenerator: SourceMapGenerator_1
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+var binarySearch = createCommonjsModule(function (module, exports) {
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+exports.GREATEST_LOWER_BOUND = 1;
+exports.LEAST_UPPER_BOUND = 2;
+
+/**
+ * Recursive implementation of binary search.
+ *
+ * @param aLow Indices here and lower do not contain the needle.
+ * @param aHigh Indices here and higher do not contain the needle.
+ * @param aNeedle The element being searched for.
+ * @param aHaystack The non-empty array being searched.
+ * @param aCompare Function which takes two elements and returns -1, 0, or 1.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ */
+function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
+ // This function terminates when one of the following is true:
+ //
+ // 1. We find the exact element we are looking for.
+ //
+ // 2. We did not find the exact element, but we can return the index of
+ // the next-closest element.
+ //
+ // 3. We did not find the exact element, and there is no next-closest
+ // element than the one we are searching for, so we return -1.
+ var mid = Math.floor((aHigh - aLow) / 2) + aLow;
+ var cmp = aCompare(aNeedle, aHaystack[mid], true);
+ if (cmp === 0) {
+ // Found the element we are looking for.
+ return mid;
+ }
+ else if (cmp > 0) {
+ // Our needle is greater than aHaystack[mid].
+ if (aHigh - mid > 1) {
+ // The element is in the upper half.
+ return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // The exact needle element was not found in this haystack. Determine if
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return aHigh < aHaystack.length ? aHigh : -1;
+ } else {
+ return mid;
+ }
+ }
+ else {
+ // Our needle is less than aHaystack[mid].
+ if (mid - aLow > 1) {
+ // The element is in the lower half.
+ return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return mid;
+ } else {
+ return aLow < 0 ? -1 : aLow;
+ }
+ }
+}
+
+/**
+ * This is an implementation of binary search which will always try and return
+ * the index of the closest element if there is no exact hit. This is because
+ * mappings between original and generated line/col pairs are single points,
+ * and there is an implicit region between each of them, so a miss just means
+ * that you aren't on the very start of a region.
+ *
+ * @param aNeedle The element you are looking for.
+ * @param aHaystack The array that is being searched.
+ * @param aCompare A function which takes the needle and an element in the
+ * array and returns -1, 0, or 1 depending on whether the needle is less
+ * than, equal to, or greater than the element, respectively.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
+ */
+exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
+ if (aHaystack.length === 0) {
+ return -1;
+ }
+
+ var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
+ aCompare, aBias || exports.GREATEST_LOWER_BOUND);
+ if (index < 0) {
+ return -1;
+ }
+
+ // We have found either the exact element, or the next-closest element than
+ // the one we are searching for. However, there may be more than one such
+ // element. Make sure we always return the smallest of these.
+ while (index - 1 >= 0) {
+ if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
+ break;
+ }
+ --index;
+ }
+
+ return index;
+};
+});
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+// It turns out that some (most?) JavaScript engines don't self-host
+// `Array.prototype.sort`. This makes sense because C++ will likely remain
+// faster than JS when doing raw CPU-intensive sorting. However, when using a
+// custom comparator function, calling back and forth between the VM's C++ and
+// JIT'd JS is rather slow *and* loses JIT type information, resulting in
+// worse generated code for the comparator function than would be optimal. In
+// fact, when sorting with a comparator, these costs outweigh the benefits of
+// sorting in C++. By using our own JS-implemented Quick Sort (below), we get
+// a ~3500ms mean speed-up in `bench/bench.html`.
+
+/**
+ * Swap the elements indexed by `x` and `y` in the array `ary`.
+ *
+ * @param {Array} ary
+ * The array.
+ * @param {Number} x
+ * The index of the first item.
+ * @param {Number} y
+ * The index of the second item.
+ */
+function swap(ary, x, y) {
+ var temp = ary[x];
+ ary[x] = ary[y];
+ ary[y] = temp;
+}
+
+/**
+ * Returns a random integer within the range `low .. high` inclusive.
+ *
+ * @param {Number} low
+ * The lower bound on the range.
+ * @param {Number} high
+ * The upper bound on the range.
+ */
+function randomIntInRange(low, high) {
+ return Math.round(low + (Math.random() * (high - low)));
+}
+
+/**
+ * The Quick Sort algorithm.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ * @param {Number} p
+ * Start index of the array
+ * @param {Number} r
+ * End index of the array
+ */
+function doQuickSort(ary, comparator, p, r) {
+ // If our lower bound is less than our upper bound, we (1) partition the
+ // array into two pieces and (2) recurse on each half. If it is not, this is
+ // the empty array and our base case.
+
+ if (p < r) {
+ // (1) Partitioning.
+ //
+ // The partitioning chooses a pivot between `p` and `r` and moves all
+ // elements that are less than or equal to the pivot to the before it, and
+ // all the elements that are greater than it after it. The effect is that
+ // once partition is done, the pivot is in the exact place it will be when
+ // the array is put in sorted order, and it will not need to be moved
+ // again. This runs in O(n) time.
+
+ // Always choose a random pivot so that an input array which is reverse
+ // sorted does not cause O(n^2) running time.
+ var pivotIndex = randomIntInRange(p, r);
+ var i = p - 1;
+
+ swap(ary, pivotIndex, r);
+ var pivot = ary[r];
+
+ // Immediately after `j` is incremented in this loop, the following hold
+ // true:
+ //
+ // * Every element in `ary[p .. i]` is less than or equal to the pivot.
+ //
+ // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
+ for (var j = p; j < r; j++) {
+ if (comparator(ary[j], pivot) <= 0) {
+ i += 1;
+ swap(ary, i, j);
+ }
+ }
+
+ swap(ary, i + 1, j);
+ var q = i + 1;
+
+ // (2) Recurse on each half.
+
+ doQuickSort(ary, comparator, p, q - 1);
+ doQuickSort(ary, comparator, q + 1, r);
+ }
+}
+
+/**
+ * Sort the given array in-place with the given comparator function.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ */
+var quickSort_1 = function (ary, comparator) {
+ doQuickSort(ary, comparator, 0, ary.length - 1);
+};
+
+var quickSort$1 = {
+ quickSort: quickSort_1
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+
+var ArraySet = arraySet.ArraySet;
+
+var quickSort = quickSort$1.quickSort;
+
+function SourceMapConsumer$1(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ return sourceMap.sections != null
+ ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
+ : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
+}
+
+SourceMapConsumer$1.fromSourceMap = function(aSourceMap, aSourceMapURL) {
+ return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
+};
+
+/**
+ * The version of the source mapping spec that we are consuming.
+ */
+SourceMapConsumer$1.prototype._version = 3;
+
+// `__generatedMappings` and `__originalMappings` are arrays that hold the
+// parsed mapping coordinates from the source map's "mappings" attribute. They
+// are lazily instantiated, accessed via the `_generatedMappings` and
+// `_originalMappings` getters respectively, and we only parse the mappings
+// and create these arrays once queried for a source location. We jump through
+// these hoops because there can be many thousands of mappings, and parsing
+// them is expensive, so we only want to do it if we must.
+//
+// Each object in the arrays is of the form:
+//
+// {
+// generatedLine: The line number in the generated code,
+// generatedColumn: The column number in the generated code,
+// source: The path to the original source file that generated this
+// chunk of code,
+// originalLine: The line number in the original source that
+// corresponds to this chunk of generated code,
+// originalColumn: The column number in the original source that
+// corresponds to this chunk of generated code,
+// name: The name of the original symbol which generated this chunk of
+// code.
+// }
+//
+// All properties except for `generatedLine` and `generatedColumn` can be
+// `null`.
+//
+// `_generatedMappings` is ordered by the generated positions.
+//
+// `_originalMappings` is ordered by the original positions.
+
+SourceMapConsumer$1.prototype.__generatedMappings = null;
+Object.defineProperty(SourceMapConsumer$1.prototype, '_generatedMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__generatedMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappings;
+ }
+});
+
+SourceMapConsumer$1.prototype.__originalMappings = null;
+Object.defineProperty(SourceMapConsumer$1.prototype, '_originalMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__originalMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__originalMappings;
+ }
+});
+
+SourceMapConsumer$1.prototype._charIsMappingSeparator =
+ function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
+ var c = aStr.charAt(index);
+ return c === ";" || c === ",";
+ };
+
+/**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+SourceMapConsumer$1.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ throw new Error("Subclasses must implement _parseMappings");
+ };
+
+SourceMapConsumer$1.GENERATED_ORDER = 1;
+SourceMapConsumer$1.ORIGINAL_ORDER = 2;
+
+SourceMapConsumer$1.GREATEST_LOWER_BOUND = 1;
+SourceMapConsumer$1.LEAST_UPPER_BOUND = 2;
+
+/**
+ * Iterate over each mapping between an original source/line/column and a
+ * generated line/column in this source map.
+ *
+ * @param Function aCallback
+ * The function that is called with each mapping.
+ * @param Object aContext
+ * Optional. If specified, this object will be the value of `this` every
+ * time that `aCallback` is called.
+ * @param aOrder
+ * Either `SourceMapConsumer.GENERATED_ORDER` or
+ * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
+ * iterate over the mappings sorted by the generated file's line/column
+ * order or the original's source/line/column order, respectively. Defaults to
+ * `SourceMapConsumer.GENERATED_ORDER`.
+ */
+SourceMapConsumer$1.prototype.eachMapping =
+ function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
+ var context = aContext || null;
+ var order = aOrder || SourceMapConsumer$1.GENERATED_ORDER;
+
+ var mappings;
+ switch (order) {
+ case SourceMapConsumer$1.GENERATED_ORDER:
+ mappings = this._generatedMappings;
+ break;
+ case SourceMapConsumer$1.ORIGINAL_ORDER:
+ mappings = this._originalMappings;
+ break;
+ default:
+ throw new Error("Unknown order of iteration.");
+ }
+
+ var sourceRoot = this.sourceRoot;
+ mappings.map(function (mapping) {
+ var source = mapping.source === null ? null : this._sources.at(mapping.source);
+ source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
+ return {
+ source: source,
+ generatedLine: mapping.generatedLine,
+ generatedColumn: mapping.generatedColumn,
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: mapping.name === null ? null : this._names.at(mapping.name)
+ };
+ }, this).forEach(aCallback, context);
+ };
+
+/**
+ * Returns all generated line and column information for the original source,
+ * line, and column provided. If no column is provided, returns all mappings
+ * corresponding to a either the line we are searching for or the next
+ * closest line that has any mappings. Otherwise, returns all mappings
+ * corresponding to the given line and either the column we are searching for
+ * or the next closest column that has any offsets.
+ *
+ * The only argument is an object with the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number is 1-based.
+ * - column: Optional. the column number in the original source.
+ * The column number is 0-based.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+SourceMapConsumer$1.prototype.allGeneratedPositionsFor =
+ function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
+ var line = util.getArg(aArgs, 'line');
+
+ // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
+ // returns the index of the closest mapping less than the needle. By
+ // setting needle.originalColumn to 0, we thus find the last mapping for
+ // the given line, provided such a mapping exists.
+ var needle = {
+ source: util.getArg(aArgs, 'source'),
+ originalLine: line,
+ originalColumn: util.getArg(aArgs, 'column', 0)
+ };
+
+ needle.source = this._findSourceIndex(needle.source);
+ if (needle.source < 0) {
+ return [];
+ }
+
+ var mappings = [];
+
+ var index = this._findMapping(needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ binarySearch.LEAST_UPPER_BOUND);
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (aArgs.column === undefined) {
+ var originalLine = mapping.originalLine;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we found. Since
+ // mappings are sorted, this is guaranteed to find all mappings for
+ // the line we found.
+ while (mapping && mapping.originalLine === originalLine) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ } else {
+ var originalColumn = mapping.originalColumn;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we were searching for.
+ // Since mappings are sorted, this is guaranteed to find all mappings for
+ // the line we are searching for.
+ while (mapping &&
+ mapping.originalLine === line &&
+ mapping.originalColumn == originalColumn) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ }
+ }
+
+ return mappings;
+ };
+
+var SourceMapConsumer_1 = SourceMapConsumer$1;
+
+/**
+ * A BasicSourceMapConsumer instance represents a parsed source map which we can
+ * query for information about the original file positions by giving it a file
+ * position in the generated source.
+ *
+ * The first parameter is the raw source map (either as a JSON string, or
+ * already parsed to an object). According to the spec, source maps have the
+ * following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - sources: An array of URLs to the original source files.
+ * - names: An array of identifiers which can be referrenced by individual mappings.
+ * - sourceRoot: Optional. The URL root from which all sources are relative.
+ * - sourcesContent: Optional. An array of contents of the original source files.
+ * - mappings: A string of base64 VLQs which contain the actual mappings.
+ * - file: Optional. The generated file this source map is associated with.
+ *
+ * Here is an example source map, taken from the source map spec[0]:
+ *
+ * {
+ * version : 3,
+ * file: "out.js",
+ * sourceRoot : "",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AA,AB;;ABCDE;"
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sources = util.getArg(sourceMap, 'sources');
+ // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
+ // requires the array) to play nice here.
+ var names = util.getArg(sourceMap, 'names', []);
+ var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
+ var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
+ var mappings = util.getArg(sourceMap, 'mappings');
+ var file = util.getArg(sourceMap, 'file', null);
+
+ // Once again, Sass deviates from the spec and supplies the version as a
+ // string rather than a number, so we use loose equality checking here.
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ if (sourceRoot) {
+ sourceRoot = util.normalize(sourceRoot);
+ }
+
+ sources = sources
+ .map(String)
+ // Some source maps produce relative source paths like "./foo.js" instead of
+ // "foo.js". Normalize these first so that future comparisons will succeed.
+ // See bugzil.la/1090768.
+ .map(util.normalize)
+ // Always ensure that absolute sources are internally stored relative to
+ // the source root, if the source root is absolute. Not doing this would
+ // be particularly problematic when the source root is a prefix of the
+ // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
+ .map(function (source) {
+ return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
+ ? util.relative(sourceRoot, source)
+ : source;
+ });
+
+ // Pass `true` below to allow duplicate names and sources. While source maps
+ // are intended to be compressed and deduplicated, the TypeScript compiler
+ // sometimes generates source maps with duplicates in them. See Github issue
+ // #72 and bugzil.la/889492.
+ this._names = ArraySet.fromArray(names.map(String), true);
+ this._sources = ArraySet.fromArray(sources, true);
+
+ this._absoluteSources = this._sources.toArray().map(function (s) {
+ return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
+ });
+
+ this.sourceRoot = sourceRoot;
+ this.sourcesContent = sourcesContent;
+ this._mappings = mappings;
+ this._sourceMapURL = aSourceMapURL;
+ this.file = file;
+}
+
+BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer$1.prototype);
+BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer$1;
+
+/**
+ * Utility function to find the index of a source. Returns -1 if not
+ * found.
+ */
+BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ if (this._sources.has(relativeSource)) {
+ return this._sources.indexOf(relativeSource);
+ }
+
+ // Maybe aSource is an absolute URL as returned by |sources|. In
+ // this case we can't simply undo the transform.
+ var i;
+ for (i = 0; i < this._absoluteSources.length; ++i) {
+ if (this._absoluteSources[i] == aSource) {
+ return i;
+ }
+ }
+
+ return -1;
+};
+
+/**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @param String aSourceMapURL
+ * The URL at which the source map can be found (optional)
+ * @returns BasicSourceMapConsumer
+ */
+BasicSourceMapConsumer.fromSourceMap =
+ function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
+ var smc = Object.create(BasicSourceMapConsumer.prototype);
+
+ var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
+ var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
+ smc.sourceRoot = aSourceMap._sourceRoot;
+ smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
+ smc.sourceRoot);
+ smc.file = aSourceMap._file;
+ smc._sourceMapURL = aSourceMapURL;
+ smc._absoluteSources = smc._sources.toArray().map(function (s) {
+ return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
+ });
+
+ // Because we are modifying the entries (by converting string sources and
+ // names to indices into the sources and names ArraySets), we have to make
+ // a copy of the entry or else bad things happen. Shared mutable state
+ // strikes again! See github issue #191.
+
+ var generatedMappings = aSourceMap._mappings.toArray().slice();
+ var destGeneratedMappings = smc.__generatedMappings = [];
+ var destOriginalMappings = smc.__originalMappings = [];
+
+ for (var i = 0, length = generatedMappings.length; i < length; i++) {
+ var srcMapping = generatedMappings[i];
+ var destMapping = new Mapping;
+ destMapping.generatedLine = srcMapping.generatedLine;
+ destMapping.generatedColumn = srcMapping.generatedColumn;
+
+ if (srcMapping.source) {
+ destMapping.source = sources.indexOf(srcMapping.source);
+ destMapping.originalLine = srcMapping.originalLine;
+ destMapping.originalColumn = srcMapping.originalColumn;
+
+ if (srcMapping.name) {
+ destMapping.name = names.indexOf(srcMapping.name);
+ }
+
+ destOriginalMappings.push(destMapping);
+ }
+
+ destGeneratedMappings.push(destMapping);
+ }
+
+ quickSort(smc.__originalMappings, util.compareByOriginalPositions);
+
+ return smc;
+ };
+
+/**
+ * The version of the source mapping spec that we are consuming.
+ */
+BasicSourceMapConsumer.prototype._version = 3;
+
+/**
+ * The list of original sources.
+ */
+Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ return this._absoluteSources.slice();
+ }
+});
+
+/**
+ * Provide the JIT with a nice shape / hidden class.
+ */
+function Mapping() {
+ this.generatedLine = 0;
+ this.generatedColumn = 0;
+ this.source = null;
+ this.originalLine = null;
+ this.originalColumn = null;
+ this.name = null;
+}
+
+/**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+BasicSourceMapConsumer.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ var generatedLine = 1;
+ var previousGeneratedColumn = 0;
+ var previousOriginalLine = 0;
+ var previousOriginalColumn = 0;
+ var previousSource = 0;
+ var previousName = 0;
+ var length = aStr.length;
+ var index = 0;
+ var cachedSegments = {};
+ var temp = {};
+ var originalMappings = [];
+ var generatedMappings = [];
+ var mapping, str, segment, end, value;
+
+ while (index < length) {
+ if (aStr.charAt(index) === ';') {
+ generatedLine++;
+ index++;
+ previousGeneratedColumn = 0;
+ }
+ else if (aStr.charAt(index) === ',') {
+ index++;
+ }
+ else {
+ mapping = new Mapping();
+ mapping.generatedLine = generatedLine;
+
+ // Because each offset is encoded relative to the previous one,
+ // many segments often have the same encoding. We can exploit this
+ // fact by caching the parsed variable length fields of each segment,
+ // allowing us to avoid a second parse if we encounter the same
+ // segment again.
+ for (end = index; end < length; end++) {
+ if (this._charIsMappingSeparator(aStr, end)) {
+ break;
+ }
+ }
+ str = aStr.slice(index, end);
+
+ segment = cachedSegments[str];
+ if (segment) {
+ index += str.length;
+ } else {
+ segment = [];
+ while (index < end) {
+ base64Vlq.decode(aStr, index, temp);
+ value = temp.value;
+ index = temp.rest;
+ segment.push(value);
+ }
+
+ if (segment.length === 2) {
+ throw new Error('Found a source, but no line and column');
+ }
+
+ if (segment.length === 3) {
+ throw new Error('Found a source and line, but no column');
+ }
+
+ cachedSegments[str] = segment;
+ }
+
+ // Generated column.
+ mapping.generatedColumn = previousGeneratedColumn + segment[0];
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (segment.length > 1) {
+ // Original source.
+ mapping.source = previousSource + segment[1];
+ previousSource += segment[1];
+
+ // Original line.
+ mapping.originalLine = previousOriginalLine + segment[2];
+ previousOriginalLine = mapping.originalLine;
+ // Lines are stored 0-based
+ mapping.originalLine += 1;
+
+ // Original column.
+ mapping.originalColumn = previousOriginalColumn + segment[3];
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (segment.length > 4) {
+ // Original name.
+ mapping.name = previousName + segment[4];
+ previousName += segment[4];
+ }
+ }
+
+ generatedMappings.push(mapping);
+ if (typeof mapping.originalLine === 'number') {
+ originalMappings.push(mapping);
+ }
+ }
+ }
+
+ quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
+ this.__generatedMappings = generatedMappings;
+
+ quickSort(originalMappings, util.compareByOriginalPositions);
+ this.__originalMappings = originalMappings;
+ };
+
+/**
+ * Find the mapping that best matches the hypothetical "needle" mapping that
+ * we are searching for in the given "haystack" of mappings.
+ */
+BasicSourceMapConsumer.prototype._findMapping =
+ function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
+ aColumnName, aComparator, aBias) {
+ // To return the position we are searching for, we must first find the
+ // mapping for the given position and then return the opposite position it
+ // points to. Because the mappings are sorted, we can use binary search to
+ // find the best mapping.
+
+ if (aNeedle[aLineName] <= 0) {
+ throw new TypeError('Line must be greater than or equal to 1, got '
+ + aNeedle[aLineName]);
+ }
+ if (aNeedle[aColumnName] < 0) {
+ throw new TypeError('Column must be greater than or equal to 0, got '
+ + aNeedle[aColumnName]);
+ }
+
+ return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
+ };
+
+/**
+ * Compute the last column for each generated mapping. The last column is
+ * inclusive.
+ */
+BasicSourceMapConsumer.prototype.computeColumnSpans =
+ function SourceMapConsumer_computeColumnSpans() {
+ for (var index = 0; index < this._generatedMappings.length; ++index) {
+ var mapping = this._generatedMappings[index];
+
+ // Mappings do not contain a field for the last generated columnt. We
+ // can come up with an optimistic estimate, however, by assuming that
+ // mappings are contiguous (i.e. given two consecutive mappings, the
+ // first mapping ends where the second one starts).
+ if (index + 1 < this._generatedMappings.length) {
+ var nextMapping = this._generatedMappings[index + 1];
+
+ if (mapping.generatedLine === nextMapping.generatedLine) {
+ mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
+ continue;
+ }
+ }
+
+ // The last mapping for each line spans the entire line.
+ mapping.lastGeneratedColumn = Infinity;
+ }
+ };
+
+/**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+BasicSourceMapConsumer.prototype.originalPositionFor =
+ function SourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._generatedMappings,
+ "generatedLine",
+ "generatedColumn",
+ util.compareByGeneratedPositionsDeflated,
+ util.getArg(aArgs, 'bias', SourceMapConsumer$1.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._generatedMappings[index];
+
+ if (mapping.generatedLine === needle.generatedLine) {
+ var source = util.getArg(mapping, 'source', null);
+ if (source !== null) {
+ source = this._sources.at(source);
+ source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
+ }
+ var name = util.getArg(mapping, 'name', null);
+ if (name !== null) {
+ name = this._names.at(name);
+ }
+ return {
+ source: source,
+ line: util.getArg(mapping, 'originalLine', null),
+ column: util.getArg(mapping, 'originalColumn', null),
+ name: name
+ };
+ }
+ }
+
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ };
+
+/**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function BasicSourceMapConsumer_hasContentsOfAllSources() {
+ if (!this.sourcesContent) {
+ return false;
+ }
+ return this.sourcesContent.length >= this._sources.size() &&
+ !this.sourcesContent.some(function (sc) { return sc == null; });
+ };
+
+/**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+BasicSourceMapConsumer.prototype.sourceContentFor =
+ function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ if (!this.sourcesContent) {
+ return null;
+ }
+
+ var index = this._findSourceIndex(aSource);
+ if (index >= 0) {
+ return this.sourcesContent[index];
+ }
+
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ var url;
+ if (this.sourceRoot != null
+ && (url = util.urlParse(this.sourceRoot))) {
+ // XXX: file:// URIs and absolute paths lead to unexpected behavior for
+ // many users. We can help them out when they expect file:// URIs to
+ // behave like it would if they were running a local HTTP server. See
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
+ var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
+ if (url.scheme == "file"
+ && this._sources.has(fileUriAbsPath)) {
+ return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
+ }
+
+ if ((!url.path || url.path == "/")
+ && this._sources.has("/" + relativeSource)) {
+ return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
+ }
+ }
+
+ // This function is used recursively from
+ // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
+ // don't want to throw if we can't find the source - we just want to
+ // return null, so we provide a flag to exit gracefully.
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + relativeSource + '" is not in the SourceMap.');
+ }
+ };
+
+/**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+BasicSourceMapConsumer.prototype.generatedPositionFor =
+ function SourceMapConsumer_generatedPositionFor(aArgs) {
+ var source = util.getArg(aArgs, 'source');
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+
+ var needle = {
+ source: source,
+ originalLine: util.getArg(aArgs, 'line'),
+ originalColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ util.getArg(aArgs, 'bias', SourceMapConsumer$1.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (mapping.source === needle.source) {
+ return {
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ };
+ }
+ }
+
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ };
+
+var BasicSourceMapConsumer_1 = BasicSourceMapConsumer;
+
+/**
+ * An IndexedSourceMapConsumer instance represents a parsed source map which
+ * we can query for information. It differs from BasicSourceMapConsumer in
+ * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
+ * input.
+ *
+ * The first parameter is a raw source map (either as a JSON string, or already
+ * parsed to an object). According to the spec for indexed source maps, they
+ * have the following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - file: Optional. The generated file this source map is associated with.
+ * - sections: A list of section definitions.
+ *
+ * Each value under the "sections" field has two fields:
+ * - offset: The offset into the original specified at which this section
+ * begins to apply, defined as an object with a "line" and "column"
+ * field.
+ * - map: A source map definition. This source map could also be indexed,
+ * but doesn't have to be.
+ *
+ * Instead of the "map" field, it's also possible to have a "url" field
+ * specifying a URL to retrieve a source map from, but that's currently
+ * unsupported.
+ *
+ * Here's an example source map, taken from the source map spec[0], but
+ * modified to omit a section which uses the "url" field.
+ *
+ * {
+ * version : 3,
+ * file: "app.js",
+ * sections: [{
+ * offset: {line:100, column:10},
+ * map: {
+ * version : 3,
+ * file: "section.js",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AAAA,E;;ABCDE;"
+ * }
+ * }],
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
+ */
+function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sections = util.getArg(sourceMap, 'sections');
+
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+
+ var lastOffset = {
+ line: -1,
+ column: 0
+ };
+ this._sections = sections.map(function (s) {
+ if (s.url) {
+ // The url field will require support for asynchronicity.
+ // See https://github.com/mozilla/source-map/issues/16
+ throw new Error('Support for url field in sections not implemented.');
+ }
+ var offset = util.getArg(s, 'offset');
+ var offsetLine = util.getArg(offset, 'line');
+ var offsetColumn = util.getArg(offset, 'column');
+
+ if (offsetLine < lastOffset.line ||
+ (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
+ throw new Error('Section offsets must be ordered and non-overlapping.');
+ }
+ lastOffset = offset;
+
+ return {
+ generatedOffset: {
+ // The offset fields are 0-based, but we use 1-based indices when
+ // encoding/decoding from VLQ.
+ generatedLine: offsetLine + 1,
+ generatedColumn: offsetColumn + 1
+ },
+ consumer: new SourceMapConsumer$1(util.getArg(s, 'map'), aSourceMapURL)
+ }
+ });
+}
+
+IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer$1.prototype);
+IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer$1;
+
+/**
+ * The version of the source mapping spec that we are consuming.
+ */
+IndexedSourceMapConsumer.prototype._version = 3;
+
+/**
+ * The list of original sources.
+ */
+Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ var sources = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
+ sources.push(this._sections[i].consumer.sources[j]);
+ }
+ }
+ return sources;
+ }
+});
+
+/**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+IndexedSourceMapConsumer.prototype.originalPositionFor =
+ function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ // Find the section containing the generated position we're trying to map
+ // to an original position.
+ var sectionIndex = binarySearch.search(needle, this._sections,
+ function(needle, section) {
+ var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ return (needle.generatedColumn -
+ section.generatedOffset.generatedColumn);
+ });
+ var section = this._sections[sectionIndex];
+
+ if (!section) {
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ }
+
+ return section.consumer.originalPositionFor({
+ line: needle.generatedLine -
+ (section.generatedOffset.generatedLine - 1),
+ column: needle.generatedColumn -
+ (section.generatedOffset.generatedLine === needle.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ bias: aArgs.bias
+ });
+ };
+
+/**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function IndexedSourceMapConsumer_hasContentsOfAllSources() {
+ return this._sections.every(function (s) {
+ return s.consumer.hasContentsOfAllSources();
+ });
+ };
+
+/**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+IndexedSourceMapConsumer.prototype.sourceContentFor =
+ function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ var content = section.consumer.sourceContentFor(aSource, true);
+ if (content) {
+ return content;
+ }
+ }
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + aSource + '" is not in the SourceMap.');
+ }
+ };
+
+/**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+IndexedSourceMapConsumer.prototype.generatedPositionFor =
+ function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ // Only consider this section if the requested source is in the list of
+ // sources of the consumer.
+ if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
+ continue;
+ }
+ var generatedPosition = section.consumer.generatedPositionFor(aArgs);
+ if (generatedPosition) {
+ var ret = {
+ line: generatedPosition.line +
+ (section.generatedOffset.generatedLine - 1),
+ column: generatedPosition.column +
+ (section.generatedOffset.generatedLine === generatedPosition.line
+ ? section.generatedOffset.generatedColumn - 1
+ : 0)
+ };
+ return ret;
+ }
+ }
+
+ return {
+ line: null,
+ column: null
+ };
+ };
+
+/**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+IndexedSourceMapConsumer.prototype._parseMappings =
+ function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ this.__generatedMappings = [];
+ this.__originalMappings = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+ var sectionMappings = section.consumer._generatedMappings;
+ for (var j = 0; j < sectionMappings.length; j++) {
+ var mapping = sectionMappings[j];
+
+ var source = section.consumer._sources.at(mapping.source);
+ source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
+ this._sources.add(source);
+ source = this._sources.indexOf(source);
+
+ var name = null;
+ if (mapping.name) {
+ name = section.consumer._names.at(mapping.name);
+ this._names.add(name);
+ name = this._names.indexOf(name);
+ }
+
+ // The mappings coming from the consumer for the section have
+ // generated positions relative to the start of the section, so we
+ // need to offset them to be relative to the start of the concatenated
+ // generated file.
+ var adjustedMapping = {
+ source: source,
+ generatedLine: mapping.generatedLine +
+ (section.generatedOffset.generatedLine - 1),
+ generatedColumn: mapping.generatedColumn +
+ (section.generatedOffset.generatedLine === mapping.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: name
+ };
+
+ this.__generatedMappings.push(adjustedMapping);
+ if (typeof adjustedMapping.originalLine === 'number') {
+ this.__originalMappings.push(adjustedMapping);
+ }
+ }
+ }
+
+ quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
+ quickSort(this.__originalMappings, util.compareByOriginalPositions);
+ };
+
+var IndexedSourceMapConsumer_1 = IndexedSourceMapConsumer;
+
+var sourceMapConsumer = {
+ SourceMapConsumer: SourceMapConsumer_1,
+ BasicSourceMapConsumer: BasicSourceMapConsumer_1,
+ IndexedSourceMapConsumer: IndexedSourceMapConsumer_1
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var SourceMapGenerator$1 = sourceMapGenerator.SourceMapGenerator;
+
+
+// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
+// operating systems these days (capturing the result).
+var REGEX_NEWLINE = /(\r?\n)/;
+
+// Newline character code for charCodeAt() comparisons
+var NEWLINE_CODE = 10;
+
+// Private symbol for identifying `SourceNode`s when multiple versions of
+// the source-map library are loaded. This MUST NOT CHANGE across
+// versions!
+var isSourceNode = "$$$isSourceNode$$$";
+
+/**
+ * SourceNodes provide a way to abstract over interpolating/concatenating
+ * snippets of generated JavaScript source code while maintaining the line and
+ * column information associated with the original source code.
+ *
+ * @param aLine The original line number.
+ * @param aColumn The original column number.
+ * @param aSource The original source's filename.
+ * @param aChunks Optional. An array of strings which are snippets of
+ * generated JS, or other SourceNodes.
+ * @param aName The original identifier.
+ */
+function SourceNode$1(aLine, aColumn, aSource, aChunks, aName) {
+ this.children = [];
+ this.sourceContents = {};
+ this.line = aLine == null ? null : aLine;
+ this.column = aColumn == null ? null : aColumn;
+ this.source = aSource == null ? null : aSource;
+ this.name = aName == null ? null : aName;
+ this[isSourceNode] = true;
+ if (aChunks != null) this.add(aChunks);
+}
+
+/**
+ * Creates a SourceNode from generated code and a SourceMapConsumer.
+ *
+ * @param aGeneratedCode The generated code
+ * @param aSourceMapConsumer The SourceMap for the generated code
+ * @param aRelativePath Optional. The path that relative sources in the
+ * SourceMapConsumer should be relative to.
+ */
+SourceNode$1.fromStringWithSourceMap =
+ function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
+ // The SourceNode we want to fill with the generated code
+ // and the SourceMap
+ var node = new SourceNode$1();
+
+ // All even indices of this array are one line of the generated code,
+ // while all odd indices are the newlines between two adjacent lines
+ // (since `REGEX_NEWLINE` captures its match).
+ // Processed fragments are accessed by calling `shiftNextLine`.
+ var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
+ var remainingLinesIndex = 0;
+ var shiftNextLine = function() {
+ var lineContents = getNextLine();
+ // The last line of a file might not have a newline.
+ var newLine = getNextLine() || "";
+ return lineContents + newLine;
+
+ function getNextLine() {
+ return remainingLinesIndex < remainingLines.length ?
+ remainingLines[remainingLinesIndex++] : undefined;
+ }
+ };
+
+ // We need to remember the position of "remainingLines"
+ var lastGeneratedLine = 1, lastGeneratedColumn = 0;
+
+ // The generate SourceNodes we need a code range.
+ // To extract it current and last mapping is used.
+ // Here we store the last mapping.
+ var lastMapping = null;
+
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ if (lastMapping !== null) {
+ // We add the code from "lastMapping" to "mapping":
+ // First check if there is a new line in between.
+ if (lastGeneratedLine < mapping.generatedLine) {
+ // Associate first line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ lastGeneratedLine++;
+ lastGeneratedColumn = 0;
+ // The remaining code is added without mapping
+ } else {
+ // There is no new line in between.
+ // Associate the code between "lastGeneratedColumn" and
+ // "mapping.generatedColumn" with "lastMapping"
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ var code = nextLine.substr(0, mapping.generatedColumn -
+ lastGeneratedColumn);
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
+ lastGeneratedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ addMappingWithCode(lastMapping, code);
+ // No more remaining code, continue
+ lastMapping = mapping;
+ return;
+ }
+ }
+ // We add the generated code until the first mapping
+ // to the SourceNode without any mapping.
+ // Each line is added as separate string.
+ while (lastGeneratedLine < mapping.generatedLine) {
+ node.add(shiftNextLine());
+ lastGeneratedLine++;
+ }
+ if (lastGeneratedColumn < mapping.generatedColumn) {
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ node.add(nextLine.substr(0, mapping.generatedColumn));
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ }
+ lastMapping = mapping;
+ }, this);
+ // We have processed all mappings.
+ if (remainingLinesIndex < remainingLines.length) {
+ if (lastMapping) {
+ // Associate the remaining code in the current line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ }
+ // and add the remaining lines without any mapping
+ node.add(remainingLines.splice(remainingLinesIndex).join(""));
+ }
+
+ // Copy sourcesContent into SourceNode
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aRelativePath != null) {
+ sourceFile = util.join(aRelativePath, sourceFile);
+ }
+ node.setSourceContent(sourceFile, content);
+ }
+ });
+
+ return node;
+
+ function addMappingWithCode(mapping, code) {
+ if (mapping === null || mapping.source === undefined) {
+ node.add(code);
+ } else {
+ var source = aRelativePath
+ ? util.join(aRelativePath, mapping.source)
+ : mapping.source;
+ node.add(new SourceNode$1(mapping.originalLine,
+ mapping.originalColumn,
+ source,
+ code,
+ mapping.name));
+ }
+ }
+ };
+
+/**
+ * Add a chunk of generated JS to this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+SourceNode$1.prototype.add = function SourceNode_add(aChunk) {
+ if (Array.isArray(aChunk)) {
+ aChunk.forEach(function (chunk) {
+ this.add(chunk);
+ }, this);
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ if (aChunk) {
+ this.children.push(aChunk);
+ }
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+};
+
+/**
+ * Add a chunk of generated JS to the beginning of this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+SourceNode$1.prototype.prepend = function SourceNode_prepend(aChunk) {
+ if (Array.isArray(aChunk)) {
+ for (var i = aChunk.length-1; i >= 0; i--) {
+ this.prepend(aChunk[i]);
+ }
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ this.children.unshift(aChunk);
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+};
+
+/**
+ * Walk over the tree of JS snippets in this node and its children. The
+ * walking function is called once for each snippet of JS and is passed that
+ * snippet and the its original associated source's line/column location.
+ *
+ * @param aFn The traversal function.
+ */
+SourceNode$1.prototype.walk = function SourceNode_walk(aFn) {
+ var chunk;
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ chunk = this.children[i];
+ if (chunk[isSourceNode]) {
+ chunk.walk(aFn);
+ }
+ else {
+ if (chunk !== '') {
+ aFn(chunk, { source: this.source,
+ line: this.line,
+ column: this.column,
+ name: this.name });
+ }
+ }
+ }
+};
+
+/**
+ * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
+ * each of `this.children`.
+ *
+ * @param aSep The separator.
+ */
+SourceNode$1.prototype.join = function SourceNode_join(aSep) {
+ var newChildren;
+ var i;
+ var len = this.children.length;
+ if (len > 0) {
+ newChildren = [];
+ for (i = 0; i < len-1; i++) {
+ newChildren.push(this.children[i]);
+ newChildren.push(aSep);
+ }
+ newChildren.push(this.children[i]);
+ this.children = newChildren;
+ }
+ return this;
+};
+
+/**
+ * Call String.prototype.replace on the very right-most source snippet. Useful
+ * for trimming whitespace from the end of a source node, etc.
+ *
+ * @param aPattern The pattern to replace.
+ * @param aReplacement The thing to replace the pattern with.
+ */
+SourceNode$1.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
+ var lastChild = this.children[this.children.length - 1];
+ if (lastChild[isSourceNode]) {
+ lastChild.replaceRight(aPattern, aReplacement);
+ }
+ else if (typeof lastChild === 'string') {
+ this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
+ }
+ else {
+ this.children.push(''.replace(aPattern, aReplacement));
+ }
+ return this;
+};
+
+/**
+ * Set the source content for a source file. This will be added to the SourceMapGenerator
+ * in the sourcesContent field.
+ *
+ * @param aSourceFile The filename of the source file
+ * @param aSourceContent The content of the source file
+ */
+SourceNode$1.prototype.setSourceContent =
+ function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
+ this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
+ };
+
+/**
+ * Walk over the tree of SourceNodes. The walking function is called for each
+ * source file content and is passed the filename and source content.
+ *
+ * @param aFn The traversal function.
+ */
+SourceNode$1.prototype.walkSourceContents =
+ function SourceNode_walkSourceContents(aFn) {
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ if (this.children[i][isSourceNode]) {
+ this.children[i].walkSourceContents(aFn);
+ }
+ }
+
+ var sources = Object.keys(this.sourceContents);
+ for (var i = 0, len = sources.length; i < len; i++) {
+ aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
+ }
+ };
+
+/**
+ * Return the string representation of this source node. Walks over the tree
+ * and concatenates all the various snippets together to one string.
+ */
+SourceNode$1.prototype.toString = function SourceNode_toString() {
+ var str = "";
+ this.walk(function (chunk) {
+ str += chunk;
+ });
+ return str;
+};
+
+/**
+ * Returns the string representation of this source node along with a source
+ * map.
+ */
+SourceNode$1.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
+ var generated = {
+ code: "",
+ line: 1,
+ column: 0
+ };
+ var map = new SourceMapGenerator$1(aArgs);
+ var sourceMappingActive = false;
+ var lastOriginalSource = null;
+ var lastOriginalLine = null;
+ var lastOriginalColumn = null;
+ var lastOriginalName = null;
+ this.walk(function (chunk, original) {
+ generated.code += chunk;
+ if (original.source !== null
+ && original.line !== null
+ && original.column !== null) {
+ if(lastOriginalSource !== original.source
+ || lastOriginalLine !== original.line
+ || lastOriginalColumn !== original.column
+ || lastOriginalName !== original.name) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ lastOriginalSource = original.source;
+ lastOriginalLine = original.line;
+ lastOriginalColumn = original.column;
+ lastOriginalName = original.name;
+ sourceMappingActive = true;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ generated: {
+ line: generated.line,
+ column: generated.column
+ }
+ });
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ }
+ for (var idx = 0, length = chunk.length; idx < length; idx++) {
+ if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
+ generated.line++;
+ generated.column = 0;
+ // Mappings end at eol
+ if (idx + 1 === length) {
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ } else {
+ generated.column++;
+ }
+ }
+ });
+ this.walkSourceContents(function (sourceFile, sourceContent) {
+ map.setSourceContent(sourceFile, sourceContent);
+ });
+
+ return { code: generated.code, map: map };
+};
+
+var SourceNode_1 = SourceNode$1;
+
+var sourceNode = {
+ SourceNode: SourceNode_1
+};
+
+/*
+ * Copyright 2009-2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE.txt or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var SourceMapGenerator = sourceMapGenerator.SourceMapGenerator;
+var SourceMapConsumer = sourceMapConsumer.SourceMapConsumer;
+var SourceNode = sourceNode.SourceNode;
+
+var sourceMap = {
+ SourceMapGenerator: SourceMapGenerator,
+ SourceMapConsumer: SourceMapConsumer,
+ SourceNode: SourceNode
+};
+
+const name="escodegen";const description="ECMAScript code generator";const homepage="http://github.com/estools/escodegen";const main="escodegen.js";const bin={esgenerate:"./bin/esgenerate.js",escodegen:"./bin/escodegen.js"};const files=["LICENSE.BSD","README.md","bin","escodegen.js","package.json"];const version="1.14.1";const engines={node:">=4.0"};const maintainers=[{name:"Yusuke Suzuki",email:"utatane.tea@gmail.com",web:"http://github.com/Constellation"}];const repository={type:"git",url:"http://github.com/estools/escodegen.git"};const dependencies={estraverse:"^4.2.0",esutils:"^2.0.2",esprima:"^4.0.1",optionator:"^0.8.1"};const optionalDependencies={"source-map":"~0.6.1"};const devDependencies={acorn:"^7.1.0",bluebird:"^3.4.7","bower-registry-client":"^1.0.0",chai:"^3.5.0","commonjs-everywhere":"^0.9.7",gulp:"^3.8.10","gulp-eslint":"^3.0.1","gulp-mocha":"^3.0.1",semver:"^5.1.0"};const license="BSD-2-Clause";const scripts={test:"gulp travis","unit-test":"gulp test",lint:"gulp lint",release:"node tools/release.js","build-min":"./node_modules/.bin/cjsify -ma path: tools/entry-point.js > escodegen.browser.min.js",build:"./node_modules/.bin/cjsify -a path: tools/entry-point.js > escodegen.browser.js"};var require$$3 = {name:name,description:description,homepage:homepage,main:main,bin:bin,files:files,version:version,engines:engines,maintainers:maintainers,repository:repository,dependencies:dependencies,optionalDependencies:optionalDependencies,devDependencies:devDependencies,license:license,scripts:scripts};
+
+/*
+ Copyright (C) 2012-2014 Yusuke Suzuki
+ Copyright (C) 2015 Ingvar Stepanyan
+ Copyright (C) 2014 Ivan Nikulin
+ Copyright (C) 2012-2013 Michael Ficarra
+ Copyright (C) 2012-2013 Mathias Bynens
+ Copyright (C) 2013 Irakli Gozalishvili
+ Copyright (C) 2012 Robert Gust-Bardon
+ Copyright (C) 2012 John Freeman
+ Copyright (C) 2011-2012 Ariya Hidayat
+ Copyright (C) 2012 Joost-Wim Boekesteijn
+ Copyright (C) 2012 Kris Kowal
+ Copyright (C) 2012 Arpad Borsos
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var escodegen = createCommonjsModule(function (module, exports) {
+/*global exports:true, require:true, global:true*/
+(function () {
+ 'use strict';
+
+ var Syntax,
+ Precedence,
+ BinaryPrecedence,
+ SourceNode,
+ estraverse$1,
+ esutils,
+ base,
+ indent,
+ json,
+ renumber,
+ hexadecimal,
+ quotes,
+ escapeless,
+ newline,
+ space,
+ parentheses,
+ semicolons,
+ safeConcatenation,
+ directive,
+ extra,
+ parse,
+ sourceMap$1,
+ sourceCode,
+ preserveBlankLines,
+ FORMAT_MINIFY,
+ FORMAT_DEFAULTS;
+
+ estraverse$1 = estraverse;
+ esutils = utils;
+
+ Syntax = estraverse$1.Syntax;
+
+ // Generation is done by generateExpression.
+ function isExpression(node) {
+ return CodeGenerator.Expression.hasOwnProperty(node.type);
+ }
+
+ // Generation is done by generateStatement.
+ function isStatement(node) {
+ return CodeGenerator.Statement.hasOwnProperty(node.type);
+ }
+
+ Precedence = {
+ Sequence: 0,
+ Yield: 1,
+ Assignment: 1,
+ Conditional: 2,
+ ArrowFunction: 2,
+ LogicalOR: 3,
+ LogicalAND: 4,
+ BitwiseOR: 5,
+ BitwiseXOR: 6,
+ BitwiseAND: 7,
+ Equality: 8,
+ Relational: 9,
+ BitwiseSHIFT: 10,
+ Additive: 11,
+ Multiplicative: 12,
+ Exponentiation: 13,
+ Await: 14,
+ Unary: 14,
+ Postfix: 15,
+ Call: 16,
+ New: 17,
+ TaggedTemplate: 18,
+ Member: 19,
+ Primary: 20
+ };
+
+ BinaryPrecedence = {
+ '||': Precedence.LogicalOR,
+ '&&': Precedence.LogicalAND,
+ '|': Precedence.BitwiseOR,
+ '^': Precedence.BitwiseXOR,
+ '&': Precedence.BitwiseAND,
+ '==': Precedence.Equality,
+ '!=': Precedence.Equality,
+ '===': Precedence.Equality,
+ '!==': Precedence.Equality,
+ 'is': Precedence.Equality,
+ 'isnt': Precedence.Equality,
+ '<': Precedence.Relational,
+ '>': Precedence.Relational,
+ '<=': Precedence.Relational,
+ '>=': Precedence.Relational,
+ 'in': Precedence.Relational,
+ 'instanceof': Precedence.Relational,
+ '<<': Precedence.BitwiseSHIFT,
+ '>>': Precedence.BitwiseSHIFT,
+ '>>>': Precedence.BitwiseSHIFT,
+ '+': Precedence.Additive,
+ '-': Precedence.Additive,
+ '*': Precedence.Multiplicative,
+ '%': Precedence.Multiplicative,
+ '/': Precedence.Multiplicative,
+ '**': Precedence.Exponentiation
+ };
+
+ //Flags
+ var F_ALLOW_IN = 1,
+ F_ALLOW_CALL = 1 << 1,
+ F_ALLOW_UNPARATH_NEW = 1 << 2,
+ F_FUNC_BODY = 1 << 3,
+ F_DIRECTIVE_CTX = 1 << 4,
+ F_SEMICOLON_OPT = 1 << 5;
+
+ //Expression flag sets
+ //NOTE: Flag order:
+ // F_ALLOW_IN
+ // F_ALLOW_CALL
+ // F_ALLOW_UNPARATH_NEW
+ var E_FTT = F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,
+ E_TTF = F_ALLOW_IN | F_ALLOW_CALL,
+ E_TTT = F_ALLOW_IN | F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,
+ E_TFF = F_ALLOW_IN,
+ E_FFT = F_ALLOW_UNPARATH_NEW,
+ E_TFT = F_ALLOW_IN | F_ALLOW_UNPARATH_NEW;
+
+ //Statement flag sets
+ //NOTE: Flag order:
+ // F_ALLOW_IN
+ // F_FUNC_BODY
+ // F_DIRECTIVE_CTX
+ // F_SEMICOLON_OPT
+ var S_TFFF = F_ALLOW_IN,
+ S_TFFT = F_ALLOW_IN | F_SEMICOLON_OPT,
+ S_FFFF = 0x00,
+ S_TFTF = F_ALLOW_IN | F_DIRECTIVE_CTX,
+ S_TTFF = F_ALLOW_IN | F_FUNC_BODY;
+
+ function getDefaultOptions() {
+ // default options
+ return {
+ indent: null,
+ base: null,
+ parse: null,
+ comment: false,
+ format: {
+ indent: {
+ style: ' ',
+ base: 0,
+ adjustMultilineComment: false
+ },
+ newline: '\n',
+ space: ' ',
+ json: false,
+ renumber: false,
+ hexadecimal: false,
+ quotes: 'single',
+ escapeless: false,
+ compact: false,
+ parentheses: true,
+ semicolons: true,
+ safeConcatenation: false,
+ preserveBlankLines: false
+ },
+ moz: {
+ comprehensionExpressionStartsWithAssignment: false,
+ starlessGenerator: false
+ },
+ sourceMap: null,
+ sourceMapRoot: null,
+ sourceMapWithCode: false,
+ directive: false,
+ raw: true,
+ verbatim: null,
+ sourceCode: null
+ };
+ }
+
+ function stringRepeat(str, num) {
+ var result = '';
+
+ for (num |= 0; num > 0; num >>>= 1, str += str) {
+ if (num & 1) {
+ result += str;
+ }
+ }
+
+ return result;
+ }
+
+ function hasLineTerminator(str) {
+ return (/[\r\n]/g).test(str);
+ }
+
+ function endsWithLineTerminator(str) {
+ var len = str.length;
+ return len && esutils.code.isLineTerminator(str.charCodeAt(len - 1));
+ }
+
+ function merge(target, override) {
+ var key;
+ for (key in override) {
+ if (override.hasOwnProperty(key)) {
+ target[key] = override[key];
+ }
+ }
+ return target;
+ }
+
+ function updateDeeply(target, override) {
+ var key, val;
+
+ function isHashObject(target) {
+ return typeof target === 'object' && target instanceof Object && !(target instanceof RegExp);
+ }
+
+ for (key in override) {
+ if (override.hasOwnProperty(key)) {
+ val = override[key];
+ if (isHashObject(val)) {
+ if (isHashObject(target[key])) {
+ updateDeeply(target[key], val);
+ } else {
+ target[key] = updateDeeply({}, val);
+ }
+ } else {
+ target[key] = val;
+ }
+ }
+ }
+ return target;
+ }
+
+ function generateNumber(value) {
+ var result, point, temp, exponent, pos;
+
+ if (value !== value) {
+ throw new Error('Numeric literal whose value is NaN');
+ }
+ if (value < 0 || (value === 0 && 1 / value < 0)) {
+ throw new Error('Numeric literal whose value is negative');
+ }
+
+ if (value === 1 / 0) {
+ return json ? 'null' : renumber ? '1e400' : '1e+400';
+ }
+
+ result = '' + value;
+ if (!renumber || result.length < 3) {
+ return result;
+ }
+
+ point = result.indexOf('.');
+ if (!json && result.charCodeAt(0) === 0x30 /* 0 */ && point === 1) {
+ point = 0;
+ result = result.slice(1);
+ }
+ temp = result;
+ result = result.replace('e+', 'e');
+ exponent = 0;
+ if ((pos = temp.indexOf('e')) > 0) {
+ exponent = +temp.slice(pos + 1);
+ temp = temp.slice(0, pos);
+ }
+ if (point >= 0) {
+ exponent -= temp.length - point - 1;
+ temp = +(temp.slice(0, point) + temp.slice(point + 1)) + '';
+ }
+ pos = 0;
+ while (temp.charCodeAt(temp.length + pos - 1) === 0x30 /* 0 */) {
+ --pos;
+ }
+ if (pos !== 0) {
+ exponent -= pos;
+ temp = temp.slice(0, pos);
+ }
+ if (exponent !== 0) {
+ temp += 'e' + exponent;
+ }
+ if ((temp.length < result.length ||
+ (hexadecimal && value > 1e12 && Math.floor(value) === value && (temp = '0x' + value.toString(16)).length < result.length)) &&
+ +temp === value) {
+ result = temp;
+ }
+
+ return result;
+ }
+
+ // Generate valid RegExp expression.
+ // This function is based on https://github.com/Constellation/iv Engine
+
+ function escapeRegExpCharacter(ch, previousIsBackslash) {
+ // not handling '\' and handling \u2028 or \u2029 to unicode escape sequence
+ if ((ch & ~1) === 0x2028) {
+ return (previousIsBackslash ? 'u' : '\\u') + ((ch === 0x2028) ? '2028' : '2029');
+ } else if (ch === 10 || ch === 13) { // \n, \r
+ return (previousIsBackslash ? '' : '\\') + ((ch === 10) ? 'n' : 'r');
+ }
+ return String.fromCharCode(ch);
+ }
+
+ function generateRegExp(reg) {
+ var match, result, flags, i, iz, ch, characterInBrack, previousIsBackslash;
+
+ result = reg.toString();
+
+ if (reg.source) {
+ // extract flag from toString result
+ match = result.match(/\/([^/]*)$/);
+ if (!match) {
+ return result;
+ }
+
+ flags = match[1];
+ result = '';
+
+ characterInBrack = false;
+ previousIsBackslash = false;
+ for (i = 0, iz = reg.source.length; i < iz; ++i) {
+ ch = reg.source.charCodeAt(i);
+
+ if (!previousIsBackslash) {
+ if (characterInBrack) {
+ if (ch === 93) { // ]
+ characterInBrack = false;
+ }
+ } else {
+ if (ch === 47) { // /
+ result += '\\';
+ } else if (ch === 91) { // [
+ characterInBrack = true;
+ }
+ }
+ result += escapeRegExpCharacter(ch, previousIsBackslash);
+ previousIsBackslash = ch === 92; // \
+ } else {
+ // if new RegExp("\\\n') is provided, create /\n/
+ result += escapeRegExpCharacter(ch, previousIsBackslash);
+ // prevent like /\\[/]/
+ previousIsBackslash = false;
+ }
+ }
+
+ return '/' + result + '/' + flags;
+ }
+
+ return result;
+ }
+
+ function escapeAllowedCharacter(code, next) {
+ var hex;
+
+ if (code === 0x08 /* \b */) {
+ return '\\b';
+ }
+
+ if (code === 0x0C /* \f */) {
+ return '\\f';
+ }
+
+ if (code === 0x09 /* \t */) {
+ return '\\t';
+ }
+
+ hex = code.toString(16).toUpperCase();
+ if (json || code > 0xFF) {
+ return '\\u' + '0000'.slice(hex.length) + hex;
+ } else if (code === 0x0000 && !esutils.code.isDecimalDigit(next)) {
+ return '\\0';
+ } else if (code === 0x000B /* \v */) { // '\v'
+ return '\\x0B';
+ } else {
+ return '\\x' + '00'.slice(hex.length) + hex;
+ }
+ }
+
+ function escapeDisallowedCharacter(code) {
+ if (code === 0x5C /* \ */) {
+ return '\\\\';
+ }
+
+ if (code === 0x0A /* \n */) {
+ return '\\n';
+ }
+
+ if (code === 0x0D /* \r */) {
+ return '\\r';
+ }
+
+ if (code === 0x2028) {
+ return '\\u2028';
+ }
+
+ if (code === 0x2029) {
+ return '\\u2029';
+ }
+
+ throw new Error('Incorrectly classified character');
+ }
+
+ function escapeDirective(str) {
+ var i, iz, code, quote;
+
+ quote = quotes === 'double' ? '"' : '\'';
+ for (i = 0, iz = str.length; i < iz; ++i) {
+ code = str.charCodeAt(i);
+ if (code === 0x27 /* ' */) {
+ quote = '"';
+ break;
+ } else if (code === 0x22 /* " */) {
+ quote = '\'';
+ break;
+ } else if (code === 0x5C /* \ */) {
+ ++i;
+ }
+ }
+
+ return quote + str + quote;
+ }
+
+ function escapeString(str) {
+ var result = '', i, len, code, singleQuotes = 0, doubleQuotes = 0, single, quote;
+
+ for (i = 0, len = str.length; i < len; ++i) {
+ code = str.charCodeAt(i);
+ if (code === 0x27 /* ' */) {
+ ++singleQuotes;
+ } else if (code === 0x22 /* " */) {
+ ++doubleQuotes;
+ } else if (code === 0x2F /* / */ && json) {
+ result += '\\';
+ } else if (esutils.code.isLineTerminator(code) || code === 0x5C /* \ */) {
+ result += escapeDisallowedCharacter(code);
+ continue;
+ } else if (!esutils.code.isIdentifierPartES5(code) && (json && code < 0x20 /* SP */ || !json && !escapeless && (code < 0x20 /* SP */ || code > 0x7E /* ~ */))) {
+ result += escapeAllowedCharacter(code, str.charCodeAt(i + 1));
+ continue;
+ }
+ result += String.fromCharCode(code);
+ }
+
+ single = !(quotes === 'double' || (quotes === 'auto' && doubleQuotes < singleQuotes));
+ quote = single ? '\'' : '"';
+
+ if (!(single ? singleQuotes : doubleQuotes)) {
+ return quote + result + quote;
+ }
+
+ str = result;
+ result = quote;
+
+ for (i = 0, len = str.length; i < len; ++i) {
+ code = str.charCodeAt(i);
+ if ((code === 0x27 /* ' */ && single) || (code === 0x22 /* " */ && !single)) {
+ result += '\\';
+ }
+ result += String.fromCharCode(code);
+ }
+
+ return result + quote;
+ }
+
+ /**
+ * flatten an array to a string, where the array can contain
+ * either strings or nested arrays
+ */
+ function flattenToString(arr) {
+ var i, iz, elem, result = '';
+ for (i = 0, iz = arr.length; i < iz; ++i) {
+ elem = arr[i];
+ result += Array.isArray(elem) ? flattenToString(elem) : elem;
+ }
+ return result;
+ }
+
+ /**
+ * convert generated to a SourceNode when source maps are enabled.
+ */
+ function toSourceNodeWhenNeeded(generated, node) {
+ if (!sourceMap$1) {
+ // with no source maps, generated is either an
+ // array or a string. if an array, flatten it.
+ // if a string, just return it
+ if (Array.isArray(generated)) {
+ return flattenToString(generated);
+ } else {
+ return generated;
+ }
+ }
+ if (node == null) {
+ if (generated instanceof SourceNode) {
+ return generated;
+ } else {
+ node = {};
+ }
+ }
+ if (node.loc == null) {
+ return new SourceNode(null, null, sourceMap$1, generated, node.name || null);
+ }
+ return new SourceNode(node.loc.start.line, node.loc.start.column, (sourceMap$1 === true ? node.loc.source || null : sourceMap$1), generated, node.name || null);
+ }
+
+ function noEmptySpace() {
+ return (space) ? space : ' ';
+ }
+
+ function join(left, right) {
+ var leftSource,
+ rightSource,
+ leftCharCode,
+ rightCharCode;
+
+ leftSource = toSourceNodeWhenNeeded(left).toString();
+ if (leftSource.length === 0) {
+ return [right];
+ }
+
+ rightSource = toSourceNodeWhenNeeded(right).toString();
+ if (rightSource.length === 0) {
+ return [left];
+ }
+
+ leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
+ rightCharCode = rightSource.charCodeAt(0);
+
+ if ((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode ||
+ esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode) ||
+ leftCharCode === 0x2F /* / */ && rightCharCode === 0x69 /* i */) { // infix word operators all start with `i`
+ return [left, noEmptySpace(), right];
+ } else if (esutils.code.isWhiteSpace(leftCharCode) || esutils.code.isLineTerminator(leftCharCode) ||
+ esutils.code.isWhiteSpace(rightCharCode) || esutils.code.isLineTerminator(rightCharCode)) {
+ return [left, right];
+ }
+ return [left, space, right];
+ }
+
+ function addIndent(stmt) {
+ return [base, stmt];
+ }
+
+ function withIndent(fn) {
+ var previousBase;
+ previousBase = base;
+ base += indent;
+ fn(base);
+ base = previousBase;
+ }
+
+ function calculateSpaces(str) {
+ var i;
+ for (i = str.length - 1; i >= 0; --i) {
+ if (esutils.code.isLineTerminator(str.charCodeAt(i))) {
+ break;
+ }
+ }
+ return (str.length - 1) - i;
+ }
+
+ function adjustMultilineComment(value, specialBase) {
+ var array, i, len, line, j, spaces, previousBase, sn;
+
+ array = value.split(/\r\n|[\r\n]/);
+ spaces = Number.MAX_VALUE;
+
+ // first line doesn't have indentation
+ for (i = 1, len = array.length; i < len; ++i) {
+ line = array[i];
+ j = 0;
+ while (j < line.length && esutils.code.isWhiteSpace(line.charCodeAt(j))) {
+ ++j;
+ }
+ if (spaces > j) {
+ spaces = j;
+ }
+ }
+
+ if (typeof specialBase !== 'undefined') {
+ // pattern like
+ // {
+ // var t = 20; /*
+ // * this is comment
+ // */
+ // }
+ previousBase = base;
+ if (array[1][spaces] === '*') {
+ specialBase += ' ';
+ }
+ base = specialBase;
+ } else {
+ if (spaces & 1) {
+ // /*
+ // *
+ // */
+ // If spaces are odd number, above pattern is considered.
+ // We waste 1 space.
+ --spaces;
+ }
+ previousBase = base;
+ }
+
+ for (i = 1, len = array.length; i < len; ++i) {
+ sn = toSourceNodeWhenNeeded(addIndent(array[i].slice(spaces)));
+ array[i] = sourceMap$1 ? sn.join('') : sn;
+ }
+
+ base = previousBase;
+
+ return array.join('\n');
+ }
+
+ function generateComment(comment, specialBase) {
+ if (comment.type === 'Line') {
+ if (endsWithLineTerminator(comment.value)) {
+ return '//' + comment.value;
+ } else {
+ // Always use LineTerminator
+ var result = '//' + comment.value;
+ if (!preserveBlankLines) {
+ result += '\n';
+ }
+ return result;
+ }
+ }
+ if (extra.format.indent.adjustMultilineComment && /[\n\r]/.test(comment.value)) {
+ return adjustMultilineComment('/*' + comment.value + '*/', specialBase);
+ }
+ return '/*' + comment.value + '*/';
+ }
+
+ function addComments(stmt, result) {
+ var i, len, comment, save, tailingToStatement, specialBase, fragment,
+ extRange, range, prevRange, prefix, infix, suffix, count;
+
+ if (stmt.leadingComments && stmt.leadingComments.length > 0) {
+ save = result;
+
+ if (preserveBlankLines) {
+ comment = stmt.leadingComments[0];
+ result = [];
+
+ extRange = comment.extendedRange;
+ range = comment.range;
+
+ prefix = sourceCode.substring(extRange[0], range[0]);
+ count = (prefix.match(/\n/g) || []).length;
+ if (count > 0) {
+ result.push(stringRepeat('\n', count));
+ result.push(addIndent(generateComment(comment)));
+ } else {
+ result.push(prefix);
+ result.push(generateComment(comment));
+ }
+
+ prevRange = range;
+
+ for (i = 1, len = stmt.leadingComments.length; i < len; i++) {
+ comment = stmt.leadingComments[i];
+ range = comment.range;
+
+ infix = sourceCode.substring(prevRange[1], range[0]);
+ count = (infix.match(/\n/g) || []).length;
+ result.push(stringRepeat('\n', count));
+ result.push(addIndent(generateComment(comment)));
+
+ prevRange = range;
+ }
+
+ suffix = sourceCode.substring(range[1], extRange[1]);
+ count = (suffix.match(/\n/g) || []).length;
+ result.push(stringRepeat('\n', count));
+ } else {
+ comment = stmt.leadingComments[0];
+ result = [];
+ if (safeConcatenation && stmt.type === Syntax.Program && stmt.body.length === 0) {
+ result.push('\n');
+ }
+ result.push(generateComment(comment));
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push('\n');
+ }
+
+ for (i = 1, len = stmt.leadingComments.length; i < len; ++i) {
+ comment = stmt.leadingComments[i];
+ fragment = [generateComment(comment)];
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ fragment.push('\n');
+ }
+ result.push(addIndent(fragment));
+ }
+ }
+
+ result.push(addIndent(save));
+ }
+
+ if (stmt.trailingComments) {
+
+ if (preserveBlankLines) {
+ comment = stmt.trailingComments[0];
+ extRange = comment.extendedRange;
+ range = comment.range;
+
+ prefix = sourceCode.substring(extRange[0], range[0]);
+ count = (prefix.match(/\n/g) || []).length;
+
+ if (count > 0) {
+ result.push(stringRepeat('\n', count));
+ result.push(addIndent(generateComment(comment)));
+ } else {
+ result.push(prefix);
+ result.push(generateComment(comment));
+ }
+ } else {
+ tailingToStatement = !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());
+ specialBase = stringRepeat(' ', calculateSpaces(toSourceNodeWhenNeeded([base, result, indent]).toString()));
+ for (i = 0, len = stmt.trailingComments.length; i < len; ++i) {
+ comment = stmt.trailingComments[i];
+ if (tailingToStatement) {
+ // We assume target like following script
+ //
+ // var t = 20; /**
+ // * This is comment of t
+ // */
+ if (i === 0) {
+ // first case
+ result = [result, indent];
+ } else {
+ result = [result, specialBase];
+ }
+ result.push(generateComment(comment, specialBase));
+ } else {
+ result = [result, addIndent(generateComment(comment))];
+ }
+ if (i !== len - 1 && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result = [result, '\n'];
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+
+ function generateBlankLines(start, end, result) {
+ var j, newlineCount = 0;
+
+ for (j = start; j < end; j++) {
+ if (sourceCode[j] === '\n') {
+ newlineCount++;
+ }
+ }
+
+ for (j = 1; j < newlineCount; j++) {
+ result.push(newline);
+ }
+ }
+
+ function parenthesize(text, current, should) {
+ if (current < should) {
+ return ['(', text, ')'];
+ }
+ return text;
+ }
+
+ function generateVerbatimString(string) {
+ var i, iz, result;
+ result = string.split(/\r\n|\n/);
+ for (i = 1, iz = result.length; i < iz; i++) {
+ result[i] = newline + base + result[i];
+ }
+ return result;
+ }
+
+ function generateVerbatim(expr, precedence) {
+ var verbatim, result, prec;
+ verbatim = expr[extra.verbatim];
+
+ if (typeof verbatim === 'string') {
+ result = parenthesize(generateVerbatimString(verbatim), Precedence.Sequence, precedence);
+ } else {
+ // verbatim is object
+ result = generateVerbatimString(verbatim.content);
+ prec = (verbatim.precedence != null) ? verbatim.precedence : Precedence.Sequence;
+ result = parenthesize(result, prec, precedence);
+ }
+
+ return toSourceNodeWhenNeeded(result, expr);
+ }
+
+ function CodeGenerator() {
+ }
+
+ // Helpers.
+
+ CodeGenerator.prototype.maybeBlock = function(stmt, flags) {
+ var result, noLeadingComment, that = this;
+
+ noLeadingComment = !extra.comment || !stmt.leadingComments;
+
+ if (stmt.type === Syntax.BlockStatement && noLeadingComment) {
+ return [space, this.generateStatement(stmt, flags)];
+ }
+
+ if (stmt.type === Syntax.EmptyStatement && noLeadingComment) {
+ return ';';
+ }
+
+ withIndent(function () {
+ result = [
+ newline,
+ addIndent(that.generateStatement(stmt, flags))
+ ];
+ });
+
+ return result;
+ };
+
+ CodeGenerator.prototype.maybeBlockSuffix = function (stmt, result) {
+ var ends = endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());
+ if (stmt.type === Syntax.BlockStatement && (!extra.comment || !stmt.leadingComments) && !ends) {
+ return [result, space];
+ }
+ if (ends) {
+ return [result, base];
+ }
+ return [result, newline, base];
+ };
+
+ function generateIdentifier(node) {
+ return toSourceNodeWhenNeeded(node.name, node);
+ }
+
+ function generateAsyncPrefix(node, spaceRequired) {
+ return node.async ? 'async' + (spaceRequired ? noEmptySpace() : space) : '';
+ }
+
+ function generateStarSuffix(node) {
+ var isGenerator = node.generator && !extra.moz.starlessGenerator;
+ return isGenerator ? '*' + space : '';
+ }
+
+ function generateMethodPrefix(prop) {
+ var func = prop.value, prefix = '';
+ if (func.async) {
+ prefix += generateAsyncPrefix(func, !prop.computed);
+ }
+ if (func.generator) {
+ // avoid space before method name
+ prefix += generateStarSuffix(func) ? '*' : '';
+ }
+ return prefix;
+ }
+
+ CodeGenerator.prototype.generatePattern = function (node, precedence, flags) {
+ if (node.type === Syntax.Identifier) {
+ return generateIdentifier(node);
+ }
+ return this.generateExpression(node, precedence, flags);
+ };
+
+ CodeGenerator.prototype.generateFunctionParams = function (node) {
+ var i, iz, result, hasDefault;
+
+ hasDefault = false;
+
+ if (node.type === Syntax.ArrowFunctionExpression &&
+ !node.rest && (!node.defaults || node.defaults.length === 0) &&
+ node.params.length === 1 && node.params[0].type === Syntax.Identifier) {
+ // arg => { } case
+ result = [generateAsyncPrefix(node, true), generateIdentifier(node.params[0])];
+ } else {
+ result = node.type === Syntax.ArrowFunctionExpression ? [generateAsyncPrefix(node, false)] : [];
+ result.push('(');
+ if (node.defaults) {
+ hasDefault = true;
+ }
+ for (i = 0, iz = node.params.length; i < iz; ++i) {
+ if (hasDefault && node.defaults[i]) {
+ // Handle default values.
+ result.push(this.generateAssignment(node.params[i], node.defaults[i], '=', Precedence.Assignment, E_TTT));
+ } else {
+ result.push(this.generatePattern(node.params[i], Precedence.Assignment, E_TTT));
+ }
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+
+ if (node.rest) {
+ if (node.params.length) {
+ result.push(',' + space);
+ }
+ result.push('...');
+ result.push(generateIdentifier(node.rest));
+ }
+
+ result.push(')');
+ }
+
+ return result;
+ };
+
+ CodeGenerator.prototype.generateFunctionBody = function (node) {
+ var result, expr;
+
+ result = this.generateFunctionParams(node);
+
+ if (node.type === Syntax.ArrowFunctionExpression) {
+ result.push(space);
+ result.push('=>');
+ }
+
+ if (node.expression) {
+ result.push(space);
+ expr = this.generateExpression(node.body, Precedence.Assignment, E_TTT);
+ if (expr.toString().charAt(0) === '{') {
+ expr = ['(', expr, ')'];
+ }
+ result.push(expr);
+ } else {
+ result.push(this.maybeBlock(node.body, S_TTFF));
+ }
+
+ return result;
+ };
+
+ CodeGenerator.prototype.generateIterationForStatement = function (operator, stmt, flags) {
+ var result = ['for' + (stmt.await ? noEmptySpace() + 'await' : '') + space + '('], that = this;
+ withIndent(function () {
+ if (stmt.left.type === Syntax.VariableDeclaration) {
+ withIndent(function () {
+ result.push(stmt.left.kind + noEmptySpace());
+ result.push(that.generateStatement(stmt.left.declarations[0], S_FFFF));
+ });
+ } else {
+ result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT));
+ }
+
+ result = join(result, operator);
+ result = [join(
+ result,
+ that.generateExpression(stmt.right, Precedence.Assignment, E_TTT)
+ ), ')'];
+ });
+ result.push(this.maybeBlock(stmt.body, flags));
+ return result;
+ };
+
+ CodeGenerator.prototype.generatePropertyKey = function (expr, computed) {
+ var result = [];
+
+ if (computed) {
+ result.push('[');
+ }
+
+ result.push(this.generateExpression(expr, Precedence.Sequence, E_TTT));
+
+ if (computed) {
+ result.push(']');
+ }
+
+ return result;
+ };
+
+ CodeGenerator.prototype.generateAssignment = function (left, right, operator, precedence, flags) {
+ if (Precedence.Assignment < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+
+ return parenthesize(
+ [
+ this.generateExpression(left, Precedence.Call, flags),
+ space + operator + space,
+ this.generateExpression(right, Precedence.Assignment, flags)
+ ],
+ Precedence.Assignment,
+ precedence
+ );
+ };
+
+ CodeGenerator.prototype.semicolon = function (flags) {
+ if (!semicolons && flags & F_SEMICOLON_OPT) {
+ return '';
+ }
+ return ';';
+ };
+
+ // Statements.
+
+ CodeGenerator.Statement = {
+
+ BlockStatement: function (stmt, flags) {
+ var range, content, result = ['{', newline], that = this;
+
+ withIndent(function () {
+ // handle functions without any code
+ if (stmt.body.length === 0 && preserveBlankLines) {
+ range = stmt.range;
+ if (range[1] - range[0] > 2) {
+ content = sourceCode.substring(range[0] + 1, range[1] - 1);
+ if (content[0] === '\n') {
+ result = ['{'];
+ }
+ result.push(content);
+ }
+ }
+
+ var i, iz, fragment, bodyFlags;
+ bodyFlags = S_TFFF;
+ if (flags & F_FUNC_BODY) {
+ bodyFlags |= F_DIRECTIVE_CTX;
+ }
+
+ for (i = 0, iz = stmt.body.length; i < iz; ++i) {
+ if (preserveBlankLines) {
+ // handle spaces before the first line
+ if (i === 0) {
+ if (stmt.body[0].leadingComments) {
+ range = stmt.body[0].leadingComments[0].extendedRange;
+ content = sourceCode.substring(range[0], range[1]);
+ if (content[0] === '\n') {
+ result = ['{'];
+ }
+ }
+ if (!stmt.body[0].leadingComments) {
+ generateBlankLines(stmt.range[0], stmt.body[0].range[0], result);
+ }
+ }
+
+ // handle spaces between lines
+ if (i > 0) {
+ if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) {
+ generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);
+ }
+ }
+ }
+
+ if (i === iz - 1) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+
+ if (stmt.body[i].leadingComments && preserveBlankLines) {
+ fragment = that.generateStatement(stmt.body[i], bodyFlags);
+ } else {
+ fragment = addIndent(that.generateStatement(stmt.body[i], bodyFlags));
+ }
+
+ result.push(fragment);
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ if (preserveBlankLines && i < iz - 1) {
+ // don't add a new line if there are leading coments
+ // in the next statement
+ if (!stmt.body[i + 1].leadingComments) {
+ result.push(newline);
+ }
+ } else {
+ result.push(newline);
+ }
+ }
+
+ if (preserveBlankLines) {
+ // handle spaces after the last line
+ if (i === iz - 1) {
+ if (!stmt.body[i].trailingComments) {
+ generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);
+ }
+ }
+ }
+ }
+ });
+
+ result.push(addIndent('}'));
+ return result;
+ },
+
+ BreakStatement: function (stmt, flags) {
+ if (stmt.label) {
+ return 'break ' + stmt.label.name + this.semicolon(flags);
+ }
+ return 'break' + this.semicolon(flags);
+ },
+
+ ContinueStatement: function (stmt, flags) {
+ if (stmt.label) {
+ return 'continue ' + stmt.label.name + this.semicolon(flags);
+ }
+ return 'continue' + this.semicolon(flags);
+ },
+
+ ClassBody: function (stmt, flags) {
+ var result = [ '{', newline], that = this;
+
+ withIndent(function (indent) {
+ var i, iz;
+
+ for (i = 0, iz = stmt.body.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(stmt.body[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(newline);
+ }
+ }
+ });
+
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base);
+ result.push('}');
+ return result;
+ },
+
+ ClassDeclaration: function (stmt, flags) {
+ var result, fragment;
+ result = ['class'];
+ if (stmt.id) {
+ result = join(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT));
+ }
+ if (stmt.superClass) {
+ fragment = join('extends', this.generateExpression(stmt.superClass, Precedence.Unary, E_TTT));
+ result = join(result, fragment);
+ }
+ result.push(space);
+ result.push(this.generateStatement(stmt.body, S_TFFT));
+ return result;
+ },
+
+ DirectiveStatement: function (stmt, flags) {
+ if (extra.raw && stmt.raw) {
+ return stmt.raw + this.semicolon(flags);
+ }
+ return escapeDirective(stmt.directive) + this.semicolon(flags);
+ },
+
+ DoWhileStatement: function (stmt, flags) {
+ // Because `do 42 while (cond)` is Syntax Error. We need semicolon.
+ var result = join('do', this.maybeBlock(stmt.body, S_TFFF));
+ result = this.maybeBlockSuffix(stmt.body, result);
+ return join(result, [
+ 'while' + space + '(',
+ this.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
+ ')' + this.semicolon(flags)
+ ]);
+ },
+
+ CatchClause: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ var guard;
+
+ if (stmt.param) {
+ result = [
+ 'catch' + space + '(',
+ that.generateExpression(stmt.param, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+
+ if (stmt.guard) {
+ guard = that.generateExpression(stmt.guard, Precedence.Sequence, E_TTT);
+ result.splice(2, 0, ' if ', guard);
+ }
+ } else {
+ result = ['catch'];
+ }
+ });
+ result.push(this.maybeBlock(stmt.body, S_TFFF));
+ return result;
+ },
+
+ DebuggerStatement: function (stmt, flags) {
+ return 'debugger' + this.semicolon(flags);
+ },
+
+ EmptyStatement: function (stmt, flags) {
+ return ';';
+ },
+
+ ExportDefaultDeclaration: function (stmt, flags) {
+ var result = [ 'export' ], bodyFlags;
+
+ bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF;
+
+ // export default HoistableDeclaration[Default]
+ // export default AssignmentExpression[In] ;
+ result = join(result, 'default');
+ if (isStatement(stmt.declaration)) {
+ result = join(result, this.generateStatement(stmt.declaration, bodyFlags));
+ } else {
+ result = join(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags));
+ }
+ return result;
+ },
+
+ ExportNamedDeclaration: function (stmt, flags) {
+ var result = [ 'export' ], bodyFlags, that = this;
+
+ bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF;
+
+ // export VariableStatement
+ // export Declaration[Default]
+ if (stmt.declaration) {
+ return join(result, this.generateStatement(stmt.declaration, bodyFlags));
+ }
+
+ // export ExportClause[NoReference] FromClause ;
+ // export ExportClause ;
+ if (stmt.specifiers) {
+ if (stmt.specifiers.length === 0) {
+ result = join(result, '{' + space + '}');
+ } else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) {
+ result = join(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT));
+ } else {
+ result = join(result, '{');
+ withIndent(function (indent) {
+ var i, iz;
+ result.push(newline);
+ for (i = 0, iz = stmt.specifiers.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + newline);
+ }
+ }
+ });
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base + '}');
+ }
+
+ if (stmt.source) {
+ result = join(result, [
+ 'from' + space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ]);
+ } else {
+ result.push(this.semicolon(flags));
+ }
+ }
+ return result;
+ },
+
+ ExportAllDeclaration: function (stmt, flags) {
+ // export * FromClause ;
+ return [
+ 'export' + space,
+ '*' + space,
+ 'from' + space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ];
+ },
+
+ ExpressionStatement: function (stmt, flags) {
+ var result, fragment;
+
+ function isClassPrefixed(fragment) {
+ var code;
+ if (fragment.slice(0, 5) !== 'class') {
+ return false;
+ }
+ code = fragment.charCodeAt(5);
+ return code === 0x7B /* '{' */ || esutils.code.isWhiteSpace(code) || esutils.code.isLineTerminator(code);
+ }
+
+ function isFunctionPrefixed(fragment) {
+ var code;
+ if (fragment.slice(0, 8) !== 'function') {
+ return false;
+ }
+ code = fragment.charCodeAt(8);
+ return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code);
+ }
+
+ function isAsyncPrefixed(fragment) {
+ var code, i, iz;
+ if (fragment.slice(0, 5) !== 'async') {
+ return false;
+ }
+ if (!esutils.code.isWhiteSpace(fragment.charCodeAt(5))) {
+ return false;
+ }
+ for (i = 6, iz = fragment.length; i < iz; ++i) {
+ if (!esutils.code.isWhiteSpace(fragment.charCodeAt(i))) {
+ break;
+ }
+ }
+ if (i === iz) {
+ return false;
+ }
+ if (fragment.slice(i, i + 8) !== 'function') {
+ return false;
+ }
+ code = fragment.charCodeAt(i + 8);
+ return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code);
+ }
+
+ result = [this.generateExpression(stmt.expression, Precedence.Sequence, E_TTT)];
+ // 12.4 '{', 'function', 'class' is not allowed in this position.
+ // wrap expression with parentheses
+ fragment = toSourceNodeWhenNeeded(result).toString();
+ if (fragment.charCodeAt(0) === 0x7B /* '{' */ || // ObjectExpression
+ isClassPrefixed(fragment) ||
+ isFunctionPrefixed(fragment) ||
+ isAsyncPrefixed(fragment) ||
+ (directive && (flags & F_DIRECTIVE_CTX) && stmt.expression.type === Syntax.Literal && typeof stmt.expression.value === 'string')) {
+ result = ['(', result, ')' + this.semicolon(flags)];
+ } else {
+ result.push(this.semicolon(flags));
+ }
+ return result;
+ },
+
+ ImportDeclaration: function (stmt, flags) {
+ // ES6: 15.2.1 valid import declarations:
+ // - import ImportClause FromClause ;
+ // - import ModuleSpecifier ;
+ var result, cursor, that = this;
+
+ // If no ImportClause is present,
+ // this should be `import ModuleSpecifier` so skip `from`
+ // ModuleSpecifier is StringLiteral.
+ if (stmt.specifiers.length === 0) {
+ // import ModuleSpecifier ;
+ return [
+ 'import',
+ space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ];
+ }
+
+ // import ImportClause FromClause ;
+ result = [
+ 'import'
+ ];
+ cursor = 0;
+
+ // ImportedBinding
+ if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) {
+ result = join(result, [
+ this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
+ ]);
+ ++cursor;
+ }
+
+ if (stmt.specifiers[cursor]) {
+ if (cursor !== 0) {
+ result.push(',');
+ }
+
+ if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) {
+ // NameSpaceImport
+ result = join(result, [
+ space,
+ this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
+ ]);
+ } else {
+ // NamedImports
+ result.push(space + '{');
+
+ if ((stmt.specifiers.length - cursor) === 1) {
+ // import { ... } from "...";
+ result.push(space);
+ result.push(this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT));
+ result.push(space + '}' + space);
+ } else {
+ // import {
+ // ...,
+ // ...,
+ // } from "...";
+ withIndent(function (indent) {
+ var i, iz;
+ result.push(newline);
+ for (i = cursor, iz = stmt.specifiers.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + newline);
+ }
+ }
+ });
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base + '}' + space);
+ }
+ }
+ }
+
+ result = join(result, [
+ 'from' + space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ]);
+ return result;
+ },
+
+ VariableDeclarator: function (stmt, flags) {
+ var itemFlags = (flags & F_ALLOW_IN) ? E_TTT : E_FTT;
+ if (stmt.init) {
+ return [
+ this.generateExpression(stmt.id, Precedence.Assignment, itemFlags),
+ space,
+ '=',
+ space,
+ this.generateExpression(stmt.init, Precedence.Assignment, itemFlags)
+ ];
+ }
+ return this.generatePattern(stmt.id, Precedence.Assignment, itemFlags);
+ },
+
+ VariableDeclaration: function (stmt, flags) {
+ // VariableDeclarator is typed as Statement,
+ // but joined with comma (not LineTerminator).
+ // So if comment is attached to target node, we should specialize.
+ var result, i, iz, node, bodyFlags, that = this;
+
+ result = [ stmt.kind ];
+
+ bodyFlags = (flags & F_ALLOW_IN) ? S_TFFF : S_FFFF;
+
+ function block() {
+ node = stmt.declarations[0];
+ if (extra.comment && node.leadingComments) {
+ result.push('\n');
+ result.push(addIndent(that.generateStatement(node, bodyFlags)));
+ } else {
+ result.push(noEmptySpace());
+ result.push(that.generateStatement(node, bodyFlags));
+ }
+
+ for (i = 1, iz = stmt.declarations.length; i < iz; ++i) {
+ node = stmt.declarations[i];
+ if (extra.comment && node.leadingComments) {
+ result.push(',' + newline);
+ result.push(addIndent(that.generateStatement(node, bodyFlags)));
+ } else {
+ result.push(',' + space);
+ result.push(that.generateStatement(node, bodyFlags));
+ }
+ }
+ }
+
+ if (stmt.declarations.length > 1) {
+ withIndent(block);
+ } else {
+ block();
+ }
+
+ result.push(this.semicolon(flags));
+
+ return result;
+ },
+
+ ThrowStatement: function (stmt, flags) {
+ return [join(
+ 'throw',
+ this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
+ ), this.semicolon(flags)];
+ },
+
+ TryStatement: function (stmt, flags) {
+ var result, i, iz, guardedHandlers;
+
+ result = ['try', this.maybeBlock(stmt.block, S_TFFF)];
+ result = this.maybeBlockSuffix(stmt.block, result);
+
+ if (stmt.handlers) {
+ // old interface
+ for (i = 0, iz = stmt.handlers.length; i < iz; ++i) {
+ result = join(result, this.generateStatement(stmt.handlers[i], S_TFFF));
+ if (stmt.finalizer || i + 1 !== iz) {
+ result = this.maybeBlockSuffix(stmt.handlers[i].body, result);
+ }
+ }
+ } else {
+ guardedHandlers = stmt.guardedHandlers || [];
+
+ for (i = 0, iz = guardedHandlers.length; i < iz; ++i) {
+ result = join(result, this.generateStatement(guardedHandlers[i], S_TFFF));
+ if (stmt.finalizer || i + 1 !== iz) {
+ result = this.maybeBlockSuffix(guardedHandlers[i].body, result);
+ }
+ }
+
+ // new interface
+ if (stmt.handler) {
+ if (Array.isArray(stmt.handler)) {
+ for (i = 0, iz = stmt.handler.length; i < iz; ++i) {
+ result = join(result, this.generateStatement(stmt.handler[i], S_TFFF));
+ if (stmt.finalizer || i + 1 !== iz) {
+ result = this.maybeBlockSuffix(stmt.handler[i].body, result);
+ }
+ }
+ } else {
+ result = join(result, this.generateStatement(stmt.handler, S_TFFF));
+ if (stmt.finalizer) {
+ result = this.maybeBlockSuffix(stmt.handler.body, result);
+ }
+ }
+ }
+ }
+ if (stmt.finalizer) {
+ result = join(result, ['finally', this.maybeBlock(stmt.finalizer, S_TFFF)]);
+ }
+ return result;
+ },
+
+ SwitchStatement: function (stmt, flags) {
+ var result, fragment, i, iz, bodyFlags, that = this;
+ withIndent(function () {
+ result = [
+ 'switch' + space + '(',
+ that.generateExpression(stmt.discriminant, Precedence.Sequence, E_TTT),
+ ')' + space + '{' + newline
+ ];
+ });
+ if (stmt.cases) {
+ bodyFlags = S_TFFF;
+ for (i = 0, iz = stmt.cases.length; i < iz; ++i) {
+ if (i === iz - 1) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+ fragment = addIndent(this.generateStatement(stmt.cases[i], bodyFlags));
+ result.push(fragment);
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ result.push(newline);
+ }
+ }
+ }
+ result.push(addIndent('}'));
+ return result;
+ },
+
+ SwitchCase: function (stmt, flags) {
+ var result, fragment, i, iz, bodyFlags, that = this;
+ withIndent(function () {
+ if (stmt.test) {
+ result = [
+ join('case', that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)),
+ ':'
+ ];
+ } else {
+ result = ['default:'];
+ }
+
+ i = 0;
+ iz = stmt.consequent.length;
+ if (iz && stmt.consequent[0].type === Syntax.BlockStatement) {
+ fragment = that.maybeBlock(stmt.consequent[0], S_TFFF);
+ result.push(fragment);
+ i = 1;
+ }
+
+ if (i !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+
+ bodyFlags = S_TFFF;
+ for (; i < iz; ++i) {
+ if (i === iz - 1 && flags & F_SEMICOLON_OPT) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+ fragment = addIndent(that.generateStatement(stmt.consequent[i], bodyFlags));
+ result.push(fragment);
+ if (i + 1 !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ result.push(newline);
+ }
+ }
+ });
+ return result;
+ },
+
+ IfStatement: function (stmt, flags) {
+ var result, bodyFlags, semicolonOptional, that = this;
+ withIndent(function () {
+ result = [
+ 'if' + space + '(',
+ that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+ });
+ semicolonOptional = flags & F_SEMICOLON_OPT;
+ bodyFlags = S_TFFF;
+ if (semicolonOptional) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+ if (stmt.alternate) {
+ result.push(this.maybeBlock(stmt.consequent, S_TFFF));
+ result = this.maybeBlockSuffix(stmt.consequent, result);
+ if (stmt.alternate.type === Syntax.IfStatement) {
+ result = join(result, ['else ', this.generateStatement(stmt.alternate, bodyFlags)]);
+ } else {
+ result = join(result, join('else', this.maybeBlock(stmt.alternate, bodyFlags)));
+ }
+ } else {
+ result.push(this.maybeBlock(stmt.consequent, bodyFlags));
+ }
+ return result;
+ },
+
+ ForStatement: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ result = ['for' + space + '('];
+ if (stmt.init) {
+ if (stmt.init.type === Syntax.VariableDeclaration) {
+ result.push(that.generateStatement(stmt.init, S_FFFF));
+ } else {
+ // F_ALLOW_IN becomes false.
+ result.push(that.generateExpression(stmt.init, Precedence.Sequence, E_FTT));
+ result.push(';');
+ }
+ } else {
+ result.push(';');
+ }
+
+ if (stmt.test) {
+ result.push(space);
+ result.push(that.generateExpression(stmt.test, Precedence.Sequence, E_TTT));
+ result.push(';');
+ } else {
+ result.push(';');
+ }
+
+ if (stmt.update) {
+ result.push(space);
+ result.push(that.generateExpression(stmt.update, Precedence.Sequence, E_TTT));
+ result.push(')');
+ } else {
+ result.push(')');
+ }
+ });
+
+ result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
+ return result;
+ },
+
+ ForInStatement: function (stmt, flags) {
+ return this.generateIterationForStatement('in', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);
+ },
+
+ ForOfStatement: function (stmt, flags) {
+ return this.generateIterationForStatement('of', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);
+ },
+
+ LabeledStatement: function (stmt, flags) {
+ return [stmt.label.name + ':', this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)];
+ },
+
+ Program: function (stmt, flags) {
+ var result, fragment, i, iz, bodyFlags;
+ iz = stmt.body.length;
+ result = [safeConcatenation && iz > 0 ? '\n' : ''];
+ bodyFlags = S_TFTF;
+ for (i = 0; i < iz; ++i) {
+ if (!safeConcatenation && i === iz - 1) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+
+ if (preserveBlankLines) {
+ // handle spaces before the first line
+ if (i === 0) {
+ if (!stmt.body[0].leadingComments) {
+ generateBlankLines(stmt.range[0], stmt.body[i].range[0], result);
+ }
+ }
+
+ // handle spaces between lines
+ if (i > 0) {
+ if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) {
+ generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);
+ }
+ }
+ }
+
+ fragment = addIndent(this.generateStatement(stmt.body[i], bodyFlags));
+ result.push(fragment);
+ if (i + 1 < iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ if (preserveBlankLines) {
+ if (!stmt.body[i + 1].leadingComments) {
+ result.push(newline);
+ }
+ } else {
+ result.push(newline);
+ }
+ }
+
+ if (preserveBlankLines) {
+ // handle spaces after the last line
+ if (i === iz - 1) {
+ if (!stmt.body[i].trailingComments) {
+ generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);
+ }
+ }
+ }
+ }
+ return result;
+ },
+
+ FunctionDeclaration: function (stmt, flags) {
+ return [
+ generateAsyncPrefix(stmt, true),
+ 'function',
+ generateStarSuffix(stmt) || noEmptySpace(),
+ stmt.id ? generateIdentifier(stmt.id) : '',
+ this.generateFunctionBody(stmt)
+ ];
+ },
+
+ ReturnStatement: function (stmt, flags) {
+ if (stmt.argument) {
+ return [join(
+ 'return',
+ this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
+ ), this.semicolon(flags)];
+ }
+ return ['return' + this.semicolon(flags)];
+ },
+
+ WhileStatement: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ result = [
+ 'while' + space + '(',
+ that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+ });
+ result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
+ return result;
+ },
+
+ WithStatement: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ result = [
+ 'with' + space + '(',
+ that.generateExpression(stmt.object, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+ });
+ result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
+ return result;
+ }
+
+ };
+
+ merge(CodeGenerator.prototype, CodeGenerator.Statement);
+
+ // Expressions.
+
+ CodeGenerator.Expression = {
+
+ SequenceExpression: function (expr, precedence, flags) {
+ var result, i, iz;
+ if (Precedence.Sequence < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+ result = [];
+ for (i = 0, iz = expr.expressions.length; i < iz; ++i) {
+ result.push(this.generateExpression(expr.expressions[i], Precedence.Assignment, flags));
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+ return parenthesize(result, Precedence.Sequence, precedence);
+ },
+
+ AssignmentExpression: function (expr, precedence, flags) {
+ return this.generateAssignment(expr.left, expr.right, expr.operator, precedence, flags);
+ },
+
+ ArrowFunctionExpression: function (expr, precedence, flags) {
+ return parenthesize(this.generateFunctionBody(expr), Precedence.ArrowFunction, precedence);
+ },
+
+ ConditionalExpression: function (expr, precedence, flags) {
+ if (Precedence.Conditional < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+ return parenthesize(
+ [
+ this.generateExpression(expr.test, Precedence.LogicalOR, flags),
+ space + '?' + space,
+ this.generateExpression(expr.consequent, Precedence.Assignment, flags),
+ space + ':' + space,
+ this.generateExpression(expr.alternate, Precedence.Assignment, flags)
+ ],
+ Precedence.Conditional,
+ precedence
+ );
+ },
+
+ LogicalExpression: function (expr, precedence, flags) {
+ return this.BinaryExpression(expr, precedence, flags);
+ },
+
+ BinaryExpression: function (expr, precedence, flags) {
+ var result, leftPrecedence, rightPrecedence, currentPrecedence, fragment, leftSource;
+ currentPrecedence = BinaryPrecedence[expr.operator];
+ leftPrecedence = expr.operator === '**' ? Precedence.Postfix : currentPrecedence;
+ rightPrecedence = expr.operator === '**' ? currentPrecedence : currentPrecedence + 1;
+
+ if (currentPrecedence < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+
+ fragment = this.generateExpression(expr.left, leftPrecedence, flags);
+
+ leftSource = fragment.toString();
+
+ if (leftSource.charCodeAt(leftSource.length - 1) === 0x2F /* / */ && esutils.code.isIdentifierPartES5(expr.operator.charCodeAt(0))) {
+ result = [fragment, noEmptySpace(), expr.operator];
+ } else {
+ result = join(fragment, expr.operator);
+ }
+
+ fragment = this.generateExpression(expr.right, rightPrecedence, flags);
+
+ if (expr.operator === '/' && fragment.toString().charAt(0) === '/' ||
+ expr.operator.slice(-1) === '<' && fragment.toString().slice(0, 3) === '!--') {
+ // If '/' concats with '/' or `<` concats with `!--`, it is interpreted as comment start
+ result.push(noEmptySpace());
+ result.push(fragment);
+ } else {
+ result = join(result, fragment);
+ }
+
+ if (expr.operator === 'in' && !(flags & F_ALLOW_IN)) {
+ return ['(', result, ')'];
+ }
+ return parenthesize(result, currentPrecedence, precedence);
+ },
+
+ CallExpression: function (expr, precedence, flags) {
+ var result, i, iz;
+ // F_ALLOW_UNPARATH_NEW becomes false.
+ result = [this.generateExpression(expr.callee, Precedence.Call, E_TTF)];
+ result.push('(');
+ for (i = 0, iz = expr['arguments'].length; i < iz; ++i) {
+ result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+ result.push(')');
+
+ if (!(flags & F_ALLOW_CALL)) {
+ return ['(', result, ')'];
+ }
+ return parenthesize(result, Precedence.Call, precedence);
+ },
+
+ NewExpression: function (expr, precedence, flags) {
+ var result, length, i, iz, itemFlags;
+ length = expr['arguments'].length;
+
+ // F_ALLOW_CALL becomes false.
+ // F_ALLOW_UNPARATH_NEW may become false.
+ itemFlags = (flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0) ? E_TFT : E_TFF;
+
+ result = join(
+ 'new',
+ this.generateExpression(expr.callee, Precedence.New, itemFlags)
+ );
+
+ if (!(flags & F_ALLOW_UNPARATH_NEW) || parentheses || length > 0) {
+ result.push('(');
+ for (i = 0, iz = length; i < iz; ++i) {
+ result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+ result.push(')');
+ }
+
+ return parenthesize(result, Precedence.New, precedence);
+ },
+
+ MemberExpression: function (expr, precedence, flags) {
+ var result, fragment;
+
+ // F_ALLOW_UNPARATH_NEW becomes false.
+ result = [this.generateExpression(expr.object, Precedence.Call, (flags & F_ALLOW_CALL) ? E_TTF : E_TFF)];
+
+ if (expr.computed) {
+ result.push('[');
+ result.push(this.generateExpression(expr.property, Precedence.Sequence, flags & F_ALLOW_CALL ? E_TTT : E_TFT));
+ result.push(']');
+ } else {
+ if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') {
+ fragment = toSourceNodeWhenNeeded(result).toString();
+ // When the following conditions are all true,
+ // 1. No floating point
+ // 2. Don't have exponents
+ // 3. The last character is a decimal digit
+ // 4. Not hexadecimal OR octal number literal
+ // we should add a floating point.
+ if (
+ fragment.indexOf('.') < 0 &&
+ !/[eExX]/.test(fragment) &&
+ esutils.code.isDecimalDigit(fragment.charCodeAt(fragment.length - 1)) &&
+ !(fragment.length >= 2 && fragment.charCodeAt(0) === 48) // '0'
+ ) {
+ result.push(' ');
+ }
+ }
+ result.push('.');
+ result.push(generateIdentifier(expr.property));
+ }
+
+ return parenthesize(result, Precedence.Member, precedence);
+ },
+
+ MetaProperty: function (expr, precedence, flags) {
+ var result;
+ result = [];
+ result.push(typeof expr.meta === "string" ? expr.meta : generateIdentifier(expr.meta));
+ result.push('.');
+ result.push(typeof expr.property === "string" ? expr.property : generateIdentifier(expr.property));
+ return parenthesize(result, Precedence.Member, precedence);
+ },
+
+ UnaryExpression: function (expr, precedence, flags) {
+ var result, fragment, rightCharCode, leftSource, leftCharCode;
+ fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT);
+
+ if (space === '') {
+ result = join(expr.operator, fragment);
+ } else {
+ result = [expr.operator];
+ if (expr.operator.length > 2) {
+ // delete, void, typeof
+ // get `typeof []`, not `typeof[]`
+ result = join(result, fragment);
+ } else {
+ // Prevent inserting spaces between operator and argument if it is unnecessary
+ // like, `!cond`
+ leftSource = toSourceNodeWhenNeeded(result).toString();
+ leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
+ rightCharCode = fragment.toString().charCodeAt(0);
+
+ if (((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode) ||
+ (esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode))) {
+ result.push(noEmptySpace());
+ result.push(fragment);
+ } else {
+ result.push(fragment);
+ }
+ }
+ }
+ return parenthesize(result, Precedence.Unary, precedence);
+ },
+
+ YieldExpression: function (expr, precedence, flags) {
+ var result;
+ if (expr.delegate) {
+ result = 'yield*';
+ } else {
+ result = 'yield';
+ }
+ if (expr.argument) {
+ result = join(
+ result,
+ this.generateExpression(expr.argument, Precedence.Yield, E_TTT)
+ );
+ }
+ return parenthesize(result, Precedence.Yield, precedence);
+ },
+
+ AwaitExpression: function (expr, precedence, flags) {
+ var result = join(
+ expr.all ? 'await*' : 'await',
+ this.generateExpression(expr.argument, Precedence.Await, E_TTT)
+ );
+ return parenthesize(result, Precedence.Await, precedence);
+ },
+
+ UpdateExpression: function (expr, precedence, flags) {
+ if (expr.prefix) {
+ return parenthesize(
+ [
+ expr.operator,
+ this.generateExpression(expr.argument, Precedence.Unary, E_TTT)
+ ],
+ Precedence.Unary,
+ precedence
+ );
+ }
+ return parenthesize(
+ [
+ this.generateExpression(expr.argument, Precedence.Postfix, E_TTT),
+ expr.operator
+ ],
+ Precedence.Postfix,
+ precedence
+ );
+ },
+
+ FunctionExpression: function (expr, precedence, flags) {
+ var result = [
+ generateAsyncPrefix(expr, true),
+ 'function'
+ ];
+ if (expr.id) {
+ result.push(generateStarSuffix(expr) || noEmptySpace());
+ result.push(generateIdentifier(expr.id));
+ } else {
+ result.push(generateStarSuffix(expr) || space);
+ }
+ result.push(this.generateFunctionBody(expr));
+ return result;
+ },
+
+ ArrayPattern: function (expr, precedence, flags) {
+ return this.ArrayExpression(expr, precedence, flags, true);
+ },
+
+ ArrayExpression: function (expr, precedence, flags, isPattern) {
+ var result, multiline, that = this;
+ if (!expr.elements.length) {
+ return '[]';
+ }
+ multiline = isPattern ? false : expr.elements.length > 1;
+ result = ['[', multiline ? newline : ''];
+ withIndent(function (indent) {
+ var i, iz;
+ for (i = 0, iz = expr.elements.length; i < iz; ++i) {
+ if (!expr.elements[i]) {
+ if (multiline) {
+ result.push(indent);
+ }
+ if (i + 1 === iz) {
+ result.push(',');
+ }
+ } else {
+ result.push(multiline ? indent : '');
+ result.push(that.generateExpression(expr.elements[i], Precedence.Assignment, E_TTT));
+ }
+ if (i + 1 < iz) {
+ result.push(',' + (multiline ? newline : space));
+ }
+ }
+ });
+ if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(multiline ? base : '');
+ result.push(']');
+ return result;
+ },
+
+ RestElement: function(expr, precedence, flags) {
+ return '...' + this.generatePattern(expr.argument);
+ },
+
+ ClassExpression: function (expr, precedence, flags) {
+ var result, fragment;
+ result = ['class'];
+ if (expr.id) {
+ result = join(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT));
+ }
+ if (expr.superClass) {
+ fragment = join('extends', this.generateExpression(expr.superClass, Precedence.Unary, E_TTT));
+ result = join(result, fragment);
+ }
+ result.push(space);
+ result.push(this.generateStatement(expr.body, S_TFFT));
+ return result;
+ },
+
+ MethodDefinition: function (expr, precedence, flags) {
+ var result, fragment;
+ if (expr['static']) {
+ result = ['static' + space];
+ } else {
+ result = [];
+ }
+ if (expr.kind === 'get' || expr.kind === 'set') {
+ fragment = [
+ join(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),
+ this.generateFunctionBody(expr.value)
+ ];
+ } else {
+ fragment = [
+ generateMethodPrefix(expr),
+ this.generatePropertyKey(expr.key, expr.computed),
+ this.generateFunctionBody(expr.value)
+ ];
+ }
+ return join(result, fragment);
+ },
+
+ Property: function (expr, precedence, flags) {
+ if (expr.kind === 'get' || expr.kind === 'set') {
+ return [
+ expr.kind, noEmptySpace(),
+ this.generatePropertyKey(expr.key, expr.computed),
+ this.generateFunctionBody(expr.value)
+ ];
+ }
+
+ if (expr.shorthand) {
+ if (expr.value.type === "AssignmentPattern") {
+ return this.AssignmentPattern(expr.value, Precedence.Sequence, E_TTT);
+ }
+ return this.generatePropertyKey(expr.key, expr.computed);
+ }
+
+ if (expr.method) {
+ return [
+ generateMethodPrefix(expr),
+ this.generatePropertyKey(expr.key, expr.computed),
+ this.generateFunctionBody(expr.value)
+ ];
+ }
+
+ return [
+ this.generatePropertyKey(expr.key, expr.computed),
+ ':' + space,
+ this.generateExpression(expr.value, Precedence.Assignment, E_TTT)
+ ];
+ },
+
+ ObjectExpression: function (expr, precedence, flags) {
+ var multiline, result, fragment, that = this;
+
+ if (!expr.properties.length) {
+ return '{}';
+ }
+ multiline = expr.properties.length > 1;
+
+ withIndent(function () {
+ fragment = that.generateExpression(expr.properties[0], Precedence.Sequence, E_TTT);
+ });
+
+ if (!multiline) {
+ // issues 4
+ // Do not transform from
+ // dejavu.Class.declare({
+ // method2: function () {}
+ // });
+ // to
+ // dejavu.Class.declare({method2: function () {
+ // }});
+ if (!hasLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ return [ '{', space, fragment, space, '}' ];
+ }
+ }
+
+ withIndent(function (indent) {
+ var i, iz;
+ result = [ '{', newline, indent, fragment ];
+
+ if (multiline) {
+ result.push(',' + newline);
+ for (i = 1, iz = expr.properties.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + newline);
+ }
+ }
+ }
+ });
+
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base);
+ result.push('}');
+ return result;
+ },
+
+ AssignmentPattern: function(expr, precedence, flags) {
+ return this.generateAssignment(expr.left, expr.right, '=', precedence, flags);
+ },
+
+ ObjectPattern: function (expr, precedence, flags) {
+ var result, i, iz, multiline, property, that = this;
+ if (!expr.properties.length) {
+ return '{}';
+ }
+
+ multiline = false;
+ if (expr.properties.length === 1) {
+ property = expr.properties[0];
+ if (property.value.type !== Syntax.Identifier) {
+ multiline = true;
+ }
+ } else {
+ for (i = 0, iz = expr.properties.length; i < iz; ++i) {
+ property = expr.properties[i];
+ if (!property.shorthand) {
+ multiline = true;
+ break;
+ }
+ }
+ }
+ result = ['{', multiline ? newline : '' ];
+
+ withIndent(function (indent) {
+ var i, iz;
+ for (i = 0, iz = expr.properties.length; i < iz; ++i) {
+ result.push(multiline ? indent : '');
+ result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + (multiline ? newline : space));
+ }
+ }
+ });
+
+ if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(multiline ? base : '');
+ result.push('}');
+ return result;
+ },
+
+ ThisExpression: function (expr, precedence, flags) {
+ return 'this';
+ },
+
+ Super: function (expr, precedence, flags) {
+ return 'super';
+ },
+
+ Identifier: function (expr, precedence, flags) {
+ return generateIdentifier(expr);
+ },
+
+ ImportDefaultSpecifier: function (expr, precedence, flags) {
+ return generateIdentifier(expr.id || expr.local);
+ },
+
+ ImportNamespaceSpecifier: function (expr, precedence, flags) {
+ var result = ['*'];
+ var id = expr.id || expr.local;
+ if (id) {
+ result.push(space + 'as' + noEmptySpace() + generateIdentifier(id));
+ }
+ return result;
+ },
+
+ ImportSpecifier: function (expr, precedence, flags) {
+ var imported = expr.imported;
+ var result = [ imported.name ];
+ var local = expr.local;
+ if (local && local.name !== imported.name) {
+ result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(local));
+ }
+ return result;
+ },
+
+ ExportSpecifier: function (expr, precedence, flags) {
+ var local = expr.local;
+ var result = [ local.name ];
+ var exported = expr.exported;
+ if (exported && exported.name !== local.name) {
+ result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(exported));
+ }
+ return result;
+ },
+
+ Literal: function (expr, precedence, flags) {
+ var raw;
+ if (expr.hasOwnProperty('raw') && parse && extra.raw) {
+ try {
+ raw = parse(expr.raw).body[0].expression;
+ if (raw.type === Syntax.Literal) {
+ if (raw.value === expr.value) {
+ return expr.raw;
+ }
+ }
+ } catch (e) {
+ // not use raw property
+ }
+ }
+
+ if (expr.regex) {
+ return '/' + expr.regex.pattern + '/' + expr.regex.flags;
+ }
+
+ if (expr.value === null) {
+ return 'null';
+ }
+
+ if (typeof expr.value === 'string') {
+ return escapeString(expr.value);
+ }
+
+ if (typeof expr.value === 'number') {
+ return generateNumber(expr.value);
+ }
+
+ if (typeof expr.value === 'boolean') {
+ return expr.value ? 'true' : 'false';
+ }
+
+ return generateRegExp(expr.value);
+ },
+
+ GeneratorExpression: function (expr, precedence, flags) {
+ return this.ComprehensionExpression(expr, precedence, flags);
+ },
+
+ ComprehensionExpression: function (expr, precedence, flags) {
+ // GeneratorExpression should be parenthesized with (...), ComprehensionExpression with [...]
+ // Due to https://bugzilla.mozilla.org/show_bug.cgi?id=883468 position of expr.body can differ in Spidermonkey and ES6
+
+ var result, i, iz, fragment, that = this;
+ result = (expr.type === Syntax.GeneratorExpression) ? ['('] : ['['];
+
+ if (extra.moz.comprehensionExpressionStartsWithAssignment) {
+ fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
+ result.push(fragment);
+ }
+
+ if (expr.blocks) {
+ withIndent(function () {
+ for (i = 0, iz = expr.blocks.length; i < iz; ++i) {
+ fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT);
+ if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) {
+ result = join(result, fragment);
+ } else {
+ result.push(fragment);
+ }
+ }
+ });
+ }
+
+ if (expr.filter) {
+ result = join(result, 'if' + space);
+ fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT);
+ result = join(result, [ '(', fragment, ')' ]);
+ }
+
+ if (!extra.moz.comprehensionExpressionStartsWithAssignment) {
+ fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
+
+ result = join(result, fragment);
+ }
+
+ result.push((expr.type === Syntax.GeneratorExpression) ? ')' : ']');
+ return result;
+ },
+
+ ComprehensionBlock: function (expr, precedence, flags) {
+ var fragment;
+ if (expr.left.type === Syntax.VariableDeclaration) {
+ fragment = [
+ expr.left.kind, noEmptySpace(),
+ this.generateStatement(expr.left.declarations[0], S_FFFF)
+ ];
+ } else {
+ fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT);
+ }
+
+ fragment = join(fragment, expr.of ? 'of' : 'in');
+ fragment = join(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT));
+
+ return [ 'for' + space + '(', fragment, ')' ];
+ },
+
+ SpreadElement: function (expr, precedence, flags) {
+ return [
+ '...',
+ this.generateExpression(expr.argument, Precedence.Assignment, E_TTT)
+ ];
+ },
+
+ TaggedTemplateExpression: function (expr, precedence, flags) {
+ var itemFlags = E_TTF;
+ if (!(flags & F_ALLOW_CALL)) {
+ itemFlags = E_TFF;
+ }
+ var result = [
+ this.generateExpression(expr.tag, Precedence.Call, itemFlags),
+ this.generateExpression(expr.quasi, Precedence.Primary, E_FFT)
+ ];
+ return parenthesize(result, Precedence.TaggedTemplate, precedence);
+ },
+
+ TemplateElement: function (expr, precedence, flags) {
+ // Don't use "cooked". Since tagged template can use raw template
+ // representation. So if we do so, it breaks the script semantics.
+ return expr.value.raw;
+ },
+
+ TemplateLiteral: function (expr, precedence, flags) {
+ var result, i, iz;
+ result = [ '`' ];
+ for (i = 0, iz = expr.quasis.length; i < iz; ++i) {
+ result.push(this.generateExpression(expr.quasis[i], Precedence.Primary, E_TTT));
+ if (i + 1 < iz) {
+ result.push('${' + space);
+ result.push(this.generateExpression(expr.expressions[i], Precedence.Sequence, E_TTT));
+ result.push(space + '}');
+ }
+ }
+ result.push('`');
+ return result;
+ },
+
+ ModuleSpecifier: function (expr, precedence, flags) {
+ return this.Literal(expr, precedence, flags);
+ },
+
+ ImportExpression: function(expr, precedence, flag) {
+ return parenthesize([
+ 'import(',
+ this.generateExpression(expr.source, Precedence.Assignment, E_TTT),
+ ')'
+ ], Precedence.Call, precedence);
+ },
+
+ };
+
+ merge(CodeGenerator.prototype, CodeGenerator.Expression);
+
+ CodeGenerator.prototype.generateExpression = function (expr, precedence, flags) {
+ var result, type;
+
+ type = expr.type || Syntax.Property;
+
+ if (extra.verbatim && expr.hasOwnProperty(extra.verbatim)) {
+ return generateVerbatim(expr, precedence);
+ }
+
+ result = this[type](expr, precedence, flags);
+
+
+ if (extra.comment) {
+ result = addComments(expr, result);
+ }
+ return toSourceNodeWhenNeeded(result, expr);
+ };
+
+ CodeGenerator.prototype.generateStatement = function (stmt, flags) {
+ var result,
+ fragment;
+
+ result = this[stmt.type](stmt, flags);
+
+ // Attach comments
+
+ if (extra.comment) {
+ result = addComments(stmt, result);
+ }
+
+ fragment = toSourceNodeWhenNeeded(result).toString();
+ if (stmt.type === Syntax.Program && !safeConcatenation && newline === '' && fragment.charAt(fragment.length - 1) === '\n') {
+ result = sourceMap$1 ? toSourceNodeWhenNeeded(result).replaceRight(/\s+$/, '') : fragment.replace(/\s+$/, '');
+ }
+
+ return toSourceNodeWhenNeeded(result, stmt);
+ };
+
+ function generateInternal(node) {
+ var codegen;
+
+ codegen = new CodeGenerator();
+ if (isStatement(node)) {
+ return codegen.generateStatement(node, S_TFFF);
+ }
+
+ if (isExpression(node)) {
+ return codegen.generateExpression(node, Precedence.Sequence, E_TTT);
+ }
+
+ throw new Error('Unknown node type: ' + node.type);
+ }
+
+ function generate(node, options) {
+ var defaultOptions = getDefaultOptions(), result, pair;
+
+ if (options != null) {
+ // Obsolete options
+ //
+ // `options.indent`
+ // `options.base`
+ //
+ // Instead of them, we can use `option.format.indent`.
+ if (typeof options.indent === 'string') {
+ defaultOptions.format.indent.style = options.indent;
+ }
+ if (typeof options.base === 'number') {
+ defaultOptions.format.indent.base = options.base;
+ }
+ options = updateDeeply(defaultOptions, options);
+ indent = options.format.indent.style;
+ if (typeof options.base === 'string') {
+ base = options.base;
+ } else {
+ base = stringRepeat(indent, options.format.indent.base);
+ }
+ } else {
+ options = defaultOptions;
+ indent = options.format.indent.style;
+ base = stringRepeat(indent, options.format.indent.base);
+ }
+ json = options.format.json;
+ renumber = options.format.renumber;
+ hexadecimal = json ? false : options.format.hexadecimal;
+ quotes = json ? 'double' : options.format.quotes;
+ escapeless = options.format.escapeless;
+ newline = options.format.newline;
+ space = options.format.space;
+ if (options.format.compact) {
+ newline = space = indent = base = '';
+ }
+ parentheses = options.format.parentheses;
+ semicolons = options.format.semicolons;
+ safeConcatenation = options.format.safeConcatenation;
+ directive = options.directive;
+ parse = json ? null : options.parse;
+ sourceMap$1 = options.sourceMap;
+ sourceCode = options.sourceCode;
+ preserveBlankLines = options.format.preserveBlankLines && sourceCode !== null;
+ extra = options;
+
+ if (sourceMap$1) {
+ if (!exports.browser) {
+ // We assume environment is node.js
+ // And prevent from including source-map by browserify
+ SourceNode = sourceMap.SourceNode;
+ } else {
+ SourceNode = commonjsGlobal.sourceMap.SourceNode;
+ }
+ }
+
+ result = generateInternal(node);
+
+ if (!sourceMap$1) {
+ pair = {code: result.toString(), map: null};
+ return options.sourceMapWithCode ? pair : pair.code;
+ }
+
+
+ pair = result.toStringWithSourceMap({
+ file: options.file,
+ sourceRoot: options.sourceMapRoot
+ });
+
+ if (options.sourceContent) {
+ pair.map.setSourceContent(options.sourceMap,
+ options.sourceContent);
+ }
+
+ if (options.sourceMapWithCode) {
+ return pair;
+ }
+
+ return pair.map.toString();
+ }
+
+ FORMAT_MINIFY = {
+ indent: {
+ style: '',
+ base: 0
+ },
+ renumber: true,
+ hexadecimal: true,
+ quotes: 'auto',
+ escapeless: true,
+ compact: true,
+ parentheses: false,
+ semicolons: false
+ };
+
+ FORMAT_DEFAULTS = getDefaultOptions().format;
+
+ exports.version = require$$3.version;
+ exports.generate = generate;
+ exports.attachComments = estraverse$1.attachComments;
+ exports.Precedence = updateDeeply({}, Precedence);
+ exports.browser = false;
+ exports.FORMAT_MINIFY = FORMAT_MINIFY;
+ exports.FORMAT_DEFAULTS = FORMAT_DEFAULTS;
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
+});
+
+var esprima = createCommonjsModule(function (module, exports) {
+(function webpackUniversalModuleDefinition(root, factory) {
+/* istanbul ignore next */
+ if('object' === 'object' && 'object' === 'object')
+ module.exports = factory();
+ else if(typeof undefined === 'function' && undefined.amd)
+ undefined([], factory);
+/* istanbul ignore next */
+ else if('object' === 'object')
+ exports["esprima"] = factory();
+ else
+ root["esprima"] = factory();
+})(commonjsGlobal, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+
+/******/ // Check if module is in cache
+/* istanbul ignore if */
+/******/ if(installedModules[moduleId])
+/******/ return installedModules[moduleId].exports;
+
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ exports: {},
+/******/ id: moduleId,
+/******/ loaded: false
+/******/ };
+
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+/******/ // Flag the module as loaded
+/******/ module.loaded = true;
+
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+
+
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ /*
+ Copyright JS Foundation and other contributors, https://js.foundation/
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var comment_handler_1 = __webpack_require__(1);
+ var jsx_parser_1 = __webpack_require__(3);
+ var parser_1 = __webpack_require__(8);
+ var tokenizer_1 = __webpack_require__(15);
+ function parse(code, options, delegate) {
+ var commentHandler = null;
+ var proxyDelegate = function (node, metadata) {
+ if (delegate) {
+ delegate(node, metadata);
+ }
+ if (commentHandler) {
+ commentHandler.visit(node, metadata);
+ }
+ };
+ var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null;
+ var collectComment = false;
+ if (options) {
+ collectComment = (typeof options.comment === 'boolean' && options.comment);
+ var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment);
+ if (collectComment || attachComment) {
+ commentHandler = new comment_handler_1.CommentHandler();
+ commentHandler.attach = attachComment;
+ options.comment = true;
+ parserDelegate = proxyDelegate;
+ }
+ }
+ var isModule = false;
+ if (options && typeof options.sourceType === 'string') {
+ isModule = (options.sourceType === 'module');
+ }
+ var parser;
+ if (options && typeof options.jsx === 'boolean' && options.jsx) {
+ parser = new jsx_parser_1.JSXParser(code, options, parserDelegate);
+ }
+ else {
+ parser = new parser_1.Parser(code, options, parserDelegate);
+ }
+ var program = isModule ? parser.parseModule() : parser.parseScript();
+ var ast = program;
+ if (collectComment && commentHandler) {
+ ast.comments = commentHandler.comments;
+ }
+ if (parser.config.tokens) {
+ ast.tokens = parser.tokens;
+ }
+ if (parser.config.tolerant) {
+ ast.errors = parser.errorHandler.errors;
+ }
+ return ast;
+ }
+ exports.parse = parse;
+ function parseModule(code, options, delegate) {
+ var parsingOptions = options || {};
+ parsingOptions.sourceType = 'module';
+ return parse(code, parsingOptions, delegate);
+ }
+ exports.parseModule = parseModule;
+ function parseScript(code, options, delegate) {
+ var parsingOptions = options || {};
+ parsingOptions.sourceType = 'script';
+ return parse(code, parsingOptions, delegate);
+ }
+ exports.parseScript = parseScript;
+ function tokenize(code, options, delegate) {
+ var tokenizer = new tokenizer_1.Tokenizer(code, options);
+ var tokens;
+ tokens = [];
+ try {
+ while (true) {
+ var token = tokenizer.getNextToken();
+ if (!token) {
+ break;
+ }
+ if (delegate) {
+ token = delegate(token);
+ }
+ tokens.push(token);
+ }
+ }
+ catch (e) {
+ tokenizer.errorHandler.tolerate(e);
+ }
+ if (tokenizer.errorHandler.tolerant) {
+ tokens.errors = tokenizer.errors();
+ }
+ return tokens;
+ }
+ exports.tokenize = tokenize;
+ var syntax_1 = __webpack_require__(2);
+ exports.Syntax = syntax_1.Syntax;
+ // Sync with *.json manifests.
+ exports.version = '4.0.1';
+
+
+/***/ },
+/* 1 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var syntax_1 = __webpack_require__(2);
+ var CommentHandler = (function () {
+ function CommentHandler() {
+ this.attach = false;
+ this.comments = [];
+ this.stack = [];
+ this.leading = [];
+ this.trailing = [];
+ }
+ CommentHandler.prototype.insertInnerComments = function (node, metadata) {
+ // innnerComments for properties empty block
+ // `function a() {/** comments **\/}`
+ if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) {
+ var innerComments = [];
+ for (var i = this.leading.length - 1; i >= 0; --i) {
+ var entry = this.leading[i];
+ if (metadata.end.offset >= entry.start) {
+ innerComments.unshift(entry.comment);
+ this.leading.splice(i, 1);
+ this.trailing.splice(i, 1);
+ }
+ }
+ if (innerComments.length) {
+ node.innerComments = innerComments;
+ }
+ }
+ };
+ CommentHandler.prototype.findTrailingComments = function (metadata) {
+ var trailingComments = [];
+ if (this.trailing.length > 0) {
+ for (var i = this.trailing.length - 1; i >= 0; --i) {
+ var entry_1 = this.trailing[i];
+ if (entry_1.start >= metadata.end.offset) {
+ trailingComments.unshift(entry_1.comment);
+ }
+ }
+ this.trailing.length = 0;
+ return trailingComments;
+ }
+ var entry = this.stack[this.stack.length - 1];
+ if (entry && entry.node.trailingComments) {
+ var firstComment = entry.node.trailingComments[0];
+ if (firstComment && firstComment.range[0] >= metadata.end.offset) {
+ trailingComments = entry.node.trailingComments;
+ delete entry.node.trailingComments;
+ }
+ }
+ return trailingComments;
+ };
+ CommentHandler.prototype.findLeadingComments = function (metadata) {
+ var leadingComments = [];
+ var target;
+ while (this.stack.length > 0) {
+ var entry = this.stack[this.stack.length - 1];
+ if (entry && entry.start >= metadata.start.offset) {
+ target = entry.node;
+ this.stack.pop();
+ }
+ else {
+ break;
+ }
+ }
+ if (target) {
+ var count = target.leadingComments ? target.leadingComments.length : 0;
+ for (var i = count - 1; i >= 0; --i) {
+ var comment = target.leadingComments[i];
+ if (comment.range[1] <= metadata.start.offset) {
+ leadingComments.unshift(comment);
+ target.leadingComments.splice(i, 1);
+ }
+ }
+ if (target.leadingComments && target.leadingComments.length === 0) {
+ delete target.leadingComments;
+ }
+ return leadingComments;
+ }
+ for (var i = this.leading.length - 1; i >= 0; --i) {
+ var entry = this.leading[i];
+ if (entry.start <= metadata.start.offset) {
+ leadingComments.unshift(entry.comment);
+ this.leading.splice(i, 1);
+ }
+ }
+ return leadingComments;
+ };
+ CommentHandler.prototype.visitNode = function (node, metadata) {
+ if (node.type === syntax_1.Syntax.Program && node.body.length > 0) {
+ return;
+ }
+ this.insertInnerComments(node, metadata);
+ var trailingComments = this.findTrailingComments(metadata);
+ var leadingComments = this.findLeadingComments(metadata);
+ if (leadingComments.length > 0) {
+ node.leadingComments = leadingComments;
+ }
+ if (trailingComments.length > 0) {
+ node.trailingComments = trailingComments;
+ }
+ this.stack.push({
+ node: node,
+ start: metadata.start.offset
+ });
+ };
+ CommentHandler.prototype.visitComment = function (node, metadata) {
+ var type = (node.type[0] === 'L') ? 'Line' : 'Block';
+ var comment = {
+ type: type,
+ value: node.value
+ };
+ if (node.range) {
+ comment.range = node.range;
+ }
+ if (node.loc) {
+ comment.loc = node.loc;
+ }
+ this.comments.push(comment);
+ if (this.attach) {
+ var entry = {
+ comment: {
+ type: type,
+ value: node.value,
+ range: [metadata.start.offset, metadata.end.offset]
+ },
+ start: metadata.start.offset
+ };
+ if (node.loc) {
+ entry.comment.loc = node.loc;
+ }
+ node.type = type;
+ this.leading.push(entry);
+ this.trailing.push(entry);
+ }
+ };
+ CommentHandler.prototype.visit = function (node, metadata) {
+ if (node.type === 'LineComment') {
+ this.visitComment(node, metadata);
+ }
+ else if (node.type === 'BlockComment') {
+ this.visitComment(node, metadata);
+ }
+ else if (this.attach) {
+ this.visitNode(node, metadata);
+ }
+ };
+ return CommentHandler;
+ }());
+ exports.CommentHandler = CommentHandler;
+
+
+/***/ },
+/* 2 */
+/***/ function(module, exports) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.Syntax = {
+ AssignmentExpression: 'AssignmentExpression',
+ AssignmentPattern: 'AssignmentPattern',
+ ArrayExpression: 'ArrayExpression',
+ ArrayPattern: 'ArrayPattern',
+ ArrowFunctionExpression: 'ArrowFunctionExpression',
+ AwaitExpression: 'AwaitExpression',
+ BlockStatement: 'BlockStatement',
+ BinaryExpression: 'BinaryExpression',
+ BreakStatement: 'BreakStatement',
+ CallExpression: 'CallExpression',
+ CatchClause: 'CatchClause',
+ ClassBody: 'ClassBody',
+ ClassDeclaration: 'ClassDeclaration',
+ ClassExpression: 'ClassExpression',
+ ConditionalExpression: 'ConditionalExpression',
+ ContinueStatement: 'ContinueStatement',
+ DoWhileStatement: 'DoWhileStatement',
+ DebuggerStatement: 'DebuggerStatement',
+ EmptyStatement: 'EmptyStatement',
+ ExportAllDeclaration: 'ExportAllDeclaration',
+ ExportDefaultDeclaration: 'ExportDefaultDeclaration',
+ ExportNamedDeclaration: 'ExportNamedDeclaration',
+ ExportSpecifier: 'ExportSpecifier',
+ ExpressionStatement: 'ExpressionStatement',
+ ForStatement: 'ForStatement',
+ ForOfStatement: 'ForOfStatement',
+ ForInStatement: 'ForInStatement',
+ FunctionDeclaration: 'FunctionDeclaration',
+ FunctionExpression: 'FunctionExpression',
+ Identifier: 'Identifier',
+ IfStatement: 'IfStatement',
+ ImportDeclaration: 'ImportDeclaration',
+ ImportDefaultSpecifier: 'ImportDefaultSpecifier',
+ ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
+ ImportSpecifier: 'ImportSpecifier',
+ Literal: 'Literal',
+ LabeledStatement: 'LabeledStatement',
+ LogicalExpression: 'LogicalExpression',
+ MemberExpression: 'MemberExpression',
+ MetaProperty: 'MetaProperty',
+ MethodDefinition: 'MethodDefinition',
+ NewExpression: 'NewExpression',
+ ObjectExpression: 'ObjectExpression',
+ ObjectPattern: 'ObjectPattern',
+ Program: 'Program',
+ Property: 'Property',
+ RestElement: 'RestElement',
+ ReturnStatement: 'ReturnStatement',
+ SequenceExpression: 'SequenceExpression',
+ SpreadElement: 'SpreadElement',
+ Super: 'Super',
+ SwitchCase: 'SwitchCase',
+ SwitchStatement: 'SwitchStatement',
+ TaggedTemplateExpression: 'TaggedTemplateExpression',
+ TemplateElement: 'TemplateElement',
+ TemplateLiteral: 'TemplateLiteral',
+ ThisExpression: 'ThisExpression',
+ ThrowStatement: 'ThrowStatement',
+ TryStatement: 'TryStatement',
+ UnaryExpression: 'UnaryExpression',
+ UpdateExpression: 'UpdateExpression',
+ VariableDeclaration: 'VariableDeclaration',
+ VariableDeclarator: 'VariableDeclarator',
+ WhileStatement: 'WhileStatement',
+ WithStatement: 'WithStatement',
+ YieldExpression: 'YieldExpression'
+ };
+
+
+/***/ },
+/* 3 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+/* istanbul ignore next */
+ var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+ })();
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var character_1 = __webpack_require__(4);
+ var JSXNode = __webpack_require__(5);
+ var jsx_syntax_1 = __webpack_require__(6);
+ var Node = __webpack_require__(7);
+ var parser_1 = __webpack_require__(8);
+ var token_1 = __webpack_require__(13);
+ var xhtml_entities_1 = __webpack_require__(14);
+ token_1.TokenName[100 /* Identifier */] = 'JSXIdentifier';
+ token_1.TokenName[101 /* Text */] = 'JSXText';
+ // Fully qualified element name, e.g. returns "svg:path"
+ function getQualifiedElementName(elementName) {
+ var qualifiedName;
+ switch (elementName.type) {
+ case jsx_syntax_1.JSXSyntax.JSXIdentifier:
+ var id = elementName;
+ qualifiedName = id.name;
+ break;
+ case jsx_syntax_1.JSXSyntax.JSXNamespacedName:
+ var ns = elementName;
+ qualifiedName = getQualifiedElementName(ns.namespace) + ':' +
+ getQualifiedElementName(ns.name);
+ break;
+ case jsx_syntax_1.JSXSyntax.JSXMemberExpression:
+ var expr = elementName;
+ qualifiedName = getQualifiedElementName(expr.object) + '.' +
+ getQualifiedElementName(expr.property);
+ break;
+ /* istanbul ignore next */
+ default:
+ break;
+ }
+ return qualifiedName;
+ }
+ var JSXParser = (function (_super) {
+ __extends(JSXParser, _super);
+ function JSXParser(code, options, delegate) {
+ return _super.call(this, code, options, delegate) || this;
+ }
+ JSXParser.prototype.parsePrimaryExpression = function () {
+ return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this);
+ };
+ JSXParser.prototype.startJSX = function () {
+ // Unwind the scanner before the lookahead token.
+ this.scanner.index = this.startMarker.index;
+ this.scanner.lineNumber = this.startMarker.line;
+ this.scanner.lineStart = this.startMarker.index - this.startMarker.column;
+ };
+ JSXParser.prototype.finishJSX = function () {
+ // Prime the next lookahead.
+ this.nextToken();
+ };
+ JSXParser.prototype.reenterJSX = function () {
+ this.startJSX();
+ this.expectJSX('}');
+ // Pop the closing '}' added from the lookahead.
+ if (this.config.tokens) {
+ this.tokens.pop();
+ }
+ };
+ JSXParser.prototype.createJSXNode = function () {
+ this.collectComments();
+ return {
+ index: this.scanner.index,
+ line: this.scanner.lineNumber,
+ column: this.scanner.index - this.scanner.lineStart
+ };
+ };
+ JSXParser.prototype.createJSXChildNode = function () {
+ return {
+ index: this.scanner.index,
+ line: this.scanner.lineNumber,
+ column: this.scanner.index - this.scanner.lineStart
+ };
+ };
+ JSXParser.prototype.scanXHTMLEntity = function (quote) {
+ var result = '&';
+ var valid = true;
+ var terminated = false;
+ var numeric = false;
+ var hex = false;
+ while (!this.scanner.eof() && valid && !terminated) {
+ var ch = this.scanner.source[this.scanner.index];
+ if (ch === quote) {
+ break;
+ }
+ terminated = (ch === ';');
+ result += ch;
+ ++this.scanner.index;
+ if (!terminated) {
+ switch (result.length) {
+ case 2:
+ // e.g. '{'
+ numeric = (ch === '#');
+ break;
+ case 3:
+ if (numeric) {
+ // e.g. 'A'
+ hex = (ch === 'x');
+ valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0));
+ numeric = numeric && !hex;
+ }
+ break;
+ default:
+ valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0)));
+ valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0)));
+ break;
+ }
+ }
+ }
+ if (valid && terminated && result.length > 2) {
+ // e.g. 'A' becomes just '#x41'
+ var str = result.substr(1, result.length - 2);
+ if (numeric && str.length > 1) {
+ result = String.fromCharCode(parseInt(str.substr(1), 10));
+ }
+ else if (hex && str.length > 2) {
+ result = String.fromCharCode(parseInt('0' + str.substr(1), 16));
+ }
+ else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) {
+ result = xhtml_entities_1.XHTMLEntities[str];
+ }
+ }
+ return result;
+ };
+ // Scan the next JSX token. This replaces Scanner#lex when in JSX mode.
+ JSXParser.prototype.lexJSX = function () {
+ var cp = this.scanner.source.charCodeAt(this.scanner.index);
+ // < > / : = { }
+ if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) {
+ var value = this.scanner.source[this.scanner.index++];
+ return {
+ type: 7 /* Punctuator */,
+ value: value,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: this.scanner.index - 1,
+ end: this.scanner.index
+ };
+ }
+ // " '
+ if (cp === 34 || cp === 39) {
+ var start = this.scanner.index;
+ var quote = this.scanner.source[this.scanner.index++];
+ var str = '';
+ while (!this.scanner.eof()) {
+ var ch = this.scanner.source[this.scanner.index++];
+ if (ch === quote) {
+ break;
+ }
+ else if (ch === '&') {
+ str += this.scanXHTMLEntity(quote);
+ }
+ else {
+ str += ch;
+ }
+ }
+ return {
+ type: 8 /* StringLiteral */,
+ value: str,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: start,
+ end: this.scanner.index
+ };
+ }
+ // ... or .
+ if (cp === 46) {
+ var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1);
+ var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2);
+ var value = (n1 === 46 && n2 === 46) ? '...' : '.';
+ var start = this.scanner.index;
+ this.scanner.index += value.length;
+ return {
+ type: 7 /* Punctuator */,
+ value: value,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: start,
+ end: this.scanner.index
+ };
+ }
+ // `
+ if (cp === 96) {
+ // Only placeholder, since it will be rescanned as a real assignment expression.
+ return {
+ type: 10 /* Template */,
+ value: '',
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: this.scanner.index,
+ end: this.scanner.index
+ };
+ }
+ // Identifer can not contain backslash (char code 92).
+ if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) {
+ var start = this.scanner.index;
+ ++this.scanner.index;
+ while (!this.scanner.eof()) {
+ var ch = this.scanner.source.charCodeAt(this.scanner.index);
+ if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) {
+ ++this.scanner.index;
+ }
+ else if (ch === 45) {
+ // Hyphen (char code 45) can be part of an identifier.
+ ++this.scanner.index;
+ }
+ else {
+ break;
+ }
+ }
+ var id = this.scanner.source.slice(start, this.scanner.index);
+ return {
+ type: 100 /* Identifier */,
+ value: id,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: start,
+ end: this.scanner.index
+ };
+ }
+ return this.scanner.lex();
+ };
+ JSXParser.prototype.nextJSXToken = function () {
+ this.collectComments();
+ this.startMarker.index = this.scanner.index;
+ this.startMarker.line = this.scanner.lineNumber;
+ this.startMarker.column = this.scanner.index - this.scanner.lineStart;
+ var token = this.lexJSX();
+ this.lastMarker.index = this.scanner.index;
+ this.lastMarker.line = this.scanner.lineNumber;
+ this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
+ if (this.config.tokens) {
+ this.tokens.push(this.convertToken(token));
+ }
+ return token;
+ };
+ JSXParser.prototype.nextJSXText = function () {
+ this.startMarker.index = this.scanner.index;
+ this.startMarker.line = this.scanner.lineNumber;
+ this.startMarker.column = this.scanner.index - this.scanner.lineStart;
+ var start = this.scanner.index;
+ var text = '';
+ while (!this.scanner.eof()) {
+ var ch = this.scanner.source[this.scanner.index];
+ if (ch === '{' || ch === '<') {
+ break;
+ }
+ ++this.scanner.index;
+ text += ch;
+ if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
+ ++this.scanner.lineNumber;
+ if (ch === '\r' && this.scanner.source[this.scanner.index] === '\n') {
+ ++this.scanner.index;
+ }
+ this.scanner.lineStart = this.scanner.index;
+ }
+ }
+ this.lastMarker.index = this.scanner.index;
+ this.lastMarker.line = this.scanner.lineNumber;
+ this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
+ var token = {
+ type: 101 /* Text */,
+ value: text,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: start,
+ end: this.scanner.index
+ };
+ if ((text.length > 0) && this.config.tokens) {
+ this.tokens.push(this.convertToken(token));
+ }
+ return token;
+ };
+ JSXParser.prototype.peekJSXToken = function () {
+ var state = this.scanner.saveState();
+ this.scanner.scanComments();
+ var next = this.lexJSX();
+ this.scanner.restoreState(state);
+ return next;
+ };
+ // Expect the next JSX token to match the specified punctuator.
+ // If not, an exception will be thrown.
+ JSXParser.prototype.expectJSX = function (value) {
+ var token = this.nextJSXToken();
+ if (token.type !== 7 /* Punctuator */ || token.value !== value) {
+ this.throwUnexpectedToken(token);
+ }
+ };
+ // Return true if the next JSX token matches the specified punctuator.
+ JSXParser.prototype.matchJSX = function (value) {
+ var next = this.peekJSXToken();
+ return next.type === 7 /* Punctuator */ && next.value === value;
+ };
+ JSXParser.prototype.parseJSXIdentifier = function () {
+ var node = this.createJSXNode();
+ var token = this.nextJSXToken();
+ if (token.type !== 100 /* Identifier */) {
+ this.throwUnexpectedToken(token);
+ }
+ return this.finalize(node, new JSXNode.JSXIdentifier(token.value));
+ };
+ JSXParser.prototype.parseJSXElementName = function () {
+ var node = this.createJSXNode();
+ var elementName = this.parseJSXIdentifier();
+ if (this.matchJSX(':')) {
+ var namespace = elementName;
+ this.expectJSX(':');
+ var name_1 = this.parseJSXIdentifier();
+ elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1));
+ }
+ else if (this.matchJSX('.')) {
+ while (this.matchJSX('.')) {
+ var object = elementName;
+ this.expectJSX('.');
+ var property = this.parseJSXIdentifier();
+ elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property));
+ }
+ }
+ return elementName;
+ };
+ JSXParser.prototype.parseJSXAttributeName = function () {
+ var node = this.createJSXNode();
+ var attributeName;
+ var identifier = this.parseJSXIdentifier();
+ if (this.matchJSX(':')) {
+ var namespace = identifier;
+ this.expectJSX(':');
+ var name_2 = this.parseJSXIdentifier();
+ attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2));
+ }
+ else {
+ attributeName = identifier;
+ }
+ return attributeName;
+ };
+ JSXParser.prototype.parseJSXStringLiteralAttribute = function () {
+ var node = this.createJSXNode();
+ var token = this.nextJSXToken();
+ if (token.type !== 8 /* StringLiteral */) {
+ this.throwUnexpectedToken(token);
+ }
+ var raw = this.getTokenRaw(token);
+ return this.finalize(node, new Node.Literal(token.value, raw));
+ };
+ JSXParser.prototype.parseJSXExpressionAttribute = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('{');
+ this.finishJSX();
+ if (this.match('}')) {
+ this.tolerateError('JSX attributes must only be assigned a non-empty expression');
+ }
+ var expression = this.parseAssignmentExpression();
+ this.reenterJSX();
+ return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
+ };
+ JSXParser.prototype.parseJSXAttributeValue = function () {
+ return this.matchJSX('{') ? this.parseJSXExpressionAttribute() :
+ this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute();
+ };
+ JSXParser.prototype.parseJSXNameValueAttribute = function () {
+ var node = this.createJSXNode();
+ var name = this.parseJSXAttributeName();
+ var value = null;
+ if (this.matchJSX('=')) {
+ this.expectJSX('=');
+ value = this.parseJSXAttributeValue();
+ }
+ return this.finalize(node, new JSXNode.JSXAttribute(name, value));
+ };
+ JSXParser.prototype.parseJSXSpreadAttribute = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('{');
+ this.expectJSX('...');
+ this.finishJSX();
+ var argument = this.parseAssignmentExpression();
+ this.reenterJSX();
+ return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument));
+ };
+ JSXParser.prototype.parseJSXAttributes = function () {
+ var attributes = [];
+ while (!this.matchJSX('/') && !this.matchJSX('>')) {
+ var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() :
+ this.parseJSXNameValueAttribute();
+ attributes.push(attribute);
+ }
+ return attributes;
+ };
+ JSXParser.prototype.parseJSXOpeningElement = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('<');
+ var name = this.parseJSXElementName();
+ var attributes = this.parseJSXAttributes();
+ var selfClosing = this.matchJSX('/');
+ if (selfClosing) {
+ this.expectJSX('/');
+ }
+ this.expectJSX('>');
+ return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
+ };
+ JSXParser.prototype.parseJSXBoundaryElement = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('<');
+ if (this.matchJSX('/')) {
+ this.expectJSX('/');
+ var name_3 = this.parseJSXElementName();
+ this.expectJSX('>');
+ return this.finalize(node, new JSXNode.JSXClosingElement(name_3));
+ }
+ var name = this.parseJSXElementName();
+ var attributes = this.parseJSXAttributes();
+ var selfClosing = this.matchJSX('/');
+ if (selfClosing) {
+ this.expectJSX('/');
+ }
+ this.expectJSX('>');
+ return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
+ };
+ JSXParser.prototype.parseJSXEmptyExpression = function () {
+ var node = this.createJSXChildNode();
+ this.collectComments();
+ this.lastMarker.index = this.scanner.index;
+ this.lastMarker.line = this.scanner.lineNumber;
+ this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
+ return this.finalize(node, new JSXNode.JSXEmptyExpression());
+ };
+ JSXParser.prototype.parseJSXExpressionContainer = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('{');
+ var expression;
+ if (this.matchJSX('}')) {
+ expression = this.parseJSXEmptyExpression();
+ this.expectJSX('}');
+ }
+ else {
+ this.finishJSX();
+ expression = this.parseAssignmentExpression();
+ this.reenterJSX();
+ }
+ return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
+ };
+ JSXParser.prototype.parseJSXChildren = function () {
+ var children = [];
+ while (!this.scanner.eof()) {
+ var node = this.createJSXChildNode();
+ var token = this.nextJSXText();
+ if (token.start < token.end) {
+ var raw = this.getTokenRaw(token);
+ var child = this.finalize(node, new JSXNode.JSXText(token.value, raw));
+ children.push(child);
+ }
+ if (this.scanner.source[this.scanner.index] === '{') {
+ var container = this.parseJSXExpressionContainer();
+ children.push(container);
+ }
+ else {
+ break;
+ }
+ }
+ return children;
+ };
+ JSXParser.prototype.parseComplexJSXElement = function (el) {
+ var stack = [];
+ while (!this.scanner.eof()) {
+ el.children = el.children.concat(this.parseJSXChildren());
+ var node = this.createJSXChildNode();
+ var element = this.parseJSXBoundaryElement();
+ if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) {
+ var opening = element;
+ if (opening.selfClosing) {
+ var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null));
+ el.children.push(child);
+ }
+ else {
+ stack.push(el);
+ el = { node: node, opening: opening, closing: null, children: [] };
+ }
+ }
+ if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) {
+ el.closing = element;
+ var open_1 = getQualifiedElementName(el.opening.name);
+ var close_1 = getQualifiedElementName(el.closing.name);
+ if (open_1 !== close_1) {
+ this.tolerateError('Expected corresponding JSX closing tag for %0', open_1);
+ }
+ if (stack.length > 0) {
+ var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing));
+ el = stack[stack.length - 1];
+ el.children.push(child);
+ stack.pop();
+ }
+ else {
+ break;
+ }
+ }
+ }
+ return el;
+ };
+ JSXParser.prototype.parseJSXElement = function () {
+ var node = this.createJSXNode();
+ var opening = this.parseJSXOpeningElement();
+ var children = [];
+ var closing = null;
+ if (!opening.selfClosing) {
+ var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children });
+ children = el.children;
+ closing = el.closing;
+ }
+ return this.finalize(node, new JSXNode.JSXElement(opening, children, closing));
+ };
+ JSXParser.prototype.parseJSXRoot = function () {
+ // Pop the opening '<' added from the lookahead.
+ if (this.config.tokens) {
+ this.tokens.pop();
+ }
+ this.startJSX();
+ var element = this.parseJSXElement();
+ this.finishJSX();
+ return element;
+ };
+ JSXParser.prototype.isStartOfExpression = function () {
+ return _super.prototype.isStartOfExpression.call(this) || this.match('<');
+ };
+ return JSXParser;
+ }(parser_1.Parser));
+ exports.JSXParser = JSXParser;
+
+
+/***/ },
+/* 4 */
+/***/ function(module, exports) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // See also tools/generate-unicode-regex.js.
+ var Regex = {
+ // Unicode v8.0.0 NonAsciiIdentifierStart:
+ NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
+ // Unicode v8.0.0 NonAsciiIdentifierPart:
+ NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
+ };
+ exports.Character = {
+ /* tslint:disable:no-bitwise */
+ fromCodePoint: function (cp) {
+ return (cp < 0x10000) ? String.fromCharCode(cp) :
+ String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) +
+ String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023));
+ },
+ // https://tc39.github.io/ecma262/#sec-white-space
+ isWhiteSpace: function (cp) {
+ return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) ||
+ (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0);
+ },
+ // https://tc39.github.io/ecma262/#sec-line-terminators
+ isLineTerminator: function (cp) {
+ return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029);
+ },
+ // https://tc39.github.io/ecma262/#sec-names-and-keywords
+ isIdentifierStart: function (cp) {
+ return (cp === 0x24) || (cp === 0x5F) ||
+ (cp >= 0x41 && cp <= 0x5A) ||
+ (cp >= 0x61 && cp <= 0x7A) ||
+ (cp === 0x5C) ||
+ ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp)));
+ },
+ isIdentifierPart: function (cp) {
+ return (cp === 0x24) || (cp === 0x5F) ||
+ (cp >= 0x41 && cp <= 0x5A) ||
+ (cp >= 0x61 && cp <= 0x7A) ||
+ (cp >= 0x30 && cp <= 0x39) ||
+ (cp === 0x5C) ||
+ ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp)));
+ },
+ // https://tc39.github.io/ecma262/#sec-literals-numeric-literals
+ isDecimalDigit: function (cp) {
+ return (cp >= 0x30 && cp <= 0x39); // 0..9
+ },
+ isHexDigit: function (cp) {
+ return (cp >= 0x30 && cp <= 0x39) ||
+ (cp >= 0x41 && cp <= 0x46) ||
+ (cp >= 0x61 && cp <= 0x66); // a..f
+ },
+ isOctalDigit: function (cp) {
+ return (cp >= 0x30 && cp <= 0x37); // 0..7
+ }
+ };
+
+
+/***/ },
+/* 5 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var jsx_syntax_1 = __webpack_require__(6);
+ /* tslint:disable:max-classes-per-file */
+ var JSXClosingElement = (function () {
+ function JSXClosingElement(name) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement;
+ this.name = name;
+ }
+ return JSXClosingElement;
+ }());
+ exports.JSXClosingElement = JSXClosingElement;
+ var JSXElement = (function () {
+ function JSXElement(openingElement, children, closingElement) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXElement;
+ this.openingElement = openingElement;
+ this.children = children;
+ this.closingElement = closingElement;
+ }
+ return JSXElement;
+ }());
+ exports.JSXElement = JSXElement;
+ var JSXEmptyExpression = (function () {
+ function JSXEmptyExpression() {
+ this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression;
+ }
+ return JSXEmptyExpression;
+ }());
+ exports.JSXEmptyExpression = JSXEmptyExpression;
+ var JSXExpressionContainer = (function () {
+ function JSXExpressionContainer(expression) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer;
+ this.expression = expression;
+ }
+ return JSXExpressionContainer;
+ }());
+ exports.JSXExpressionContainer = JSXExpressionContainer;
+ var JSXIdentifier = (function () {
+ function JSXIdentifier(name) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier;
+ this.name = name;
+ }
+ return JSXIdentifier;
+ }());
+ exports.JSXIdentifier = JSXIdentifier;
+ var JSXMemberExpression = (function () {
+ function JSXMemberExpression(object, property) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression;
+ this.object = object;
+ this.property = property;
+ }
+ return JSXMemberExpression;
+ }());
+ exports.JSXMemberExpression = JSXMemberExpression;
+ var JSXAttribute = (function () {
+ function JSXAttribute(name, value) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXAttribute;
+ this.name = name;
+ this.value = value;
+ }
+ return JSXAttribute;
+ }());
+ exports.JSXAttribute = JSXAttribute;
+ var JSXNamespacedName = (function () {
+ function JSXNamespacedName(namespace, name) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName;
+ this.namespace = namespace;
+ this.name = name;
+ }
+ return JSXNamespacedName;
+ }());
+ exports.JSXNamespacedName = JSXNamespacedName;
+ var JSXOpeningElement = (function () {
+ function JSXOpeningElement(name, selfClosing, attributes) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement;
+ this.name = name;
+ this.selfClosing = selfClosing;
+ this.attributes = attributes;
+ }
+ return JSXOpeningElement;
+ }());
+ exports.JSXOpeningElement = JSXOpeningElement;
+ var JSXSpreadAttribute = (function () {
+ function JSXSpreadAttribute(argument) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute;
+ this.argument = argument;
+ }
+ return JSXSpreadAttribute;
+ }());
+ exports.JSXSpreadAttribute = JSXSpreadAttribute;
+ var JSXText = (function () {
+ function JSXText(value, raw) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXText;
+ this.value = value;
+ this.raw = raw;
+ }
+ return JSXText;
+ }());
+ exports.JSXText = JSXText;
+
+
+/***/ },
+/* 6 */
+/***/ function(module, exports) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.JSXSyntax = {
+ JSXAttribute: 'JSXAttribute',
+ JSXClosingElement: 'JSXClosingElement',
+ JSXElement: 'JSXElement',
+ JSXEmptyExpression: 'JSXEmptyExpression',
+ JSXExpressionContainer: 'JSXExpressionContainer',
+ JSXIdentifier: 'JSXIdentifier',
+ JSXMemberExpression: 'JSXMemberExpression',
+ JSXNamespacedName: 'JSXNamespacedName',
+ JSXOpeningElement: 'JSXOpeningElement',
+ JSXSpreadAttribute: 'JSXSpreadAttribute',
+ JSXText: 'JSXText'
+ };
+
+
+/***/ },
+/* 7 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var syntax_1 = __webpack_require__(2);
+ /* tslint:disable:max-classes-per-file */
+ var ArrayExpression = (function () {
+ function ArrayExpression(elements) {
+ this.type = syntax_1.Syntax.ArrayExpression;
+ this.elements = elements;
+ }
+ return ArrayExpression;
+ }());
+ exports.ArrayExpression = ArrayExpression;
+ var ArrayPattern = (function () {
+ function ArrayPattern(elements) {
+ this.type = syntax_1.Syntax.ArrayPattern;
+ this.elements = elements;
+ }
+ return ArrayPattern;
+ }());
+ exports.ArrayPattern = ArrayPattern;
+ var ArrowFunctionExpression = (function () {
+ function ArrowFunctionExpression(params, body, expression) {
+ this.type = syntax_1.Syntax.ArrowFunctionExpression;
+ this.id = null;
+ this.params = params;
+ this.body = body;
+ this.generator = false;
+ this.expression = expression;
+ this.async = false;
+ }
+ return ArrowFunctionExpression;
+ }());
+ exports.ArrowFunctionExpression = ArrowFunctionExpression;
+ var AssignmentExpression = (function () {
+ function AssignmentExpression(operator, left, right) {
+ this.type = syntax_1.Syntax.AssignmentExpression;
+ this.operator = operator;
+ this.left = left;
+ this.right = right;
+ }
+ return AssignmentExpression;
+ }());
+ exports.AssignmentExpression = AssignmentExpression;
+ var AssignmentPattern = (function () {
+ function AssignmentPattern(left, right) {
+ this.type = syntax_1.Syntax.AssignmentPattern;
+ this.left = left;
+ this.right = right;
+ }
+ return AssignmentPattern;
+ }());
+ exports.AssignmentPattern = AssignmentPattern;
+ var AsyncArrowFunctionExpression = (function () {
+ function AsyncArrowFunctionExpression(params, body, expression) {
+ this.type = syntax_1.Syntax.ArrowFunctionExpression;
+ this.id = null;
+ this.params = params;
+ this.body = body;
+ this.generator = false;
+ this.expression = expression;
+ this.async = true;
+ }
+ return AsyncArrowFunctionExpression;
+ }());
+ exports.AsyncArrowFunctionExpression = AsyncArrowFunctionExpression;
+ var AsyncFunctionDeclaration = (function () {
+ function AsyncFunctionDeclaration(id, params, body) {
+ this.type = syntax_1.Syntax.FunctionDeclaration;
+ this.id = id;
+ this.params = params;
+ this.body = body;
+ this.generator = false;
+ this.expression = false;
+ this.async = true;
+ }
+ return AsyncFunctionDeclaration;
+ }());
+ exports.AsyncFunctionDeclaration = AsyncFunctionDeclaration;
+ var AsyncFunctionExpression = (function () {
+ function AsyncFunctionExpression(id, params, body) {
+ this.type = syntax_1.Syntax.FunctionExpression;
+ this.id = id;
+ this.params = params;
+ this.body = body;
+ this.generator = false;
+ this.expression = false;
+ this.async = true;
+ }
+ return AsyncFunctionExpression;
+ }());
+ exports.AsyncFunctionExpression = AsyncFunctionExpression;
+ var AwaitExpression = (function () {
+ function AwaitExpression(argument) {
+ this.type = syntax_1.Syntax.AwaitExpression;
+ this.argument = argument;
+ }
+ return AwaitExpression;
+ }());
+ exports.AwaitExpression = AwaitExpression;
+ var BinaryExpression = (function () {
+ function BinaryExpression(operator, left, right) {
+ var logical = (operator === '||' || operator === '&&');
+ this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression;
+ this.operator = operator;
+ this.left = left;
+ this.right = right;
+ }
+ return BinaryExpression;
+ }());
+ exports.BinaryExpression = BinaryExpression;
+ var BlockStatement = (function () {
+ function BlockStatement(body) {
+ this.type = syntax_1.Syntax.BlockStatement;
+ this.body = body;
+ }
+ return BlockStatement;
+ }());
+ exports.BlockStatement = BlockStatement;
+ var BreakStatement = (function () {
+ function BreakStatement(label) {
+ this.type = syntax_1.Syntax.BreakStatement;
+ this.label = label;
+ }
+ return BreakStatement;
+ }());
+ exports.BreakStatement = BreakStatement;
+ var CallExpression = (function () {
+ function CallExpression(callee, args) {
+ this.type = syntax_1.Syntax.CallExpression;
+ this.callee = callee;
+ this.arguments = args;
+ }
+ return CallExpression;
+ }());
+ exports.CallExpression = CallExpression;
+ var CatchClause = (function () {
+ function CatchClause(param, body) {
+ this.type = syntax_1.Syntax.CatchClause;
+ this.param = param;
+ this.body = body;
+ }
+ return CatchClause;
+ }());
+ exports.CatchClause = CatchClause;
+ var ClassBody = (function () {
+ function ClassBody(body) {
+ this.type = syntax_1.Syntax.ClassBody;
+ this.body = body;
+ }
+ return ClassBody;
+ }());
+ exports.ClassBody = ClassBody;
+ var ClassDeclaration = (function () {
+ function ClassDeclaration(id, superClass, body) {
+ this.type = syntax_1.Syntax.ClassDeclaration;
+ this.id = id;
+ this.superClass = superClass;
+ this.body = body;
+ }
+ return ClassDeclaration;
+ }());
+ exports.ClassDeclaration = ClassDeclaration;
+ var ClassExpression = (function () {
+ function ClassExpression(id, superClass, body) {
+ this.type = syntax_1.Syntax.ClassExpression;
+ this.id = id;
+ this.superClass = superClass;
+ this.body = body;
+ }
+ return ClassExpression;
+ }());
+ exports.ClassExpression = ClassExpression;
+ var ComputedMemberExpression = (function () {
+ function ComputedMemberExpression(object, property) {
+ this.type = syntax_1.Syntax.MemberExpression;
+ this.computed = true;
+ this.object = object;
+ this.property = property;
+ }
+ return ComputedMemberExpression;
+ }());
+ exports.ComputedMemberExpression = ComputedMemberExpression;
+ var ConditionalExpression = (function () {
+ function ConditionalExpression(test, consequent, alternate) {
+ this.type = syntax_1.Syntax.ConditionalExpression;
+ this.test = test;
+ this.consequent = consequent;
+ this.alternate = alternate;
+ }
+ return ConditionalExpression;
+ }());
+ exports.ConditionalExpression = ConditionalExpression;
+ var ContinueStatement = (function () {
+ function ContinueStatement(label) {
+ this.type = syntax_1.Syntax.ContinueStatement;
+ this.label = label;
+ }
+ return ContinueStatement;
+ }());
+ exports.ContinueStatement = ContinueStatement;
+ var DebuggerStatement = (function () {
+ function DebuggerStatement() {
+ this.type = syntax_1.Syntax.DebuggerStatement;
+ }
+ return DebuggerStatement;
+ }());
+ exports.DebuggerStatement = DebuggerStatement;
+ var Directive = (function () {
+ function Directive(expression, directive) {
+ this.type = syntax_1.Syntax.ExpressionStatement;
+ this.expression = expression;
+ this.directive = directive;
+ }
+ return Directive;
+ }());
+ exports.Directive = Directive;
+ var DoWhileStatement = (function () {
+ function DoWhileStatement(body, test) {
+ this.type = syntax_1.Syntax.DoWhileStatement;
+ this.body = body;
+ this.test = test;
+ }
+ return DoWhileStatement;
+ }());
+ exports.DoWhileStatement = DoWhileStatement;
+ var EmptyStatement = (function () {
+ function EmptyStatement() {
+ this.type = syntax_1.Syntax.EmptyStatement;
+ }
+ return EmptyStatement;
+ }());
+ exports.EmptyStatement = EmptyStatement;
+ var ExportAllDeclaration = (function () {
+ function ExportAllDeclaration(source) {
+ this.type = syntax_1.Syntax.ExportAllDeclaration;
+ this.source = source;
+ }
+ return ExportAllDeclaration;
+ }());
+ exports.ExportAllDeclaration = ExportAllDeclaration;
+ var ExportDefaultDeclaration = (function () {
+ function ExportDefaultDeclaration(declaration) {
+ this.type = syntax_1.Syntax.ExportDefaultDeclaration;
+ this.declaration = declaration;
+ }
+ return ExportDefaultDeclaration;
+ }());
+ exports.ExportDefaultDeclaration = ExportDefaultDeclaration;
+ var ExportNamedDeclaration = (function () {
+ function ExportNamedDeclaration(declaration, specifiers, source) {
+ this.type = syntax_1.Syntax.ExportNamedDeclaration;
+ this.declaration = declaration;
+ this.specifiers = specifiers;
+ this.source = source;
+ }
+ return ExportNamedDeclaration;
+ }());
+ exports.ExportNamedDeclaration = ExportNamedDeclaration;
+ var ExportSpecifier = (function () {
+ function ExportSpecifier(local, exported) {
+ this.type = syntax_1.Syntax.ExportSpecifier;
+ this.exported = exported;
+ this.local = local;
+ }
+ return ExportSpecifier;
+ }());
+ exports.ExportSpecifier = ExportSpecifier;
+ var ExpressionStatement = (function () {
+ function ExpressionStatement(expression) {
+ this.type = syntax_1.Syntax.ExpressionStatement;
+ this.expression = expression;
+ }
+ return ExpressionStatement;
+ }());
+ exports.ExpressionStatement = ExpressionStatement;
+ var ForInStatement = (function () {
+ function ForInStatement(left, right, body) {
+ this.type = syntax_1.Syntax.ForInStatement;
+ this.left = left;
+ this.right = right;
+ this.body = body;
+ this.each = false;
+ }
+ return ForInStatement;
+ }());
+ exports.ForInStatement = ForInStatement;
+ var ForOfStatement = (function () {
+ function ForOfStatement(left, right, body) {
+ this.type = syntax_1.Syntax.ForOfStatement;
+ this.left = left;
+ this.right = right;
+ this.body = body;
+ }
+ return ForOfStatement;
+ }());
+ exports.ForOfStatement = ForOfStatement;
+ var ForStatement = (function () {
+ function ForStatement(init, test, update, body) {
+ this.type = syntax_1.Syntax.ForStatement;
+ this.init = init;
+ this.test = test;
+ this.update = update;
+ this.body = body;
+ }
+ return ForStatement;
+ }());
+ exports.ForStatement = ForStatement;
+ var FunctionDeclaration = (function () {
+ function FunctionDeclaration(id, params, body, generator) {
+ this.type = syntax_1.Syntax.FunctionDeclaration;
+ this.id = id;
+ this.params = params;
+ this.body = body;
+ this.generator = generator;
+ this.expression = false;
+ this.async = false;
+ }
+ return FunctionDeclaration;
+ }());
+ exports.FunctionDeclaration = FunctionDeclaration;
+ var FunctionExpression = (function () {
+ function FunctionExpression(id, params, body, generator) {
+ this.type = syntax_1.Syntax.FunctionExpression;
+ this.id = id;
+ this.params = params;
+ this.body = body;
+ this.generator = generator;
+ this.expression = false;
+ this.async = false;
+ }
+ return FunctionExpression;
+ }());
+ exports.FunctionExpression = FunctionExpression;
+ var Identifier = (function () {
+ function Identifier(name) {
+ this.type = syntax_1.Syntax.Identifier;
+ this.name = name;
+ }
+ return Identifier;
+ }());
+ exports.Identifier = Identifier;
+ var IfStatement = (function () {
+ function IfStatement(test, consequent, alternate) {
+ this.type = syntax_1.Syntax.IfStatement;
+ this.test = test;
+ this.consequent = consequent;
+ this.alternate = alternate;
+ }
+ return IfStatement;
+ }());
+ exports.IfStatement = IfStatement;
+ var ImportDeclaration = (function () {
+ function ImportDeclaration(specifiers, source) {
+ this.type = syntax_1.Syntax.ImportDeclaration;
+ this.specifiers = specifiers;
+ this.source = source;
+ }
+ return ImportDeclaration;
+ }());
+ exports.ImportDeclaration = ImportDeclaration;
+ var ImportDefaultSpecifier = (function () {
+ function ImportDefaultSpecifier(local) {
+ this.type = syntax_1.Syntax.ImportDefaultSpecifier;
+ this.local = local;
+ }
+ return ImportDefaultSpecifier;
+ }());
+ exports.ImportDefaultSpecifier = ImportDefaultSpecifier;
+ var ImportNamespaceSpecifier = (function () {
+ function ImportNamespaceSpecifier(local) {
+ this.type = syntax_1.Syntax.ImportNamespaceSpecifier;
+ this.local = local;
+ }
+ return ImportNamespaceSpecifier;
+ }());
+ exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier;
+ var ImportSpecifier = (function () {
+ function ImportSpecifier(local, imported) {
+ this.type = syntax_1.Syntax.ImportSpecifier;
+ this.local = local;
+ this.imported = imported;
+ }
+ return ImportSpecifier;
+ }());
+ exports.ImportSpecifier = ImportSpecifier;
+ var LabeledStatement = (function () {
+ function LabeledStatement(label, body) {
+ this.type = syntax_1.Syntax.LabeledStatement;
+ this.label = label;
+ this.body = body;
+ }
+ return LabeledStatement;
+ }());
+ exports.LabeledStatement = LabeledStatement;
+ var Literal = (function () {
+ function Literal(value, raw) {
+ this.type = syntax_1.Syntax.Literal;
+ this.value = value;
+ this.raw = raw;
+ }
+ return Literal;
+ }());
+ exports.Literal = Literal;
+ var MetaProperty = (function () {
+ function MetaProperty(meta, property) {
+ this.type = syntax_1.Syntax.MetaProperty;
+ this.meta = meta;
+ this.property = property;
+ }
+ return MetaProperty;
+ }());
+ exports.MetaProperty = MetaProperty;
+ var MethodDefinition = (function () {
+ function MethodDefinition(key, computed, value, kind, isStatic) {
+ this.type = syntax_1.Syntax.MethodDefinition;
+ this.key = key;
+ this.computed = computed;
+ this.value = value;
+ this.kind = kind;
+ this.static = isStatic;
+ }
+ return MethodDefinition;
+ }());
+ exports.MethodDefinition = MethodDefinition;
+ var Module = (function () {
+ function Module(body) {
+ this.type = syntax_1.Syntax.Program;
+ this.body = body;
+ this.sourceType = 'module';
+ }
+ return Module;
+ }());
+ exports.Module = Module;
+ var NewExpression = (function () {
+ function NewExpression(callee, args) {
+ this.type = syntax_1.Syntax.NewExpression;
+ this.callee = callee;
+ this.arguments = args;
+ }
+ return NewExpression;
+ }());
+ exports.NewExpression = NewExpression;
+ var ObjectExpression = (function () {
+ function ObjectExpression(properties) {
+ this.type = syntax_1.Syntax.ObjectExpression;
+ this.properties = properties;
+ }
+ return ObjectExpression;
+ }());
+ exports.ObjectExpression = ObjectExpression;
+ var ObjectPattern = (function () {
+ function ObjectPattern(properties) {
+ this.type = syntax_1.Syntax.ObjectPattern;
+ this.properties = properties;
+ }
+ return ObjectPattern;
+ }());
+ exports.ObjectPattern = ObjectPattern;
+ var Property = (function () {
+ function Property(kind, key, computed, value, method, shorthand) {
+ this.type = syntax_1.Syntax.Property;
+ this.key = key;
+ this.computed = computed;
+ this.value = value;
+ this.kind = kind;
+ this.method = method;
+ this.shorthand = shorthand;
+ }
+ return Property;
+ }());
+ exports.Property = Property;
+ var RegexLiteral = (function () {
+ function RegexLiteral(value, raw, pattern, flags) {
+ this.type = syntax_1.Syntax.Literal;
+ this.value = value;
+ this.raw = raw;
+ this.regex = { pattern: pattern, flags: flags };
+ }
+ return RegexLiteral;
+ }());
+ exports.RegexLiteral = RegexLiteral;
+ var RestElement = (function () {
+ function RestElement(argument) {
+ this.type = syntax_1.Syntax.RestElement;
+ this.argument = argument;
+ }
+ return RestElement;
+ }());
+ exports.RestElement = RestElement;
+ var ReturnStatement = (function () {
+ function ReturnStatement(argument) {
+ this.type = syntax_1.Syntax.ReturnStatement;
+ this.argument = argument;
+ }
+ return ReturnStatement;
+ }());
+ exports.ReturnStatement = ReturnStatement;
+ var Script = (function () {
+ function Script(body) {
+ this.type = syntax_1.Syntax.Program;
+ this.body = body;
+ this.sourceType = 'script';
+ }
+ return Script;
+ }());
+ exports.Script = Script;
+ var SequenceExpression = (function () {
+ function SequenceExpression(expressions) {
+ this.type = syntax_1.Syntax.SequenceExpression;
+ this.expressions = expressions;
+ }
+ return SequenceExpression;
+ }());
+ exports.SequenceExpression = SequenceExpression;
+ var SpreadElement = (function () {
+ function SpreadElement(argument) {
+ this.type = syntax_1.Syntax.SpreadElement;
+ this.argument = argument;
+ }
+ return SpreadElement;
+ }());
+ exports.SpreadElement = SpreadElement;
+ var StaticMemberExpression = (function () {
+ function StaticMemberExpression(object, property) {
+ this.type = syntax_1.Syntax.MemberExpression;
+ this.computed = false;
+ this.object = object;
+ this.property = property;
+ }
+ return StaticMemberExpression;
+ }());
+ exports.StaticMemberExpression = StaticMemberExpression;
+ var Super = (function () {
+ function Super() {
+ this.type = syntax_1.Syntax.Super;
+ }
+ return Super;
+ }());
+ exports.Super = Super;
+ var SwitchCase = (function () {
+ function SwitchCase(test, consequent) {
+ this.type = syntax_1.Syntax.SwitchCase;
+ this.test = test;
+ this.consequent = consequent;
+ }
+ return SwitchCase;
+ }());
+ exports.SwitchCase = SwitchCase;
+ var SwitchStatement = (function () {
+ function SwitchStatement(discriminant, cases) {
+ this.type = syntax_1.Syntax.SwitchStatement;
+ this.discriminant = discriminant;
+ this.cases = cases;
+ }
+ return SwitchStatement;
+ }());
+ exports.SwitchStatement = SwitchStatement;
+ var TaggedTemplateExpression = (function () {
+ function TaggedTemplateExpression(tag, quasi) {
+ this.type = syntax_1.Syntax.TaggedTemplateExpression;
+ this.tag = tag;
+ this.quasi = quasi;
+ }
+ return TaggedTemplateExpression;
+ }());
+ exports.TaggedTemplateExpression = TaggedTemplateExpression;
+ var TemplateElement = (function () {
+ function TemplateElement(value, tail) {
+ this.type = syntax_1.Syntax.TemplateElement;
+ this.value = value;
+ this.tail = tail;
+ }
+ return TemplateElement;
+ }());
+ exports.TemplateElement = TemplateElement;
+ var TemplateLiteral = (function () {
+ function TemplateLiteral(quasis, expressions) {
+ this.type = syntax_1.Syntax.TemplateLiteral;
+ this.quasis = quasis;
+ this.expressions = expressions;
+ }
+ return TemplateLiteral;
+ }());
+ exports.TemplateLiteral = TemplateLiteral;
+ var ThisExpression = (function () {
+ function ThisExpression() {
+ this.type = syntax_1.Syntax.ThisExpression;
+ }
+ return ThisExpression;
+ }());
+ exports.ThisExpression = ThisExpression;
+ var ThrowStatement = (function () {
+ function ThrowStatement(argument) {
+ this.type = syntax_1.Syntax.ThrowStatement;
+ this.argument = argument;
+ }
+ return ThrowStatement;
+ }());
+ exports.ThrowStatement = ThrowStatement;
+ var TryStatement = (function () {
+ function TryStatement(block, handler, finalizer) {
+ this.type = syntax_1.Syntax.TryStatement;
+ this.block = block;
+ this.handler = handler;
+ this.finalizer = finalizer;
+ }
+ return TryStatement;
+ }());
+ exports.TryStatement = TryStatement;
+ var UnaryExpression = (function () {
+ function UnaryExpression(operator, argument) {
+ this.type = syntax_1.Syntax.UnaryExpression;
+ this.operator = operator;
+ this.argument = argument;
+ this.prefix = true;
+ }
+ return UnaryExpression;
+ }());
+ exports.UnaryExpression = UnaryExpression;
+ var UpdateExpression = (function () {
+ function UpdateExpression(operator, argument, prefix) {
+ this.type = syntax_1.Syntax.UpdateExpression;
+ this.operator = operator;
+ this.argument = argument;
+ this.prefix = prefix;
+ }
+ return UpdateExpression;
+ }());
+ exports.UpdateExpression = UpdateExpression;
+ var VariableDeclaration = (function () {
+ function VariableDeclaration(declarations, kind) {
+ this.type = syntax_1.Syntax.VariableDeclaration;
+ this.declarations = declarations;
+ this.kind = kind;
+ }
+ return VariableDeclaration;
+ }());
+ exports.VariableDeclaration = VariableDeclaration;
+ var VariableDeclarator = (function () {
+ function VariableDeclarator(id, init) {
+ this.type = syntax_1.Syntax.VariableDeclarator;
+ this.id = id;
+ this.init = init;
+ }
+ return VariableDeclarator;
+ }());
+ exports.VariableDeclarator = VariableDeclarator;
+ var WhileStatement = (function () {
+ function WhileStatement(test, body) {
+ this.type = syntax_1.Syntax.WhileStatement;
+ this.test = test;
+ this.body = body;
+ }
+ return WhileStatement;
+ }());
+ exports.WhileStatement = WhileStatement;
+ var WithStatement = (function () {
+ function WithStatement(object, body) {
+ this.type = syntax_1.Syntax.WithStatement;
+ this.object = object;
+ this.body = body;
+ }
+ return WithStatement;
+ }());
+ exports.WithStatement = WithStatement;
+ var YieldExpression = (function () {
+ function YieldExpression(argument, delegate) {
+ this.type = syntax_1.Syntax.YieldExpression;
+ this.argument = argument;
+ this.delegate = delegate;
+ }
+ return YieldExpression;
+ }());
+ exports.YieldExpression = YieldExpression;
+
+
+/***/ },
+/* 8 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var assert_1 = __webpack_require__(9);
+ var error_handler_1 = __webpack_require__(10);
+ var messages_1 = __webpack_require__(11);
+ var Node = __webpack_require__(7);
+ var scanner_1 = __webpack_require__(12);
+ var syntax_1 = __webpack_require__(2);
+ var token_1 = __webpack_require__(13);
+ var ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder';
+ var Parser = (function () {
+ function Parser(code, options, delegate) {
+ if (options === void 0) { options = {}; }
+ this.config = {
+ range: (typeof options.range === 'boolean') && options.range,
+ loc: (typeof options.loc === 'boolean') && options.loc,
+ source: null,
+ tokens: (typeof options.tokens === 'boolean') && options.tokens,
+ comment: (typeof options.comment === 'boolean') && options.comment,
+ tolerant: (typeof options.tolerant === 'boolean') && options.tolerant
+ };
+ if (this.config.loc && options.source && options.source !== null) {
+ this.config.source = String(options.source);
+ }
+ this.delegate = delegate;
+ this.errorHandler = new error_handler_1.ErrorHandler();
+ this.errorHandler.tolerant = this.config.tolerant;
+ this.scanner = new scanner_1.Scanner(code, this.errorHandler);
+ this.scanner.trackComment = this.config.comment;
+ this.operatorPrecedence = {
+ ')': 0,
+ ';': 0,
+ ',': 0,
+ '=': 0,
+ ']': 0,
+ '||': 1,
+ '&&': 2,
+ '|': 3,
+ '^': 4,
+ '&': 5,
+ '==': 6,
+ '!=': 6,
+ '===': 6,
+ '!==': 6,
+ '<': 7,
+ '>': 7,
+ '<=': 7,
+ '>=': 7,
+ '<<': 8,
+ '>>': 8,
+ '>>>': 8,
+ '+': 9,
+ '-': 9,
+ '*': 11,
+ '/': 11,
+ '%': 11
+ };
+ this.lookahead = {
+ type: 2 /* EOF */,
+ value: '',
+ lineNumber: this.scanner.lineNumber,
+ lineStart: 0,
+ start: 0,
+ end: 0
+ };
+ this.hasLineTerminator = false;
+ this.context = {
+ isModule: false,
+ await: false,
+ allowIn: true,
+ allowStrictDirective: true,
+ allowYield: true,
+ firstCoverInitializedNameError: null,
+ isAssignmentTarget: false,
+ isBindingElement: false,
+ inFunctionBody: false,
+ inIteration: false,
+ inSwitch: false,
+ labelSet: {},
+ strict: false
+ };
+ this.tokens = [];
+ this.startMarker = {
+ index: 0,
+ line: this.scanner.lineNumber,
+ column: 0
+ };
+ this.lastMarker = {
+ index: 0,
+ line: this.scanner.lineNumber,
+ column: 0
+ };
+ this.nextToken();
+ this.lastMarker = {
+ index: this.scanner.index,
+ line: this.scanner.lineNumber,
+ column: this.scanner.index - this.scanner.lineStart
+ };
+ }
+ Parser.prototype.throwError = function (messageFormat) {
+ var values = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ values[_i - 1] = arguments[_i];
+ }
+ var args = Array.prototype.slice.call(arguments, 1);
+ var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
+ assert_1.assert(idx < args.length, 'Message reference must be in range');
+ return args[idx];
+ });
+ var index = this.lastMarker.index;
+ var line = this.lastMarker.line;
+ var column = this.lastMarker.column + 1;
+ throw this.errorHandler.createError(index, line, column, msg);
+ };
+ Parser.prototype.tolerateError = function (messageFormat) {
+ var values = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ values[_i - 1] = arguments[_i];
+ }
+ var args = Array.prototype.slice.call(arguments, 1);
+ var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
+ assert_1.assert(idx < args.length, 'Message reference must be in range');
+ return args[idx];
+ });
+ var index = this.lastMarker.index;
+ var line = this.scanner.lineNumber;
+ var column = this.lastMarker.column + 1;
+ this.errorHandler.tolerateError(index, line, column, msg);
+ };
+ // Throw an exception because of the token.
+ Parser.prototype.unexpectedTokenError = function (token, message) {
+ var msg = message || messages_1.Messages.UnexpectedToken;
+ var value;
+ if (token) {
+ if (!message) {
+ msg = (token.type === 2 /* EOF */) ? messages_1.Messages.UnexpectedEOS :
+ (token.type === 3 /* Identifier */) ? messages_1.Messages.UnexpectedIdentifier :
+ (token.type === 6 /* NumericLiteral */) ? messages_1.Messages.UnexpectedNumber :
+ (token.type === 8 /* StringLiteral */) ? messages_1.Messages.UnexpectedString :
+ (token.type === 10 /* Template */) ? messages_1.Messages.UnexpectedTemplate :
+ messages_1.Messages.UnexpectedToken;
+ if (token.type === 4 /* Keyword */) {
+ if (this.scanner.isFutureReservedWord(token.value)) {
+ msg = messages_1.Messages.UnexpectedReserved;
+ }
+ else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) {
+ msg = messages_1.Messages.StrictReservedWord;
+ }
+ }
+ }
+ value = token.value;
+ }
+ else {
+ value = 'ILLEGAL';
+ }
+ msg = msg.replace('%0', value);
+ if (token && typeof token.lineNumber === 'number') {
+ var index = token.start;
+ var line = token.lineNumber;
+ var lastMarkerLineStart = this.lastMarker.index - this.lastMarker.column;
+ var column = token.start - lastMarkerLineStart + 1;
+ return this.errorHandler.createError(index, line, column, msg);
+ }
+ else {
+ var index = this.lastMarker.index;
+ var line = this.lastMarker.line;
+ var column = this.lastMarker.column + 1;
+ return this.errorHandler.createError(index, line, column, msg);
+ }
+ };
+ Parser.prototype.throwUnexpectedToken = function (token, message) {
+ throw this.unexpectedTokenError(token, message);
+ };
+ Parser.prototype.tolerateUnexpectedToken = function (token, message) {
+ this.errorHandler.tolerate(this.unexpectedTokenError(token, message));
+ };
+ Parser.prototype.collectComments = function () {
+ if (!this.config.comment) {
+ this.scanner.scanComments();
+ }
+ else {
+ var comments = this.scanner.scanComments();
+ if (comments.length > 0 && this.delegate) {
+ for (var i = 0; i < comments.length; ++i) {
+ var e = comments[i];
+ var node = void 0;
+ node = {
+ type: e.multiLine ? 'BlockComment' : 'LineComment',
+ value: this.scanner.source.slice(e.slice[0], e.slice[1])
+ };
+ if (this.config.range) {
+ node.range = e.range;
+ }
+ if (this.config.loc) {
+ node.loc = e.loc;
+ }
+ var metadata = {
+ start: {
+ line: e.loc.start.line,
+ column: e.loc.start.column,
+ offset: e.range[0]
+ },
+ end: {
+ line: e.loc.end.line,
+ column: e.loc.end.column,
+ offset: e.range[1]
+ }
+ };
+ this.delegate(node, metadata);
+ }
+ }
+ }
+ };
+ // From internal representation to an external structure
+ Parser.prototype.getTokenRaw = function (token) {
+ return this.scanner.source.slice(token.start, token.end);
+ };
+ Parser.prototype.convertToken = function (token) {
+ var t = {
+ type: token_1.TokenName[token.type],
+ value: this.getTokenRaw(token)
+ };
+ if (this.config.range) {
+ t.range = [token.start, token.end];
+ }
+ if (this.config.loc) {
+ t.loc = {
+ start: {
+ line: this.startMarker.line,
+ column: this.startMarker.column
+ },
+ end: {
+ line: this.scanner.lineNumber,
+ column: this.scanner.index - this.scanner.lineStart
+ }
+ };
+ }
+ if (token.type === 9 /* RegularExpression */) {
+ var pattern = token.pattern;
+ var flags = token.flags;
+ t.regex = { pattern: pattern, flags: flags };
+ }
+ return t;
+ };
+ Parser.prototype.nextToken = function () {
+ var token = this.lookahead;
+ this.lastMarker.index = this.scanner.index;
+ this.lastMarker.line = this.scanner.lineNumber;
+ this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
+ this.collectComments();
+ if (this.scanner.index !== this.startMarker.index) {
+ this.startMarker.index = this.scanner.index;
+ this.startMarker.line = this.scanner.lineNumber;
+ this.startMarker.column = this.scanner.index - this.scanner.lineStart;
+ }
+ var next = this.scanner.lex();
+ this.hasLineTerminator = (token.lineNumber !== next.lineNumber);
+ if (next && this.context.strict && next.type === 3 /* Identifier */) {
+ if (this.scanner.isStrictModeReservedWord(next.value)) {
+ next.type = 4 /* Keyword */;
+ }
+ }
+ this.lookahead = next;
+ if (this.config.tokens && next.type !== 2 /* EOF */) {
+ this.tokens.push(this.convertToken(next));
+ }
+ return token;
+ };
+ Parser.prototype.nextRegexToken = function () {
+ this.collectComments();
+ var token = this.scanner.scanRegExp();
+ if (this.config.tokens) {
+ // Pop the previous token, '/' or '/='
+ // This is added from the lookahead token.
+ this.tokens.pop();
+ this.tokens.push(this.convertToken(token));
+ }
+ // Prime the next lookahead.
+ this.lookahead = token;
+ this.nextToken();
+ return token;
+ };
+ Parser.prototype.createNode = function () {
+ return {
+ index: this.startMarker.index,
+ line: this.startMarker.line,
+ column: this.startMarker.column
+ };
+ };
+ Parser.prototype.startNode = function (token, lastLineStart) {
+ if (lastLineStart === void 0) { lastLineStart = 0; }
+ var column = token.start - token.lineStart;
+ var line = token.lineNumber;
+ if (column < 0) {
+ column += lastLineStart;
+ line--;
+ }
+ return {
+ index: token.start,
+ line: line,
+ column: column
+ };
+ };
+ Parser.prototype.finalize = function (marker, node) {
+ if (this.config.range) {
+ node.range = [marker.index, this.lastMarker.index];
+ }
+ if (this.config.loc) {
+ node.loc = {
+ start: {
+ line: marker.line,
+ column: marker.column,
+ },
+ end: {
+ line: this.lastMarker.line,
+ column: this.lastMarker.column
+ }
+ };
+ if (this.config.source) {
+ node.loc.source = this.config.source;
+ }
+ }
+ if (this.delegate) {
+ var metadata = {
+ start: {
+ line: marker.line,
+ column: marker.column,
+ offset: marker.index
+ },
+ end: {
+ line: this.lastMarker.line,
+ column: this.lastMarker.column,
+ offset: this.lastMarker.index
+ }
+ };
+ this.delegate(node, metadata);
+ }
+ return node;
+ };
+ // Expect the next token to match the specified punctuator.
+ // If not, an exception will be thrown.
+ Parser.prototype.expect = function (value) {
+ var token = this.nextToken();
+ if (token.type !== 7 /* Punctuator */ || token.value !== value) {
+ this.throwUnexpectedToken(token);
+ }
+ };
+ // Quietly expect a comma when in tolerant mode, otherwise delegates to expect().
+ Parser.prototype.expectCommaSeparator = function () {
+ if (this.config.tolerant) {
+ var token = this.lookahead;
+ if (token.type === 7 /* Punctuator */ && token.value === ',') {
+ this.nextToken();
+ }
+ else if (token.type === 7 /* Punctuator */ && token.value === ';') {
+ this.nextToken();
+ this.tolerateUnexpectedToken(token);
+ }
+ else {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken);
+ }
+ }
+ else {
+ this.expect(',');
+ }
+ };
+ // Expect the next token to match the specified keyword.
+ // If not, an exception will be thrown.
+ Parser.prototype.expectKeyword = function (keyword) {
+ var token = this.nextToken();
+ if (token.type !== 4 /* Keyword */ || token.value !== keyword) {
+ this.throwUnexpectedToken(token);
+ }
+ };
+ // Return true if the next token matches the specified punctuator.
+ Parser.prototype.match = function (value) {
+ return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value;
+ };
+ // Return true if the next token matches the specified keyword
+ Parser.prototype.matchKeyword = function (keyword) {
+ return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword;
+ };
+ // Return true if the next token matches the specified contextual keyword
+ // (where an identifier is sometimes a keyword depending on the context)
+ Parser.prototype.matchContextualKeyword = function (keyword) {
+ return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword;
+ };
+ // Return true if the next token is an assignment operator
+ Parser.prototype.matchAssign = function () {
+ if (this.lookahead.type !== 7 /* Punctuator */) {
+ return false;
+ }
+ var op = this.lookahead.value;
+ return op === '=' ||
+ op === '*=' ||
+ op === '**=' ||
+ op === '/=' ||
+ op === '%=' ||
+ op === '+=' ||
+ op === '-=' ||
+ op === '<<=' ||
+ op === '>>=' ||
+ op === '>>>=' ||
+ op === '&=' ||
+ op === '^=' ||
+ op === '|=';
+ };
+ // Cover grammar support.
+ //
+ // When an assignment expression position starts with an left parenthesis, the determination of the type
+ // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead)
+ // or the first comma. This situation also defers the determination of all the expressions nested in the pair.
+ //
+ // There are three productions that can be parsed in a parentheses pair that needs to be determined
+ // after the outermost pair is closed. They are:
+ //
+ // 1. AssignmentExpression
+ // 2. BindingElements
+ // 3. AssignmentTargets
+ //
+ // In order to avoid exponential backtracking, we use two flags to denote if the production can be
+ // binding element or assignment target.
+ //
+ // The three productions have the relationship:
+ //
+ // BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression
+ //
+ // with a single exception that CoverInitializedName when used directly in an Expression, generates
+ // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the
+ // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair.
+ //
+ // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not
+ // effect the current flags. This means the production the parser parses is only used as an expression. Therefore
+ // the CoverInitializedName check is conducted.
+ //
+ // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates
+ // the flags outside of the parser. This means the production the parser parses is used as a part of a potential
+ // pattern. The CoverInitializedName check is deferred.
+ Parser.prototype.isolateCoverGrammar = function (parseFunction) {
+ var previousIsBindingElement = this.context.isBindingElement;
+ var previousIsAssignmentTarget = this.context.isAssignmentTarget;
+ var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
+ this.context.isBindingElement = true;
+ this.context.isAssignmentTarget = true;
+ this.context.firstCoverInitializedNameError = null;
+ var result = parseFunction.call(this);
+ if (this.context.firstCoverInitializedNameError !== null) {
+ this.throwUnexpectedToken(this.context.firstCoverInitializedNameError);
+ }
+ this.context.isBindingElement = previousIsBindingElement;
+ this.context.isAssignmentTarget = previousIsAssignmentTarget;
+ this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError;
+ return result;
+ };
+ Parser.prototype.inheritCoverGrammar = function (parseFunction) {
+ var previousIsBindingElement = this.context.isBindingElement;
+ var previousIsAssignmentTarget = this.context.isAssignmentTarget;
+ var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
+ this.context.isBindingElement = true;
+ this.context.isAssignmentTarget = true;
+ this.context.firstCoverInitializedNameError = null;
+ var result = parseFunction.call(this);
+ this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement;
+ this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget;
+ this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError;
+ return result;
+ };
+ Parser.prototype.consumeSemicolon = function () {
+ if (this.match(';')) {
+ this.nextToken();
+ }
+ else if (!this.hasLineTerminator) {
+ if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ this.lastMarker.index = this.startMarker.index;
+ this.lastMarker.line = this.startMarker.line;
+ this.lastMarker.column = this.startMarker.column;
+ }
+ };
+ // https://tc39.github.io/ecma262/#sec-primary-expression
+ Parser.prototype.parsePrimaryExpression = function () {
+ var node = this.createNode();
+ var expr;
+ var token, raw;
+ switch (this.lookahead.type) {
+ case 3 /* Identifier */:
+ if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') {
+ this.tolerateUnexpectedToken(this.lookahead);
+ }
+ expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value));
+ break;
+ case 6 /* NumericLiteral */:
+ case 8 /* StringLiteral */:
+ if (this.context.strict && this.lookahead.octal) {
+ this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral);
+ }
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ token = this.nextToken();
+ raw = this.getTokenRaw(token);
+ expr = this.finalize(node, new Node.Literal(token.value, raw));
+ break;
+ case 1 /* BooleanLiteral */:
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ token = this.nextToken();
+ raw = this.getTokenRaw(token);
+ expr = this.finalize(node, new Node.Literal(token.value === 'true', raw));
+ break;
+ case 5 /* NullLiteral */:
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ token = this.nextToken();
+ raw = this.getTokenRaw(token);
+ expr = this.finalize(node, new Node.Literal(null, raw));
+ break;
+ case 10 /* Template */:
+ expr = this.parseTemplateLiteral();
+ break;
+ case 7 /* Punctuator */:
+ switch (this.lookahead.value) {
+ case '(':
+ this.context.isBindingElement = false;
+ expr = this.inheritCoverGrammar(this.parseGroupExpression);
+ break;
+ case '[':
+ expr = this.inheritCoverGrammar(this.parseArrayInitializer);
+ break;
+ case '{':
+ expr = this.inheritCoverGrammar(this.parseObjectInitializer);
+ break;
+ case '/':
+ case '/=':
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ this.scanner.index = this.startMarker.index;
+ token = this.nextRegexToken();
+ raw = this.getTokenRaw(token);
+ expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags));
+ break;
+ default:
+ expr = this.throwUnexpectedToken(this.nextToken());
+ }
+ break;
+ case 4 /* Keyword */:
+ if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) {
+ expr = this.parseIdentifierName();
+ }
+ else if (!this.context.strict && this.matchKeyword('let')) {
+ expr = this.finalize(node, new Node.Identifier(this.nextToken().value));
+ }
+ else {
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ if (this.matchKeyword('function')) {
+ expr = this.parseFunctionExpression();
+ }
+ else if (this.matchKeyword('this')) {
+ this.nextToken();
+ expr = this.finalize(node, new Node.ThisExpression());
+ }
+ else if (this.matchKeyword('class')) {
+ expr = this.parseClassExpression();
+ }
+ else {
+ expr = this.throwUnexpectedToken(this.nextToken());
+ }
+ }
+ break;
+ default:
+ expr = this.throwUnexpectedToken(this.nextToken());
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-array-initializer
+ Parser.prototype.parseSpreadElement = function () {
+ var node = this.createNode();
+ this.expect('...');
+ var arg = this.inheritCoverGrammar(this.parseAssignmentExpression);
+ return this.finalize(node, new Node.SpreadElement(arg));
+ };
+ Parser.prototype.parseArrayInitializer = function () {
+ var node = this.createNode();
+ var elements = [];
+ this.expect('[');
+ while (!this.match(']')) {
+ if (this.match(',')) {
+ this.nextToken();
+ elements.push(null);
+ }
+ else if (this.match('...')) {
+ var element = this.parseSpreadElement();
+ if (!this.match(']')) {
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ this.expect(',');
+ }
+ elements.push(element);
+ }
+ else {
+ elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
+ if (!this.match(']')) {
+ this.expect(',');
+ }
+ }
+ }
+ this.expect(']');
+ return this.finalize(node, new Node.ArrayExpression(elements));
+ };
+ // https://tc39.github.io/ecma262/#sec-object-initializer
+ Parser.prototype.parsePropertyMethod = function (params) {
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var previousStrict = this.context.strict;
+ var previousAllowStrictDirective = this.context.allowStrictDirective;
+ this.context.allowStrictDirective = params.simple;
+ var body = this.isolateCoverGrammar(this.parseFunctionSourceElements);
+ if (this.context.strict && params.firstRestricted) {
+ this.tolerateUnexpectedToken(params.firstRestricted, params.message);
+ }
+ if (this.context.strict && params.stricted) {
+ this.tolerateUnexpectedToken(params.stricted, params.message);
+ }
+ this.context.strict = previousStrict;
+ this.context.allowStrictDirective = previousAllowStrictDirective;
+ return body;
+ };
+ Parser.prototype.parsePropertyMethodFunction = function () {
+ var isGenerator = false;
+ var node = this.createNode();
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = true;
+ var params = this.parseFormalParameters();
+ var method = this.parsePropertyMethod(params);
+ this.context.allowYield = previousAllowYield;
+ return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
+ };
+ Parser.prototype.parsePropertyMethodAsyncFunction = function () {
+ var node = this.createNode();
+ var previousAllowYield = this.context.allowYield;
+ var previousAwait = this.context.await;
+ this.context.allowYield = false;
+ this.context.await = true;
+ var params = this.parseFormalParameters();
+ var method = this.parsePropertyMethod(params);
+ this.context.allowYield = previousAllowYield;
+ this.context.await = previousAwait;
+ return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method));
+ };
+ Parser.prototype.parseObjectPropertyKey = function () {
+ var node = this.createNode();
+ var token = this.nextToken();
+ var key;
+ switch (token.type) {
+ case 8 /* StringLiteral */:
+ case 6 /* NumericLiteral */:
+ if (this.context.strict && token.octal) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral);
+ }
+ var raw = this.getTokenRaw(token);
+ key = this.finalize(node, new Node.Literal(token.value, raw));
+ break;
+ case 3 /* Identifier */:
+ case 1 /* BooleanLiteral */:
+ case 5 /* NullLiteral */:
+ case 4 /* Keyword */:
+ key = this.finalize(node, new Node.Identifier(token.value));
+ break;
+ case 7 /* Punctuator */:
+ if (token.value === '[') {
+ key = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ this.expect(']');
+ }
+ else {
+ key = this.throwUnexpectedToken(token);
+ }
+ break;
+ default:
+ key = this.throwUnexpectedToken(token);
+ }
+ return key;
+ };
+ Parser.prototype.isPropertyKey = function (key, value) {
+ return (key.type === syntax_1.Syntax.Identifier && key.name === value) ||
+ (key.type === syntax_1.Syntax.Literal && key.value === value);
+ };
+ Parser.prototype.parseObjectProperty = function (hasProto) {
+ var node = this.createNode();
+ var token = this.lookahead;
+ var kind;
+ var key = null;
+ var value = null;
+ var computed = false;
+ var method = false;
+ var shorthand = false;
+ var isAsync = false;
+ if (token.type === 3 /* Identifier */) {
+ var id = token.value;
+ this.nextToken();
+ computed = this.match('[');
+ isAsync = !this.hasLineTerminator && (id === 'async') &&
+ !this.match(':') && !this.match('(') && !this.match('*') && !this.match(',');
+ key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id));
+ }
+ else if (this.match('*')) {
+ this.nextToken();
+ }
+ else {
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ }
+ var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
+ if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) {
+ kind = 'get';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ this.context.allowYield = false;
+ value = this.parseGetterMethod();
+ }
+ else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) {
+ kind = 'set';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ value = this.parseSetterMethod();
+ }
+ else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
+ kind = 'init';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ value = this.parseGeneratorMethod();
+ method = true;
+ }
+ else {
+ if (!key) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ kind = 'init';
+ if (this.match(':') && !isAsync) {
+ if (!computed && this.isPropertyKey(key, '__proto__')) {
+ if (hasProto.value) {
+ this.tolerateError(messages_1.Messages.DuplicateProtoProperty);
+ }
+ hasProto.value = true;
+ }
+ this.nextToken();
+ value = this.inheritCoverGrammar(this.parseAssignmentExpression);
+ }
+ else if (this.match('(')) {
+ value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
+ method = true;
+ }
+ else if (token.type === 3 /* Identifier */) {
+ var id = this.finalize(node, new Node.Identifier(token.value));
+ if (this.match('=')) {
+ this.context.firstCoverInitializedNameError = this.lookahead;
+ this.nextToken();
+ shorthand = true;
+ var init = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ value = this.finalize(node, new Node.AssignmentPattern(id, init));
+ }
+ else {
+ shorthand = true;
+ value = id;
+ }
+ }
+ else {
+ this.throwUnexpectedToken(this.nextToken());
+ }
+ }
+ return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand));
+ };
+ Parser.prototype.parseObjectInitializer = function () {
+ var node = this.createNode();
+ this.expect('{');
+ var properties = [];
+ var hasProto = { value: false };
+ while (!this.match('}')) {
+ properties.push(this.parseObjectProperty(hasProto));
+ if (!this.match('}')) {
+ this.expectCommaSeparator();
+ }
+ }
+ this.expect('}');
+ return this.finalize(node, new Node.ObjectExpression(properties));
+ };
+ // https://tc39.github.io/ecma262/#sec-template-literals
+ Parser.prototype.parseTemplateHead = function () {
+ assert_1.assert(this.lookahead.head, 'Template literal must start with a template head');
+ var node = this.createNode();
+ var token = this.nextToken();
+ var raw = token.value;
+ var cooked = token.cooked;
+ return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
+ };
+ Parser.prototype.parseTemplateElement = function () {
+ if (this.lookahead.type !== 10 /* Template */) {
+ this.throwUnexpectedToken();
+ }
+ var node = this.createNode();
+ var token = this.nextToken();
+ var raw = token.value;
+ var cooked = token.cooked;
+ return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
+ };
+ Parser.prototype.parseTemplateLiteral = function () {
+ var node = this.createNode();
+ var expressions = [];
+ var quasis = [];
+ var quasi = this.parseTemplateHead();
+ quasis.push(quasi);
+ while (!quasi.tail) {
+ expressions.push(this.parseExpression());
+ quasi = this.parseTemplateElement();
+ quasis.push(quasi);
+ }
+ return this.finalize(node, new Node.TemplateLiteral(quasis, expressions));
+ };
+ // https://tc39.github.io/ecma262/#sec-grouping-operator
+ Parser.prototype.reinterpretExpressionAsPattern = function (expr) {
+ switch (expr.type) {
+ case syntax_1.Syntax.Identifier:
+ case syntax_1.Syntax.MemberExpression:
+ case syntax_1.Syntax.RestElement:
+ case syntax_1.Syntax.AssignmentPattern:
+ break;
+ case syntax_1.Syntax.SpreadElement:
+ expr.type = syntax_1.Syntax.RestElement;
+ this.reinterpretExpressionAsPattern(expr.argument);
+ break;
+ case syntax_1.Syntax.ArrayExpression:
+ expr.type = syntax_1.Syntax.ArrayPattern;
+ for (var i = 0; i < expr.elements.length; i++) {
+ if (expr.elements[i] !== null) {
+ this.reinterpretExpressionAsPattern(expr.elements[i]);
+ }
+ }
+ break;
+ case syntax_1.Syntax.ObjectExpression:
+ expr.type = syntax_1.Syntax.ObjectPattern;
+ for (var i = 0; i < expr.properties.length; i++) {
+ this.reinterpretExpressionAsPattern(expr.properties[i].value);
+ }
+ break;
+ case syntax_1.Syntax.AssignmentExpression:
+ expr.type = syntax_1.Syntax.AssignmentPattern;
+ delete expr.operator;
+ this.reinterpretExpressionAsPattern(expr.left);
+ break;
+ default:
+ // Allow other node type for tolerant parsing.
+ break;
+ }
+ };
+ Parser.prototype.parseGroupExpression = function () {
+ var expr;
+ this.expect('(');
+ if (this.match(')')) {
+ this.nextToken();
+ if (!this.match('=>')) {
+ this.expect('=>');
+ }
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: [],
+ async: false
+ };
+ }
+ else {
+ var startToken = this.lookahead;
+ var params = [];
+ if (this.match('...')) {
+ expr = this.parseRestElement(params);
+ this.expect(')');
+ if (!this.match('=>')) {
+ this.expect('=>');
+ }
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: [expr],
+ async: false
+ };
+ }
+ else {
+ var arrow = false;
+ this.context.isBindingElement = true;
+ expr = this.inheritCoverGrammar(this.parseAssignmentExpression);
+ if (this.match(',')) {
+ var expressions = [];
+ this.context.isAssignmentTarget = false;
+ expressions.push(expr);
+ while (this.lookahead.type !== 2 /* EOF */) {
+ if (!this.match(',')) {
+ break;
+ }
+ this.nextToken();
+ if (this.match(')')) {
+ this.nextToken();
+ for (var i = 0; i < expressions.length; i++) {
+ this.reinterpretExpressionAsPattern(expressions[i]);
+ }
+ arrow = true;
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: expressions,
+ async: false
+ };
+ }
+ else if (this.match('...')) {
+ if (!this.context.isBindingElement) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ expressions.push(this.parseRestElement(params));
+ this.expect(')');
+ if (!this.match('=>')) {
+ this.expect('=>');
+ }
+ this.context.isBindingElement = false;
+ for (var i = 0; i < expressions.length; i++) {
+ this.reinterpretExpressionAsPattern(expressions[i]);
+ }
+ arrow = true;
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: expressions,
+ async: false
+ };
+ }
+ else {
+ expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
+ }
+ if (arrow) {
+ break;
+ }
+ }
+ if (!arrow) {
+ expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
+ }
+ }
+ if (!arrow) {
+ this.expect(')');
+ if (this.match('=>')) {
+ if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') {
+ arrow = true;
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: [expr],
+ async: false
+ };
+ }
+ if (!arrow) {
+ if (!this.context.isBindingElement) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ if (expr.type === syntax_1.Syntax.SequenceExpression) {
+ for (var i = 0; i < expr.expressions.length; i++) {
+ this.reinterpretExpressionAsPattern(expr.expressions[i]);
+ }
+ }
+ else {
+ this.reinterpretExpressionAsPattern(expr);
+ }
+ var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]);
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: parameters,
+ async: false
+ };
+ }
+ }
+ this.context.isBindingElement = false;
+ }
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions
+ Parser.prototype.parseArguments = function () {
+ this.expect('(');
+ var args = [];
+ if (!this.match(')')) {
+ while (true) {
+ var expr = this.match('...') ? this.parseSpreadElement() :
+ this.isolateCoverGrammar(this.parseAssignmentExpression);
+ args.push(expr);
+ if (this.match(')')) {
+ break;
+ }
+ this.expectCommaSeparator();
+ if (this.match(')')) {
+ break;
+ }
+ }
+ }
+ this.expect(')');
+ return args;
+ };
+ Parser.prototype.isIdentifierName = function (token) {
+ return token.type === 3 /* Identifier */ ||
+ token.type === 4 /* Keyword */ ||
+ token.type === 1 /* BooleanLiteral */ ||
+ token.type === 5 /* NullLiteral */;
+ };
+ Parser.prototype.parseIdentifierName = function () {
+ var node = this.createNode();
+ var token = this.nextToken();
+ if (!this.isIdentifierName(token)) {
+ this.throwUnexpectedToken(token);
+ }
+ return this.finalize(node, new Node.Identifier(token.value));
+ };
+ Parser.prototype.parseNewExpression = function () {
+ var node = this.createNode();
+ var id = this.parseIdentifierName();
+ assert_1.assert(id.name === 'new', 'New expression must start with `new`');
+ var expr;
+ if (this.match('.')) {
+ this.nextToken();
+ if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') {
+ var property = this.parseIdentifierName();
+ expr = new Node.MetaProperty(id, property);
+ }
+ else {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ }
+ else {
+ var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression);
+ var args = this.match('(') ? this.parseArguments() : [];
+ expr = new Node.NewExpression(callee, args);
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ return this.finalize(node, expr);
+ };
+ Parser.prototype.parseAsyncArgument = function () {
+ var arg = this.parseAssignmentExpression();
+ this.context.firstCoverInitializedNameError = null;
+ return arg;
+ };
+ Parser.prototype.parseAsyncArguments = function () {
+ this.expect('(');
+ var args = [];
+ if (!this.match(')')) {
+ while (true) {
+ var expr = this.match('...') ? this.parseSpreadElement() :
+ this.isolateCoverGrammar(this.parseAsyncArgument);
+ args.push(expr);
+ if (this.match(')')) {
+ break;
+ }
+ this.expectCommaSeparator();
+ if (this.match(')')) {
+ break;
+ }
+ }
+ }
+ this.expect(')');
+ return args;
+ };
+ Parser.prototype.parseLeftHandSideExpressionAllowCall = function () {
+ var startToken = this.lookahead;
+ var maybeAsync = this.matchContextualKeyword('async');
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = true;
+ var expr;
+ if (this.matchKeyword('super') && this.context.inFunctionBody) {
+ expr = this.createNode();
+ this.nextToken();
+ expr = this.finalize(expr, new Node.Super());
+ if (!this.match('(') && !this.match('.') && !this.match('[')) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ }
+ else {
+ expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
+ }
+ while (true) {
+ if (this.match('.')) {
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = true;
+ this.expect('.');
+ var property = this.parseIdentifierName();
+ expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property));
+ }
+ else if (this.match('(')) {
+ var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber);
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = false;
+ var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments();
+ expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args));
+ if (asyncArrow && this.match('=>')) {
+ for (var i = 0; i < args.length; ++i) {
+ this.reinterpretExpressionAsPattern(args[i]);
+ }
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: args,
+ async: true
+ };
+ }
+ }
+ else if (this.match('[')) {
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = true;
+ this.expect('[');
+ var property = this.isolateCoverGrammar(this.parseExpression);
+ this.expect(']');
+ expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property));
+ }
+ else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
+ var quasi = this.parseTemplateLiteral();
+ expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi));
+ }
+ else {
+ break;
+ }
+ }
+ this.context.allowIn = previousAllowIn;
+ return expr;
+ };
+ Parser.prototype.parseSuper = function () {
+ var node = this.createNode();
+ this.expectKeyword('super');
+ if (!this.match('[') && !this.match('.')) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ return this.finalize(node, new Node.Super());
+ };
+ Parser.prototype.parseLeftHandSideExpression = function () {
+ assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.');
+ var node = this.startNode(this.lookahead);
+ var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() :
+ this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
+ while (true) {
+ if (this.match('[')) {
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = true;
+ this.expect('[');
+ var property = this.isolateCoverGrammar(this.parseExpression);
+ this.expect(']');
+ expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property));
+ }
+ else if (this.match('.')) {
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = true;
+ this.expect('.');
+ var property = this.parseIdentifierName();
+ expr = this.finalize(node, new Node.StaticMemberExpression(expr, property));
+ }
+ else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
+ var quasi = this.parseTemplateLiteral();
+ expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi));
+ }
+ else {
+ break;
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-update-expressions
+ Parser.prototype.parseUpdateExpression = function () {
+ var expr;
+ var startToken = this.lookahead;
+ if (this.match('++') || this.match('--')) {
+ var node = this.startNode(startToken);
+ var token = this.nextToken();
+ expr = this.inheritCoverGrammar(this.parseUnaryExpression);
+ if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
+ this.tolerateError(messages_1.Messages.StrictLHSPrefix);
+ }
+ if (!this.context.isAssignmentTarget) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
+ }
+ var prefix = true;
+ expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix));
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ else {
+ expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
+ if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) {
+ if (this.match('++') || this.match('--')) {
+ if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
+ this.tolerateError(messages_1.Messages.StrictLHSPostfix);
+ }
+ if (!this.context.isAssignmentTarget) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
+ }
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var operator = this.nextToken().value;
+ var prefix = false;
+ expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix));
+ }
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-unary-operators
+ Parser.prototype.parseAwaitExpression = function () {
+ var node = this.createNode();
+ this.nextToken();
+ var argument = this.parseUnaryExpression();
+ return this.finalize(node, new Node.AwaitExpression(argument));
+ };
+ Parser.prototype.parseUnaryExpression = function () {
+ var expr;
+ if (this.match('+') || this.match('-') || this.match('~') || this.match('!') ||
+ this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) {
+ var node = this.startNode(this.lookahead);
+ var token = this.nextToken();
+ expr = this.inheritCoverGrammar(this.parseUnaryExpression);
+ expr = this.finalize(node, new Node.UnaryExpression(token.value, expr));
+ if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) {
+ this.tolerateError(messages_1.Messages.StrictDelete);
+ }
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ else if (this.context.await && this.matchContextualKeyword('await')) {
+ expr = this.parseAwaitExpression();
+ }
+ else {
+ expr = this.parseUpdateExpression();
+ }
+ return expr;
+ };
+ Parser.prototype.parseExponentiationExpression = function () {
+ var startToken = this.lookahead;
+ var expr = this.inheritCoverGrammar(this.parseUnaryExpression);
+ if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) {
+ this.nextToken();
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var left = expr;
+ var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
+ expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right));
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-exp-operator
+ // https://tc39.github.io/ecma262/#sec-multiplicative-operators
+ // https://tc39.github.io/ecma262/#sec-additive-operators
+ // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators
+ // https://tc39.github.io/ecma262/#sec-relational-operators
+ // https://tc39.github.io/ecma262/#sec-equality-operators
+ // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators
+ // https://tc39.github.io/ecma262/#sec-binary-logical-operators
+ Parser.prototype.binaryPrecedence = function (token) {
+ var op = token.value;
+ var precedence;
+ if (token.type === 7 /* Punctuator */) {
+ precedence = this.operatorPrecedence[op] || 0;
+ }
+ else if (token.type === 4 /* Keyword */) {
+ precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0;
+ }
+ else {
+ precedence = 0;
+ }
+ return precedence;
+ };
+ Parser.prototype.parseBinaryExpression = function () {
+ var startToken = this.lookahead;
+ var expr = this.inheritCoverGrammar(this.parseExponentiationExpression);
+ var token = this.lookahead;
+ var prec = this.binaryPrecedence(token);
+ if (prec > 0) {
+ this.nextToken();
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var markers = [startToken, this.lookahead];
+ var left = expr;
+ var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
+ var stack = [left, token.value, right];
+ var precedences = [prec];
+ while (true) {
+ prec = this.binaryPrecedence(this.lookahead);
+ if (prec <= 0) {
+ break;
+ }
+ // Reduce: make a binary expression from the three topmost entries.
+ while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) {
+ right = stack.pop();
+ var operator = stack.pop();
+ precedences.pop();
+ left = stack.pop();
+ markers.pop();
+ var node = this.startNode(markers[markers.length - 1]);
+ stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right)));
+ }
+ // Shift.
+ stack.push(this.nextToken().value);
+ precedences.push(prec);
+ markers.push(this.lookahead);
+ stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression));
+ }
+ // Final reduce to clean-up the stack.
+ var i = stack.length - 1;
+ expr = stack[i];
+ var lastMarker = markers.pop();
+ while (i > 1) {
+ var marker = markers.pop();
+ var lastLineStart = lastMarker && lastMarker.lineStart;
+ var node = this.startNode(marker, lastLineStart);
+ var operator = stack[i - 1];
+ expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr));
+ i -= 2;
+ lastMarker = marker;
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-conditional-operator
+ Parser.prototype.parseConditionalExpression = function () {
+ var startToken = this.lookahead;
+ var expr = this.inheritCoverGrammar(this.parseBinaryExpression);
+ if (this.match('?')) {
+ this.nextToken();
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = true;
+ var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ this.context.allowIn = previousAllowIn;
+ this.expect(':');
+ var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate));
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-assignment-operators
+ Parser.prototype.checkPatternParam = function (options, param) {
+ switch (param.type) {
+ case syntax_1.Syntax.Identifier:
+ this.validateParam(options, param, param.name);
+ break;
+ case syntax_1.Syntax.RestElement:
+ this.checkPatternParam(options, param.argument);
+ break;
+ case syntax_1.Syntax.AssignmentPattern:
+ this.checkPatternParam(options, param.left);
+ break;
+ case syntax_1.Syntax.ArrayPattern:
+ for (var i = 0; i < param.elements.length; i++) {
+ if (param.elements[i] !== null) {
+ this.checkPatternParam(options, param.elements[i]);
+ }
+ }
+ break;
+ case syntax_1.Syntax.ObjectPattern:
+ for (var i = 0; i < param.properties.length; i++) {
+ this.checkPatternParam(options, param.properties[i].value);
+ }
+ break;
+ default:
+ break;
+ }
+ options.simple = options.simple && (param instanceof Node.Identifier);
+ };
+ Parser.prototype.reinterpretAsCoverFormalsList = function (expr) {
+ var params = [expr];
+ var options;
+ var asyncArrow = false;
+ switch (expr.type) {
+ case syntax_1.Syntax.Identifier:
+ break;
+ case ArrowParameterPlaceHolder:
+ params = expr.params;
+ asyncArrow = expr.async;
+ break;
+ default:
+ return null;
+ }
+ options = {
+ simple: true,
+ paramSet: {}
+ };
+ for (var i = 0; i < params.length; ++i) {
+ var param = params[i];
+ if (param.type === syntax_1.Syntax.AssignmentPattern) {
+ if (param.right.type === syntax_1.Syntax.YieldExpression) {
+ if (param.right.argument) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ param.right.type = syntax_1.Syntax.Identifier;
+ param.right.name = 'yield';
+ delete param.right.argument;
+ delete param.right.delegate;
+ }
+ }
+ else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ this.checkPatternParam(options, param);
+ params[i] = param;
+ }
+ if (this.context.strict || !this.context.allowYield) {
+ for (var i = 0; i < params.length; ++i) {
+ var param = params[i];
+ if (param.type === syntax_1.Syntax.YieldExpression) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ }
+ }
+ if (options.message === messages_1.Messages.StrictParamDupe) {
+ var token = this.context.strict ? options.stricted : options.firstRestricted;
+ this.throwUnexpectedToken(token, options.message);
+ }
+ return {
+ simple: options.simple,
+ params: params,
+ stricted: options.stricted,
+ firstRestricted: options.firstRestricted,
+ message: options.message
+ };
+ };
+ Parser.prototype.parseAssignmentExpression = function () {
+ var expr;
+ if (!this.context.allowYield && this.matchKeyword('yield')) {
+ expr = this.parseYieldExpression();
+ }
+ else {
+ var startToken = this.lookahead;
+ var token = startToken;
+ expr = this.parseConditionalExpression();
+ if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') {
+ if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) {
+ var arg = this.parsePrimaryExpression();
+ this.reinterpretExpressionAsPattern(arg);
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: [arg],
+ async: true
+ };
+ }
+ }
+ if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) {
+ // https://tc39.github.io/ecma262/#sec-arrow-function-definitions
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var isAsync = expr.async;
+ var list = this.reinterpretAsCoverFormalsList(expr);
+ if (list) {
+ if (this.hasLineTerminator) {
+ this.tolerateUnexpectedToken(this.lookahead);
+ }
+ this.context.firstCoverInitializedNameError = null;
+ var previousStrict = this.context.strict;
+ var previousAllowStrictDirective = this.context.allowStrictDirective;
+ this.context.allowStrictDirective = list.simple;
+ var previousAllowYield = this.context.allowYield;
+ var previousAwait = this.context.await;
+ this.context.allowYield = true;
+ this.context.await = isAsync;
+ var node = this.startNode(startToken);
+ this.expect('=>');
+ var body = void 0;
+ if (this.match('{')) {
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = true;
+ body = this.parseFunctionSourceElements();
+ this.context.allowIn = previousAllowIn;
+ }
+ else {
+ body = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ }
+ var expression = body.type !== syntax_1.Syntax.BlockStatement;
+ if (this.context.strict && list.firstRestricted) {
+ this.throwUnexpectedToken(list.firstRestricted, list.message);
+ }
+ if (this.context.strict && list.stricted) {
+ this.tolerateUnexpectedToken(list.stricted, list.message);
+ }
+ expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) :
+ this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression));
+ this.context.strict = previousStrict;
+ this.context.allowStrictDirective = previousAllowStrictDirective;
+ this.context.allowYield = previousAllowYield;
+ this.context.await = previousAwait;
+ }
+ }
+ else {
+ if (this.matchAssign()) {
+ if (!this.context.isAssignmentTarget) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
+ }
+ if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) {
+ var id = expr;
+ if (this.scanner.isRestrictedWord(id.name)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment);
+ }
+ if (this.scanner.isStrictModeReservedWord(id.name)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
+ }
+ }
+ if (!this.match('=')) {
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ else {
+ this.reinterpretExpressionAsPattern(expr);
+ }
+ token = this.nextToken();
+ var operator = token.value;
+ var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right));
+ this.context.firstCoverInitializedNameError = null;
+ }
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-comma-operator
+ Parser.prototype.parseExpression = function () {
+ var startToken = this.lookahead;
+ var expr = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ if (this.match(',')) {
+ var expressions = [];
+ expressions.push(expr);
+ while (this.lookahead.type !== 2 /* EOF */) {
+ if (!this.match(',')) {
+ break;
+ }
+ this.nextToken();
+ expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
+ }
+ expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-block
+ Parser.prototype.parseStatementListItem = function () {
+ var statement;
+ this.context.isAssignmentTarget = true;
+ this.context.isBindingElement = true;
+ if (this.lookahead.type === 4 /* Keyword */) {
+ switch (this.lookahead.value) {
+ case 'export':
+ if (!this.context.isModule) {
+ this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration);
+ }
+ statement = this.parseExportDeclaration();
+ break;
+ case 'import':
+ if (!this.context.isModule) {
+ this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration);
+ }
+ statement = this.parseImportDeclaration();
+ break;
+ case 'const':
+ statement = this.parseLexicalDeclaration({ inFor: false });
+ break;
+ case 'function':
+ statement = this.parseFunctionDeclaration();
+ break;
+ case 'class':
+ statement = this.parseClassDeclaration();
+ break;
+ case 'let':
+ statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement();
+ break;
+ default:
+ statement = this.parseStatement();
+ break;
+ }
+ }
+ else {
+ statement = this.parseStatement();
+ }
+ return statement;
+ };
+ Parser.prototype.parseBlock = function () {
+ var node = this.createNode();
+ this.expect('{');
+ var block = [];
+ while (true) {
+ if (this.match('}')) {
+ break;
+ }
+ block.push(this.parseStatementListItem());
+ }
+ this.expect('}');
+ return this.finalize(node, new Node.BlockStatement(block));
+ };
+ // https://tc39.github.io/ecma262/#sec-let-and-const-declarations
+ Parser.prototype.parseLexicalBinding = function (kind, options) {
+ var node = this.createNode();
+ var params = [];
+ var id = this.parsePattern(params, kind);
+ if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
+ if (this.scanner.isRestrictedWord(id.name)) {
+ this.tolerateError(messages_1.Messages.StrictVarName);
+ }
+ }
+ var init = null;
+ if (kind === 'const') {
+ if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) {
+ if (this.match('=')) {
+ this.nextToken();
+ init = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ }
+ else {
+ this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const');
+ }
+ }
+ }
+ else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) {
+ this.expect('=');
+ init = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ }
+ return this.finalize(node, new Node.VariableDeclarator(id, init));
+ };
+ Parser.prototype.parseBindingList = function (kind, options) {
+ var list = [this.parseLexicalBinding(kind, options)];
+ while (this.match(',')) {
+ this.nextToken();
+ list.push(this.parseLexicalBinding(kind, options));
+ }
+ return list;
+ };
+ Parser.prototype.isLexicalDeclaration = function () {
+ var state = this.scanner.saveState();
+ this.scanner.scanComments();
+ var next = this.scanner.lex();
+ this.scanner.restoreState(state);
+ return (next.type === 3 /* Identifier */) ||
+ (next.type === 7 /* Punctuator */ && next.value === '[') ||
+ (next.type === 7 /* Punctuator */ && next.value === '{') ||
+ (next.type === 4 /* Keyword */ && next.value === 'let') ||
+ (next.type === 4 /* Keyword */ && next.value === 'yield');
+ };
+ Parser.prototype.parseLexicalDeclaration = function (options) {
+ var node = this.createNode();
+ var kind = this.nextToken().value;
+ assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const');
+ var declarations = this.parseBindingList(kind, options);
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.VariableDeclaration(declarations, kind));
+ };
+ // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns
+ Parser.prototype.parseBindingRestElement = function (params, kind) {
+ var node = this.createNode();
+ this.expect('...');
+ var arg = this.parsePattern(params, kind);
+ return this.finalize(node, new Node.RestElement(arg));
+ };
+ Parser.prototype.parseArrayPattern = function (params, kind) {
+ var node = this.createNode();
+ this.expect('[');
+ var elements = [];
+ while (!this.match(']')) {
+ if (this.match(',')) {
+ this.nextToken();
+ elements.push(null);
+ }
+ else {
+ if (this.match('...')) {
+ elements.push(this.parseBindingRestElement(params, kind));
+ break;
+ }
+ else {
+ elements.push(this.parsePatternWithDefault(params, kind));
+ }
+ if (!this.match(']')) {
+ this.expect(',');
+ }
+ }
+ }
+ this.expect(']');
+ return this.finalize(node, new Node.ArrayPattern(elements));
+ };
+ Parser.prototype.parsePropertyPattern = function (params, kind) {
+ var node = this.createNode();
+ var computed = false;
+ var shorthand = false;
+ var method = false;
+ var key;
+ var value;
+ if (this.lookahead.type === 3 /* Identifier */) {
+ var keyToken = this.lookahead;
+ key = this.parseVariableIdentifier();
+ var init = this.finalize(node, new Node.Identifier(keyToken.value));
+ if (this.match('=')) {
+ params.push(keyToken);
+ shorthand = true;
+ this.nextToken();
+ var expr = this.parseAssignmentExpression();
+ value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr));
+ }
+ else if (!this.match(':')) {
+ params.push(keyToken);
+ shorthand = true;
+ value = init;
+ }
+ else {
+ this.expect(':');
+ value = this.parsePatternWithDefault(params, kind);
+ }
+ }
+ else {
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ this.expect(':');
+ value = this.parsePatternWithDefault(params, kind);
+ }
+ return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand));
+ };
+ Parser.prototype.parseObjectPattern = function (params, kind) {
+ var node = this.createNode();
+ var properties = [];
+ this.expect('{');
+ while (!this.match('}')) {
+ properties.push(this.parsePropertyPattern(params, kind));
+ if (!this.match('}')) {
+ this.expect(',');
+ }
+ }
+ this.expect('}');
+ return this.finalize(node, new Node.ObjectPattern(properties));
+ };
+ Parser.prototype.parsePattern = function (params, kind) {
+ var pattern;
+ if (this.match('[')) {
+ pattern = this.parseArrayPattern(params, kind);
+ }
+ else if (this.match('{')) {
+ pattern = this.parseObjectPattern(params, kind);
+ }
+ else {
+ if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) {
+ this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding);
+ }
+ params.push(this.lookahead);
+ pattern = this.parseVariableIdentifier(kind);
+ }
+ return pattern;
+ };
+ Parser.prototype.parsePatternWithDefault = function (params, kind) {
+ var startToken = this.lookahead;
+ var pattern = this.parsePattern(params, kind);
+ if (this.match('=')) {
+ this.nextToken();
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = true;
+ var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ this.context.allowYield = previousAllowYield;
+ pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right));
+ }
+ return pattern;
+ };
+ // https://tc39.github.io/ecma262/#sec-variable-statement
+ Parser.prototype.parseVariableIdentifier = function (kind) {
+ var node = this.createNode();
+ var token = this.nextToken();
+ if (token.type === 4 /* Keyword */ && token.value === 'yield') {
+ if (this.context.strict) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
+ }
+ else if (!this.context.allowYield) {
+ this.throwUnexpectedToken(token);
+ }
+ }
+ else if (token.type !== 3 /* Identifier */) {
+ if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
+ }
+ else {
+ if (this.context.strict || token.value !== 'let' || kind !== 'var') {
+ this.throwUnexpectedToken(token);
+ }
+ }
+ }
+ else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') {
+ this.tolerateUnexpectedToken(token);
+ }
+ return this.finalize(node, new Node.Identifier(token.value));
+ };
+ Parser.prototype.parseVariableDeclaration = function (options) {
+ var node = this.createNode();
+ var params = [];
+ var id = this.parsePattern(params, 'var');
+ if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
+ if (this.scanner.isRestrictedWord(id.name)) {
+ this.tolerateError(messages_1.Messages.StrictVarName);
+ }
+ }
+ var init = null;
+ if (this.match('=')) {
+ this.nextToken();
+ init = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ }
+ else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) {
+ this.expect('=');
+ }
+ return this.finalize(node, new Node.VariableDeclarator(id, init));
+ };
+ Parser.prototype.parseVariableDeclarationList = function (options) {
+ var opt = { inFor: options.inFor };
+ var list = [];
+ list.push(this.parseVariableDeclaration(opt));
+ while (this.match(',')) {
+ this.nextToken();
+ list.push(this.parseVariableDeclaration(opt));
+ }
+ return list;
+ };
+ Parser.prototype.parseVariableStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('var');
+ var declarations = this.parseVariableDeclarationList({ inFor: false });
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.VariableDeclaration(declarations, 'var'));
+ };
+ // https://tc39.github.io/ecma262/#sec-empty-statement
+ Parser.prototype.parseEmptyStatement = function () {
+ var node = this.createNode();
+ this.expect(';');
+ return this.finalize(node, new Node.EmptyStatement());
+ };
+ // https://tc39.github.io/ecma262/#sec-expression-statement
+ Parser.prototype.parseExpressionStatement = function () {
+ var node = this.createNode();
+ var expr = this.parseExpression();
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.ExpressionStatement(expr));
+ };
+ // https://tc39.github.io/ecma262/#sec-if-statement
+ Parser.prototype.parseIfClause = function () {
+ if (this.context.strict && this.matchKeyword('function')) {
+ this.tolerateError(messages_1.Messages.StrictFunction);
+ }
+ return this.parseStatement();
+ };
+ Parser.prototype.parseIfStatement = function () {
+ var node = this.createNode();
+ var consequent;
+ var alternate = null;
+ this.expectKeyword('if');
+ this.expect('(');
+ var test = this.parseExpression();
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ consequent = this.finalize(this.createNode(), new Node.EmptyStatement());
+ }
+ else {
+ this.expect(')');
+ consequent = this.parseIfClause();
+ if (this.matchKeyword('else')) {
+ this.nextToken();
+ alternate = this.parseIfClause();
+ }
+ }
+ return this.finalize(node, new Node.IfStatement(test, consequent, alternate));
+ };
+ // https://tc39.github.io/ecma262/#sec-do-while-statement
+ Parser.prototype.parseDoWhileStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('do');
+ var previousInIteration = this.context.inIteration;
+ this.context.inIteration = true;
+ var body = this.parseStatement();
+ this.context.inIteration = previousInIteration;
+ this.expectKeyword('while');
+ this.expect('(');
+ var test = this.parseExpression();
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ }
+ else {
+ this.expect(')');
+ if (this.match(';')) {
+ this.nextToken();
+ }
+ }
+ return this.finalize(node, new Node.DoWhileStatement(body, test));
+ };
+ // https://tc39.github.io/ecma262/#sec-while-statement
+ Parser.prototype.parseWhileStatement = function () {
+ var node = this.createNode();
+ var body;
+ this.expectKeyword('while');
+ this.expect('(');
+ var test = this.parseExpression();
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ body = this.finalize(this.createNode(), new Node.EmptyStatement());
+ }
+ else {
+ this.expect(')');
+ var previousInIteration = this.context.inIteration;
+ this.context.inIteration = true;
+ body = this.parseStatement();
+ this.context.inIteration = previousInIteration;
+ }
+ return this.finalize(node, new Node.WhileStatement(test, body));
+ };
+ // https://tc39.github.io/ecma262/#sec-for-statement
+ // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements
+ Parser.prototype.parseForStatement = function () {
+ var init = null;
+ var test = null;
+ var update = null;
+ var forIn = true;
+ var left, right;
+ var node = this.createNode();
+ this.expectKeyword('for');
+ this.expect('(');
+ if (this.match(';')) {
+ this.nextToken();
+ }
+ else {
+ if (this.matchKeyword('var')) {
+ init = this.createNode();
+ this.nextToken();
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = false;
+ var declarations = this.parseVariableDeclarationList({ inFor: true });
+ this.context.allowIn = previousAllowIn;
+ if (declarations.length === 1 && this.matchKeyword('in')) {
+ var decl = declarations[0];
+ if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) {
+ this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in');
+ }
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
+ this.nextToken();
+ left = init;
+ right = this.parseExpression();
+ init = null;
+ }
+ else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
+ this.nextToken();
+ left = init;
+ right = this.parseAssignmentExpression();
+ init = null;
+ forIn = false;
+ }
+ else {
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
+ this.expect(';');
+ }
+ }
+ else if (this.matchKeyword('const') || this.matchKeyword('let')) {
+ init = this.createNode();
+ var kind = this.nextToken().value;
+ if (!this.context.strict && this.lookahead.value === 'in') {
+ init = this.finalize(init, new Node.Identifier(kind));
+ this.nextToken();
+ left = init;
+ right = this.parseExpression();
+ init = null;
+ }
+ else {
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = false;
+ var declarations = this.parseBindingList(kind, { inFor: true });
+ this.context.allowIn = previousAllowIn;
+ if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) {
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
+ this.nextToken();
+ left = init;
+ right = this.parseExpression();
+ init = null;
+ }
+ else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
+ this.nextToken();
+ left = init;
+ right = this.parseAssignmentExpression();
+ init = null;
+ forIn = false;
+ }
+ else {
+ this.consumeSemicolon();
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
+ }
+ }
+ }
+ else {
+ var initStartToken = this.lookahead;
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = false;
+ init = this.inheritCoverGrammar(this.parseAssignmentExpression);
+ this.context.allowIn = previousAllowIn;
+ if (this.matchKeyword('in')) {
+ if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInForIn);
+ }
+ this.nextToken();
+ this.reinterpretExpressionAsPattern(init);
+ left = init;
+ right = this.parseExpression();
+ init = null;
+ }
+ else if (this.matchContextualKeyword('of')) {
+ if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInForLoop);
+ }
+ this.nextToken();
+ this.reinterpretExpressionAsPattern(init);
+ left = init;
+ right = this.parseAssignmentExpression();
+ init = null;
+ forIn = false;
+ }
+ else {
+ if (this.match(',')) {
+ var initSeq = [init];
+ while (this.match(',')) {
+ this.nextToken();
+ initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
+ }
+ init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq));
+ }
+ this.expect(';');
+ }
+ }
+ }
+ if (typeof left === 'undefined') {
+ if (!this.match(';')) {
+ test = this.parseExpression();
+ }
+ this.expect(';');
+ if (!this.match(')')) {
+ update = this.parseExpression();
+ }
+ }
+ var body;
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ body = this.finalize(this.createNode(), new Node.EmptyStatement());
+ }
+ else {
+ this.expect(')');
+ var previousInIteration = this.context.inIteration;
+ this.context.inIteration = true;
+ body = this.isolateCoverGrammar(this.parseStatement);
+ this.context.inIteration = previousInIteration;
+ }
+ return (typeof left === 'undefined') ?
+ this.finalize(node, new Node.ForStatement(init, test, update, body)) :
+ forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) :
+ this.finalize(node, new Node.ForOfStatement(left, right, body));
+ };
+ // https://tc39.github.io/ecma262/#sec-continue-statement
+ Parser.prototype.parseContinueStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('continue');
+ var label = null;
+ if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
+ var id = this.parseVariableIdentifier();
+ label = id;
+ var key = '$' + id.name;
+ if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
+ this.throwError(messages_1.Messages.UnknownLabel, id.name);
+ }
+ }
+ this.consumeSemicolon();
+ if (label === null && !this.context.inIteration) {
+ this.throwError(messages_1.Messages.IllegalContinue);
+ }
+ return this.finalize(node, new Node.ContinueStatement(label));
+ };
+ // https://tc39.github.io/ecma262/#sec-break-statement
+ Parser.prototype.parseBreakStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('break');
+ var label = null;
+ if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
+ var id = this.parseVariableIdentifier();
+ var key = '$' + id.name;
+ if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
+ this.throwError(messages_1.Messages.UnknownLabel, id.name);
+ }
+ label = id;
+ }
+ this.consumeSemicolon();
+ if (label === null && !this.context.inIteration && !this.context.inSwitch) {
+ this.throwError(messages_1.Messages.IllegalBreak);
+ }
+ return this.finalize(node, new Node.BreakStatement(label));
+ };
+ // https://tc39.github.io/ecma262/#sec-return-statement
+ Parser.prototype.parseReturnStatement = function () {
+ if (!this.context.inFunctionBody) {
+ this.tolerateError(messages_1.Messages.IllegalReturn);
+ }
+ var node = this.createNode();
+ this.expectKeyword('return');
+ var hasArgument = (!this.match(';') && !this.match('}') &&
+ !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */) ||
+ this.lookahead.type === 8 /* StringLiteral */ ||
+ this.lookahead.type === 10 /* Template */;
+ var argument = hasArgument ? this.parseExpression() : null;
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.ReturnStatement(argument));
+ };
+ // https://tc39.github.io/ecma262/#sec-with-statement
+ Parser.prototype.parseWithStatement = function () {
+ if (this.context.strict) {
+ this.tolerateError(messages_1.Messages.StrictModeWith);
+ }
+ var node = this.createNode();
+ var body;
+ this.expectKeyword('with');
+ this.expect('(');
+ var object = this.parseExpression();
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ body = this.finalize(this.createNode(), new Node.EmptyStatement());
+ }
+ else {
+ this.expect(')');
+ body = this.parseStatement();
+ }
+ return this.finalize(node, new Node.WithStatement(object, body));
+ };
+ // https://tc39.github.io/ecma262/#sec-switch-statement
+ Parser.prototype.parseSwitchCase = function () {
+ var node = this.createNode();
+ var test;
+ if (this.matchKeyword('default')) {
+ this.nextToken();
+ test = null;
+ }
+ else {
+ this.expectKeyword('case');
+ test = this.parseExpression();
+ }
+ this.expect(':');
+ var consequent = [];
+ while (true) {
+ if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) {
+ break;
+ }
+ consequent.push(this.parseStatementListItem());
+ }
+ return this.finalize(node, new Node.SwitchCase(test, consequent));
+ };
+ Parser.prototype.parseSwitchStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('switch');
+ this.expect('(');
+ var discriminant = this.parseExpression();
+ this.expect(')');
+ var previousInSwitch = this.context.inSwitch;
+ this.context.inSwitch = true;
+ var cases = [];
+ var defaultFound = false;
+ this.expect('{');
+ while (true) {
+ if (this.match('}')) {
+ break;
+ }
+ var clause = this.parseSwitchCase();
+ if (clause.test === null) {
+ if (defaultFound) {
+ this.throwError(messages_1.Messages.MultipleDefaultsInSwitch);
+ }
+ defaultFound = true;
+ }
+ cases.push(clause);
+ }
+ this.expect('}');
+ this.context.inSwitch = previousInSwitch;
+ return this.finalize(node, new Node.SwitchStatement(discriminant, cases));
+ };
+ // https://tc39.github.io/ecma262/#sec-labelled-statements
+ Parser.prototype.parseLabelledStatement = function () {
+ var node = this.createNode();
+ var expr = this.parseExpression();
+ var statement;
+ if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) {
+ this.nextToken();
+ var id = expr;
+ var key = '$' + id.name;
+ if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
+ this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name);
+ }
+ this.context.labelSet[key] = true;
+ var body = void 0;
+ if (this.matchKeyword('class')) {
+ this.tolerateUnexpectedToken(this.lookahead);
+ body = this.parseClassDeclaration();
+ }
+ else if (this.matchKeyword('function')) {
+ var token = this.lookahead;
+ var declaration = this.parseFunctionDeclaration();
+ if (this.context.strict) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction);
+ }
+ else if (declaration.generator) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext);
+ }
+ body = declaration;
+ }
+ else {
+ body = this.parseStatement();
+ }
+ delete this.context.labelSet[key];
+ statement = new Node.LabeledStatement(id, body);
+ }
+ else {
+ this.consumeSemicolon();
+ statement = new Node.ExpressionStatement(expr);
+ }
+ return this.finalize(node, statement);
+ };
+ // https://tc39.github.io/ecma262/#sec-throw-statement
+ Parser.prototype.parseThrowStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('throw');
+ if (this.hasLineTerminator) {
+ this.throwError(messages_1.Messages.NewlineAfterThrow);
+ }
+ var argument = this.parseExpression();
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.ThrowStatement(argument));
+ };
+ // https://tc39.github.io/ecma262/#sec-try-statement
+ Parser.prototype.parseCatchClause = function () {
+ var node = this.createNode();
+ this.expectKeyword('catch');
+ this.expect('(');
+ if (this.match(')')) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ var params = [];
+ var param = this.parsePattern(params);
+ var paramMap = {};
+ for (var i = 0; i < params.length; i++) {
+ var key = '$' + params[i].value;
+ if (Object.prototype.hasOwnProperty.call(paramMap, key)) {
+ this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value);
+ }
+ paramMap[key] = true;
+ }
+ if (this.context.strict && param.type === syntax_1.Syntax.Identifier) {
+ if (this.scanner.isRestrictedWord(param.name)) {
+ this.tolerateError(messages_1.Messages.StrictCatchVariable);
+ }
+ }
+ this.expect(')');
+ var body = this.parseBlock();
+ return this.finalize(node, new Node.CatchClause(param, body));
+ };
+ Parser.prototype.parseFinallyClause = function () {
+ this.expectKeyword('finally');
+ return this.parseBlock();
+ };
+ Parser.prototype.parseTryStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('try');
+ var block = this.parseBlock();
+ var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null;
+ var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null;
+ if (!handler && !finalizer) {
+ this.throwError(messages_1.Messages.NoCatchOrFinally);
+ }
+ return this.finalize(node, new Node.TryStatement(block, handler, finalizer));
+ };
+ // https://tc39.github.io/ecma262/#sec-debugger-statement
+ Parser.prototype.parseDebuggerStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('debugger');
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.DebuggerStatement());
+ };
+ // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations
+ Parser.prototype.parseStatement = function () {
+ var statement;
+ switch (this.lookahead.type) {
+ case 1 /* BooleanLiteral */:
+ case 5 /* NullLiteral */:
+ case 6 /* NumericLiteral */:
+ case 8 /* StringLiteral */:
+ case 10 /* Template */:
+ case 9 /* RegularExpression */:
+ statement = this.parseExpressionStatement();
+ break;
+ case 7 /* Punctuator */:
+ var value = this.lookahead.value;
+ if (value === '{') {
+ statement = this.parseBlock();
+ }
+ else if (value === '(') {
+ statement = this.parseExpressionStatement();
+ }
+ else if (value === ';') {
+ statement = this.parseEmptyStatement();
+ }
+ else {
+ statement = this.parseExpressionStatement();
+ }
+ break;
+ case 3 /* Identifier */:
+ statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement();
+ break;
+ case 4 /* Keyword */:
+ switch (this.lookahead.value) {
+ case 'break':
+ statement = this.parseBreakStatement();
+ break;
+ case 'continue':
+ statement = this.parseContinueStatement();
+ break;
+ case 'debugger':
+ statement = this.parseDebuggerStatement();
+ break;
+ case 'do':
+ statement = this.parseDoWhileStatement();
+ break;
+ case 'for':
+ statement = this.parseForStatement();
+ break;
+ case 'function':
+ statement = this.parseFunctionDeclaration();
+ break;
+ case 'if':
+ statement = this.parseIfStatement();
+ break;
+ case 'return':
+ statement = this.parseReturnStatement();
+ break;
+ case 'switch':
+ statement = this.parseSwitchStatement();
+ break;
+ case 'throw':
+ statement = this.parseThrowStatement();
+ break;
+ case 'try':
+ statement = this.parseTryStatement();
+ break;
+ case 'var':
+ statement = this.parseVariableStatement();
+ break;
+ case 'while':
+ statement = this.parseWhileStatement();
+ break;
+ case 'with':
+ statement = this.parseWithStatement();
+ break;
+ default:
+ statement = this.parseExpressionStatement();
+ break;
+ }
+ break;
+ default:
+ statement = this.throwUnexpectedToken(this.lookahead);
+ }
+ return statement;
+ };
+ // https://tc39.github.io/ecma262/#sec-function-definitions
+ Parser.prototype.parseFunctionSourceElements = function () {
+ var node = this.createNode();
+ this.expect('{');
+ var body = this.parseDirectivePrologues();
+ var previousLabelSet = this.context.labelSet;
+ var previousInIteration = this.context.inIteration;
+ var previousInSwitch = this.context.inSwitch;
+ var previousInFunctionBody = this.context.inFunctionBody;
+ this.context.labelSet = {};
+ this.context.inIteration = false;
+ this.context.inSwitch = false;
+ this.context.inFunctionBody = true;
+ while (this.lookahead.type !== 2 /* EOF */) {
+ if (this.match('}')) {
+ break;
+ }
+ body.push(this.parseStatementListItem());
+ }
+ this.expect('}');
+ this.context.labelSet = previousLabelSet;
+ this.context.inIteration = previousInIteration;
+ this.context.inSwitch = previousInSwitch;
+ this.context.inFunctionBody = previousInFunctionBody;
+ return this.finalize(node, new Node.BlockStatement(body));
+ };
+ Parser.prototype.validateParam = function (options, param, name) {
+ var key = '$' + name;
+ if (this.context.strict) {
+ if (this.scanner.isRestrictedWord(name)) {
+ options.stricted = param;
+ options.message = messages_1.Messages.StrictParamName;
+ }
+ if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
+ options.stricted = param;
+ options.message = messages_1.Messages.StrictParamDupe;
+ }
+ }
+ else if (!options.firstRestricted) {
+ if (this.scanner.isRestrictedWord(name)) {
+ options.firstRestricted = param;
+ options.message = messages_1.Messages.StrictParamName;
+ }
+ else if (this.scanner.isStrictModeReservedWord(name)) {
+ options.firstRestricted = param;
+ options.message = messages_1.Messages.StrictReservedWord;
+ }
+ else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
+ options.stricted = param;
+ options.message = messages_1.Messages.StrictParamDupe;
+ }
+ }
+ /* istanbul ignore next */
+ if (typeof Object.defineProperty === 'function') {
+ Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true });
+ }
+ else {
+ options.paramSet[key] = true;
+ }
+ };
+ Parser.prototype.parseRestElement = function (params) {
+ var node = this.createNode();
+ this.expect('...');
+ var arg = this.parsePattern(params);
+ if (this.match('=')) {
+ this.throwError(messages_1.Messages.DefaultRestParameter);
+ }
+ if (!this.match(')')) {
+ this.throwError(messages_1.Messages.ParameterAfterRestParameter);
+ }
+ return this.finalize(node, new Node.RestElement(arg));
+ };
+ Parser.prototype.parseFormalParameter = function (options) {
+ var params = [];
+ var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params);
+ for (var i = 0; i < params.length; i++) {
+ this.validateParam(options, params[i], params[i].value);
+ }
+ options.simple = options.simple && (param instanceof Node.Identifier);
+ options.params.push(param);
+ };
+ Parser.prototype.parseFormalParameters = function (firstRestricted) {
+ var options;
+ options = {
+ simple: true,
+ params: [],
+ firstRestricted: firstRestricted
+ };
+ this.expect('(');
+ if (!this.match(')')) {
+ options.paramSet = {};
+ while (this.lookahead.type !== 2 /* EOF */) {
+ this.parseFormalParameter(options);
+ if (this.match(')')) {
+ break;
+ }
+ this.expect(',');
+ if (this.match(')')) {
+ break;
+ }
+ }
+ }
+ this.expect(')');
+ return {
+ simple: options.simple,
+ params: options.params,
+ stricted: options.stricted,
+ firstRestricted: options.firstRestricted,
+ message: options.message
+ };
+ };
+ Parser.prototype.matchAsyncFunction = function () {
+ var match = this.matchContextualKeyword('async');
+ if (match) {
+ var state = this.scanner.saveState();
+ this.scanner.scanComments();
+ var next = this.scanner.lex();
+ this.scanner.restoreState(state);
+ match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function');
+ }
+ return match;
+ };
+ Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) {
+ var node = this.createNode();
+ var isAsync = this.matchContextualKeyword('async');
+ if (isAsync) {
+ this.nextToken();
+ }
+ this.expectKeyword('function');
+ var isGenerator = isAsync ? false : this.match('*');
+ if (isGenerator) {
+ this.nextToken();
+ }
+ var message;
+ var id = null;
+ var firstRestricted = null;
+ if (!identifierIsOptional || !this.match('(')) {
+ var token = this.lookahead;
+ id = this.parseVariableIdentifier();
+ if (this.context.strict) {
+ if (this.scanner.isRestrictedWord(token.value)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
+ }
+ }
+ else {
+ if (this.scanner.isRestrictedWord(token.value)) {
+ firstRestricted = token;
+ message = messages_1.Messages.StrictFunctionName;
+ }
+ else if (this.scanner.isStrictModeReservedWord(token.value)) {
+ firstRestricted = token;
+ message = messages_1.Messages.StrictReservedWord;
+ }
+ }
+ }
+ var previousAllowAwait = this.context.await;
+ var previousAllowYield = this.context.allowYield;
+ this.context.await = isAsync;
+ this.context.allowYield = !isGenerator;
+ var formalParameters = this.parseFormalParameters(firstRestricted);
+ var params = formalParameters.params;
+ var stricted = formalParameters.stricted;
+ firstRestricted = formalParameters.firstRestricted;
+ if (formalParameters.message) {
+ message = formalParameters.message;
+ }
+ var previousStrict = this.context.strict;
+ var previousAllowStrictDirective = this.context.allowStrictDirective;
+ this.context.allowStrictDirective = formalParameters.simple;
+ var body = this.parseFunctionSourceElements();
+ if (this.context.strict && firstRestricted) {
+ this.throwUnexpectedToken(firstRestricted, message);
+ }
+ if (this.context.strict && stricted) {
+ this.tolerateUnexpectedToken(stricted, message);
+ }
+ this.context.strict = previousStrict;
+ this.context.allowStrictDirective = previousAllowStrictDirective;
+ this.context.await = previousAllowAwait;
+ this.context.allowYield = previousAllowYield;
+ return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) :
+ this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator));
+ };
+ Parser.prototype.parseFunctionExpression = function () {
+ var node = this.createNode();
+ var isAsync = this.matchContextualKeyword('async');
+ if (isAsync) {
+ this.nextToken();
+ }
+ this.expectKeyword('function');
+ var isGenerator = isAsync ? false : this.match('*');
+ if (isGenerator) {
+ this.nextToken();
+ }
+ var message;
+ var id = null;
+ var firstRestricted;
+ var previousAllowAwait = this.context.await;
+ var previousAllowYield = this.context.allowYield;
+ this.context.await = isAsync;
+ this.context.allowYield = !isGenerator;
+ if (!this.match('(')) {
+ var token = this.lookahead;
+ id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier();
+ if (this.context.strict) {
+ if (this.scanner.isRestrictedWord(token.value)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
+ }
+ }
+ else {
+ if (this.scanner.isRestrictedWord(token.value)) {
+ firstRestricted = token;
+ message = messages_1.Messages.StrictFunctionName;
+ }
+ else if (this.scanner.isStrictModeReservedWord(token.value)) {
+ firstRestricted = token;
+ message = messages_1.Messages.StrictReservedWord;
+ }
+ }
+ }
+ var formalParameters = this.parseFormalParameters(firstRestricted);
+ var params = formalParameters.params;
+ var stricted = formalParameters.stricted;
+ firstRestricted = formalParameters.firstRestricted;
+ if (formalParameters.message) {
+ message = formalParameters.message;
+ }
+ var previousStrict = this.context.strict;
+ var previousAllowStrictDirective = this.context.allowStrictDirective;
+ this.context.allowStrictDirective = formalParameters.simple;
+ var body = this.parseFunctionSourceElements();
+ if (this.context.strict && firstRestricted) {
+ this.throwUnexpectedToken(firstRestricted, message);
+ }
+ if (this.context.strict && stricted) {
+ this.tolerateUnexpectedToken(stricted, message);
+ }
+ this.context.strict = previousStrict;
+ this.context.allowStrictDirective = previousAllowStrictDirective;
+ this.context.await = previousAllowAwait;
+ this.context.allowYield = previousAllowYield;
+ return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) :
+ this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator));
+ };
+ // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive
+ Parser.prototype.parseDirective = function () {
+ var token = this.lookahead;
+ var node = this.createNode();
+ var expr = this.parseExpression();
+ var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null;
+ this.consumeSemicolon();
+ return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr));
+ };
+ Parser.prototype.parseDirectivePrologues = function () {
+ var firstRestricted = null;
+ var body = [];
+ while (true) {
+ var token = this.lookahead;
+ if (token.type !== 8 /* StringLiteral */) {
+ break;
+ }
+ var statement = this.parseDirective();
+ body.push(statement);
+ var directive = statement.directive;
+ if (typeof directive !== 'string') {
+ break;
+ }
+ if (directive === 'use strict') {
+ this.context.strict = true;
+ if (firstRestricted) {
+ this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral);
+ }
+ if (!this.context.allowStrictDirective) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective);
+ }
+ }
+ else {
+ if (!firstRestricted && token.octal) {
+ firstRestricted = token;
+ }
+ }
+ }
+ return body;
+ };
+ // https://tc39.github.io/ecma262/#sec-method-definitions
+ Parser.prototype.qualifiedPropertyName = function (token) {
+ switch (token.type) {
+ case 3 /* Identifier */:
+ case 8 /* StringLiteral */:
+ case 1 /* BooleanLiteral */:
+ case 5 /* NullLiteral */:
+ case 6 /* NumericLiteral */:
+ case 4 /* Keyword */:
+ return true;
+ case 7 /* Punctuator */:
+ return token.value === '[';
+ default:
+ break;
+ }
+ return false;
+ };
+ Parser.prototype.parseGetterMethod = function () {
+ var node = this.createNode();
+ var isGenerator = false;
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = !isGenerator;
+ var formalParameters = this.parseFormalParameters();
+ if (formalParameters.params.length > 0) {
+ this.tolerateError(messages_1.Messages.BadGetterArity);
+ }
+ var method = this.parsePropertyMethod(formalParameters);
+ this.context.allowYield = previousAllowYield;
+ return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
+ };
+ Parser.prototype.parseSetterMethod = function () {
+ var node = this.createNode();
+ var isGenerator = false;
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = !isGenerator;
+ var formalParameters = this.parseFormalParameters();
+ if (formalParameters.params.length !== 1) {
+ this.tolerateError(messages_1.Messages.BadSetterArity);
+ }
+ else if (formalParameters.params[0] instanceof Node.RestElement) {
+ this.tolerateError(messages_1.Messages.BadSetterRestParameter);
+ }
+ var method = this.parsePropertyMethod(formalParameters);
+ this.context.allowYield = previousAllowYield;
+ return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
+ };
+ Parser.prototype.parseGeneratorMethod = function () {
+ var node = this.createNode();
+ var isGenerator = true;
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = true;
+ var params = this.parseFormalParameters();
+ this.context.allowYield = false;
+ var method = this.parsePropertyMethod(params);
+ this.context.allowYield = previousAllowYield;
+ return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
+ };
+ // https://tc39.github.io/ecma262/#sec-generator-function-definitions
+ Parser.prototype.isStartOfExpression = function () {
+ var start = true;
+ var value = this.lookahead.value;
+ switch (this.lookahead.type) {
+ case 7 /* Punctuator */:
+ start = (value === '[') || (value === '(') || (value === '{') ||
+ (value === '+') || (value === '-') ||
+ (value === '!') || (value === '~') ||
+ (value === '++') || (value === '--') ||
+ (value === '/') || (value === '/='); // regular expression literal
+ break;
+ case 4 /* Keyword */:
+ start = (value === 'class') || (value === 'delete') ||
+ (value === 'function') || (value === 'let') || (value === 'new') ||
+ (value === 'super') || (value === 'this') || (value === 'typeof') ||
+ (value === 'void') || (value === 'yield');
+ break;
+ default:
+ break;
+ }
+ return start;
+ };
+ Parser.prototype.parseYieldExpression = function () {
+ var node = this.createNode();
+ this.expectKeyword('yield');
+ var argument = null;
+ var delegate = false;
+ if (!this.hasLineTerminator) {
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = false;
+ delegate = this.match('*');
+ if (delegate) {
+ this.nextToken();
+ argument = this.parseAssignmentExpression();
+ }
+ else if (this.isStartOfExpression()) {
+ argument = this.parseAssignmentExpression();
+ }
+ this.context.allowYield = previousAllowYield;
+ }
+ return this.finalize(node, new Node.YieldExpression(argument, delegate));
+ };
+ // https://tc39.github.io/ecma262/#sec-class-definitions
+ Parser.prototype.parseClassElement = function (hasConstructor) {
+ var token = this.lookahead;
+ var node = this.createNode();
+ var kind = '';
+ var key = null;
+ var value = null;
+ var computed = false;
+ var method = false;
+ var isStatic = false;
+ var isAsync = false;
+ if (this.match('*')) {
+ this.nextToken();
+ }
+ else {
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ var id = key;
+ if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) {
+ token = this.lookahead;
+ isStatic = true;
+ computed = this.match('[');
+ if (this.match('*')) {
+ this.nextToken();
+ }
+ else {
+ key = this.parseObjectPropertyKey();
+ }
+ }
+ if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) {
+ var punctuator = this.lookahead.value;
+ if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') {
+ isAsync = true;
+ token = this.lookahead;
+ key = this.parseObjectPropertyKey();
+ if (token.type === 3 /* Identifier */ && token.value === 'constructor') {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync);
+ }
+ }
+ }
+ }
+ var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
+ if (token.type === 3 /* Identifier */) {
+ if (token.value === 'get' && lookaheadPropertyKey) {
+ kind = 'get';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ this.context.allowYield = false;
+ value = this.parseGetterMethod();
+ }
+ else if (token.value === 'set' && lookaheadPropertyKey) {
+ kind = 'set';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ value = this.parseSetterMethod();
+ }
+ }
+ else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
+ kind = 'init';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ value = this.parseGeneratorMethod();
+ method = true;
+ }
+ if (!kind && key && this.match('(')) {
+ kind = 'init';
+ value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
+ method = true;
+ }
+ if (!kind) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ if (kind === 'init') {
+ kind = 'method';
+ }
+ if (!computed) {
+ if (isStatic && this.isPropertyKey(key, 'prototype')) {
+ this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype);
+ }
+ if (!isStatic && this.isPropertyKey(key, 'constructor')) {
+ if (kind !== 'method' || !method || (value && value.generator)) {
+ this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod);
+ }
+ if (hasConstructor.value) {
+ this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor);
+ }
+ else {
+ hasConstructor.value = true;
+ }
+ kind = 'constructor';
+ }
+ }
+ return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic));
+ };
+ Parser.prototype.parseClassElementList = function () {
+ var body = [];
+ var hasConstructor = { value: false };
+ this.expect('{');
+ while (!this.match('}')) {
+ if (this.match(';')) {
+ this.nextToken();
+ }
+ else {
+ body.push(this.parseClassElement(hasConstructor));
+ }
+ }
+ this.expect('}');
+ return body;
+ };
+ Parser.prototype.parseClassBody = function () {
+ var node = this.createNode();
+ var elementList = this.parseClassElementList();
+ return this.finalize(node, new Node.ClassBody(elementList));
+ };
+ Parser.prototype.parseClassDeclaration = function (identifierIsOptional) {
+ var node = this.createNode();
+ var previousStrict = this.context.strict;
+ this.context.strict = true;
+ this.expectKeyword('class');
+ var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier();
+ var superClass = null;
+ if (this.matchKeyword('extends')) {
+ this.nextToken();
+ superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
+ }
+ var classBody = this.parseClassBody();
+ this.context.strict = previousStrict;
+ return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody));
+ };
+ Parser.prototype.parseClassExpression = function () {
+ var node = this.createNode();
+ var previousStrict = this.context.strict;
+ this.context.strict = true;
+ this.expectKeyword('class');
+ var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null;
+ var superClass = null;
+ if (this.matchKeyword('extends')) {
+ this.nextToken();
+ superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
+ }
+ var classBody = this.parseClassBody();
+ this.context.strict = previousStrict;
+ return this.finalize(node, new Node.ClassExpression(id, superClass, classBody));
+ };
+ // https://tc39.github.io/ecma262/#sec-scripts
+ // https://tc39.github.io/ecma262/#sec-modules
+ Parser.prototype.parseModule = function () {
+ this.context.strict = true;
+ this.context.isModule = true;
+ this.scanner.isModule = true;
+ var node = this.createNode();
+ var body = this.parseDirectivePrologues();
+ while (this.lookahead.type !== 2 /* EOF */) {
+ body.push(this.parseStatementListItem());
+ }
+ return this.finalize(node, new Node.Module(body));
+ };
+ Parser.prototype.parseScript = function () {
+ var node = this.createNode();
+ var body = this.parseDirectivePrologues();
+ while (this.lookahead.type !== 2 /* EOF */) {
+ body.push(this.parseStatementListItem());
+ }
+ return this.finalize(node, new Node.Script(body));
+ };
+ // https://tc39.github.io/ecma262/#sec-imports
+ Parser.prototype.parseModuleSpecifier = function () {
+ var node = this.createNode();
+ if (this.lookahead.type !== 8 /* StringLiteral */) {
+ this.throwError(messages_1.Messages.InvalidModuleSpecifier);
+ }
+ var token = this.nextToken();
+ var raw = this.getTokenRaw(token);
+ return this.finalize(node, new Node.Literal(token.value, raw));
+ };
+ // import {} ...;
+ Parser.prototype.parseImportSpecifier = function () {
+ var node = this.createNode();
+ var imported;
+ var local;
+ if (this.lookahead.type === 3 /* Identifier */) {
+ imported = this.parseVariableIdentifier();
+ local = imported;
+ if (this.matchContextualKeyword('as')) {
+ this.nextToken();
+ local = this.parseVariableIdentifier();
+ }
+ }
+ else {
+ imported = this.parseIdentifierName();
+ local = imported;
+ if (this.matchContextualKeyword('as')) {
+ this.nextToken();
+ local = this.parseVariableIdentifier();
+ }
+ else {
+ this.throwUnexpectedToken(this.nextToken());
+ }
+ }
+ return this.finalize(node, new Node.ImportSpecifier(local, imported));
+ };
+ // {foo, bar as bas}
+ Parser.prototype.parseNamedImports = function () {
+ this.expect('{');
+ var specifiers = [];
+ while (!this.match('}')) {
+ specifiers.push(this.parseImportSpecifier());
+ if (!this.match('}')) {
+ this.expect(',');
+ }
+ }
+ this.expect('}');
+ return specifiers;
+ };
+ // import ...;
+ Parser.prototype.parseImportDefaultSpecifier = function () {
+ var node = this.createNode();
+ var local = this.parseIdentifierName();
+ return this.finalize(node, new Node.ImportDefaultSpecifier(local));
+ };
+ // import <* as foo> ...;
+ Parser.prototype.parseImportNamespaceSpecifier = function () {
+ var node = this.createNode();
+ this.expect('*');
+ if (!this.matchContextualKeyword('as')) {
+ this.throwError(messages_1.Messages.NoAsAfterImportNamespace);
+ }
+ this.nextToken();
+ var local = this.parseIdentifierName();
+ return this.finalize(node, new Node.ImportNamespaceSpecifier(local));
+ };
+ Parser.prototype.parseImportDeclaration = function () {
+ if (this.context.inFunctionBody) {
+ this.throwError(messages_1.Messages.IllegalImportDeclaration);
+ }
+ var node = this.createNode();
+ this.expectKeyword('import');
+ var src;
+ var specifiers = [];
+ if (this.lookahead.type === 8 /* StringLiteral */) {
+ // import 'foo';
+ src = this.parseModuleSpecifier();
+ }
+ else {
+ if (this.match('{')) {
+ // import {bar}
+ specifiers = specifiers.concat(this.parseNamedImports());
+ }
+ else if (this.match('*')) {
+ // import * as foo
+ specifiers.push(this.parseImportNamespaceSpecifier());
+ }
+ else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) {
+ // import foo
+ specifiers.push(this.parseImportDefaultSpecifier());
+ if (this.match(',')) {
+ this.nextToken();
+ if (this.match('*')) {
+ // import foo, * as foo
+ specifiers.push(this.parseImportNamespaceSpecifier());
+ }
+ else if (this.match('{')) {
+ // import foo, {bar}
+ specifiers = specifiers.concat(this.parseNamedImports());
+ }
+ else {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ }
+ }
+ else {
+ this.throwUnexpectedToken(this.nextToken());
+ }
+ if (!this.matchContextualKeyword('from')) {
+ var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
+ this.throwError(message, this.lookahead.value);
+ }
+ this.nextToken();
+ src = this.parseModuleSpecifier();
+ }
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.ImportDeclaration(specifiers, src));
+ };
+ // https://tc39.github.io/ecma262/#sec-exports
+ Parser.prototype.parseExportSpecifier = function () {
+ var node = this.createNode();
+ var local = this.parseIdentifierName();
+ var exported = local;
+ if (this.matchContextualKeyword('as')) {
+ this.nextToken();
+ exported = this.parseIdentifierName();
+ }
+ return this.finalize(node, new Node.ExportSpecifier(local, exported));
+ };
+ Parser.prototype.parseExportDeclaration = function () {
+ if (this.context.inFunctionBody) {
+ this.throwError(messages_1.Messages.IllegalExportDeclaration);
+ }
+ var node = this.createNode();
+ this.expectKeyword('export');
+ var exportDeclaration;
+ if (this.matchKeyword('default')) {
+ // export default ...
+ this.nextToken();
+ if (this.matchKeyword('function')) {
+ // export default function foo () {}
+ // export default function () {}
+ var declaration = this.parseFunctionDeclaration(true);
+ exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
+ }
+ else if (this.matchKeyword('class')) {
+ // export default class foo {}
+ var declaration = this.parseClassDeclaration(true);
+ exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
+ }
+ else if (this.matchContextualKeyword('async')) {
+ // export default async function f () {}
+ // export default async function () {}
+ // export default async x => x
+ var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression();
+ exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
+ }
+ else {
+ if (this.matchContextualKeyword('from')) {
+ this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value);
+ }
+ // export default {};
+ // export default [];
+ // export default (1 + 2);
+ var declaration = this.match('{') ? this.parseObjectInitializer() :
+ this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression();
+ this.consumeSemicolon();
+ exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
+ }
+ }
+ else if (this.match('*')) {
+ // export * from 'foo';
+ this.nextToken();
+ if (!this.matchContextualKeyword('from')) {
+ var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
+ this.throwError(message, this.lookahead.value);
+ }
+ this.nextToken();
+ var src = this.parseModuleSpecifier();
+ this.consumeSemicolon();
+ exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src));
+ }
+ else if (this.lookahead.type === 4 /* Keyword */) {
+ // export var f = 1;
+ var declaration = void 0;
+ switch (this.lookahead.value) {
+ case 'let':
+ case 'const':
+ declaration = this.parseLexicalDeclaration({ inFor: false });
+ break;
+ case 'var':
+ case 'class':
+ case 'function':
+ declaration = this.parseStatementListItem();
+ break;
+ default:
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
+ }
+ else if (this.matchAsyncFunction()) {
+ var declaration = this.parseFunctionDeclaration();
+ exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
+ }
+ else {
+ var specifiers = [];
+ var source = null;
+ var isExportFromIdentifier = false;
+ this.expect('{');
+ while (!this.match('}')) {
+ isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default');
+ specifiers.push(this.parseExportSpecifier());
+ if (!this.match('}')) {
+ this.expect(',');
+ }
+ }
+ this.expect('}');
+ if (this.matchContextualKeyword('from')) {
+ // export {default} from 'foo';
+ // export {foo} from 'foo';
+ this.nextToken();
+ source = this.parseModuleSpecifier();
+ this.consumeSemicolon();
+ }
+ else if (isExportFromIdentifier) {
+ // export {default}; // missing fromClause
+ var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
+ this.throwError(message, this.lookahead.value);
+ }
+ else {
+ // export {foo};
+ this.consumeSemicolon();
+ }
+ exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source));
+ }
+ return exportDeclaration;
+ };
+ return Parser;
+ }());
+ exports.Parser = Parser;
+
+
+/***/ },
+/* 9 */
+/***/ function(module, exports) {
+
+ "use strict";
+ // Ensure the condition is true, otherwise throw an error.
+ // This is only to have a better contract semantic, i.e. another safety net
+ // to catch a logic error. The condition shall be fulfilled in normal case.
+ // Do NOT use this to enforce a certain condition on any user input.
+ Object.defineProperty(exports, "__esModule", { value: true });
+ function assert(condition, message) {
+ /* istanbul ignore if */
+ if (!condition) {
+ throw new Error('ASSERT: ' + message);
+ }
+ }
+ exports.assert = assert;
+
+
+/***/ },
+/* 10 */
+/***/ function(module, exports) {
+
+ "use strict";
+ /* tslint:disable:max-classes-per-file */
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var ErrorHandler = (function () {
+ function ErrorHandler() {
+ this.errors = [];
+ this.tolerant = false;
+ }
+ ErrorHandler.prototype.recordError = function (error) {
+ this.errors.push(error);
+ };
+ ErrorHandler.prototype.tolerate = function (error) {
+ if (this.tolerant) {
+ this.recordError(error);
+ }
+ else {
+ throw error;
+ }
+ };
+ ErrorHandler.prototype.constructError = function (msg, column) {
+ var error = new Error(msg);
+ try {
+ throw error;
+ }
+ catch (base) {
+ /* istanbul ignore else */
+ if (Object.create && Object.defineProperty) {
+ error = Object.create(base);
+ Object.defineProperty(error, 'column', { value: column });
+ }
+ }
+ /* istanbul ignore next */
+ return error;
+ };
+ ErrorHandler.prototype.createError = function (index, line, col, description) {
+ var msg = 'Line ' + line + ': ' + description;
+ var error = this.constructError(msg, col);
+ error.index = index;
+ error.lineNumber = line;
+ error.description = description;
+ return error;
+ };
+ ErrorHandler.prototype.throwError = function (index, line, col, description) {
+ throw this.createError(index, line, col, description);
+ };
+ ErrorHandler.prototype.tolerateError = function (index, line, col, description) {
+ var error = this.createError(index, line, col, description);
+ if (this.tolerant) {
+ this.recordError(error);
+ }
+ else {
+ throw error;
+ }
+ };
+ return ErrorHandler;
+ }());
+ exports.ErrorHandler = ErrorHandler;
+
+
+/***/ },
+/* 11 */
+/***/ function(module, exports) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // Error messages should be identical to V8.
+ exports.Messages = {
+ BadGetterArity: 'Getter must not have any formal parameters',
+ BadSetterArity: 'Setter must have exactly one formal parameter',
+ BadSetterRestParameter: 'Setter function argument must not be a rest parameter',
+ ConstructorIsAsync: 'Class constructor may not be an async method',
+ ConstructorSpecialMethod: 'Class constructor may not be an accessor',
+ DeclarationMissingInitializer: 'Missing initializer in %0 declaration',
+ DefaultRestParameter: 'Unexpected token =',
+ DuplicateBinding: 'Duplicate binding %0',
+ DuplicateConstructor: 'A class may only have one constructor',
+ DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',
+ ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer',
+ GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts',
+ IllegalBreak: 'Illegal break statement',
+ IllegalContinue: 'Illegal continue statement',
+ IllegalExportDeclaration: 'Unexpected token',
+ IllegalImportDeclaration: 'Unexpected token',
+ IllegalLanguageModeDirective: 'Illegal \'use strict\' directive in function with non-simple parameter list',
+ IllegalReturn: 'Illegal return statement',
+ InvalidEscapedReservedWord: 'Keyword must not contain escaped characters',
+ InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence',
+ InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
+ InvalidLHSInForIn: 'Invalid left-hand side in for-in',
+ InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',
+ InvalidModuleSpecifier: 'Unexpected token',
+ InvalidRegExp: 'Invalid regular expression',
+ LetInLexicalBinding: 'let is disallowed as a lexically bound name',
+ MissingFromClause: 'Unexpected token',
+ MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
+ NewlineAfterThrow: 'Illegal newline after throw',
+ NoAsAfterImportNamespace: 'Unexpected token',
+ NoCatchOrFinally: 'Missing catch or finally after try',
+ ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',
+ Redeclaration: '%0 \'%1\' has already been declared',
+ StaticPrototype: 'Classes may not have static property named prototype',
+ StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
+ StrictDelete: 'Delete of an unqualified identifier in strict mode.',
+ StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block',
+ StrictFunctionName: 'Function name may not be eval or arguments in strict mode',
+ StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',
+ StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
+ StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
+ StrictModeWith: 'Strict mode code may not include a with statement',
+ StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',
+ StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
+ StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',
+ StrictReservedWord: 'Use of future reserved word in strict mode',
+ StrictVarName: 'Variable name may not be eval or arguments in strict mode',
+ TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',
+ UnexpectedEOS: 'Unexpected end of input',
+ UnexpectedIdentifier: 'Unexpected identifier',
+ UnexpectedNumber: 'Unexpected number',
+ UnexpectedReserved: 'Unexpected reserved word',
+ UnexpectedString: 'Unexpected string',
+ UnexpectedTemplate: 'Unexpected quasi %0',
+ UnexpectedToken: 'Unexpected token %0',
+ UnexpectedTokenIllegal: 'Unexpected token ILLEGAL',
+ UnknownLabel: 'Undefined label \'%0\'',
+ UnterminatedRegExp: 'Invalid regular expression: missing /'
+ };
+
+
+/***/ },
+/* 12 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var assert_1 = __webpack_require__(9);
+ var character_1 = __webpack_require__(4);
+ var messages_1 = __webpack_require__(11);
+ function hexValue(ch) {
+ return '0123456789abcdef'.indexOf(ch.toLowerCase());
+ }
+ function octalValue(ch) {
+ return '01234567'.indexOf(ch);
+ }
+ var Scanner = (function () {
+ function Scanner(code, handler) {
+ this.source = code;
+ this.errorHandler = handler;
+ this.trackComment = false;
+ this.isModule = false;
+ this.length = code.length;
+ this.index = 0;
+ this.lineNumber = (code.length > 0) ? 1 : 0;
+ this.lineStart = 0;
+ this.curlyStack = [];
+ }
+ Scanner.prototype.saveState = function () {
+ return {
+ index: this.index,
+ lineNumber: this.lineNumber,
+ lineStart: this.lineStart
+ };
+ };
+ Scanner.prototype.restoreState = function (state) {
+ this.index = state.index;
+ this.lineNumber = state.lineNumber;
+ this.lineStart = state.lineStart;
+ };
+ Scanner.prototype.eof = function () {
+ return this.index >= this.length;
+ };
+ Scanner.prototype.throwUnexpectedToken = function (message) {
+ if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
+ return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
+ };
+ Scanner.prototype.tolerateUnexpectedToken = function (message) {
+ if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
+ this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
+ };
+ // https://tc39.github.io/ecma262/#sec-comments
+ Scanner.prototype.skipSingleLineComment = function (offset) {
+ var comments = [];
+ var start, loc;
+ if (this.trackComment) {
+ comments = [];
+ start = this.index - offset;
+ loc = {
+ start: {
+ line: this.lineNumber,
+ column: this.index - this.lineStart - offset
+ },
+ end: {}
+ };
+ }
+ while (!this.eof()) {
+ var ch = this.source.charCodeAt(this.index);
+ ++this.index;
+ if (character_1.Character.isLineTerminator(ch)) {
+ if (this.trackComment) {
+ loc.end = {
+ line: this.lineNumber,
+ column: this.index - this.lineStart - 1
+ };
+ var entry = {
+ multiLine: false,
+ slice: [start + offset, this.index - 1],
+ range: [start, this.index - 1],
+ loc: loc
+ };
+ comments.push(entry);
+ }
+ if (ch === 13 && this.source.charCodeAt(this.index) === 10) {
+ ++this.index;
+ }
+ ++this.lineNumber;
+ this.lineStart = this.index;
+ return comments;
+ }
+ }
+ if (this.trackComment) {
+ loc.end = {
+ line: this.lineNumber,
+ column: this.index - this.lineStart
+ };
+ var entry = {
+ multiLine: false,
+ slice: [start + offset, this.index],
+ range: [start, this.index],
+ loc: loc
+ };
+ comments.push(entry);
+ }
+ return comments;
+ };
+ Scanner.prototype.skipMultiLineComment = function () {
+ var comments = [];
+ var start, loc;
+ if (this.trackComment) {
+ comments = [];
+ start = this.index - 2;
+ loc = {
+ start: {
+ line: this.lineNumber,
+ column: this.index - this.lineStart - 2
+ },
+ end: {}
+ };
+ }
+ while (!this.eof()) {
+ var ch = this.source.charCodeAt(this.index);
+ if (character_1.Character.isLineTerminator(ch)) {
+ if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) {
+ ++this.index;
+ }
+ ++this.lineNumber;
+ ++this.index;
+ this.lineStart = this.index;
+ }
+ else if (ch === 0x2A) {
+ // Block comment ends with '*/'.
+ if (this.source.charCodeAt(this.index + 1) === 0x2F) {
+ this.index += 2;
+ if (this.trackComment) {
+ loc.end = {
+ line: this.lineNumber,
+ column: this.index - this.lineStart
+ };
+ var entry = {
+ multiLine: true,
+ slice: [start + 2, this.index - 2],
+ range: [start, this.index],
+ loc: loc
+ };
+ comments.push(entry);
+ }
+ return comments;
+ }
+ ++this.index;
+ }
+ else {
+ ++this.index;
+ }
+ }
+ // Ran off the end of the file - the whole thing is a comment
+ if (this.trackComment) {
+ loc.end = {
+ line: this.lineNumber,
+ column: this.index - this.lineStart
+ };
+ var entry = {
+ multiLine: true,
+ slice: [start + 2, this.index],
+ range: [start, this.index],
+ loc: loc
+ };
+ comments.push(entry);
+ }
+ this.tolerateUnexpectedToken();
+ return comments;
+ };
+ Scanner.prototype.scanComments = function () {
+ var comments;
+ if (this.trackComment) {
+ comments = [];
+ }
+ var start = (this.index === 0);
+ while (!this.eof()) {
+ var ch = this.source.charCodeAt(this.index);
+ if (character_1.Character.isWhiteSpace(ch)) {
+ ++this.index;
+ }
+ else if (character_1.Character.isLineTerminator(ch)) {
+ ++this.index;
+ if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) {
+ ++this.index;
+ }
+ ++this.lineNumber;
+ this.lineStart = this.index;
+ start = true;
+ }
+ else if (ch === 0x2F) {
+ ch = this.source.charCodeAt(this.index + 1);
+ if (ch === 0x2F) {
+ this.index += 2;
+ var comment = this.skipSingleLineComment(2);
+ if (this.trackComment) {
+ comments = comments.concat(comment);
+ }
+ start = true;
+ }
+ else if (ch === 0x2A) {
+ this.index += 2;
+ var comment = this.skipMultiLineComment();
+ if (this.trackComment) {
+ comments = comments.concat(comment);
+ }
+ }
+ else {
+ break;
+ }
+ }
+ else if (start && ch === 0x2D) {
+ // U+003E is '>'
+ if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) {
+ // '-->' is a single-line comment
+ this.index += 3;
+ var comment = this.skipSingleLineComment(3);
+ if (this.trackComment) {
+ comments = comments.concat(comment);
+ }
+ }
+ else {
+ break;
+ }
+ }
+ else if (ch === 0x3C && !this.isModule) {
+ if (this.source.slice(this.index + 1, this.index + 4) === '!--') {
+ this.index += 4; // ` (0,0,1,1,0,0)
+ optimize() {
+
+ // times or values may be shared with other tracks, so overwriting is unsafe
+ const times = AnimationUtils.arraySlice( this.times ),
+ values = AnimationUtils.arraySlice( this.values ),
+ stride = this.getValueSize(),
+
+ smoothInterpolation = this.getInterpolation() === InterpolateSmooth,
+
+ lastIndex = times.length - 1;
+
+ let writeIndex = 1;
+
+ for ( let i = 1; i < lastIndex; ++ i ) {
+
+ let keep = false;
+
+ const time = times[ i ];
+ const timeNext = times[ i + 1 ];
+
+ // remove adjacent keyframes scheduled at the same time
+
+ if ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {
+
+ if ( ! smoothInterpolation ) {
+
+ // remove unnecessary keyframes same as their neighbors
+
+ const offset = i * stride,
+ offsetP = offset - stride,
+ offsetN = offset + stride;
+
+ for ( let j = 0; j !== stride; ++ j ) {
+
+ const value = values[ offset + j ];
+
+ if ( value !== values[ offsetP + j ] ||
+ value !== values[ offsetN + j ] ) {
+
+ keep = true;
+ break;
+
+ }
+
+ }
+
+ } else {
+
+ keep = true;
+
+ }
+
+ }
+
+ // in-place compaction
+
+ if ( keep ) {
+
+ if ( i !== writeIndex ) {
+
+ times[ writeIndex ] = times[ i ];
+
+ const readOffset = i * stride,
+ writeOffset = writeIndex * stride;
+
+ for ( let j = 0; j !== stride; ++ j ) {
+
+ values[ writeOffset + j ] = values[ readOffset + j ];
+
+ }
+
+ }
+
+ ++ writeIndex;
+
+ }
+
+ }
+
+ // flush last keyframe (compaction looks ahead)
+
+ if ( lastIndex > 0 ) {
+
+ times[ writeIndex ] = times[ lastIndex ];
+
+ for ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {
+
+ values[ writeOffset + j ] = values[ readOffset + j ];
+
+ }
+
+ ++ writeIndex;
+
+ }
+
+ if ( writeIndex !== times.length ) {
+
+ this.times = AnimationUtils.arraySlice( times, 0, writeIndex );
+ this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );
+
+ } else {
+
+ this.times = times;
+ this.values = values;
+
+ }
+
+ return this;
+
+ }
+
+ clone() {
+
+ const times = AnimationUtils.arraySlice( this.times, 0 );
+ const values = AnimationUtils.arraySlice( this.values, 0 );
+
+ const TypedKeyframeTrack = this.constructor;
+ const track = new TypedKeyframeTrack( this.name, times, values );
+
+ // Interpolant argument to constructor is not saved, so copy the factory method directly.
+ track.createInterpolant = this.createInterpolant;
+
+ return track;
+
+ }
+
+}
+
+KeyframeTrack.prototype.TimeBufferType = Float32Array;
+KeyframeTrack.prototype.ValueBufferType = Float32Array;
+KeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;
+
+/**
+ * A Track of Boolean keyframe values.
+ */
+class BooleanKeyframeTrack extends KeyframeTrack {}
+
+BooleanKeyframeTrack.prototype.ValueTypeName = 'bool';
+BooleanKeyframeTrack.prototype.ValueBufferType = Array;
+BooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;
+BooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;
+BooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;
+
+/**
+ * A Track of keyframe values that represent color.
+ */
+class ColorKeyframeTrack extends KeyframeTrack {}
+
+ColorKeyframeTrack.prototype.ValueTypeName = 'color';
+
+/**
+ * A Track of numeric keyframe values.
+ */
+class NumberKeyframeTrack extends KeyframeTrack {}
+
+NumberKeyframeTrack.prototype.ValueTypeName = 'number';
+
+/**
+ * Spherical linear unit quaternion interpolant.
+ */
+
+class QuaternionLinearInterpolant extends Interpolant {
+
+ constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
+
+ super( parameterPositions, sampleValues, sampleSize, resultBuffer );
+
+ }
+
+ interpolate_( i1, t0, t, t1 ) {
+
+ const result = this.resultBuffer,
+ values = this.sampleValues,
+ stride = this.valueSize,
+
+ alpha = ( t - t0 ) / ( t1 - t0 );
+
+ let offset = i1 * stride;
+
+ for ( let end = offset + stride; offset !== end; offset += 4 ) {
+
+ Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );
+
+ }
+
+ return result;
+
+ }
+
+}
+
+/**
+ * A Track of quaternion keyframe values.
+ */
+class QuaternionKeyframeTrack extends KeyframeTrack {
+
+ InterpolantFactoryMethodLinear( result ) {
+
+ return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );
+
+ }
+
+}
+
+QuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';
+// ValueBufferType is inherited
+QuaternionKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;
+QuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;
+
+/**
+ * A Track that interpolates Strings
+ */
+class StringKeyframeTrack extends KeyframeTrack {}
+
+StringKeyframeTrack.prototype.ValueTypeName = 'string';
+StringKeyframeTrack.prototype.ValueBufferType = Array;
+StringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;
+StringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;
+StringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;
+
+/**
+ * A Track of vectored keyframe values.
+ */
+class VectorKeyframeTrack extends KeyframeTrack {}
+
+VectorKeyframeTrack.prototype.ValueTypeName = 'vector';
+
+class AnimationClip {
+
+ constructor( name, duration = - 1, tracks, blendMode = NormalAnimationBlendMode ) {
+
+ this.name = name;
+ this.tracks = tracks;
+ this.duration = duration;
+ this.blendMode = blendMode;
+
+ this.uuid = generateUUID();
+
+ // this means it should figure out its duration by scanning the tracks
+ if ( this.duration < 0 ) {
+
+ this.resetDuration();
+
+ }
+
+ }
+
+
+ static parse( json ) {
+
+ const tracks = [],
+ jsonTracks = json.tracks,
+ frameTime = 1.0 / ( json.fps || 1.0 );
+
+ for ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {
+
+ tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );
+
+ }
+
+ const clip = new this( json.name, json.duration, tracks, json.blendMode );
+ clip.uuid = json.uuid;
+
+ return clip;
+
+ }
+
+ static toJSON( clip ) {
+
+ const tracks = [],
+ clipTracks = clip.tracks;
+
+ const json = {
+
+ 'name': clip.name,
+ 'duration': clip.duration,
+ 'tracks': tracks,
+ 'uuid': clip.uuid,
+ 'blendMode': clip.blendMode
+
+ };
+
+ for ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {
+
+ tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );
+
+ }
+
+ return json;
+
+ }
+
+ static CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {
+
+ const numMorphTargets = morphTargetSequence.length;
+ const tracks = [];
+
+ for ( let i = 0; i < numMorphTargets; i ++ ) {
+
+ let times = [];
+ let values = [];
+
+ times.push(
+ ( i + numMorphTargets - 1 ) % numMorphTargets,
+ i,
+ ( i + 1 ) % numMorphTargets );
+
+ values.push( 0, 1, 0 );
+
+ const order = AnimationUtils.getKeyframeOrder( times );
+ times = AnimationUtils.sortedArray( times, 1, order );
+ values = AnimationUtils.sortedArray( values, 1, order );
+
+ // if there is a key at the first frame, duplicate it as the
+ // last frame as well for perfect loop.
+ if ( ! noLoop && times[ 0 ] === 0 ) {
+
+ times.push( numMorphTargets );
+ values.push( values[ 0 ] );
+
+ }
+
+ tracks.push(
+ new NumberKeyframeTrack(
+ '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',
+ times, values
+ ).scale( 1.0 / fps ) );
+
+ }
+
+ return new this( name, - 1, tracks );
+
+ }
+
+ static findByName( objectOrClipArray, name ) {
+
+ let clipArray = objectOrClipArray;
+
+ if ( ! Array.isArray( objectOrClipArray ) ) {
+
+ const o = objectOrClipArray;
+ clipArray = o.geometry && o.geometry.animations || o.animations;
+
+ }
+
+ for ( let i = 0; i < clipArray.length; i ++ ) {
+
+ if ( clipArray[ i ].name === name ) {
+
+ return clipArray[ i ];
+
+ }
+
+ }
+
+ return null;
+
+ }
+
+ static CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {
+
+ const animationToMorphTargets = {};
+
+ // tested with https://regex101.com/ on trick sequences
+ // such flamingo_flyA_003, flamingo_run1_003, crdeath0059
+ const pattern = /^([\w-]*?)([\d]+)$/;
+
+ // sort morph target names into animation groups based
+ // patterns like Walk_001, Walk_002, Run_001, Run_002
+ for ( let i = 0, il = morphTargets.length; i < il; i ++ ) {
+
+ const morphTarget = morphTargets[ i ];
+ const parts = morphTarget.name.match( pattern );
+
+ if ( parts && parts.length > 1 ) {
+
+ const name = parts[ 1 ];
+
+ let animationMorphTargets = animationToMorphTargets[ name ];
+
+ if ( ! animationMorphTargets ) {
+
+ animationToMorphTargets[ name ] = animationMorphTargets = [];
+
+ }
+
+ animationMorphTargets.push( morphTarget );
+
+ }
+
+ }
+
+ const clips = [];
+
+ for ( const name in animationToMorphTargets ) {
+
+ clips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );
+
+ }
+
+ return clips;
+
+ }
+
+ // parse the animation.hierarchy format
+ static parseAnimation( animation, bones ) {
+
+ if ( ! animation ) {
+
+ console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );
+ return null;
+
+ }
+
+ const addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {
+
+ // only return track if there are actually keys.
+ if ( animationKeys.length !== 0 ) {
+
+ const times = [];
+ const values = [];
+
+ AnimationUtils.flattenJSON( animationKeys, times, values, propertyName );
+
+ // empty keys are filtered out, so check again
+ if ( times.length !== 0 ) {
+
+ destTracks.push( new trackType( trackName, times, values ) );
+
+ }
+
+ }
+
+ };
+
+ const tracks = [];
+
+ const clipName = animation.name || 'default';
+ const fps = animation.fps || 30;
+ const blendMode = animation.blendMode;
+
+ // automatic length determination in AnimationClip.
+ let duration = animation.length || - 1;
+
+ const hierarchyTracks = animation.hierarchy || [];
+
+ for ( let h = 0; h < hierarchyTracks.length; h ++ ) {
+
+ const animationKeys = hierarchyTracks[ h ].keys;
+
+ // skip empty tracks
+ if ( ! animationKeys || animationKeys.length === 0 ) continue;
+
+ // process morph targets
+ if ( animationKeys[ 0 ].morphTargets ) {
+
+ // figure out all morph targets used in this track
+ const morphTargetNames = {};
+
+ let k;
+
+ for ( k = 0; k < animationKeys.length; k ++ ) {
+
+ if ( animationKeys[ k ].morphTargets ) {
+
+ for ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {
+
+ morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;
+
+ }
+
+ }
+
+ }
+
+ // create a track for each morph target with all zero
+ // morphTargetInfluences except for the keys in which
+ // the morphTarget is named.
+ for ( const morphTargetName in morphTargetNames ) {
+
+ const times = [];
+ const values = [];
+
+ for ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {
+
+ const animationKey = animationKeys[ k ];
+
+ times.push( animationKey.time );
+ values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );
+
+ }
+
+ tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );
+
+ }
+
+ duration = morphTargetNames.length * fps;
+
+ } else {
+
+ // ...assume skeletal animation
+
+ const boneName = '.bones[' + bones[ h ].name + ']';
+
+ addNonemptyTrack(
+ VectorKeyframeTrack, boneName + '.position',
+ animationKeys, 'pos', tracks );
+
+ addNonemptyTrack(
+ QuaternionKeyframeTrack, boneName + '.quaternion',
+ animationKeys, 'rot', tracks );
+
+ addNonemptyTrack(
+ VectorKeyframeTrack, boneName + '.scale',
+ animationKeys, 'scl', tracks );
+
+ }
+
+ }
+
+ if ( tracks.length === 0 ) {
+
+ return null;
+
+ }
+
+ const clip = new this( clipName, duration, tracks, blendMode );
+
+ return clip;
+
+ }
+
+ resetDuration() {
+
+ const tracks = this.tracks;
+ let duration = 0;
+
+ for ( let i = 0, n = tracks.length; i !== n; ++ i ) {
+
+ const track = this.tracks[ i ];
+
+ duration = Math.max( duration, track.times[ track.times.length - 1 ] );
+
+ }
+
+ this.duration = duration;
+
+ return this;
+
+ }
+
+ trim() {
+
+ for ( let i = 0; i < this.tracks.length; i ++ ) {
+
+ this.tracks[ i ].trim( 0, this.duration );
+
+ }
+
+ return this;
+
+ }
+
+ validate() {
+
+ let valid = true;
+
+ for ( let i = 0; i < this.tracks.length; i ++ ) {
+
+ valid = valid && this.tracks[ i ].validate();
+
+ }
+
+ return valid;
+
+ }
+
+ optimize() {
+
+ for ( let i = 0; i < this.tracks.length; i ++ ) {
+
+ this.tracks[ i ].optimize();
+
+ }
+
+ return this;
+
+ }
+
+ clone() {
+
+ const tracks = [];
+
+ for ( let i = 0; i < this.tracks.length; i ++ ) {
+
+ tracks.push( this.tracks[ i ].clone() );
+
+ }
+
+ return new this.constructor( this.name, this.duration, tracks, this.blendMode );
+
+ }
+
+ toJSON() {
+
+ return this.constructor.toJSON( this );
+
+ }
+
+}
+
+function getTrackTypeForValueTypeName( typeName ) {
+
+ switch ( typeName.toLowerCase() ) {
+
+ case 'scalar':
+ case 'double':
+ case 'float':
+ case 'number':
+ case 'integer':
+
+ return NumberKeyframeTrack;
+
+ case 'vector':
+ case 'vector2':
+ case 'vector3':
+ case 'vector4':
+
+ return VectorKeyframeTrack;
+
+ case 'color':
+
+ return ColorKeyframeTrack;
+
+ case 'quaternion':
+
+ return QuaternionKeyframeTrack;
+
+ case 'bool':
+ case 'boolean':
+
+ return BooleanKeyframeTrack;
+
+ case 'string':
+
+ return StringKeyframeTrack;
+
+ }
+
+ throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );
+
+}
+
+function parseKeyframeTrack( json ) {
+
+ if ( json.type === undefined ) {
+
+ throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );
+
+ }
+
+ const trackType = getTrackTypeForValueTypeName( json.type );
+
+ if ( json.times === undefined ) {
+
+ const times = [], values = [];
+
+ AnimationUtils.flattenJSON( json.keys, times, values, 'value' );
+
+ json.times = times;
+ json.values = values;
+
+ }
+
+ // derived classes can define a static parse method
+ if ( trackType.parse !== undefined ) {
+
+ return trackType.parse( json );
+
+ } else {
+
+ // by default, we assume a constructor compatible with the base
+ return new trackType( json.name, json.times, json.values, json.interpolation );
+
+ }
+
+}
+
+const Cache = {
+
+ enabled: false,
+
+ files: {},
+
+ add: function ( key, file ) {
+
+ if ( this.enabled === false ) return;
+
+ // console.log( 'THREE.Cache', 'Adding key:', key );
+
+ this.files[ key ] = file;
+
+ },
+
+ get: function ( key ) {
+
+ if ( this.enabled === false ) return;
+
+ // console.log( 'THREE.Cache', 'Checking key:', key );
+
+ return this.files[ key ];
+
+ },
+
+ remove: function ( key ) {
+
+ delete this.files[ key ];
+
+ },
+
+ clear: function () {
+
+ this.files = {};
+
+ }
+
+};
+
+class LoadingManager {
+
+ constructor( onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ let isLoading = false;
+ let itemsLoaded = 0;
+ let itemsTotal = 0;
+ let urlModifier = undefined;
+ const handlers = [];
+
+ // Refer to #5689 for the reason why we don't set .onStart
+ // in the constructor
+
+ this.onStart = undefined;
+ this.onLoad = onLoad;
+ this.onProgress = onProgress;
+ this.onError = onError;
+
+ this.itemStart = function ( url ) {
+
+ itemsTotal ++;
+
+ if ( isLoading === false ) {
+
+ if ( scope.onStart !== undefined ) {
+
+ scope.onStart( url, itemsLoaded, itemsTotal );
+
+ }
+
+ }
+
+ isLoading = true;
+
+ };
+
+ this.itemEnd = function ( url ) {
+
+ itemsLoaded ++;
+
+ if ( scope.onProgress !== undefined ) {
+
+ scope.onProgress( url, itemsLoaded, itemsTotal );
+
+ }
+
+ if ( itemsLoaded === itemsTotal ) {
+
+ isLoading = false;
+
+ if ( scope.onLoad !== undefined ) {
+
+ scope.onLoad();
+
+ }
+
+ }
+
+ };
+
+ this.itemError = function ( url ) {
+
+ if ( scope.onError !== undefined ) {
+
+ scope.onError( url );
+
+ }
+
+ };
+
+ this.resolveURL = function ( url ) {
+
+ if ( urlModifier ) {
+
+ return urlModifier( url );
+
+ }
+
+ return url;
+
+ };
+
+ this.setURLModifier = function ( transform ) {
+
+ urlModifier = transform;
+
+ return this;
+
+ };
+
+ this.addHandler = function ( regex, loader ) {
+
+ handlers.push( regex, loader );
+
+ return this;
+
+ };
+
+ this.removeHandler = function ( regex ) {
+
+ const index = handlers.indexOf( regex );
+
+ if ( index !== - 1 ) {
+
+ handlers.splice( index, 2 );
+
+ }
+
+ return this;
+
+ };
+
+ this.getHandler = function ( file ) {
+
+ for ( let i = 0, l = handlers.length; i < l; i += 2 ) {
+
+ const regex = handlers[ i ];
+ const loader = handlers[ i + 1 ];
+
+ if ( regex.global ) regex.lastIndex = 0; // see #17920
+
+ if ( regex.test( file ) ) {
+
+ return loader;
+
+ }
+
+ }
+
+ return null;
+
+ };
+
+ }
+
+}
+
+const DefaultLoadingManager = new LoadingManager();
+
+class Loader {
+
+ constructor( manager ) {
+
+ this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
+
+ this.crossOrigin = 'anonymous';
+ this.withCredentials = false;
+ this.path = '';
+ this.resourcePath = '';
+ this.requestHeader = {};
+
+ }
+
+ load( /* url, onLoad, onProgress, onError */ ) {}
+
+ loadAsync( url, onProgress ) {
+
+ const scope = this;
+
+ return new Promise( function ( resolve, reject ) {
+
+ scope.load( url, resolve, onProgress, reject );
+
+ } );
+
+ }
+
+ parse( /* data */ ) {}
+
+ setCrossOrigin( crossOrigin ) {
+
+ this.crossOrigin = crossOrigin;
+ return this;
+
+ }
+
+ setWithCredentials( value ) {
+
+ this.withCredentials = value;
+ return this;
+
+ }
+
+ setPath( path ) {
+
+ this.path = path;
+ return this;
+
+ }
+
+ setResourcePath( resourcePath ) {
+
+ this.resourcePath = resourcePath;
+ return this;
+
+ }
+
+ setRequestHeader( requestHeader ) {
+
+ this.requestHeader = requestHeader;
+ return this;
+
+ }
+
+}
+
+const loading = {};
+
+class FileLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ if ( url === undefined ) url = '';
+
+ if ( this.path !== undefined ) url = this.path + url;
+
+ url = this.manager.resolveURL( url );
+
+ const cached = Cache.get( url );
+
+ if ( cached !== undefined ) {
+
+ this.manager.itemStart( url );
+
+ setTimeout( () => {
+
+ if ( onLoad ) onLoad( cached );
+
+ this.manager.itemEnd( url );
+
+ }, 0 );
+
+ return cached;
+
+ }
+
+ // Check if request is duplicate
+
+ if ( loading[ url ] !== undefined ) {
+
+ loading[ url ].push( {
+
+ onLoad: onLoad,
+ onProgress: onProgress,
+ onError: onError
+
+ } );
+
+ return;
+
+ }
+
+ // Initialise array for duplicate requests
+ loading[ url ] = [];
+
+ loading[ url ].push( {
+ onLoad: onLoad,
+ onProgress: onProgress,
+ onError: onError,
+ } );
+
+ // create request
+ const req = new Request( url, {
+ headers: new Headers( this.requestHeader ),
+ credentials: this.withCredentials ? 'include' : 'same-origin',
+ // An abort controller could be added within a future PR
+ } );
+
+ // record states ( avoid data race )
+ const mimeType = this.mimeType;
+ const responseType = this.responseType;
+
+ // start the fetch
+ fetch( req )
+ .then( response => {
+
+ if ( response.status === 200 || response.status === 0 ) {
+
+ // Some browsers return HTTP Status 0 when using non-http protocol
+ // e.g. 'file://' or 'data://'. Handle as success.
+
+ if ( response.status === 0 ) {
+
+ console.warn( 'THREE.FileLoader: HTTP Status 0 received.' );
+
+ }
+
+ // Workaround: Checking if response.body === undefined for Alipay browser #23548
+
+ if ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {
+
+ return response;
+
+ }
+
+ const callbacks = loading[ url ];
+ const reader = response.body.getReader();
+ const contentLength = response.headers.get( 'Content-Length' );
+ const total = contentLength ? parseInt( contentLength ) : 0;
+ const lengthComputable = total !== 0;
+ let loaded = 0;
+
+ // periodically read data into the new stream tracking while download progress
+ const stream = new ReadableStream( {
+ start( controller ) {
+
+ readData();
+
+ function readData() {
+
+ reader.read().then( ( { done, value } ) => {
+
+ if ( done ) {
+
+ controller.close();
+
+ } else {
+
+ loaded += value.byteLength;
+
+ const event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );
+ for ( let i = 0, il = callbacks.length; i < il; i ++ ) {
+
+ const callback = callbacks[ i ];
+ if ( callback.onProgress ) callback.onProgress( event );
+
+ }
+
+ controller.enqueue( value );
+ readData();
+
+ }
+
+ } );
+
+ }
+
+ }
+
+ } );
+
+ return new Response( stream );
+
+ } else {
+
+ throw Error( `fetch for "${response.url}" responded with ${response.status}: ${response.statusText}` );
+
+ }
+
+ } )
+ .then( response => {
+
+ switch ( responseType ) {
+
+ case 'arraybuffer':
+
+ return response.arrayBuffer();
+
+ case 'blob':
+
+ return response.blob();
+
+ case 'document':
+
+ return response.text()
+ .then( text => {
+
+ const parser = new DOMParser();
+ return parser.parseFromString( text, mimeType );
+
+ } );
+
+ case 'json':
+
+ return response.json();
+
+ default:
+
+ if ( mimeType === undefined ) {
+
+ return response.text();
+
+ } else {
+
+ // sniff encoding
+ const re = /charset="?([^;"\s]*)"?/i;
+ const exec = re.exec( mimeType );
+ const label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;
+ const decoder = new TextDecoder( label );
+ return response.arrayBuffer().then( ab => decoder.decode( ab ) );
+
+ }
+
+ }
+
+ } )
+ .then( data => {
+
+ // Add to cache only on HTTP success, so that we do not cache
+ // error response bodies as proper responses to requests.
+ Cache.add( url, data );
+
+ const callbacks = loading[ url ];
+ delete loading[ url ];
+
+ for ( let i = 0, il = callbacks.length; i < il; i ++ ) {
+
+ const callback = callbacks[ i ];
+ if ( callback.onLoad ) callback.onLoad( data );
+
+ }
+
+ } )
+ .catch( err => {
+
+ // Abort errors and other errors are handled the same
+
+ const callbacks = loading[ url ];
+
+ if ( callbacks === undefined ) {
+
+ // When onLoad was called and url was deleted in `loading`
+ this.manager.itemError( url );
+ throw err;
+
+ }
+
+ delete loading[ url ];
+
+ for ( let i = 0, il = callbacks.length; i < il; i ++ ) {
+
+ const callback = callbacks[ i ];
+ if ( callback.onError ) callback.onError( err );
+
+ }
+
+ this.manager.itemError( url );
+
+ } )
+ .finally( () => {
+
+ this.manager.itemEnd( url );
+
+ } );
+
+ this.manager.itemStart( url );
+
+ }
+
+ setResponseType( value ) {
+
+ this.responseType = value;
+ return this;
+
+ }
+
+ setMimeType( value ) {
+
+ this.mimeType = value;
+ return this;
+
+ }
+
+}
+
+class AnimationLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const loader = new FileLoader( this.manager );
+ loader.setPath( this.path );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( this.withCredentials );
+ loader.load( url, function ( text ) {
+
+ try {
+
+ onLoad( scope.parse( JSON.parse( text ) ) );
+
+ } catch ( e ) {
+
+ if ( onError ) {
+
+ onError( e );
+
+ } else {
+
+ console.error( e );
+
+ }
+
+ scope.manager.itemError( url );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+ parse( json ) {
+
+ const animations = [];
+
+ for ( let i = 0; i < json.length; i ++ ) {
+
+ const clip = AnimationClip.parse( json[ i ] );
+
+ animations.push( clip );
+
+ }
+
+ return animations;
+
+ }
+
+}
+
+/**
+ * Abstract Base class to block based textures loader (dds, pvr, ...)
+ *
+ * Sub classes have to implement the parse() method which will be used in load().
+ */
+
+class CompressedTextureLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const images = [];
+
+ const texture = new CompressedTexture();
+
+ const loader = new FileLoader( this.manager );
+ loader.setPath( this.path );
+ loader.setResponseType( 'arraybuffer' );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( scope.withCredentials );
+
+ let loaded = 0;
+
+ function loadTexture( i ) {
+
+ loader.load( url[ i ], function ( buffer ) {
+
+ const texDatas = scope.parse( buffer, true );
+
+ images[ i ] = {
+ width: texDatas.width,
+ height: texDatas.height,
+ format: texDatas.format,
+ mipmaps: texDatas.mipmaps
+ };
+
+ loaded += 1;
+
+ if ( loaded === 6 ) {
+
+ if ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;
+
+ texture.image = images;
+ texture.format = texDatas.format;
+ texture.needsUpdate = true;
+
+ if ( onLoad ) onLoad( texture );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+ if ( Array.isArray( url ) ) {
+
+ for ( let i = 0, il = url.length; i < il; ++ i ) {
+
+ loadTexture( i );
+
+ }
+
+ } else {
+
+ // compressed cubemap texture stored in a single DDS file
+
+ loader.load( url, function ( buffer ) {
+
+ const texDatas = scope.parse( buffer, true );
+
+ if ( texDatas.isCubemap ) {
+
+ const faces = texDatas.mipmaps.length / texDatas.mipmapCount;
+
+ for ( let f = 0; f < faces; f ++ ) {
+
+ images[ f ] = { mipmaps: [] };
+
+ for ( let i = 0; i < texDatas.mipmapCount; i ++ ) {
+
+ images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );
+ images[ f ].format = texDatas.format;
+ images[ f ].width = texDatas.width;
+ images[ f ].height = texDatas.height;
+
+ }
+
+ }
+
+ texture.image = images;
+
+ } else {
+
+ texture.image.width = texDatas.width;
+ texture.image.height = texDatas.height;
+ texture.mipmaps = texDatas.mipmaps;
+
+ }
+
+ if ( texDatas.mipmapCount === 1 ) {
+
+ texture.minFilter = LinearFilter;
+
+ }
+
+ texture.format = texDatas.format;
+ texture.needsUpdate = true;
+
+ if ( onLoad ) onLoad( texture );
+
+ }, onProgress, onError );
+
+ }
+
+ return texture;
+
+ }
+
+}
+
+class ImageLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ if ( this.path !== undefined ) url = this.path + url;
+
+ url = this.manager.resolveURL( url );
+
+ const scope = this;
+
+ const cached = Cache.get( url );
+
+ if ( cached !== undefined ) {
+
+ scope.manager.itemStart( url );
+
+ setTimeout( function () {
+
+ if ( onLoad ) onLoad( cached );
+
+ scope.manager.itemEnd( url );
+
+ }, 0 );
+
+ return cached;
+
+ }
+
+ const image = createElementNS( 'img' );
+
+ function onImageLoad() {
+
+ removeEventListeners();
+
+ Cache.add( url, this );
+
+ if ( onLoad ) onLoad( this );
+
+ scope.manager.itemEnd( url );
+
+ }
+
+ function onImageError( event ) {
+
+ removeEventListeners();
+
+ if ( onError ) onError( event );
+
+ scope.manager.itemError( url );
+ scope.manager.itemEnd( url );
+
+ }
+
+ function removeEventListeners() {
+
+ image.removeEventListener( 'load', onImageLoad, false );
+ image.removeEventListener( 'error', onImageError, false );
+
+ }
+
+ image.addEventListener( 'load', onImageLoad, false );
+ image.addEventListener( 'error', onImageError, false );
+
+ if ( url.slice( 0, 5 ) !== 'data:' ) {
+
+ if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;
+
+ }
+
+ scope.manager.itemStart( url );
+
+ image.src = url;
+
+ return image;
+
+ }
+
+}
+
+class CubeTextureLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( urls, onLoad, onProgress, onError ) {
+
+ const texture = new CubeTexture();
+
+ const loader = new ImageLoader( this.manager );
+ loader.setCrossOrigin( this.crossOrigin );
+ loader.setPath( this.path );
+
+ let loaded = 0;
+
+ function loadTexture( i ) {
+
+ loader.load( urls[ i ], function ( image ) {
+
+ texture.images[ i ] = image;
+
+ loaded ++;
+
+ if ( loaded === 6 ) {
+
+ texture.needsUpdate = true;
+
+ if ( onLoad ) onLoad( texture );
+
+ }
+
+ }, undefined, onError );
+
+ }
+
+ for ( let i = 0; i < urls.length; ++ i ) {
+
+ loadTexture( i );
+
+ }
+
+ return texture;
+
+ }
+
+}
+
+/**
+ * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)
+ *
+ * Sub classes have to implement the parse() method which will be used in load().
+ */
+
+class DataTextureLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const texture = new DataTexture();
+
+ const loader = new FileLoader( this.manager );
+ loader.setResponseType( 'arraybuffer' );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setPath( this.path );
+ loader.setWithCredentials( scope.withCredentials );
+ loader.load( url, function ( buffer ) {
+
+ const texData = scope.parse( buffer );
+
+ if ( ! texData ) return;
+
+ if ( texData.image !== undefined ) {
+
+ texture.image = texData.image;
+
+ } else if ( texData.data !== undefined ) {
+
+ texture.image.width = texData.width;
+ texture.image.height = texData.height;
+ texture.image.data = texData.data;
+
+ }
+
+ texture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;
+ texture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;
+
+ texture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;
+ texture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;
+
+ texture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;
+
+ if ( texData.encoding !== undefined ) {
+
+ texture.encoding = texData.encoding;
+
+ }
+
+ if ( texData.flipY !== undefined ) {
+
+ texture.flipY = texData.flipY;
+
+ }
+
+ if ( texData.format !== undefined ) {
+
+ texture.format = texData.format;
+
+ }
+
+ if ( texData.type !== undefined ) {
+
+ texture.type = texData.type;
+
+ }
+
+ if ( texData.mipmaps !== undefined ) {
+
+ texture.mipmaps = texData.mipmaps;
+ texture.minFilter = LinearMipmapLinearFilter; // presumably...
+
+ }
+
+ if ( texData.mipmapCount === 1 ) {
+
+ texture.minFilter = LinearFilter;
+
+ }
+
+ if ( texData.generateMipmaps !== undefined ) {
+
+ texture.generateMipmaps = texData.generateMipmaps;
+
+ }
+
+ texture.needsUpdate = true;
+
+ if ( onLoad ) onLoad( texture, texData );
+
+ }, onProgress, onError );
+
+
+ return texture;
+
+ }
+
+}
+
+class TextureLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const texture = new Texture();
+
+ const loader = new ImageLoader( this.manager );
+ loader.setCrossOrigin( this.crossOrigin );
+ loader.setPath( this.path );
+
+ loader.load( url, function ( image ) {
+
+ texture.image = image;
+ texture.needsUpdate = true;
+
+ if ( onLoad !== undefined ) {
+
+ onLoad( texture );
+
+ }
+
+ }, onProgress, onError );
+
+ return texture;
+
+ }
+
+}
+
+class Light extends Object3D {
+
+ constructor( color, intensity = 1 ) {
+
+ super();
+
+ this.type = 'Light';
+
+ this.color = new Color( color );
+ this.intensity = intensity;
+
+ }
+
+ dispose() {
+
+ // Empty here in base class; some subclasses override.
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.color.copy( source.color );
+ this.intensity = source.intensity;
+
+ return this;
+
+ }
+
+ toJSON( meta ) {
+
+ const data = super.toJSON( meta );
+
+ data.object.color = this.color.getHex();
+ data.object.intensity = this.intensity;
+
+ if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();
+
+ if ( this.distance !== undefined ) data.object.distance = this.distance;
+ if ( this.angle !== undefined ) data.object.angle = this.angle;
+ if ( this.decay !== undefined ) data.object.decay = this.decay;
+ if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;
+
+ if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();
+
+ return data;
+
+ }
+
+}
+
+Light.prototype.isLight = true;
+
+class HemisphereLight extends Light {
+
+ constructor( skyColor, groundColor, intensity ) {
+
+ super( skyColor, intensity );
+
+ this.type = 'HemisphereLight';
+
+ this.position.copy( Object3D.DefaultUp );
+ this.updateMatrix();
+
+ this.groundColor = new Color( groundColor );
+
+ }
+
+ copy( source ) {
+
+ Light.prototype.copy.call( this, source );
+
+ this.groundColor.copy( source.groundColor );
+
+ return this;
+
+ }
+
+}
+
+HemisphereLight.prototype.isHemisphereLight = true;
+
+const _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();
+const _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();
+const _lookTarget$1 = /*@__PURE__*/ new Vector3();
+
+class LightShadow {
+
+ constructor( camera ) {
+
+ this.camera = camera;
+
+ this.bias = 0;
+ this.normalBias = 0;
+ this.radius = 1;
+ this.blurSamples = 8;
+
+ this.mapSize = new Vector2( 512, 512 );
+
+ this.map = null;
+ this.mapPass = null;
+ this.matrix = new Matrix4();
+
+ this.autoUpdate = true;
+ this.needsUpdate = false;
+
+ this._frustum = new Frustum();
+ this._frameExtents = new Vector2( 1, 1 );
+
+ this._viewportCount = 1;
+
+ this._viewports = [
+
+ new Vector4$1( 0, 0, 1, 1 )
+
+ ];
+
+ }
+
+ getViewportCount() {
+
+ return this._viewportCount;
+
+ }
+
+ getFrustum() {
+
+ return this._frustum;
+
+ }
+
+ updateMatrices( light ) {
+
+ const shadowCamera = this.camera;
+ const shadowMatrix = this.matrix;
+
+ _lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );
+ shadowCamera.position.copy( _lightPositionWorld$1 );
+
+ _lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );
+ shadowCamera.lookAt( _lookTarget$1 );
+ shadowCamera.updateMatrixWorld();
+
+ _projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
+ this._frustum.setFromProjectionMatrix( _projScreenMatrix$1 );
+
+ shadowMatrix.set(
+ 0.5, 0.0, 0.0, 0.5,
+ 0.0, 0.5, 0.0, 0.5,
+ 0.0, 0.0, 0.5, 0.5,
+ 0.0, 0.0, 0.0, 1.0
+ );
+
+ shadowMatrix.multiply( shadowCamera.projectionMatrix );
+ shadowMatrix.multiply( shadowCamera.matrixWorldInverse );
+
+ }
+
+ getViewport( viewportIndex ) {
+
+ return this._viewports[ viewportIndex ];
+
+ }
+
+ getFrameExtents() {
+
+ return this._frameExtents;
+
+ }
+
+ dispose() {
+
+ if ( this.map ) {
+
+ this.map.dispose();
+
+ }
+
+ if ( this.mapPass ) {
+
+ this.mapPass.dispose();
+
+ }
+
+ }
+
+ copy( source ) {
+
+ this.camera = source.camera.clone();
+
+ this.bias = source.bias;
+ this.radius = source.radius;
+
+ this.mapSize.copy( source.mapSize );
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ toJSON() {
+
+ const object = {};
+
+ if ( this.bias !== 0 ) object.bias = this.bias;
+ if ( this.normalBias !== 0 ) object.normalBias = this.normalBias;
+ if ( this.radius !== 1 ) object.radius = this.radius;
+ if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();
+
+ object.camera = this.camera.toJSON( false ).object;
+ delete object.camera.matrix;
+
+ return object;
+
+ }
+
+}
+
+class SpotLightShadow extends LightShadow {
+
+ constructor() {
+
+ super( new PerspectiveCamera( 50, 1, 0.5, 500 ) );
+
+ this.focus = 1;
+
+ }
+
+ updateMatrices( light ) {
+
+ const camera = this.camera;
+
+ const fov = RAD2DEG * 2 * light.angle * this.focus;
+ const aspect = this.mapSize.width / this.mapSize.height;
+ const far = light.distance || camera.far;
+
+ if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {
+
+ camera.fov = fov;
+ camera.aspect = aspect;
+ camera.far = far;
+ camera.updateProjectionMatrix();
+
+ }
+
+ super.updateMatrices( light );
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.focus = source.focus;
+
+ return this;
+
+ }
+
+}
+
+SpotLightShadow.prototype.isSpotLightShadow = true;
+
+class SpotLight extends Light {
+
+ constructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 1 ) {
+
+ super( color, intensity );
+
+ this.type = 'SpotLight';
+
+ this.position.copy( Object3D.DefaultUp );
+ this.updateMatrix();
+
+ this.target = new Object3D();
+
+ this.distance = distance;
+ this.angle = angle;
+ this.penumbra = penumbra;
+ this.decay = decay; // for physically correct lights, should be 2.
+
+ this.shadow = new SpotLightShadow();
+
+ }
+
+ get power() {
+
+ // compute the light's luminous power (in lumens) from its intensity (in candela)
+ // by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)
+ return this.intensity * Math.PI;
+
+ }
+
+ set power( power ) {
+
+ // set the light's intensity (in candela) from the desired luminous power (in lumens)
+ this.intensity = power / Math.PI;
+
+ }
+
+ dispose() {
+
+ this.shadow.dispose();
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.distance = source.distance;
+ this.angle = source.angle;
+ this.penumbra = source.penumbra;
+ this.decay = source.decay;
+
+ this.target = source.target.clone();
+
+ this.shadow = source.shadow.clone();
+
+ return this;
+
+ }
+
+}
+
+SpotLight.prototype.isSpotLight = true;
+
+const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
+const _lightPositionWorld = /*@__PURE__*/ new Vector3();
+const _lookTarget = /*@__PURE__*/ new Vector3();
+
+class PointLightShadow extends LightShadow {
+
+ constructor() {
+
+ super( new PerspectiveCamera( 90, 1, 0.5, 500 ) );
+
+ this._frameExtents = new Vector2( 4, 2 );
+
+ this._viewportCount = 6;
+
+ this._viewports = [
+ // These viewports map a cube-map onto a 2D texture with the
+ // following orientation:
+ //
+ // xzXZ
+ // y Y
+ //
+ // X - Positive x direction
+ // x - Negative x direction
+ // Y - Positive y direction
+ // y - Negative y direction
+ // Z - Positive z direction
+ // z - Negative z direction
+
+ // positive X
+ new Vector4$1( 2, 1, 1, 1 ),
+ // negative X
+ new Vector4$1( 0, 1, 1, 1 ),
+ // positive Z
+ new Vector4$1( 3, 1, 1, 1 ),
+ // negative Z
+ new Vector4$1( 1, 1, 1, 1 ),
+ // positive Y
+ new Vector4$1( 3, 0, 1, 1 ),
+ // negative Y
+ new Vector4$1( 1, 0, 1, 1 )
+ ];
+
+ this._cubeDirections = [
+ new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),
+ new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )
+ ];
+
+ this._cubeUps = [
+ new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),
+ new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 )
+ ];
+
+ }
+
+ updateMatrices( light, viewportIndex = 0 ) {
+
+ const camera = this.camera;
+ const shadowMatrix = this.matrix;
+
+ const far = light.distance || camera.far;
+
+ if ( far !== camera.far ) {
+
+ camera.far = far;
+ camera.updateProjectionMatrix();
+
+ }
+
+ _lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
+ camera.position.copy( _lightPositionWorld );
+
+ _lookTarget.copy( camera.position );
+ _lookTarget.add( this._cubeDirections[ viewportIndex ] );
+ camera.up.copy( this._cubeUps[ viewportIndex ] );
+ camera.lookAt( _lookTarget );
+ camera.updateMatrixWorld();
+
+ shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );
+
+ _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
+ this._frustum.setFromProjectionMatrix( _projScreenMatrix );
+
+ }
+
+}
+
+PointLightShadow.prototype.isPointLightShadow = true;
+
+class PointLight extends Light {
+
+ constructor( color, intensity, distance = 0, decay = 1 ) {
+
+ super( color, intensity );
+
+ this.type = 'PointLight';
+
+ this.distance = distance;
+ this.decay = decay; // for physically correct lights, should be 2.
+
+ this.shadow = new PointLightShadow();
+
+ }
+
+ get power() {
+
+ // compute the light's luminous power (in lumens) from its intensity (in candela)
+ // for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)
+ return this.intensity * 4 * Math.PI;
+
+ }
+
+ set power( power ) {
+
+ // set the light's intensity (in candela) from the desired luminous power (in lumens)
+ this.intensity = power / ( 4 * Math.PI );
+
+ }
+
+ dispose() {
+
+ this.shadow.dispose();
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.distance = source.distance;
+ this.decay = source.decay;
+
+ this.shadow = source.shadow.clone();
+
+ return this;
+
+ }
+
+}
+
+PointLight.prototype.isPointLight = true;
+
+class DirectionalLightShadow extends LightShadow {
+
+ constructor() {
+
+ super( new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );
+
+ }
+
+}
+
+DirectionalLightShadow.prototype.isDirectionalLightShadow = true;
+
+class DirectionalLight extends Light {
+
+ constructor( color, intensity ) {
+
+ super( color, intensity );
+
+ this.type = 'DirectionalLight';
+
+ this.position.copy( Object3D.DefaultUp );
+ this.updateMatrix();
+
+ this.target = new Object3D();
+
+ this.shadow = new DirectionalLightShadow();
+
+ }
+
+ dispose() {
+
+ this.shadow.dispose();
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.target = source.target.clone();
+ this.shadow = source.shadow.clone();
+
+ return this;
+
+ }
+
+}
+
+DirectionalLight.prototype.isDirectionalLight = true;
+
+class AmbientLight extends Light {
+
+ constructor( color, intensity ) {
+
+ super( color, intensity );
+
+ this.type = 'AmbientLight';
+
+ }
+
+}
+
+AmbientLight.prototype.isAmbientLight = true;
+
+class RectAreaLight extends Light {
+
+ constructor( color, intensity, width = 10, height = 10 ) {
+
+ super( color, intensity );
+
+ this.type = 'RectAreaLight';
+
+ this.width = width;
+ this.height = height;
+
+ }
+
+ get power() {
+
+ // compute the light's luminous power (in lumens) from its intensity (in nits)
+ return this.intensity * this.width * this.height * Math.PI;
+
+ }
+
+ set power( power ) {
+
+ // set the light's intensity (in nits) from the desired luminous power (in lumens)
+ this.intensity = power / ( this.width * this.height * Math.PI );
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.width = source.width;
+ this.height = source.height;
+
+ return this;
+
+ }
+
+ toJSON( meta ) {
+
+ const data = super.toJSON( meta );
+
+ data.object.width = this.width;
+ data.object.height = this.height;
+
+ return data;
+
+ }
+
+}
+
+RectAreaLight.prototype.isRectAreaLight = true;
+
+/**
+ * Primary reference:
+ * https://graphics.stanford.edu/papers/envmap/envmap.pdf
+ *
+ * Secondary reference:
+ * https://www.ppsloan.org/publications/StupidSH36.pdf
+ */
+
+// 3-band SH defined by 9 coefficients
+
+class SphericalHarmonics3 {
+
+ constructor() {
+
+ this.coefficients = [];
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients.push( new Vector3() );
+
+ }
+
+ }
+
+ set( coefficients ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].copy( coefficients[ i ] );
+
+ }
+
+ return this;
+
+ }
+
+ zero() {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].set( 0, 0, 0 );
+
+ }
+
+ return this;
+
+ }
+
+ // get the radiance in the direction of the normal
+ // target is a Vector3
+ getAt( normal, target ) {
+
+ // normal is assumed to be unit length
+
+ const x = normal.x, y = normal.y, z = normal.z;
+
+ const coeff = this.coefficients;
+
+ // band 0
+ target.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );
+
+ // band 1
+ target.addScaledVector( coeff[ 1 ], 0.488603 * y );
+ target.addScaledVector( coeff[ 2 ], 0.488603 * z );
+ target.addScaledVector( coeff[ 3 ], 0.488603 * x );
+
+ // band 2
+ target.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );
+ target.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );
+ target.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );
+ target.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );
+ target.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );
+
+ return target;
+
+ }
+
+ // get the irradiance (radiance convolved with cosine lobe) in the direction of the normal
+ // target is a Vector3
+ // https://graphics.stanford.edu/papers/envmap/envmap.pdf
+ getIrradianceAt( normal, target ) {
+
+ // normal is assumed to be unit length
+
+ const x = normal.x, y = normal.y, z = normal.z;
+
+ const coeff = this.coefficients;
+
+ // band 0
+ target.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095
+
+ // band 1
+ target.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603
+ target.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );
+ target.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );
+
+ // band 2
+ target.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548
+ target.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );
+ target.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3
+ target.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );
+ target.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274
+
+ return target;
+
+ }
+
+ add( sh ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].add( sh.coefficients[ i ] );
+
+ }
+
+ return this;
+
+ }
+
+ addScaledSH( sh, s ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );
+
+ }
+
+ return this;
+
+ }
+
+ scale( s ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].multiplyScalar( s );
+
+ }
+
+ return this;
+
+ }
+
+ lerp( sh, alpha ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );
+
+ }
+
+ return this;
+
+ }
+
+ equals( sh ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ if ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {
+
+ return false;
+
+ }
+
+ }
+
+ return true;
+
+ }
+
+ copy( sh ) {
+
+ return this.set( sh.coefficients );
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ fromArray( array, offset = 0 ) {
+
+ const coefficients = this.coefficients;
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ coefficients[ i ].fromArray( array, offset + ( i * 3 ) );
+
+ }
+
+ return this;
+
+ }
+
+ toArray( array = [], offset = 0 ) {
+
+ const coefficients = this.coefficients;
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ coefficients[ i ].toArray( array, offset + ( i * 3 ) );
+
+ }
+
+ return array;
+
+ }
+
+ // evaluate the basis functions
+ // shBasis is an Array[ 9 ]
+ static getBasisAt( normal, shBasis ) {
+
+ // normal is assumed to be unit length
+
+ const x = normal.x, y = normal.y, z = normal.z;
+
+ // band 0
+ shBasis[ 0 ] = 0.282095;
+
+ // band 1
+ shBasis[ 1 ] = 0.488603 * y;
+ shBasis[ 2 ] = 0.488603 * z;
+ shBasis[ 3 ] = 0.488603 * x;
+
+ // band 2
+ shBasis[ 4 ] = 1.092548 * x * y;
+ shBasis[ 5 ] = 1.092548 * y * z;
+ shBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );
+ shBasis[ 7 ] = 1.092548 * x * z;
+ shBasis[ 8 ] = 0.546274 * ( x * x - y * y );
+
+ }
+
+}
+
+SphericalHarmonics3.prototype.isSphericalHarmonics3 = true;
+
+class LightProbe extends Light {
+
+ constructor( sh = new SphericalHarmonics3(), intensity = 1 ) {
+
+ super( undefined, intensity );
+
+ this.sh = sh;
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.sh.copy( source.sh );
+
+ return this;
+
+ }
+
+ fromJSON( json ) {
+
+ this.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();
+ this.sh.fromArray( json.sh );
+
+ return this;
+
+ }
+
+ toJSON( meta ) {
+
+ const data = super.toJSON( meta );
+
+ data.object.sh = this.sh.toArray();
+
+ return data;
+
+ }
+
+}
+
+LightProbe.prototype.isLightProbe = true;
+
+class MaterialLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+ this.textures = {};
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const loader = new FileLoader( scope.manager );
+ loader.setPath( scope.path );
+ loader.setRequestHeader( scope.requestHeader );
+ loader.setWithCredentials( scope.withCredentials );
+ loader.load( url, function ( text ) {
+
+ try {
+
+ onLoad( scope.parse( JSON.parse( text ) ) );
+
+ } catch ( e ) {
+
+ if ( onError ) {
+
+ onError( e );
+
+ } else {
+
+ console.error( e );
+
+ }
+
+ scope.manager.itemError( url );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+ parse( json ) {
+
+ const textures = this.textures;
+
+ function getTexture( name ) {
+
+ if ( textures[ name ] === undefined ) {
+
+ console.warn( 'THREE.MaterialLoader: Undefined texture', name );
+
+ }
+
+ return textures[ name ];
+
+ }
+
+ const material = Material.fromType( json.type );
+
+ if ( json.uuid !== undefined ) material.uuid = json.uuid;
+ if ( json.name !== undefined ) material.name = json.name;
+ if ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );
+ if ( json.roughness !== undefined ) material.roughness = json.roughness;
+ if ( json.metalness !== undefined ) material.metalness = json.metalness;
+ if ( json.sheen !== undefined ) material.sheen = json.sheen;
+ if ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );
+ if ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;
+ if ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );
+ if ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );
+ if ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;
+ if ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );
+ if ( json.shininess !== undefined ) material.shininess = json.shininess;
+ if ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;
+ if ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;
+ if ( json.transmission !== undefined ) material.transmission = json.transmission;
+ if ( json.thickness !== undefined ) material.thickness = json.thickness;
+ if ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;
+ if ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );
+ if ( json.fog !== undefined ) material.fog = json.fog;
+ if ( json.flatShading !== undefined ) material.flatShading = json.flatShading;
+ if ( json.blending !== undefined ) material.blending = json.blending;
+ if ( json.combine !== undefined ) material.combine = json.combine;
+ if ( json.side !== undefined ) material.side = json.side;
+ if ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;
+ if ( json.opacity !== undefined ) material.opacity = json.opacity;
+ if ( json.transparent !== undefined ) material.transparent = json.transparent;
+ if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;
+ if ( json.depthTest !== undefined ) material.depthTest = json.depthTest;
+ if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;
+ if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;
+
+ if ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;
+ if ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;
+ if ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;
+ if ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;
+ if ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;
+ if ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;
+ if ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;
+ if ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;
+
+ if ( json.wireframe !== undefined ) material.wireframe = json.wireframe;
+ if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;
+ if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;
+ if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;
+
+ if ( json.rotation !== undefined ) material.rotation = json.rotation;
+
+ if ( json.linewidth !== 1 ) material.linewidth = json.linewidth;
+ if ( json.dashSize !== undefined ) material.dashSize = json.dashSize;
+ if ( json.gapSize !== undefined ) material.gapSize = json.gapSize;
+ if ( json.scale !== undefined ) material.scale = json.scale;
+
+ if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;
+ if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;
+ if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;
+
+ if ( json.dithering !== undefined ) material.dithering = json.dithering;
+
+ if ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;
+ if ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;
+
+ if ( json.visible !== undefined ) material.visible = json.visible;
+
+ if ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;
+
+ if ( json.userData !== undefined ) material.userData = json.userData;
+
+ if ( json.vertexColors !== undefined ) {
+
+ if ( typeof json.vertexColors === 'number' ) {
+
+ material.vertexColors = ( json.vertexColors > 0 ) ? true : false;
+
+ } else {
+
+ material.vertexColors = json.vertexColors;
+
+ }
+
+ }
+
+ // Shader Material
+
+ if ( json.uniforms !== undefined ) {
+
+ for ( const name in json.uniforms ) {
+
+ const uniform = json.uniforms[ name ];
+
+ material.uniforms[ name ] = {};
+
+ switch ( uniform.type ) {
+
+ case 't':
+ material.uniforms[ name ].value = getTexture( uniform.value );
+ break;
+
+ case 'c':
+ material.uniforms[ name ].value = new Color().setHex( uniform.value );
+ break;
+
+ case 'v2':
+ material.uniforms[ name ].value = new Vector2().fromArray( uniform.value );
+ break;
+
+ case 'v3':
+ material.uniforms[ name ].value = new Vector3().fromArray( uniform.value );
+ break;
+
+ case 'v4':
+ material.uniforms[ name ].value = new Vector4$1().fromArray( uniform.value );
+ break;
+
+ case 'm3':
+ material.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );
+ break;
+
+ case 'm4':
+ material.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );
+ break;
+
+ default:
+ material.uniforms[ name ].value = uniform.value;
+
+ }
+
+ }
+
+ }
+
+ if ( json.defines !== undefined ) material.defines = json.defines;
+ if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;
+ if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;
+
+ if ( json.extensions !== undefined ) {
+
+ for ( const key in json.extensions ) {
+
+ material.extensions[ key ] = json.extensions[ key ];
+
+ }
+
+ }
+
+ // Deprecated
+
+ if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading
+
+ // for PointsMaterial
+
+ if ( json.size !== undefined ) material.size = json.size;
+ if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;
+
+ // maps
+
+ if ( json.map !== undefined ) material.map = getTexture( json.map );
+ if ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );
+
+ if ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );
+
+ if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );
+ if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;
+
+ if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );
+ if ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;
+ if ( json.normalScale !== undefined ) {
+
+ let normalScale = json.normalScale;
+
+ if ( Array.isArray( normalScale ) === false ) {
+
+ // Blender exporter used to export a scalar. See #7459
+
+ normalScale = [ normalScale, normalScale ];
+
+ }
+
+ material.normalScale = new Vector2().fromArray( normalScale );
+
+ }
+
+ if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );
+ if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;
+ if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;
+
+ if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );
+ if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );
+
+ if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );
+ if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;
+
+ if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );
+ if ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );
+ if ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );
+
+ if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );
+ if ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;
+
+ if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;
+ if ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;
+
+ if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );
+ if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;
+
+ if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );
+ if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;
+
+ if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );
+
+ if ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );
+ if ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );
+ if ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );
+ if ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );
+
+ if ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );
+ if ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );
+
+ if ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );
+ if ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );
+
+ return material;
+
+ }
+
+ setTextures( value ) {
+
+ this.textures = value;
+ return this;
+
+ }
+
+}
+
+class LoaderUtils {
+
+ static decodeText( array ) {
+
+ if ( typeof TextDecoder !== 'undefined' ) {
+
+ return new TextDecoder().decode( array );
+
+ }
+
+ // Avoid the String.fromCharCode.apply(null, array) shortcut, which
+ // throws a "maximum call stack size exceeded" error for large arrays.
+
+ let s = '';
+
+ for ( let i = 0, il = array.length; i < il; i ++ ) {
+
+ // Implicitly assumes little-endian.
+ s += String.fromCharCode( array[ i ] );
+
+ }
+
+ try {
+
+ // merges multi-byte utf-8 characters.
+
+ return decodeURIComponent( escape( s ) );
+
+ } catch ( e ) { // see #16358
+
+ return s;
+
+ }
+
+ }
+
+ static extractUrlBase( url ) {
+
+ const index = url.lastIndexOf( '/' );
+
+ if ( index === - 1 ) return './';
+
+ return url.slice( 0, index + 1 );
+
+ }
+
+ static resolveURL( url, path ) {
+
+ // Invalid URL
+ if ( typeof url !== 'string' || url === '' ) return '';
+
+ // Host Relative URL
+ if ( /^https?:\/\//i.test( path ) && /^\//.test( url ) ) {
+
+ path = path.replace( /(^https?:\/\/[^\/]+).*/i, '$1' );
+
+ }
+
+ // Absolute URL http://,https://,//
+ if ( /^(https?:)?\/\//i.test( url ) ) return url;
+
+ // Data URI
+ if ( /^data:.*,.*$/i.test( url ) ) return url;
+
+ // Blob URL
+ if ( /^blob:.*$/i.test( url ) ) return url;
+
+ // Relative URL
+ return path + url;
+
+ }
+
+}
+
+class InstancedBufferGeometry extends BufferGeometry {
+
+ constructor() {
+
+ super();
+
+ this.type = 'InstancedBufferGeometry';
+ this.instanceCount = Infinity;
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.instanceCount = source.instanceCount;
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ toJSON() {
+
+ const data = super.toJSON( this );
+
+ data.instanceCount = this.instanceCount;
+
+ data.isInstancedBufferGeometry = true;
+
+ return data;
+
+ }
+
+}
+
+InstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;
+
+class BufferGeometryLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const loader = new FileLoader( scope.manager );
+ loader.setPath( scope.path );
+ loader.setRequestHeader( scope.requestHeader );
+ loader.setWithCredentials( scope.withCredentials );
+ loader.load( url, function ( text ) {
+
+ try {
+
+ onLoad( scope.parse( JSON.parse( text ) ) );
+
+ } catch ( e ) {
+
+ if ( onError ) {
+
+ onError( e );
+
+ } else {
+
+ console.error( e );
+
+ }
+
+ scope.manager.itemError( url );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+ parse( json ) {
+
+ const interleavedBufferMap = {};
+ const arrayBufferMap = {};
+
+ function getInterleavedBuffer( json, uuid ) {
+
+ if ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];
+
+ const interleavedBuffers = json.interleavedBuffers;
+ const interleavedBuffer = interleavedBuffers[ uuid ];
+
+ const buffer = getArrayBuffer( json, interleavedBuffer.buffer );
+
+ const array = getTypedArray( interleavedBuffer.type, buffer );
+ const ib = new InterleavedBuffer( array, interleavedBuffer.stride );
+ ib.uuid = interleavedBuffer.uuid;
+
+ interleavedBufferMap[ uuid ] = ib;
+
+ return ib;
+
+ }
+
+ function getArrayBuffer( json, uuid ) {
+
+ if ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];
+
+ const arrayBuffers = json.arrayBuffers;
+ const arrayBuffer = arrayBuffers[ uuid ];
+
+ const ab = new Uint32Array( arrayBuffer ).buffer;
+
+ arrayBufferMap[ uuid ] = ab;
+
+ return ab;
+
+ }
+
+ const geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();
+
+ const index = json.data.index;
+
+ if ( index !== undefined ) {
+
+ const typedArray = getTypedArray( index.type, index.array );
+ geometry.setIndex( new BufferAttribute( typedArray, 1 ) );
+
+ }
+
+ const attributes = json.data.attributes;
+
+ for ( const key in attributes ) {
+
+ const attribute = attributes[ key ];
+ let bufferAttribute;
+
+ if ( attribute.isInterleavedBufferAttribute ) {
+
+ const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );
+ bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );
+
+ } else {
+
+ const typedArray = getTypedArray( attribute.type, attribute.array );
+ const bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;
+ bufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );
+
+ }
+
+ if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;
+ if ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );
+
+ if ( attribute.updateRange !== undefined ) {
+
+ bufferAttribute.updateRange.offset = attribute.updateRange.offset;
+ bufferAttribute.updateRange.count = attribute.updateRange.count;
+
+ }
+
+ geometry.setAttribute( key, bufferAttribute );
+
+ }
+
+ const morphAttributes = json.data.morphAttributes;
+
+ if ( morphAttributes ) {
+
+ for ( const key in morphAttributes ) {
+
+ const attributeArray = morphAttributes[ key ];
+
+ const array = [];
+
+ for ( let i = 0, il = attributeArray.length; i < il; i ++ ) {
+
+ const attribute = attributeArray[ i ];
+ let bufferAttribute;
+
+ if ( attribute.isInterleavedBufferAttribute ) {
+
+ const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );
+ bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );
+
+ } else {
+
+ const typedArray = getTypedArray( attribute.type, attribute.array );
+ bufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );
+
+ }
+
+ if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;
+ array.push( bufferAttribute );
+
+ }
+
+ geometry.morphAttributes[ key ] = array;
+
+ }
+
+ }
+
+ const morphTargetsRelative = json.data.morphTargetsRelative;
+
+ if ( morphTargetsRelative ) {
+
+ geometry.morphTargetsRelative = true;
+
+ }
+
+ const groups = json.data.groups || json.data.drawcalls || json.data.offsets;
+
+ if ( groups !== undefined ) {
+
+ for ( let i = 0, n = groups.length; i !== n; ++ i ) {
+
+ const group = groups[ i ];
+
+ geometry.addGroup( group.start, group.count, group.materialIndex );
+
+ }
+
+ }
+
+ const boundingSphere = json.data.boundingSphere;
+
+ if ( boundingSphere !== undefined ) {
+
+ const center = new Vector3();
+
+ if ( boundingSphere.center !== undefined ) {
+
+ center.fromArray( boundingSphere.center );
+
+ }
+
+ geometry.boundingSphere = new Sphere( center, boundingSphere.radius );
+
+ }
+
+ if ( json.name ) geometry.name = json.name;
+ if ( json.userData ) geometry.userData = json.userData;
+
+ return geometry;
+
+ }
+
+}
+
+class ObjectLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;
+ this.resourcePath = this.resourcePath || path;
+
+ const loader = new FileLoader( this.manager );
+ loader.setPath( this.path );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( this.withCredentials );
+ loader.load( url, function ( text ) {
+
+ let json = null;
+
+ try {
+
+ json = JSON.parse( text );
+
+ } catch ( error ) {
+
+ if ( onError !== undefined ) onError( error );
+
+ console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message );
+
+ return;
+
+ }
+
+ const metadata = json.metadata;
+
+ if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {
+
+ console.error( 'THREE.ObjectLoader: Can\'t load ' + url );
+ return;
+
+ }
+
+ scope.parse( json, onLoad );
+
+ }, onProgress, onError );
+
+ }
+
+ async loadAsync( url, onProgress ) {
+
+ const scope = this;
+
+ const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;
+ this.resourcePath = this.resourcePath || path;
+
+ const loader = new FileLoader( this.manager );
+ loader.setPath( this.path );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( this.withCredentials );
+
+ const text = await loader.loadAsync( url, onProgress );
+
+ const json = JSON.parse( text );
+
+ const metadata = json.metadata;
+
+ if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {
+
+ throw new Error( 'THREE.ObjectLoader: Can\'t load ' + url );
+
+ }
+
+ return await scope.parseAsync( json );
+
+ }
+
+ parse( json, onLoad ) {
+
+ const animations = this.parseAnimations( json.animations );
+ const shapes = this.parseShapes( json.shapes );
+ const geometries = this.parseGeometries( json.geometries, shapes );
+
+ const images = this.parseImages( json.images, function () {
+
+ if ( onLoad !== undefined ) onLoad( object );
+
+ } );
+
+ const textures = this.parseTextures( json.textures, images );
+ const materials = this.parseMaterials( json.materials, textures );
+
+ const object = this.parseObject( json.object, geometries, materials, textures, animations );
+ const skeletons = this.parseSkeletons( json.skeletons, object );
+
+ this.bindSkeletons( object, skeletons );
+
+ //
+
+ if ( onLoad !== undefined ) {
+
+ let hasImages = false;
+
+ for ( const uuid in images ) {
+
+ if ( images[ uuid ] instanceof HTMLImageElement ) {
+
+ hasImages = true;
+ break;
+
+ }
+
+ }
+
+ if ( hasImages === false ) onLoad( object );
+
+ }
+
+ return object;
+
+ }
+
+ async parseAsync( json ) {
+
+ const animations = this.parseAnimations( json.animations );
+ const shapes = this.parseShapes( json.shapes );
+ const geometries = this.parseGeometries( json.geometries, shapes );
+
+ const images = await this.parseImagesAsync( json.images );
+
+ const textures = this.parseTextures( json.textures, images );
+ const materials = this.parseMaterials( json.materials, textures );
+
+ const object = this.parseObject( json.object, geometries, materials, textures, animations );
+ const skeletons = this.parseSkeletons( json.skeletons, object );
+
+ this.bindSkeletons( object, skeletons );
+
+ return object;
+
+ }
+
+ parseShapes( json ) {
+
+ const shapes = {};
+
+ if ( json !== undefined ) {
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ const shape = new Shape().fromJSON( json[ i ] );
+
+ shapes[ shape.uuid ] = shape;
+
+ }
+
+ }
+
+ return shapes;
+
+ }
+
+ parseSkeletons( json, object ) {
+
+ const skeletons = {};
+ const bones = {};
+
+ // generate bone lookup table
+
+ object.traverse( function ( child ) {
+
+ if ( child.isBone ) bones[ child.uuid ] = child;
+
+ } );
+
+ // create skeletons
+
+ if ( json !== undefined ) {
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ const skeleton = new Skeleton().fromJSON( json[ i ], bones );
+
+ skeletons[ skeleton.uuid ] = skeleton;
+
+ }
+
+ }
+
+ return skeletons;
+
+ }
+
+ parseGeometries( json, shapes ) {
+
+ const geometries = {};
+
+ if ( json !== undefined ) {
+
+ const bufferGeometryLoader = new BufferGeometryLoader();
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ let geometry;
+ const data = json[ i ];
+
+ switch ( data.type ) {
+
+ case 'BufferGeometry':
+ case 'InstancedBufferGeometry':
+
+ geometry = bufferGeometryLoader.parse( data );
+
+ break;
+
+ case 'Geometry':
+
+ console.error( 'THREE.ObjectLoader: The legacy Geometry type is no longer supported.' );
+
+ break;
+
+ default:
+
+ if ( data.type in Geometries ) {
+
+ geometry = Geometries[ data.type ].fromJSON( data, shapes );
+
+ } else {
+
+ console.warn( `THREE.ObjectLoader: Unsupported geometry type "${ data.type }"` );
+
+ }
+
+ }
+
+ geometry.uuid = data.uuid;
+
+ if ( data.name !== undefined ) geometry.name = data.name;
+ if ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData;
+
+ geometries[ data.uuid ] = geometry;
+
+ }
+
+ }
+
+ return geometries;
+
+ }
+
+ parseMaterials( json, textures ) {
+
+ const cache = {}; // MultiMaterial
+ const materials = {};
+
+ if ( json !== undefined ) {
+
+ const loader = new MaterialLoader();
+ loader.setTextures( textures );
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ const data = json[ i ];
+
+ if ( data.type === 'MultiMaterial' ) {
+
+ // Deprecated
+
+ const array = [];
+
+ for ( let j = 0; j < data.materials.length; j ++ ) {
+
+ const material = data.materials[ j ];
+
+ if ( cache[ material.uuid ] === undefined ) {
+
+ cache[ material.uuid ] = loader.parse( material );
+
+ }
+
+ array.push( cache[ material.uuid ] );
+
+ }
+
+ materials[ data.uuid ] = array;
+
+ } else {
+
+ if ( cache[ data.uuid ] === undefined ) {
+
+ cache[ data.uuid ] = loader.parse( data );
+
+ }
+
+ materials[ data.uuid ] = cache[ data.uuid ];
+
+ }
+
+ }
+
+ }
+
+ return materials;
+
+ }
+
+ parseAnimations( json ) {
+
+ const animations = {};
+
+ if ( json !== undefined ) {
+
+ for ( let i = 0; i < json.length; i ++ ) {
+
+ const data = json[ i ];
+
+ const clip = AnimationClip.parse( data );
+
+ animations[ clip.uuid ] = clip;
+
+ }
+
+ }
+
+ return animations;
+
+ }
+
+ parseImages( json, onLoad ) {
+
+ const scope = this;
+ const images = {};
+
+ let loader;
+
+ function loadImage( url ) {
+
+ scope.manager.itemStart( url );
+
+ return loader.load( url, function () {
+
+ scope.manager.itemEnd( url );
+
+ }, undefined, function () {
+
+ scope.manager.itemError( url );
+ scope.manager.itemEnd( url );
+
+ } );
+
+ }
+
+ function deserializeImage( image ) {
+
+ if ( typeof image === 'string' ) {
+
+ const url = image;
+
+ const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url;
+
+ return loadImage( path );
+
+ } else {
+
+ if ( image.data ) {
+
+ return {
+ data: getTypedArray( image.type, image.data ),
+ width: image.width,
+ height: image.height
+ };
+
+ } else {
+
+ return null;
+
+ }
+
+ }
+
+ }
+
+ if ( json !== undefined && json.length > 0 ) {
+
+ const manager = new LoadingManager( onLoad );
+
+ loader = new ImageLoader( manager );
+ loader.setCrossOrigin( this.crossOrigin );
+
+ for ( let i = 0, il = json.length; i < il; i ++ ) {
+
+ const image = json[ i ];
+ const url = image.url;
+
+ if ( Array.isArray( url ) ) {
+
+ // load array of images e.g CubeTexture
+
+ const imageArray = [];
+
+ for ( let j = 0, jl = url.length; j < jl; j ++ ) {
+
+ const currentUrl = url[ j ];
+
+ const deserializedImage = deserializeImage( currentUrl );
+
+ if ( deserializedImage !== null ) {
+
+ if ( deserializedImage instanceof HTMLImageElement ) {
+
+ imageArray.push( deserializedImage );
+
+ } else {
+
+ // special case: handle array of data textures for cube textures
+
+ imageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );
+
+ }
+
+ }
+
+ }
+
+ images[ image.uuid ] = new Source( imageArray );
+
+ } else {
+
+ // load single image
+
+ const deserializedImage = deserializeImage( image.url );
+ images[ image.uuid ] = new Source( deserializedImage );
+
+
+ }
+
+ }
+
+ }
+
+ return images;
+
+ }
+
+ async parseImagesAsync( json ) {
+
+ const scope = this;
+ const images = {};
+
+ let loader;
+
+ async function deserializeImage( image ) {
+
+ if ( typeof image === 'string' ) {
+
+ const url = image;
+
+ const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url;
+
+ return await loader.loadAsync( path );
+
+ } else {
+
+ if ( image.data ) {
+
+ return {
+ data: getTypedArray( image.type, image.data ),
+ width: image.width,
+ height: image.height
+ };
+
+ } else {
+
+ return null;
+
+ }
+
+ }
+
+ }
+
+ if ( json !== undefined && json.length > 0 ) {
+
+ loader = new ImageLoader( this.manager );
+ loader.setCrossOrigin( this.crossOrigin );
+
+ for ( let i = 0, il = json.length; i < il; i ++ ) {
+
+ const image = json[ i ];
+ const url = image.url;
+
+ if ( Array.isArray( url ) ) {
+
+ // load array of images e.g CubeTexture
+
+ const imageArray = [];
+
+ for ( let j = 0, jl = url.length; j < jl; j ++ ) {
+
+ const currentUrl = url[ j ];
+
+ const deserializedImage = await deserializeImage( currentUrl );
+
+ if ( deserializedImage !== null ) {
+
+ if ( deserializedImage instanceof HTMLImageElement ) {
+
+ imageArray.push( deserializedImage );
+
+ } else {
+
+ // special case: handle array of data textures for cube textures
+
+ imageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );
+
+ }
+
+ }
+
+ }
+
+ images[ image.uuid ] = new Source( imageArray );
+
+ } else {
+
+ // load single image
+
+ const deserializedImage = await deserializeImage( image.url );
+ images[ image.uuid ] = new Source( deserializedImage );
+
+ }
+
+ }
+
+ }
+
+ return images;
+
+ }
+
+ parseTextures( json, images ) {
+
+ function parseConstant( value, type ) {
+
+ if ( typeof value === 'number' ) return value;
+
+ console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );
+
+ return type[ value ];
+
+ }
+
+ const textures = {};
+
+ if ( json !== undefined ) {
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ const data = json[ i ];
+
+ if ( data.image === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid );
+
+ }
+
+ if ( images[ data.image ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined image', data.image );
+
+ }
+
+ const source = images[ data.image ];
+ const image = source.data;
+
+ let texture;
+
+ if ( Array.isArray( image ) ) {
+
+ texture = new CubeTexture();
+
+ if ( image.length === 6 ) texture.needsUpdate = true;
+
+ } else {
+
+ if ( image && image.data ) {
+
+ texture = new DataTexture();
+
+ } else {
+
+ texture = new Texture();
+
+ }
+
+ if ( image ) texture.needsUpdate = true; // textures can have undefined image data
+
+ }
+
+ texture.source = source;
+
+ texture.uuid = data.uuid;
+
+ if ( data.name !== undefined ) texture.name = data.name;
+
+ if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );
+
+ if ( data.offset !== undefined ) texture.offset.fromArray( data.offset );
+ if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );
+ if ( data.center !== undefined ) texture.center.fromArray( data.center );
+ if ( data.rotation !== undefined ) texture.rotation = data.rotation;
+
+ if ( data.wrap !== undefined ) {
+
+ texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );
+ texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );
+
+ }
+
+ if ( data.format !== undefined ) texture.format = data.format;
+ if ( data.type !== undefined ) texture.type = data.type;
+ if ( data.encoding !== undefined ) texture.encoding = data.encoding;
+
+ if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );
+ if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );
+ if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;
+
+ if ( data.flipY !== undefined ) texture.flipY = data.flipY;
+
+ if ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;
+ if ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;
+
+ if ( data.userData !== undefined ) texture.userData = data.userData;
+
+ textures[ data.uuid ] = texture;
+
+ }
+
+ }
+
+ return textures;
+
+ }
+
+ parseObject( data, geometries, materials, textures, animations ) {
+
+ let object;
+
+ function getGeometry( name ) {
+
+ if ( geometries[ name ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined geometry', name );
+
+ }
+
+ return geometries[ name ];
+
+ }
+
+ function getMaterial( name ) {
+
+ if ( name === undefined ) return undefined;
+
+ if ( Array.isArray( name ) ) {
+
+ const array = [];
+
+ for ( let i = 0, l = name.length; i < l; i ++ ) {
+
+ const uuid = name[ i ];
+
+ if ( materials[ uuid ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined material', uuid );
+
+ }
+
+ array.push( materials[ uuid ] );
+
+ }
+
+ return array;
+
+ }
+
+ if ( materials[ name ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined material', name );
+
+ }
+
+ return materials[ name ];
+
+ }
+
+ function getTexture( uuid ) {
+
+ if ( textures[ uuid ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined texture', uuid );
+
+ }
+
+ return textures[ uuid ];
+
+ }
+
+ let geometry, material;
+
+ switch ( data.type ) {
+
+ case 'Scene':
+
+ object = new Scene();
+
+ if ( data.background !== undefined ) {
+
+ if ( Number.isInteger( data.background ) ) {
+
+ object.background = new Color( data.background );
+
+ } else {
+
+ object.background = getTexture( data.background );
+
+ }
+
+ }
+
+ if ( data.environment !== undefined ) {
+
+ object.environment = getTexture( data.environment );
+
+ }
+
+ if ( data.fog !== undefined ) {
+
+ if ( data.fog.type === 'Fog' ) {
+
+ object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );
+
+ } else if ( data.fog.type === 'FogExp2' ) {
+
+ object.fog = new FogExp2( data.fog.color, data.fog.density );
+
+ }
+
+ }
+
+ break;
+
+ case 'PerspectiveCamera':
+
+ object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );
+
+ if ( data.focus !== undefined ) object.focus = data.focus;
+ if ( data.zoom !== undefined ) object.zoom = data.zoom;
+ if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;
+ if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;
+ if ( data.view !== undefined ) object.view = Object.assign( {}, data.view );
+
+ break;
+
+ case 'OrthographicCamera':
+
+ object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );
+
+ if ( data.zoom !== undefined ) object.zoom = data.zoom;
+ if ( data.view !== undefined ) object.view = Object.assign( {}, data.view );
+
+ break;
+
+ case 'AmbientLight':
+
+ object = new AmbientLight( data.color, data.intensity );
+
+ break;
+
+ case 'DirectionalLight':
+
+ object = new DirectionalLight( data.color, data.intensity );
+
+ break;
+
+ case 'PointLight':
+
+ object = new PointLight( data.color, data.intensity, data.distance, data.decay );
+
+ break;
+
+ case 'RectAreaLight':
+
+ object = new RectAreaLight( data.color, data.intensity, data.width, data.height );
+
+ break;
+
+ case 'SpotLight':
+
+ object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );
+
+ break;
+
+ case 'HemisphereLight':
+
+ object = new HemisphereLight( data.color, data.groundColor, data.intensity );
+
+ break;
+
+ case 'LightProbe':
+
+ object = new LightProbe().fromJSON( data );
+
+ break;
+
+ case 'SkinnedMesh':
+
+ geometry = getGeometry( data.geometry );
+ material = getMaterial( data.material );
+
+ object = new SkinnedMesh( geometry, material );
+
+ if ( data.bindMode !== undefined ) object.bindMode = data.bindMode;
+ if ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );
+ if ( data.skeleton !== undefined ) object.skeleton = data.skeleton;
+
+ break;
+
+ case 'Mesh':
+
+ geometry = getGeometry( data.geometry );
+ material = getMaterial( data.material );
+
+ object = new Mesh( geometry, material );
+
+ break;
+
+ case 'InstancedMesh':
+
+ geometry = getGeometry( data.geometry );
+ material = getMaterial( data.material );
+ const count = data.count;
+ const instanceMatrix = data.instanceMatrix;
+ const instanceColor = data.instanceColor;
+
+ object = new InstancedMesh( geometry, material, count );
+ object.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );
+ if ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );
+
+ break;
+
+ case 'LOD':
+
+ object = new LOD();
+
+ break;
+
+ case 'Line':
+
+ object = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );
+
+ break;
+
+ case 'LineLoop':
+
+ object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );
+
+ break;
+
+ case 'LineSegments':
+
+ object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );
+
+ break;
+
+ case 'PointCloud':
+ case 'Points':
+
+ object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );
+
+ break;
+
+ case 'Sprite':
+
+ object = new Sprite( getMaterial( data.material ) );
+
+ break;
+
+ case 'Group':
+
+ object = new Group();
+
+ break;
+
+ case 'Bone':
+
+ object = new Bone();
+
+ break;
+
+ default:
+
+ object = new Object3D();
+
+ }
+
+ object.uuid = data.uuid;
+
+ if ( data.name !== undefined ) object.name = data.name;
+
+ if ( data.matrix !== undefined ) {
+
+ object.matrix.fromArray( data.matrix );
+
+ if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;
+ if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );
+
+ } else {
+
+ if ( data.position !== undefined ) object.position.fromArray( data.position );
+ if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );
+ if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );
+ if ( data.scale !== undefined ) object.scale.fromArray( data.scale );
+
+ }
+
+ if ( data.castShadow !== undefined ) object.castShadow = data.castShadow;
+ if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;
+
+ if ( data.shadow ) {
+
+ if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;
+ if ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;
+ if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;
+ if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );
+ if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );
+
+ }
+
+ if ( data.visible !== undefined ) object.visible = data.visible;
+ if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;
+ if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;
+ if ( data.userData !== undefined ) object.userData = data.userData;
+ if ( data.layers !== undefined ) object.layers.mask = data.layers;
+
+ if ( data.children !== undefined ) {
+
+ const children = data.children;
+
+ for ( let i = 0; i < children.length; i ++ ) {
+
+ object.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );
+
+ }
+
+ }
+
+ if ( data.animations !== undefined ) {
+
+ const objectAnimations = data.animations;
+
+ for ( let i = 0; i < objectAnimations.length; i ++ ) {
+
+ const uuid = objectAnimations[ i ];
+
+ object.animations.push( animations[ uuid ] );
+
+ }
+
+ }
+
+ if ( data.type === 'LOD' ) {
+
+ if ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;
+
+ const levels = data.levels;
+
+ for ( let l = 0; l < levels.length; l ++ ) {
+
+ const level = levels[ l ];
+ const child = object.getObjectByProperty( 'uuid', level.object );
+
+ if ( child !== undefined ) {
+
+ object.addLevel( child, level.distance );
+
+ }
+
+ }
+
+ }
+
+ return object;
+
+ }
+
+ bindSkeletons( object, skeletons ) {
+
+ if ( Object.keys( skeletons ).length === 0 ) return;
+
+ object.traverse( function ( child ) {
+
+ if ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {
+
+ const skeleton = skeletons[ child.skeleton ];
+
+ if ( skeleton === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton );
+
+ } else {
+
+ child.bind( skeleton, child.bindMatrix );
+
+ }
+
+ }
+
+ } );
+
+ }
+
+ /* DEPRECATED */
+
+ setTexturePath( value ) {
+
+ console.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' );
+ return this.setResourcePath( value );
+
+ }
+
+}
+
+const TEXTURE_MAPPING = {
+ UVMapping: UVMapping,
+ CubeReflectionMapping: CubeReflectionMapping,
+ CubeRefractionMapping: CubeRefractionMapping,
+ EquirectangularReflectionMapping: EquirectangularReflectionMapping,
+ EquirectangularRefractionMapping: EquirectangularRefractionMapping,
+ CubeUVReflectionMapping: CubeUVReflectionMapping,
+ CubeUVRefractionMapping: CubeUVRefractionMapping
+};
+
+const TEXTURE_WRAPPING = {
+ RepeatWrapping: RepeatWrapping,
+ ClampToEdgeWrapping: ClampToEdgeWrapping,
+ MirroredRepeatWrapping: MirroredRepeatWrapping
+};
+
+const TEXTURE_FILTER = {
+ NearestFilter: NearestFilter,
+ NearestMipmapNearestFilter: NearestMipmapNearestFilter,
+ NearestMipmapLinearFilter: NearestMipmapLinearFilter,
+ LinearFilter: LinearFilter,
+ LinearMipmapNearestFilter: LinearMipmapNearestFilter,
+ LinearMipmapLinearFilter: LinearMipmapLinearFilter
+};
+
+class ImageBitmapLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ if ( typeof createImageBitmap === 'undefined' ) {
+
+ console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );
+
+ }
+
+ if ( typeof fetch === 'undefined' ) {
+
+ console.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );
+
+ }
+
+ this.options = { premultiplyAlpha: 'none' };
+
+ }
+
+ setOptions( options ) {
+
+ this.options = options;
+
+ return this;
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ if ( url === undefined ) url = '';
+
+ if ( this.path !== undefined ) url = this.path + url;
+
+ url = this.manager.resolveURL( url );
+
+ const scope = this;
+
+ const cached = Cache.get( url );
+
+ if ( cached !== undefined ) {
+
+ scope.manager.itemStart( url );
+
+ setTimeout( function () {
+
+ if ( onLoad ) onLoad( cached );
+
+ scope.manager.itemEnd( url );
+
+ }, 0 );
+
+ return cached;
+
+ }
+
+ const fetchOptions = {};
+ fetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';
+ fetchOptions.headers = this.requestHeader;
+
+ fetch( url, fetchOptions ).then( function ( res ) {
+
+ return res.blob();
+
+ } ).then( function ( blob ) {
+
+ return createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );
+
+ } ).then( function ( imageBitmap ) {
+
+ Cache.add( url, imageBitmap );
+
+ if ( onLoad ) onLoad( imageBitmap );
+
+ scope.manager.itemEnd( url );
+
+ } ).catch( function ( e ) {
+
+ if ( onError ) onError( e );
+
+ scope.manager.itemError( url );
+ scope.manager.itemEnd( url );
+
+ } );
+
+ scope.manager.itemStart( url );
+
+ }
+
+}
+
+ImageBitmapLoader.prototype.isImageBitmapLoader = true;
+
+let _context;
+
+const AudioContext = {
+
+ getContext: function () {
+
+ if ( _context === undefined ) {
+
+ _context = new ( window.AudioContext || window.webkitAudioContext )();
+
+ }
+
+ return _context;
+
+ },
+
+ setContext: function ( value ) {
+
+ _context = value;
+
+ }
+
+};
+
+class AudioLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const loader = new FileLoader( this.manager );
+ loader.setResponseType( 'arraybuffer' );
+ loader.setPath( this.path );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( this.withCredentials );
+ loader.load( url, function ( buffer ) {
+
+ try {
+
+ // Create a copy of the buffer. The `decodeAudioData` method
+ // detaches the buffer when complete, preventing reuse.
+ const bufferCopy = buffer.slice( 0 );
+
+ const context = AudioContext.getContext();
+ context.decodeAudioData( bufferCopy, function ( audioBuffer ) {
+
+ onLoad( audioBuffer );
+
+ } );
+
+ } catch ( e ) {
+
+ if ( onError ) {
+
+ onError( e );
+
+ } else {
+
+ console.error( e );
+
+ }
+
+ scope.manager.itemError( url );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+}
+
+class HemisphereLightProbe extends LightProbe {
+
+ constructor( skyColor, groundColor, intensity = 1 ) {
+
+ super( undefined, intensity );
+
+ const color1 = new Color().set( skyColor );
+ const color2 = new Color().set( groundColor );
+
+ const sky = new Vector3( color1.r, color1.g, color1.b );
+ const ground = new Vector3( color2.r, color2.g, color2.b );
+
+ // without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI );
+ const c0 = Math.sqrt( Math.PI );
+ const c1 = c0 * Math.sqrt( 0.75 );
+
+ this.sh.coefficients[ 0 ].copy( sky ).add( ground ).multiplyScalar( c0 );
+ this.sh.coefficients[ 1 ].copy( sky ).sub( ground ).multiplyScalar( c1 );
+
+ }
+
+}
+
+HemisphereLightProbe.prototype.isHemisphereLightProbe = true;
+
+class AmbientLightProbe extends LightProbe {
+
+ constructor( color, intensity = 1 ) {
+
+ super( undefined, intensity );
+
+ const color1 = new Color().set( color );
+
+ // without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI );
+ this.sh.coefficients[ 0 ].set( color1.r, color1.g, color1.b ).multiplyScalar( 2 * Math.sqrt( Math.PI ) );
+
+ }
+
+}
+
+AmbientLightProbe.prototype.isAmbientLightProbe = true;
+
+const _eyeRight = /*@__PURE__*/ new Matrix4();
+const _eyeLeft = /*@__PURE__*/ new Matrix4();
+const _projectionMatrix = /*@__PURE__*/ new Matrix4();
+
+class StereoCamera {
+
+ constructor() {
+
+ this.type = 'StereoCamera';
+
+ this.aspect = 1;
+
+ this.eyeSep = 0.064;
+
+ this.cameraL = new PerspectiveCamera();
+ this.cameraL.layers.enable( 1 );
+ this.cameraL.matrixAutoUpdate = false;
+
+ this.cameraR = new PerspectiveCamera();
+ this.cameraR.layers.enable( 2 );
+ this.cameraR.matrixAutoUpdate = false;
+
+ this._cache = {
+ focus: null,
+ fov: null,
+ aspect: null,
+ near: null,
+ far: null,
+ zoom: null,
+ eyeSep: null
+ };
+
+ }
+
+ update( camera ) {
+
+ const cache = this._cache;
+
+ const needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||
+ cache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||
+ cache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;
+
+ if ( needsUpdate ) {
+
+ cache.focus = camera.focus;
+ cache.fov = camera.fov;
+ cache.aspect = camera.aspect * this.aspect;
+ cache.near = camera.near;
+ cache.far = camera.far;
+ cache.zoom = camera.zoom;
+ cache.eyeSep = this.eyeSep;
+
+ // Off-axis stereoscopic effect based on
+ // http://paulbourke.net/stereographics/stereorender/
+
+ _projectionMatrix.copy( camera.projectionMatrix );
+ const eyeSepHalf = cache.eyeSep / 2;
+ const eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;
+ const ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;
+ let xmin, xmax;
+
+ // translate xOffset
+
+ _eyeLeft.elements[ 12 ] = - eyeSepHalf;
+ _eyeRight.elements[ 12 ] = eyeSepHalf;
+
+ // for left eye
+
+ xmin = - ymax * cache.aspect + eyeSepOnProjection;
+ xmax = ymax * cache.aspect + eyeSepOnProjection;
+
+ _projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );
+ _projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
+
+ this.cameraL.projectionMatrix.copy( _projectionMatrix );
+
+ // for right eye
+
+ xmin = - ymax * cache.aspect - eyeSepOnProjection;
+ xmax = ymax * cache.aspect - eyeSepOnProjection;
+
+ _projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );
+ _projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
+
+ this.cameraR.projectionMatrix.copy( _projectionMatrix );
+
+ }
+
+ this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );
+ this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );
+
+ }
+
+}
+
+class Clock {
+
+ constructor( autoStart = true ) {
+
+ this.autoStart = autoStart;
+
+ this.startTime = 0;
+ this.oldTime = 0;
+ this.elapsedTime = 0;
+
+ this.running = false;
+
+ }
+
+ start() {
+
+ this.startTime = now();
+
+ this.oldTime = this.startTime;
+ this.elapsedTime = 0;
+ this.running = true;
+
+ }
+
+ stop() {
+
+ this.getElapsedTime();
+ this.running = false;
+ this.autoStart = false;
+
+ }
+
+ getElapsedTime() {
+
+ this.getDelta();
+ return this.elapsedTime;
+
+ }
+
+ getDelta() {
+
+ let diff = 0;
+
+ if ( this.autoStart && ! this.running ) {
+
+ this.start();
+ return 0;
+
+ }
+
+ if ( this.running ) {
+
+ const newTime = now();
+
+ diff = ( newTime - this.oldTime ) / 1000;
+ this.oldTime = newTime;
+
+ this.elapsedTime += diff;
+
+ }
+
+ return diff;
+
+ }
+
+}
+
+function now() {
+
+ return ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732
+
+}
+
+const _position$1 = /*@__PURE__*/ new Vector3();
+const _quaternion$1 = /*@__PURE__*/ new Quaternion();
+const _scale$1 = /*@__PURE__*/ new Vector3();
+const _orientation$1 = /*@__PURE__*/ new Vector3();
+
+class AudioListener extends Object3D {
+
+ constructor() {
+
+ super();
+
+ this.type = 'AudioListener';
+
+ this.context = AudioContext.getContext();
+
+ this.gain = this.context.createGain();
+ this.gain.connect( this.context.destination );
+
+ this.filter = null;
+
+ this.timeDelta = 0;
+
+ // private
+
+ this._clock = new Clock();
+
+ }
+
+ getInput() {
+
+ return this.gain;
+
+ }
+
+ removeFilter() {
+
+ if ( this.filter !== null ) {
+
+ this.gain.disconnect( this.filter );
+ this.filter.disconnect( this.context.destination );
+ this.gain.connect( this.context.destination );
+ this.filter = null;
+
+ }
+
+ return this;
+
+ }
+
+ getFilter() {
+
+ return this.filter;
+
+ }
+
+ setFilter( value ) {
+
+ if ( this.filter !== null ) {
+
+ this.gain.disconnect( this.filter );
+ this.filter.disconnect( this.context.destination );
+
+ } else {
+
+ this.gain.disconnect( this.context.destination );
+
+ }
+
+ this.filter = value;
+ this.gain.connect( this.filter );
+ this.filter.connect( this.context.destination );
+
+ return this;
+
+ }
+
+ getMasterVolume() {
+
+ return this.gain.gain.value;
+
+ }
+
+ setMasterVolume( value ) {
+
+ this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );
+
+ return this;
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ super.updateMatrixWorld( force );
+
+ const listener = this.context.listener;
+ const up = this.up;
+
+ this.timeDelta = this._clock.getDelta();
+
+ this.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );
+
+ _orientation$1.set( 0, 0, - 1 ).applyQuaternion( _quaternion$1 );
+
+ if ( listener.positionX ) {
+
+ // code path for Chrome (see #14393)
+
+ const endTime = this.context.currentTime + this.timeDelta;
+
+ listener.positionX.linearRampToValueAtTime( _position$1.x, endTime );
+ listener.positionY.linearRampToValueAtTime( _position$1.y, endTime );
+ listener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );
+ listener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime );
+ listener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime );
+ listener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime );
+ listener.upX.linearRampToValueAtTime( up.x, endTime );
+ listener.upY.linearRampToValueAtTime( up.y, endTime );
+ listener.upZ.linearRampToValueAtTime( up.z, endTime );
+
+ } else {
+
+ listener.setPosition( _position$1.x, _position$1.y, _position$1.z );
+ listener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z );
+
+ }
+
+ }
+
+}
+
+class Audio extends Object3D {
+
+ constructor( listener ) {
+
+ super();
+
+ this.type = 'Audio';
+
+ this.listener = listener;
+ this.context = listener.context;
+
+ this.gain = this.context.createGain();
+ this.gain.connect( listener.getInput() );
+
+ this.autoplay = false;
+
+ this.buffer = null;
+ this.detune = 0;
+ this.loop = false;
+ this.loopStart = 0;
+ this.loopEnd = 0;
+ this.offset = 0;
+ this.duration = undefined;
+ this.playbackRate = 1;
+ this.isPlaying = false;
+ this.hasPlaybackControl = true;
+ this.source = null;
+ this.sourceType = 'empty';
+
+ this._startedAt = 0;
+ this._progress = 0;
+ this._connected = false;
+
+ this.filters = [];
+
+ }
+
+ getOutput() {
+
+ return this.gain;
+
+ }
+
+ setNodeSource( audioNode ) {
+
+ this.hasPlaybackControl = false;
+ this.sourceType = 'audioNode';
+ this.source = audioNode;
+ this.connect();
+
+ return this;
+
+ }
+
+ setMediaElementSource( mediaElement ) {
+
+ this.hasPlaybackControl = false;
+ this.sourceType = 'mediaNode';
+ this.source = this.context.createMediaElementSource( mediaElement );
+ this.connect();
+
+ return this;
+
+ }
+
+ setMediaStreamSource( mediaStream ) {
+
+ this.hasPlaybackControl = false;
+ this.sourceType = 'mediaStreamNode';
+ this.source = this.context.createMediaStreamSource( mediaStream );
+ this.connect();
+
+ return this;
+
+ }
+
+ setBuffer( audioBuffer ) {
+
+ this.buffer = audioBuffer;
+ this.sourceType = 'buffer';
+
+ if ( this.autoplay ) this.play();
+
+ return this;
+
+ }
+
+ play( delay = 0 ) {
+
+ if ( this.isPlaying === true ) {
+
+ console.warn( 'THREE.Audio: Audio is already playing.' );
+ return;
+
+ }
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ this._startedAt = this.context.currentTime + delay;
+
+ const source = this.context.createBufferSource();
+ source.buffer = this.buffer;
+ source.loop = this.loop;
+ source.loopStart = this.loopStart;
+ source.loopEnd = this.loopEnd;
+ source.onended = this.onEnded.bind( this );
+ source.start( this._startedAt, this._progress + this.offset, this.duration );
+
+ this.isPlaying = true;
+
+ this.source = source;
+
+ this.setDetune( this.detune );
+ this.setPlaybackRate( this.playbackRate );
+
+ return this.connect();
+
+ }
+
+ pause() {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ if ( this.isPlaying === true ) {
+
+ // update current progress
+
+ this._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;
+
+ if ( this.loop === true ) {
+
+ // ensure _progress does not exceed duration with looped audios
+
+ this._progress = this._progress % ( this.duration || this.buffer.duration );
+
+ }
+
+ this.source.stop();
+ this.source.onended = null;
+
+ this.isPlaying = false;
+
+ }
+
+ return this;
+
+ }
+
+ stop() {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ this._progress = 0;
+
+ this.source.stop();
+ this.source.onended = null;
+ this.isPlaying = false;
+
+ return this;
+
+ }
+
+ connect() {
+
+ if ( this.filters.length > 0 ) {
+
+ this.source.connect( this.filters[ 0 ] );
+
+ for ( let i = 1, l = this.filters.length; i < l; i ++ ) {
+
+ this.filters[ i - 1 ].connect( this.filters[ i ] );
+
+ }
+
+ this.filters[ this.filters.length - 1 ].connect( this.getOutput() );
+
+ } else {
+
+ this.source.connect( this.getOutput() );
+
+ }
+
+ this._connected = true;
+
+ return this;
+
+ }
+
+ disconnect() {
+
+ if ( this.filters.length > 0 ) {
+
+ this.source.disconnect( this.filters[ 0 ] );
+
+ for ( let i = 1, l = this.filters.length; i < l; i ++ ) {
+
+ this.filters[ i - 1 ].disconnect( this.filters[ i ] );
+
+ }
+
+ this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );
+
+ } else {
+
+ this.source.disconnect( this.getOutput() );
+
+ }
+
+ this._connected = false;
+
+ return this;
+
+ }
+
+ getFilters() {
+
+ return this.filters;
+
+ }
+
+ setFilters( value ) {
+
+ if ( ! value ) value = [];
+
+ if ( this._connected === true ) {
+
+ this.disconnect();
+ this.filters = value.slice();
+ this.connect();
+
+ } else {
+
+ this.filters = value.slice();
+
+ }
+
+ return this;
+
+ }
+
+ setDetune( value ) {
+
+ this.detune = value;
+
+ if ( this.source.detune === undefined ) return; // only set detune when available
+
+ if ( this.isPlaying === true ) {
+
+ this.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );
+
+ }
+
+ return this;
+
+ }
+
+ getDetune() {
+
+ return this.detune;
+
+ }
+
+ getFilter() {
+
+ return this.getFilters()[ 0 ];
+
+ }
+
+ setFilter( filter ) {
+
+ return this.setFilters( filter ? [ filter ] : [] );
+
+ }
+
+ setPlaybackRate( value ) {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ this.playbackRate = value;
+
+ if ( this.isPlaying === true ) {
+
+ this.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );
+
+ }
+
+ return this;
+
+ }
+
+ getPlaybackRate() {
+
+ return this.playbackRate;
+
+ }
+
+ onEnded() {
+
+ this.isPlaying = false;
+
+ }
+
+ getLoop() {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return false;
+
+ }
+
+ return this.loop;
+
+ }
+
+ setLoop( value ) {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ this.loop = value;
+
+ if ( this.isPlaying === true ) {
+
+ this.source.loop = this.loop;
+
+ }
+
+ return this;
+
+ }
+
+ setLoopStart( value ) {
+
+ this.loopStart = value;
+
+ return this;
+
+ }
+
+ setLoopEnd( value ) {
+
+ this.loopEnd = value;
+
+ return this;
+
+ }
+
+ getVolume() {
+
+ return this.gain.gain.value;
+
+ }
+
+ setVolume( value ) {
+
+ this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );
+
+ return this;
+
+ }
+
+}
+
+const _position = /*@__PURE__*/ new Vector3();
+const _quaternion = /*@__PURE__*/ new Quaternion();
+const _scale = /*@__PURE__*/ new Vector3();
+const _orientation = /*@__PURE__*/ new Vector3();
+
+class PositionalAudio extends Audio {
+
+ constructor( listener ) {
+
+ super( listener );
+
+ this.panner = this.context.createPanner();
+ this.panner.panningModel = 'HRTF';
+ this.panner.connect( this.gain );
+
+ }
+
+ getOutput() {
+
+ return this.panner;
+
+ }
+
+ getRefDistance() {
+
+ return this.panner.refDistance;
+
+ }
+
+ setRefDistance( value ) {
+
+ this.panner.refDistance = value;
+
+ return this;
+
+ }
+
+ getRolloffFactor() {
+
+ return this.panner.rolloffFactor;
+
+ }
+
+ setRolloffFactor( value ) {
+
+ this.panner.rolloffFactor = value;
+
+ return this;
+
+ }
+
+ getDistanceModel() {
+
+ return this.panner.distanceModel;
+
+ }
+
+ setDistanceModel( value ) {
+
+ this.panner.distanceModel = value;
+
+ return this;
+
+ }
+
+ getMaxDistance() {
+
+ return this.panner.maxDistance;
+
+ }
+
+ setMaxDistance( value ) {
+
+ this.panner.maxDistance = value;
+
+ return this;
+
+ }
+
+ setDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {
+
+ this.panner.coneInnerAngle = coneInnerAngle;
+ this.panner.coneOuterAngle = coneOuterAngle;
+ this.panner.coneOuterGain = coneOuterGain;
+
+ return this;
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ super.updateMatrixWorld( force );
+
+ if ( this.hasPlaybackControl === true && this.isPlaying === false ) return;
+
+ this.matrixWorld.decompose( _position, _quaternion, _scale );
+
+ _orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );
+
+ const panner = this.panner;
+
+ if ( panner.positionX ) {
+
+ // code path for Chrome and Firefox (see #14393)
+
+ const endTime = this.context.currentTime + this.listener.timeDelta;
+
+ panner.positionX.linearRampToValueAtTime( _position.x, endTime );
+ panner.positionY.linearRampToValueAtTime( _position.y, endTime );
+ panner.positionZ.linearRampToValueAtTime( _position.z, endTime );
+ panner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );
+ panner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );
+ panner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );
+
+ } else {
+
+ panner.setPosition( _position.x, _position.y, _position.z );
+ panner.setOrientation( _orientation.x, _orientation.y, _orientation.z );
+
+ }
+
+ }
+
+}
+
+class AudioAnalyser {
+
+ constructor( audio, fftSize = 2048 ) {
+
+ this.analyser = audio.context.createAnalyser();
+ this.analyser.fftSize = fftSize;
+
+ this.data = new Uint8Array( this.analyser.frequencyBinCount );
+
+ audio.getOutput().connect( this.analyser );
+
+ }
+
+
+ getFrequencyData() {
+
+ this.analyser.getByteFrequencyData( this.data );
+
+ return this.data;
+
+ }
+
+ getAverageFrequency() {
+
+ let value = 0;
+ const data = this.getFrequencyData();
+
+ for ( let i = 0; i < data.length; i ++ ) {
+
+ value += data[ i ];
+
+ }
+
+ return value / data.length;
+
+ }
+
+}
+
+class PropertyMixer {
+
+ constructor( binding, typeName, valueSize ) {
+
+ this.binding = binding;
+ this.valueSize = valueSize;
+
+ let mixFunction,
+ mixFunctionAdditive,
+ setIdentity;
+
+ // buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]
+ //
+ // interpolators can use .buffer as their .result
+ // the data then goes to 'incoming'
+ //
+ // 'accu0' and 'accu1' are used frame-interleaved for
+ // the cumulative result and are compared to detect
+ // changes
+ //
+ // 'orig' stores the original state of the property
+ //
+ // 'add' is used for additive cumulative results
+ //
+ // 'work' is optional and is only present for quaternion types. It is used
+ // to store intermediate quaternion multiplication results
+
+ switch ( typeName ) {
+
+ case 'quaternion':
+ mixFunction = this._slerp;
+ mixFunctionAdditive = this._slerpAdditive;
+ setIdentity = this._setAdditiveIdentityQuaternion;
+
+ this.buffer = new Float64Array( valueSize * 6 );
+ this._workIndex = 5;
+ break;
+
+ case 'string':
+ case 'bool':
+ mixFunction = this._select;
+
+ // Use the regular mix function and for additive on these types,
+ // additive is not relevant for non-numeric types
+ mixFunctionAdditive = this._select;
+
+ setIdentity = this._setAdditiveIdentityOther;
+
+ this.buffer = new Array( valueSize * 5 );
+ break;
+
+ default:
+ mixFunction = this._lerp;
+ mixFunctionAdditive = this._lerpAdditive;
+ setIdentity = this._setAdditiveIdentityNumeric;
+
+ this.buffer = new Float64Array( valueSize * 5 );
+
+ }
+
+ this._mixBufferRegion = mixFunction;
+ this._mixBufferRegionAdditive = mixFunctionAdditive;
+ this._setIdentity = setIdentity;
+ this._origIndex = 3;
+ this._addIndex = 4;
+
+ this.cumulativeWeight = 0;
+ this.cumulativeWeightAdditive = 0;
+
+ this.useCount = 0;
+ this.referenceCount = 0;
+
+ }
+
+ // accumulate data in the 'incoming' region into 'accu'
+ accumulate( accuIndex, weight ) {
+
+ // note: happily accumulating nothing when weight = 0, the caller knows
+ // the weight and shouldn't have made the call in the first place
+
+ const buffer = this.buffer,
+ stride = this.valueSize,
+ offset = accuIndex * stride + stride;
+
+ let currentWeight = this.cumulativeWeight;
+
+ if ( currentWeight === 0 ) {
+
+ // accuN := incoming * weight
+
+ for ( let i = 0; i !== stride; ++ i ) {
+
+ buffer[ offset + i ] = buffer[ i ];
+
+ }
+
+ currentWeight = weight;
+
+ } else {
+
+ // accuN := accuN + incoming * weight
+
+ currentWeight += weight;
+ const mix = weight / currentWeight;
+ this._mixBufferRegion( buffer, offset, 0, mix, stride );
+
+ }
+
+ this.cumulativeWeight = currentWeight;
+
+ }
+
+ // accumulate data in the 'incoming' region into 'add'
+ accumulateAdditive( weight ) {
+
+ const buffer = this.buffer,
+ stride = this.valueSize,
+ offset = stride * this._addIndex;
+
+ if ( this.cumulativeWeightAdditive === 0 ) {
+
+ // add = identity
+
+ this._setIdentity();
+
+ }
+
+ // add := add + incoming * weight
+
+ this._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );
+ this.cumulativeWeightAdditive += weight;
+
+ }
+
+ // apply the state of 'accu' to the binding when accus differ
+ apply( accuIndex ) {
+
+ const stride = this.valueSize,
+ buffer = this.buffer,
+ offset = accuIndex * stride + stride,
+
+ weight = this.cumulativeWeight,
+ weightAdditive = this.cumulativeWeightAdditive,
+
+ binding = this.binding;
+
+ this.cumulativeWeight = 0;
+ this.cumulativeWeightAdditive = 0;
+
+ if ( weight < 1 ) {
+
+ // accuN := accuN + original * ( 1 - cumulativeWeight )
+
+ const originalValueOffset = stride * this._origIndex;
+
+ this._mixBufferRegion(
+ buffer, offset, originalValueOffset, 1 - weight, stride );
+
+ }
+
+ if ( weightAdditive > 0 ) {
+
+ // accuN := accuN + additive accuN
+
+ this._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );
+
+ }
+
+ for ( let i = stride, e = stride + stride; i !== e; ++ i ) {
+
+ if ( buffer[ i ] !== buffer[ i + stride ] ) {
+
+ // value has changed -> update scene graph
+
+ binding.setValue( buffer, offset );
+ break;
+
+ }
+
+ }
+
+ }
+
+ // remember the state of the bound property and copy it to both accus
+ saveOriginalState() {
+
+ const binding = this.binding;
+
+ const buffer = this.buffer,
+ stride = this.valueSize,
+
+ originalValueOffset = stride * this._origIndex;
+
+ binding.getValue( buffer, originalValueOffset );
+
+ // accu[0..1] := orig -- initially detect changes against the original
+ for ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {
+
+ buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];
+
+ }
+
+ // Add to identity for additive
+ this._setIdentity();
+
+ this.cumulativeWeight = 0;
+ this.cumulativeWeightAdditive = 0;
+
+ }
+
+ // apply the state previously taken via 'saveOriginalState' to the binding
+ restoreOriginalState() {
+
+ const originalValueOffset = this.valueSize * 3;
+ this.binding.setValue( this.buffer, originalValueOffset );
+
+ }
+
+ _setAdditiveIdentityNumeric() {
+
+ const startIndex = this._addIndex * this.valueSize;
+ const endIndex = startIndex + this.valueSize;
+
+ for ( let i = startIndex; i < endIndex; i ++ ) {
+
+ this.buffer[ i ] = 0;
+
+ }
+
+ }
+
+ _setAdditiveIdentityQuaternion() {
+
+ this._setAdditiveIdentityNumeric();
+ this.buffer[ this._addIndex * this.valueSize + 3 ] = 1;
+
+ }
+
+ _setAdditiveIdentityOther() {
+
+ const startIndex = this._origIndex * this.valueSize;
+ const targetIndex = this._addIndex * this.valueSize;
+
+ for ( let i = 0; i < this.valueSize; i ++ ) {
+
+ this.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];
+
+ }
+
+ }
+
+
+ // mix functions
+
+ _select( buffer, dstOffset, srcOffset, t, stride ) {
+
+ if ( t >= 0.5 ) {
+
+ for ( let i = 0; i !== stride; ++ i ) {
+
+ buffer[ dstOffset + i ] = buffer[ srcOffset + i ];
+
+ }
+
+ }
+
+ }
+
+ _slerp( buffer, dstOffset, srcOffset, t ) {
+
+ Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );
+
+ }
+
+ _slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {
+
+ const workOffset = this._workIndex * stride;
+
+ // Store result in intermediate buffer offset
+ Quaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );
+
+ // Slerp to the intermediate result
+ Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );
+
+ }
+
+ _lerp( buffer, dstOffset, srcOffset, t, stride ) {
+
+ const s = 1 - t;
+
+ for ( let i = 0; i !== stride; ++ i ) {
+
+ const j = dstOffset + i;
+
+ buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;
+
+ }
+
+ }
+
+ _lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {
+
+ for ( let i = 0; i !== stride; ++ i ) {
+
+ const j = dstOffset + i;
+
+ buffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;
+
+ }
+
+ }
+
+}
+
+// Characters [].:/ are reserved for track binding syntax.
+const _RESERVED_CHARS_RE = '\\[\\]\\.:\\/';
+const _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );
+
+// Attempts to allow node names from any language. ES5's `\w` regexp matches
+// only latin characters, and the unicode \p{L} is not yet supported. So
+// instead, we exclude reserved characters and match everything else.
+const _wordChar = '[^' + _RESERVED_CHARS_RE + ']';
+const _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\.', '' ) + ']';
+
+// Parent directories, delimited by '/' or ':'. Currently unused, but must
+// be matched to parse the rest of the track name.
+const _directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', _wordChar );
+
+// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.
+const _nodeRe = /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );
+
+// Object on target node, and accessor. May not contain reserved
+// characters. Accessor may contain any character except closing bracket.
+const _objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', _wordChar );
+
+// Property and accessor. May not contain reserved characters. Accessor may
+// contain any non-bracket characters.
+const _propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', _wordChar );
+
+const _trackRe = new RegExp( ''
+ + '^'
+ + _directoryRe
+ + _nodeRe
+ + _objectRe
+ + _propertyRe
+ + '$'
+);
+
+const _supportedObjectNames = [ 'material', 'materials', 'bones' ];
+
+class Composite {
+
+ constructor( targetGroup, path, optionalParsedPath ) {
+
+ const parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );
+
+ this._targetGroup = targetGroup;
+ this._bindings = targetGroup.subscribe_( path, parsedPath );
+
+ }
+
+ getValue( array, offset ) {
+
+ this.bind(); // bind all binding
+
+ const firstValidIndex = this._targetGroup.nCachedObjects_,
+ binding = this._bindings[ firstValidIndex ];
+
+ // and only call .getValue on the first
+ if ( binding !== undefined ) binding.getValue( array, offset );
+
+ }
+
+ setValue( array, offset ) {
+
+ const bindings = this._bindings;
+
+ for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {
+
+ bindings[ i ].setValue( array, offset );
+
+ }
+
+ }
+
+ bind() {
+
+ const bindings = this._bindings;
+
+ for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {
+
+ bindings[ i ].bind();
+
+ }
+
+ }
+
+ unbind() {
+
+ const bindings = this._bindings;
+
+ for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {
+
+ bindings[ i ].unbind();
+
+ }
+
+ }
+
+}
+
+// Note: This class uses a State pattern on a per-method basis:
+// 'bind' sets 'this.getValue' / 'setValue' and shadows the
+// prototype version of these methods with one that represents
+// the bound state. When the property is not found, the methods
+// become no-ops.
+class PropertyBinding {
+
+ constructor( rootNode, path, parsedPath ) {
+
+ this.path = path;
+ this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );
+
+ this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;
+
+ this.rootNode = rootNode;
+
+ // initial state of these methods that calls 'bind'
+ this.getValue = this._getValue_unbound;
+ this.setValue = this._setValue_unbound;
+
+ }
+
+
+ static create( root, path, parsedPath ) {
+
+ if ( ! ( root && root.isAnimationObjectGroup ) ) {
+
+ return new PropertyBinding( root, path, parsedPath );
+
+ } else {
+
+ return new PropertyBinding.Composite( root, path, parsedPath );
+
+ }
+
+ }
+
+ /**
+ * Replaces spaces with underscores and removes unsupported characters from
+ * node names, to ensure compatibility with parseTrackName().
+ *
+ * @param {string} name Node name to be sanitized.
+ * @return {string}
+ */
+ static sanitizeNodeName( name ) {
+
+ return name.replace( /\s/g, '_' ).replace( _reservedRe, '' );
+
+ }
+
+ static parseTrackName( trackName ) {
+
+ const matches = _trackRe.exec( trackName );
+
+ if ( matches === null ) {
+
+ throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );
+
+ }
+
+ const results = {
+ // directoryName: matches[ 1 ], // (tschw) currently unused
+ nodeName: matches[ 2 ],
+ objectName: matches[ 3 ],
+ objectIndex: matches[ 4 ],
+ propertyName: matches[ 5 ], // required
+ propertyIndex: matches[ 6 ]
+ };
+
+ const lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );
+
+ if ( lastDot !== undefined && lastDot !== - 1 ) {
+
+ const objectName = results.nodeName.substring( lastDot + 1 );
+
+ // Object names must be checked against an allowlist. Otherwise, there
+ // is no way to parse 'foo.bar.baz': 'baz' must be a property, but
+ // 'bar' could be the objectName, or part of a nodeName (which can
+ // include '.' characters).
+ if ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) {
+
+ results.nodeName = results.nodeName.substring( 0, lastDot );
+ results.objectName = objectName;
+
+ }
+
+ }
+
+ if ( results.propertyName === null || results.propertyName.length === 0 ) {
+
+ throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );
+
+ }
+
+ return results;
+
+ }
+
+ static findNode( root, nodeName ) {
+
+ if ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {
+
+ return root;
+
+ }
+
+ // search into skeleton bones.
+ if ( root.skeleton ) {
+
+ const bone = root.skeleton.getBoneByName( nodeName );
+
+ if ( bone !== undefined ) {
+
+ return bone;
+
+ }
+
+ }
+
+ // search into node subtree.
+ if ( root.children ) {
+
+ const searchNodeSubtree = function ( children ) {
+
+ for ( let i = 0; i < children.length; i ++ ) {
+
+ const childNode = children[ i ];
+
+ if ( childNode.name === nodeName || childNode.uuid === nodeName ) {
+
+ return childNode;
+
+ }
+
+ const result = searchNodeSubtree( childNode.children );
+
+ if ( result ) return result;
+
+ }
+
+ return null;
+
+ };
+
+ const subTreeNode = searchNodeSubtree( root.children );
+
+ if ( subTreeNode ) {
+
+ return subTreeNode;
+
+ }
+
+ }
+
+ return null;
+
+ }
+
+ // these are used to "bind" a nonexistent property
+ _getValue_unavailable() {}
+ _setValue_unavailable() {}
+
+ // Getters
+
+ _getValue_direct( buffer, offset ) {
+
+ buffer[ offset ] = this.targetObject[ this.propertyName ];
+
+ }
+
+ _getValue_array( buffer, offset ) {
+
+ const source = this.resolvedProperty;
+
+ for ( let i = 0, n = source.length; i !== n; ++ i ) {
+
+ buffer[ offset ++ ] = source[ i ];
+
+ }
+
+ }
+
+ _getValue_arrayElement( buffer, offset ) {
+
+ buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];
+
+ }
+
+ _getValue_toArray( buffer, offset ) {
+
+ this.resolvedProperty.toArray( buffer, offset );
+
+ }
+
+ // Direct
+
+ _setValue_direct( buffer, offset ) {
+
+ this.targetObject[ this.propertyName ] = buffer[ offset ];
+
+ }
+
+ _setValue_direct_setNeedsUpdate( buffer, offset ) {
+
+ this.targetObject[ this.propertyName ] = buffer[ offset ];
+ this.targetObject.needsUpdate = true;
+
+ }
+
+ _setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {
+
+ this.targetObject[ this.propertyName ] = buffer[ offset ];
+ this.targetObject.matrixWorldNeedsUpdate = true;
+
+ }
+
+ // EntireArray
+
+ _setValue_array( buffer, offset ) {
+
+ const dest = this.resolvedProperty;
+
+ for ( let i = 0, n = dest.length; i !== n; ++ i ) {
+
+ dest[ i ] = buffer[ offset ++ ];
+
+ }
+
+ }
+
+ _setValue_array_setNeedsUpdate( buffer, offset ) {
+
+ const dest = this.resolvedProperty;
+
+ for ( let i = 0, n = dest.length; i !== n; ++ i ) {
+
+ dest[ i ] = buffer[ offset ++ ];
+
+ }
+
+ this.targetObject.needsUpdate = true;
+
+ }
+
+ _setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {
+
+ const dest = this.resolvedProperty;
+
+ for ( let i = 0, n = dest.length; i !== n; ++ i ) {
+
+ dest[ i ] = buffer[ offset ++ ];
+
+ }
+
+ this.targetObject.matrixWorldNeedsUpdate = true;
+
+ }
+
+ // ArrayElement
+
+ _setValue_arrayElement( buffer, offset ) {
+
+ this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
+
+ }
+
+ _setValue_arrayElement_setNeedsUpdate( buffer, offset ) {
+
+ this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
+ this.targetObject.needsUpdate = true;
+
+ }
+
+ _setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {
+
+ this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
+ this.targetObject.matrixWorldNeedsUpdate = true;
+
+ }
+
+ // HasToFromArray
+
+ _setValue_fromArray( buffer, offset ) {
+
+ this.resolvedProperty.fromArray( buffer, offset );
+
+ }
+
+ _setValue_fromArray_setNeedsUpdate( buffer, offset ) {
+
+ this.resolvedProperty.fromArray( buffer, offset );
+ this.targetObject.needsUpdate = true;
+
+ }
+
+ _setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {
+
+ this.resolvedProperty.fromArray( buffer, offset );
+ this.targetObject.matrixWorldNeedsUpdate = true;
+
+ }
+
+ _getValue_unbound( targetArray, offset ) {
+
+ this.bind();
+ this.getValue( targetArray, offset );
+
+ }
+
+ _setValue_unbound( sourceArray, offset ) {
+
+ this.bind();
+ this.setValue( sourceArray, offset );
+
+ }
+
+ // create getter / setter pair for a property in the scene graph
+ bind() {
+
+ let targetObject = this.node;
+ const parsedPath = this.parsedPath;
+
+ const objectName = parsedPath.objectName;
+ const propertyName = parsedPath.propertyName;
+ let propertyIndex = parsedPath.propertyIndex;
+
+ if ( ! targetObject ) {
+
+ targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;
+
+ this.node = targetObject;
+
+ }
+
+ // set fail state so we can just 'return' on error
+ this.getValue = this._getValue_unavailable;
+ this.setValue = this._setValue_unavailable;
+
+ // ensure there is a value node
+ if ( ! targetObject ) {
+
+ console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' );
+ return;
+
+ }
+
+ if ( objectName ) {
+
+ let objectIndex = parsedPath.objectIndex;
+
+ // special cases were we need to reach deeper into the hierarchy to get the face materials....
+ switch ( objectName ) {
+
+ case 'materials':
+
+ if ( ! targetObject.material ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );
+ return;
+
+ }
+
+ if ( ! targetObject.material.materials ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );
+ return;
+
+ }
+
+ targetObject = targetObject.material.materials;
+
+ break;
+
+ case 'bones':
+
+ if ( ! targetObject.skeleton ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );
+ return;
+
+ }
+
+ // potential future optimization: skip this if propertyIndex is already an integer
+ // and convert the integer string to a true integer.
+
+ targetObject = targetObject.skeleton.bones;
+
+ // support resolving morphTarget names into indices.
+ for ( let i = 0; i < targetObject.length; i ++ ) {
+
+ if ( targetObject[ i ].name === objectIndex ) {
+
+ objectIndex = i;
+ break;
+
+ }
+
+ }
+
+ break;
+
+ default:
+
+ if ( targetObject[ objectName ] === undefined ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );
+ return;
+
+ }
+
+ targetObject = targetObject[ objectName ];
+
+ }
+
+
+ if ( objectIndex !== undefined ) {
+
+ if ( targetObject[ objectIndex ] === undefined ) {
+
+ console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );
+ return;
+
+ }
+
+ targetObject = targetObject[ objectIndex ];
+
+ }
+
+ }
+
+ // resolve property
+ const nodeProperty = targetObject[ propertyName ];
+
+ if ( nodeProperty === undefined ) {
+
+ const nodeName = parsedPath.nodeName;
+
+ console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +
+ '.' + propertyName + ' but it wasn\'t found.', targetObject );
+ return;
+
+ }
+
+ // determine versioning scheme
+ let versioning = this.Versioning.None;
+
+ this.targetObject = targetObject;
+
+ if ( targetObject.needsUpdate !== undefined ) { // material
+
+ versioning = this.Versioning.NeedsUpdate;
+
+ } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform
+
+ versioning = this.Versioning.MatrixWorldNeedsUpdate;
+
+ }
+
+ // determine how the property gets bound
+ let bindingType = this.BindingType.Direct;
+
+ if ( propertyIndex !== undefined ) {
+
+ // access a sub element of the property array (only primitives are supported right now)
+
+ if ( propertyName === 'morphTargetInfluences' ) {
+
+ // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.
+
+ // support resolving morphTarget names into indices.
+ if ( ! targetObject.geometry ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );
+ return;
+
+ }
+
+ if ( targetObject.geometry.isBufferGeometry ) {
+
+ if ( ! targetObject.geometry.morphAttributes ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );
+ return;
+
+ }
+
+ if ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {
+
+ propertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];
+
+ }
+
+
+ } else {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.', this );
+ return;
+
+ }
+
+ }
+
+ bindingType = this.BindingType.ArrayElement;
+
+ this.resolvedProperty = nodeProperty;
+ this.propertyIndex = propertyIndex;
+
+ } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {
+
+ // must use copy for Object3D.Euler/Quaternion
+
+ bindingType = this.BindingType.HasFromToArray;
+
+ this.resolvedProperty = nodeProperty;
+
+ } else if ( Array.isArray( nodeProperty ) ) {
+
+ bindingType = this.BindingType.EntireArray;
+
+ this.resolvedProperty = nodeProperty;
+
+ } else {
+
+ this.propertyName = propertyName;
+
+ }
+
+ // select getter / setter
+ this.getValue = this.GetterByBindingType[ bindingType ];
+ this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];
+
+ }
+
+ unbind() {
+
+ this.node = null;
+
+ // back to the prototype version of getValue / setValue
+ // note: avoiding to mutate the shape of 'this' via 'delete'
+ this.getValue = this._getValue_unbound;
+ this.setValue = this._setValue_unbound;
+
+ }
+
+}
+
+PropertyBinding.Composite = Composite;
+
+PropertyBinding.prototype.BindingType = {
+ Direct: 0,
+ EntireArray: 1,
+ ArrayElement: 2,
+ HasFromToArray: 3
+};
+
+PropertyBinding.prototype.Versioning = {
+ None: 0,
+ NeedsUpdate: 1,
+ MatrixWorldNeedsUpdate: 2
+};
+
+PropertyBinding.prototype.GetterByBindingType = [
+
+ PropertyBinding.prototype._getValue_direct,
+ PropertyBinding.prototype._getValue_array,
+ PropertyBinding.prototype._getValue_arrayElement,
+ PropertyBinding.prototype._getValue_toArray,
+
+];
+
+PropertyBinding.prototype.SetterByBindingTypeAndVersioning = [
+
+ [
+ // Direct
+ PropertyBinding.prototype._setValue_direct,
+ PropertyBinding.prototype._setValue_direct_setNeedsUpdate,
+ PropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,
+
+ ], [
+
+ // EntireArray
+
+ PropertyBinding.prototype._setValue_array,
+ PropertyBinding.prototype._setValue_array_setNeedsUpdate,
+ PropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,
+
+ ], [
+
+ // ArrayElement
+ PropertyBinding.prototype._setValue_arrayElement,
+ PropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,
+ PropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,
+
+ ], [
+
+ // HasToFromArray
+ PropertyBinding.prototype._setValue_fromArray,
+ PropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,
+ PropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,
+
+ ]
+
+];
+
+/**
+ *
+ * A group of objects that receives a shared animation state.
+ *
+ * Usage:
+ *
+ * - Add objects you would otherwise pass as 'root' to the
+ * constructor or the .clipAction method of AnimationMixer.
+ *
+ * - Instead pass this object as 'root'.
+ *
+ * - You can also add and remove objects later when the mixer
+ * is running.
+ *
+ * Note:
+ *
+ * Objects of this class appear as one object to the mixer,
+ * so cache control of the individual objects must be done
+ * on the group.
+ *
+ * Limitation:
+ *
+ * - The animated properties must be compatible among the
+ * all objects in the group.
+ *
+ * - A single property can either be controlled through a
+ * target group or directly, but not both.
+ */
+
+class AnimationObjectGroup {
+
+ constructor() {
+
+ this.uuid = generateUUID();
+
+ // cached objects followed by the active ones
+ this._objects = Array.prototype.slice.call( arguments );
+
+ this.nCachedObjects_ = 0; // threshold
+ // note: read by PropertyBinding.Composite
+
+ const indices = {};
+ this._indicesByUUID = indices; // for bookkeeping
+
+ for ( let i = 0, n = arguments.length; i !== n; ++ i ) {
+
+ indices[ arguments[ i ].uuid ] = i;
+
+ }
+
+ this._paths = []; // inside: string
+ this._parsedPaths = []; // inside: { we don't care, here }
+ this._bindings = []; // inside: Array< PropertyBinding >
+ this._bindingsIndicesByPath = {}; // inside: indices in these arrays
+
+ const scope = this;
+
+ this.stats = {
+
+ objects: {
+ get total() {
+
+ return scope._objects.length;
+
+ },
+ get inUse() {
+
+ return this.total - scope.nCachedObjects_;
+
+ }
+ },
+ get bindingsPerObject() {
+
+ return scope._bindings.length;
+
+ }
+
+ };
+
+ }
+
+ add() {
+
+ const objects = this._objects,
+ indicesByUUID = this._indicesByUUID,
+ paths = this._paths,
+ parsedPaths = this._parsedPaths,
+ bindings = this._bindings,
+ nBindings = bindings.length;
+
+ let knownObject = undefined,
+ nObjects = objects.length,
+ nCachedObjects = this.nCachedObjects_;
+
+ for ( let i = 0, n = arguments.length; i !== n; ++ i ) {
+
+ const object = arguments[ i ],
+ uuid = object.uuid;
+ let index = indicesByUUID[ uuid ];
+
+ if ( index === undefined ) {
+
+ // unknown object -> add it to the ACTIVE region
+
+ index = nObjects ++;
+ indicesByUUID[ uuid ] = index;
+ objects.push( object );
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );
+
+ }
+
+ } else if ( index < nCachedObjects ) {
+
+ knownObject = objects[ index ];
+
+ // move existing object to the ACTIVE region
+
+ const firstActiveIndex = -- nCachedObjects,
+ lastCachedObject = objects[ firstActiveIndex ];
+
+ indicesByUUID[ lastCachedObject.uuid ] = index;
+ objects[ index ] = lastCachedObject;
+
+ indicesByUUID[ uuid ] = firstActiveIndex;
+ objects[ firstActiveIndex ] = object;
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ const bindingsForPath = bindings[ j ],
+ lastCached = bindingsForPath[ firstActiveIndex ];
+
+ let binding = bindingsForPath[ index ];
+
+ bindingsForPath[ index ] = lastCached;
+
+ if ( binding === undefined ) {
+
+ // since we do not bother to create new bindings
+ // for objects that are cached, the binding may
+ // or may not exist
+
+ binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );
+
+ }
+
+ bindingsForPath[ firstActiveIndex ] = binding;
+
+ }
+
+ } else if ( objects[ index ] !== knownObject ) {
+
+ console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +
+ 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );
+
+ } // else the object is already where we want it to be
+
+ } // for arguments
+
+ this.nCachedObjects_ = nCachedObjects;
+
+ }
+
+ remove() {
+
+ const objects = this._objects,
+ indicesByUUID = this._indicesByUUID,
+ bindings = this._bindings,
+ nBindings = bindings.length;
+
+ let nCachedObjects = this.nCachedObjects_;
+
+ for ( let i = 0, n = arguments.length; i !== n; ++ i ) {
+
+ const object = arguments[ i ],
+ uuid = object.uuid,
+ index = indicesByUUID[ uuid ];
+
+ if ( index !== undefined && index >= nCachedObjects ) {
+
+ // move existing object into the CACHED region
+
+ const lastCachedIndex = nCachedObjects ++,
+ firstActiveObject = objects[ lastCachedIndex ];
+
+ indicesByUUID[ firstActiveObject.uuid ] = index;
+ objects[ index ] = firstActiveObject;
+
+ indicesByUUID[ uuid ] = lastCachedIndex;
+ objects[ lastCachedIndex ] = object;
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ const bindingsForPath = bindings[ j ],
+ firstActive = bindingsForPath[ lastCachedIndex ],
+ binding = bindingsForPath[ index ];
+
+ bindingsForPath[ index ] = firstActive;
+ bindingsForPath[ lastCachedIndex ] = binding;
+
+ }
+
+ }
+
+ } // for arguments
+
+ this.nCachedObjects_ = nCachedObjects;
+
+ }
+
+ // remove & forget
+ uncache() {
+
+ const objects = this._objects,
+ indicesByUUID = this._indicesByUUID,
+ bindings = this._bindings,
+ nBindings = bindings.length;
+
+ let nCachedObjects = this.nCachedObjects_,
+ nObjects = objects.length;
+
+ for ( let i = 0, n = arguments.length; i !== n; ++ i ) {
+
+ const object = arguments[ i ],
+ uuid = object.uuid,
+ index = indicesByUUID[ uuid ];
+
+ if ( index !== undefined ) {
+
+ delete indicesByUUID[ uuid ];
+
+ if ( index < nCachedObjects ) {
+
+ // object is cached, shrink the CACHED region
+
+ const firstActiveIndex = -- nCachedObjects,
+ lastCachedObject = objects[ firstActiveIndex ],
+ lastIndex = -- nObjects,
+ lastObject = objects[ lastIndex ];
+
+ // last cached object takes this object's place
+ indicesByUUID[ lastCachedObject.uuid ] = index;
+ objects[ index ] = lastCachedObject;
+
+ // last object goes to the activated slot and pop
+ indicesByUUID[ lastObject.uuid ] = firstActiveIndex;
+ objects[ firstActiveIndex ] = lastObject;
+ objects.pop();
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ const bindingsForPath = bindings[ j ],
+ lastCached = bindingsForPath[ firstActiveIndex ],
+ last = bindingsForPath[ lastIndex ];
+
+ bindingsForPath[ index ] = lastCached;
+ bindingsForPath[ firstActiveIndex ] = last;
+ bindingsForPath.pop();
+
+ }
+
+ } else {
+
+ // object is active, just swap with the last and pop
+
+ const lastIndex = -- nObjects,
+ lastObject = objects[ lastIndex ];
+
+ if ( lastIndex > 0 ) {
+
+ indicesByUUID[ lastObject.uuid ] = index;
+
+ }
+
+ objects[ index ] = lastObject;
+ objects.pop();
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ const bindingsForPath = bindings[ j ];
+
+ bindingsForPath[ index ] = bindingsForPath[ lastIndex ];
+ bindingsForPath.pop();
+
+ }
+
+ } // cached or active
+
+ } // if object is known
+
+ } // for arguments
+
+ this.nCachedObjects_ = nCachedObjects;
+
+ }
+
+ // Internal interface used by befriended PropertyBinding.Composite:
+
+ subscribe_( path, parsedPath ) {
+
+ // returns an array of bindings for the given path that is changed
+ // according to the contained objects in the group
+
+ const indicesByPath = this._bindingsIndicesByPath;
+ let index = indicesByPath[ path ];
+ const bindings = this._bindings;
+
+ if ( index !== undefined ) return bindings[ index ];
+
+ const paths = this._paths,
+ parsedPaths = this._parsedPaths,
+ objects = this._objects,
+ nObjects = objects.length,
+ nCachedObjects = this.nCachedObjects_,
+ bindingsForPath = new Array( nObjects );
+
+ index = bindings.length;
+
+ indicesByPath[ path ] = index;
+
+ paths.push( path );
+ parsedPaths.push( parsedPath );
+ bindings.push( bindingsForPath );
+
+ for ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {
+
+ const object = objects[ i ];
+ bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );
+
+ }
+
+ return bindingsForPath;
+
+ }
+
+ unsubscribe_( path ) {
+
+ // tells the group to forget about a property path and no longer
+ // update the array previously obtained with 'subscribe_'
+
+ const indicesByPath = this._bindingsIndicesByPath,
+ index = indicesByPath[ path ];
+
+ if ( index !== undefined ) {
+
+ const paths = this._paths,
+ parsedPaths = this._parsedPaths,
+ bindings = this._bindings,
+ lastBindingsIndex = bindings.length - 1,
+ lastBindings = bindings[ lastBindingsIndex ],
+ lastBindingsPath = path[ lastBindingsIndex ];
+
+ indicesByPath[ lastBindingsPath ] = index;
+
+ bindings[ index ] = lastBindings;
+ bindings.pop();
+
+ parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];
+ parsedPaths.pop();
+
+ paths[ index ] = paths[ lastBindingsIndex ];
+ paths.pop();
+
+ }
+
+ }
+
+}
+
+AnimationObjectGroup.prototype.isAnimationObjectGroup = true;
+
+class AnimationAction {
+
+ constructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {
+
+ this._mixer = mixer;
+ this._clip = clip;
+ this._localRoot = localRoot;
+ this.blendMode = blendMode;
+
+ const tracks = clip.tracks,
+ nTracks = tracks.length,
+ interpolants = new Array( nTracks );
+
+ const interpolantSettings = {
+ endingStart: ZeroCurvatureEnding,
+ endingEnd: ZeroCurvatureEnding
+ };
+
+ for ( let i = 0; i !== nTracks; ++ i ) {
+
+ const interpolant = tracks[ i ].createInterpolant( null );
+ interpolants[ i ] = interpolant;
+ interpolant.settings = interpolantSettings;
+
+ }
+
+ this._interpolantSettings = interpolantSettings;
+
+ this._interpolants = interpolants; // bound by the mixer
+
+ // inside: PropertyMixer (managed by the mixer)
+ this._propertyBindings = new Array( nTracks );
+
+ this._cacheIndex = null; // for the memory manager
+ this._byClipCacheIndex = null; // for the memory manager
+
+ this._timeScaleInterpolant = null;
+ this._weightInterpolant = null;
+
+ this.loop = LoopRepeat;
+ this._loopCount = - 1;
+
+ // global mixer time when the action is to be started
+ // it's set back to 'null' upon start of the action
+ this._startTime = null;
+
+ // scaled local time of the action
+ // gets clamped or wrapped to 0..clip.duration according to loop
+ this.time = 0;
+
+ this.timeScale = 1;
+ this._effectiveTimeScale = 1;
+
+ this.weight = 1;
+ this._effectiveWeight = 1;
+
+ this.repetitions = Infinity; // no. of repetitions when looping
+
+ this.paused = false; // true -> zero effective time scale
+ this.enabled = true; // false -> zero effective weight
+
+ this.clampWhenFinished = false;// keep feeding the last frame?
+
+ this.zeroSlopeAtStart = true;// for smooth interpolation w/o separate
+ this.zeroSlopeAtEnd = true;// clips for start, loop and end
+
+ }
+
+ // State & Scheduling
+
+ play() {
+
+ this._mixer._activateAction( this );
+
+ return this;
+
+ }
+
+ stop() {
+
+ this._mixer._deactivateAction( this );
+
+ return this.reset();
+
+ }
+
+ reset() {
+
+ this.paused = false;
+ this.enabled = true;
+
+ this.time = 0; // restart clip
+ this._loopCount = - 1;// forget previous loops
+ this._startTime = null;// forget scheduling
+
+ return this.stopFading().stopWarping();
+
+ }
+
+ isRunning() {
+
+ return this.enabled && ! this.paused && this.timeScale !== 0 &&
+ this._startTime === null && this._mixer._isActiveAction( this );
+
+ }
+
+ // return true when play has been called
+ isScheduled() {
+
+ return this._mixer._isActiveAction( this );
+
+ }
+
+ startAt( time ) {
+
+ this._startTime = time;
+
+ return this;
+
+ }
+
+ setLoop( mode, repetitions ) {
+
+ this.loop = mode;
+ this.repetitions = repetitions;
+
+ return this;
+
+ }
+
+ // Weight
+
+ // set the weight stopping any scheduled fading
+ // although .enabled = false yields an effective weight of zero, this
+ // method does *not* change .enabled, because it would be confusing
+ setEffectiveWeight( weight ) {
+
+ this.weight = weight;
+
+ // note: same logic as when updated at runtime
+ this._effectiveWeight = this.enabled ? weight : 0;
+
+ return this.stopFading();
+
+ }
+
+ // return the weight considering fading and .enabled
+ getEffectiveWeight() {
+
+ return this._effectiveWeight;
+
+ }
+
+ fadeIn( duration ) {
+
+ return this._scheduleFading( duration, 0, 1 );
+
+ }
+
+ fadeOut( duration ) {
+
+ return this._scheduleFading( duration, 1, 0 );
+
+ }
+
+ crossFadeFrom( fadeOutAction, duration, warp ) {
+
+ fadeOutAction.fadeOut( duration );
+ this.fadeIn( duration );
+
+ if ( warp ) {
+
+ const fadeInDuration = this._clip.duration,
+ fadeOutDuration = fadeOutAction._clip.duration,
+
+ startEndRatio = fadeOutDuration / fadeInDuration,
+ endStartRatio = fadeInDuration / fadeOutDuration;
+
+ fadeOutAction.warp( 1.0, startEndRatio, duration );
+ this.warp( endStartRatio, 1.0, duration );
+
+ }
+
+ return this;
+
+ }
+
+ crossFadeTo( fadeInAction, duration, warp ) {
+
+ return fadeInAction.crossFadeFrom( this, duration, warp );
+
+ }
+
+ stopFading() {
+
+ const weightInterpolant = this._weightInterpolant;
+
+ if ( weightInterpolant !== null ) {
+
+ this._weightInterpolant = null;
+ this._mixer._takeBackControlInterpolant( weightInterpolant );
+
+ }
+
+ return this;
+
+ }
+
+ // Time Scale Control
+
+ // set the time scale stopping any scheduled warping
+ // although .paused = true yields an effective time scale of zero, this
+ // method does *not* change .paused, because it would be confusing
+ setEffectiveTimeScale( timeScale ) {
+
+ this.timeScale = timeScale;
+ this._effectiveTimeScale = this.paused ? 0 : timeScale;
+
+ return this.stopWarping();
+
+ }
+
+ // return the time scale considering warping and .paused
+ getEffectiveTimeScale() {
+
+ return this._effectiveTimeScale;
+
+ }
+
+ setDuration( duration ) {
+
+ this.timeScale = this._clip.duration / duration;
+
+ return this.stopWarping();
+
+ }
+
+ syncWith( action ) {
+
+ this.time = action.time;
+ this.timeScale = action.timeScale;
+
+ return this.stopWarping();
+
+ }
+
+ halt( duration ) {
+
+ return this.warp( this._effectiveTimeScale, 0, duration );
+
+ }
+
+ warp( startTimeScale, endTimeScale, duration ) {
+
+ const mixer = this._mixer,
+ now = mixer.time,
+ timeScale = this.timeScale;
+
+ let interpolant = this._timeScaleInterpolant;
+
+ if ( interpolant === null ) {
+
+ interpolant = mixer._lendControlInterpolant();
+ this._timeScaleInterpolant = interpolant;
+
+ }
+
+ const times = interpolant.parameterPositions,
+ values = interpolant.sampleValues;
+
+ times[ 0 ] = now;
+ times[ 1 ] = now + duration;
+
+ values[ 0 ] = startTimeScale / timeScale;
+ values[ 1 ] = endTimeScale / timeScale;
+
+ return this;
+
+ }
+
+ stopWarping() {
+
+ const timeScaleInterpolant = this._timeScaleInterpolant;
+
+ if ( timeScaleInterpolant !== null ) {
+
+ this._timeScaleInterpolant = null;
+ this._mixer._takeBackControlInterpolant( timeScaleInterpolant );
+
+ }
+
+ return this;
+
+ }
+
+ // Object Accessors
+
+ getMixer() {
+
+ return this._mixer;
+
+ }
+
+ getClip() {
+
+ return this._clip;
+
+ }
+
+ getRoot() {
+
+ return this._localRoot || this._mixer._root;
+
+ }
+
+ // Interna
+
+ _update( time, deltaTime, timeDirection, accuIndex ) {
+
+ // called by the mixer
+
+ if ( ! this.enabled ) {
+
+ // call ._updateWeight() to update ._effectiveWeight
+
+ this._updateWeight( time );
+ return;
+
+ }
+
+ const startTime = this._startTime;
+
+ if ( startTime !== null ) {
+
+ // check for scheduled start of action
+
+ const timeRunning = ( time - startTime ) * timeDirection;
+ if ( timeRunning < 0 || timeDirection === 0 ) {
+
+ return; // yet to come / don't decide when delta = 0
+
+ }
+
+ // start
+
+ this._startTime = null; // unschedule
+ deltaTime = timeDirection * timeRunning;
+
+ }
+
+ // apply time scale and advance time
+
+ deltaTime *= this._updateTimeScale( time );
+ const clipTime = this._updateTime( deltaTime );
+
+ // note: _updateTime may disable the action resulting in
+ // an effective weight of 0
+
+ const weight = this._updateWeight( time );
+
+ if ( weight > 0 ) {
+
+ const interpolants = this._interpolants;
+ const propertyMixers = this._propertyBindings;
+
+ switch ( this.blendMode ) {
+
+ case AdditiveAnimationBlendMode:
+
+ for ( let j = 0, m = interpolants.length; j !== m; ++ j ) {
+
+ interpolants[ j ].evaluate( clipTime );
+ propertyMixers[ j ].accumulateAdditive( weight );
+
+ }
+
+ break;
+
+ case NormalAnimationBlendMode:
+ default:
+
+ for ( let j = 0, m = interpolants.length; j !== m; ++ j ) {
+
+ interpolants[ j ].evaluate( clipTime );
+ propertyMixers[ j ].accumulate( accuIndex, weight );
+
+ }
+
+ }
+
+ }
+
+ }
+
+ _updateWeight( time ) {
+
+ let weight = 0;
+
+ if ( this.enabled ) {
+
+ weight = this.weight;
+ const interpolant = this._weightInterpolant;
+
+ if ( interpolant !== null ) {
+
+ const interpolantValue = interpolant.evaluate( time )[ 0 ];
+
+ weight *= interpolantValue;
+
+ if ( time > interpolant.parameterPositions[ 1 ] ) {
+
+ this.stopFading();
+
+ if ( interpolantValue === 0 ) {
+
+ // faded out, disable
+ this.enabled = false;
+
+ }
+
+ }
+
+ }
+
+ }
+
+ this._effectiveWeight = weight;
+ return weight;
+
+ }
+
+ _updateTimeScale( time ) {
+
+ let timeScale = 0;
+
+ if ( ! this.paused ) {
+
+ timeScale = this.timeScale;
+
+ const interpolant = this._timeScaleInterpolant;
+
+ if ( interpolant !== null ) {
+
+ const interpolantValue = interpolant.evaluate( time )[ 0 ];
+
+ timeScale *= interpolantValue;
+
+ if ( time > interpolant.parameterPositions[ 1 ] ) {
+
+ this.stopWarping();
+
+ if ( timeScale === 0 ) {
+
+ // motion has halted, pause
+ this.paused = true;
+
+ } else {
+
+ // warp done - apply final time scale
+ this.timeScale = timeScale;
+
+ }
+
+ }
+
+ }
+
+ }
+
+ this._effectiveTimeScale = timeScale;
+ return timeScale;
+
+ }
+
+ _updateTime( deltaTime ) {
+
+ const duration = this._clip.duration;
+ const loop = this.loop;
+
+ let time = this.time + deltaTime;
+ let loopCount = this._loopCount;
+
+ const pingPong = ( loop === LoopPingPong );
+
+ if ( deltaTime === 0 ) {
+
+ if ( loopCount === - 1 ) return time;
+
+ return ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;
+
+ }
+
+ if ( loop === LoopOnce ) {
+
+ if ( loopCount === - 1 ) {
+
+ // just started
+
+ this._loopCount = 0;
+ this._setEndings( true, true, false );
+
+ }
+
+ handle_stop: {
+
+ if ( time >= duration ) {
+
+ time = duration;
+
+ } else if ( time < 0 ) {
+
+ time = 0;
+
+ } else {
+
+ this.time = time;
+
+ break handle_stop;
+
+ }
+
+ if ( this.clampWhenFinished ) this.paused = true;
+ else this.enabled = false;
+
+ this.time = time;
+
+ this._mixer.dispatchEvent( {
+ type: 'finished', action: this,
+ direction: deltaTime < 0 ? - 1 : 1
+ } );
+
+ }
+
+ } else { // repetitive Repeat or PingPong
+
+ if ( loopCount === - 1 ) {
+
+ // just started
+
+ if ( deltaTime >= 0 ) {
+
+ loopCount = 0;
+
+ this._setEndings( true, this.repetitions === 0, pingPong );
+
+ } else {
+
+ // when looping in reverse direction, the initial
+ // transition through zero counts as a repetition,
+ // so leave loopCount at -1
+
+ this._setEndings( this.repetitions === 0, true, pingPong );
+
+ }
+
+ }
+
+ if ( time >= duration || time < 0 ) {
+
+ // wrap around
+
+ const loopDelta = Math.floor( time / duration ); // signed
+ time -= duration * loopDelta;
+
+ loopCount += Math.abs( loopDelta );
+
+ const pending = this.repetitions - loopCount;
+
+ if ( pending <= 0 ) {
+
+ // have to stop (switch state, clamp time, fire event)
+
+ if ( this.clampWhenFinished ) this.paused = true;
+ else this.enabled = false;
+
+ time = deltaTime > 0 ? duration : 0;
+
+ this.time = time;
+
+ this._mixer.dispatchEvent( {
+ type: 'finished', action: this,
+ direction: deltaTime > 0 ? 1 : - 1
+ } );
+
+ } else {
+
+ // keep running
+
+ if ( pending === 1 ) {
+
+ // entering the last round
+
+ const atStart = deltaTime < 0;
+ this._setEndings( atStart, ! atStart, pingPong );
+
+ } else {
+
+ this._setEndings( false, false, pingPong );
+
+ }
+
+ this._loopCount = loopCount;
+
+ this.time = time;
+
+ this._mixer.dispatchEvent( {
+ type: 'loop', action: this, loopDelta: loopDelta
+ } );
+
+ }
+
+ } else {
+
+ this.time = time;
+
+ }
+
+ if ( pingPong && ( loopCount & 1 ) === 1 ) {
+
+ // invert time for the "pong round"
+
+ return duration - time;
+
+ }
+
+ }
+
+ return time;
+
+ }
+
+ _setEndings( atStart, atEnd, pingPong ) {
+
+ const settings = this._interpolantSettings;
+
+ if ( pingPong ) {
+
+ settings.endingStart = ZeroSlopeEnding;
+ settings.endingEnd = ZeroSlopeEnding;
+
+ } else {
+
+ // assuming for LoopOnce atStart == atEnd == true
+
+ if ( atStart ) {
+
+ settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;
+
+ } else {
+
+ settings.endingStart = WrapAroundEnding;
+
+ }
+
+ if ( atEnd ) {
+
+ settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;
+
+ } else {
+
+ settings.endingEnd = WrapAroundEnding;
+
+ }
+
+ }
+
+ }
+
+ _scheduleFading( duration, weightNow, weightThen ) {
+
+ const mixer = this._mixer, now = mixer.time;
+ let interpolant = this._weightInterpolant;
+
+ if ( interpolant === null ) {
+
+ interpolant = mixer._lendControlInterpolant();
+ this._weightInterpolant = interpolant;
+
+ }
+
+ const times = interpolant.parameterPositions,
+ values = interpolant.sampleValues;
+
+ times[ 0 ] = now;
+ values[ 0 ] = weightNow;
+ times[ 1 ] = now + duration;
+ values[ 1 ] = weightThen;
+
+ return this;
+
+ }
+
+}
+
+class AnimationMixer extends EventDispatcher {
+
+ constructor( root ) {
+
+ super();
+
+ this._root = root;
+ this._initMemoryManager();
+ this._accuIndex = 0;
+ this.time = 0;
+ this.timeScale = 1.0;
+
+ }
+
+ _bindAction( action, prototypeAction ) {
+
+ const root = action._localRoot || this._root,
+ tracks = action._clip.tracks,
+ nTracks = tracks.length,
+ bindings = action._propertyBindings,
+ interpolants = action._interpolants,
+ rootUuid = root.uuid,
+ bindingsByRoot = this._bindingsByRootAndName;
+
+ let bindingsByName = bindingsByRoot[ rootUuid ];
+
+ if ( bindingsByName === undefined ) {
+
+ bindingsByName = {};
+ bindingsByRoot[ rootUuid ] = bindingsByName;
+
+ }
+
+ for ( let i = 0; i !== nTracks; ++ i ) {
+
+ const track = tracks[ i ],
+ trackName = track.name;
+
+ let binding = bindingsByName[ trackName ];
+
+ if ( binding !== undefined ) {
+
+ ++ binding.referenceCount;
+ bindings[ i ] = binding;
+
+ } else {
+
+ binding = bindings[ i ];
+
+ if ( binding !== undefined ) {
+
+ // existing binding, make sure the cache knows
+
+ if ( binding._cacheIndex === null ) {
+
+ ++ binding.referenceCount;
+ this._addInactiveBinding( binding, rootUuid, trackName );
+
+ }
+
+ continue;
+
+ }
+
+ const path = prototypeAction && prototypeAction.
+ _propertyBindings[ i ].binding.parsedPath;
+
+ binding = new PropertyMixer(
+ PropertyBinding.create( root, trackName, path ),
+ track.ValueTypeName, track.getValueSize() );
+
+ ++ binding.referenceCount;
+ this._addInactiveBinding( binding, rootUuid, trackName );
+
+ bindings[ i ] = binding;
+
+ }
+
+ interpolants[ i ].resultBuffer = binding.buffer;
+
+ }
+
+ }
+
+ _activateAction( action ) {
+
+ if ( ! this._isActiveAction( action ) ) {
+
+ if ( action._cacheIndex === null ) {
+
+ // this action has been forgotten by the cache, but the user
+ // appears to be still using it -> rebind
+
+ const rootUuid = ( action._localRoot || this._root ).uuid,
+ clipUuid = action._clip.uuid,
+ actionsForClip = this._actionsByClip[ clipUuid ];
+
+ this._bindAction( action,
+ actionsForClip && actionsForClip.knownActions[ 0 ] );
+
+ this._addInactiveAction( action, clipUuid, rootUuid );
+
+ }
+
+ const bindings = action._propertyBindings;
+
+ // increment reference counts / sort out state
+ for ( let i = 0, n = bindings.length; i !== n; ++ i ) {
+
+ const binding = bindings[ i ];
+
+ if ( binding.useCount ++ === 0 ) {
+
+ this._lendBinding( binding );
+ binding.saveOriginalState();
+
+ }
+
+ }
+
+ this._lendAction( action );
+
+ }
+
+ }
+
+ _deactivateAction( action ) {
+
+ if ( this._isActiveAction( action ) ) {
+
+ const bindings = action._propertyBindings;
+
+ // decrement reference counts / sort out state
+ for ( let i = 0, n = bindings.length; i !== n; ++ i ) {
+
+ const binding = bindings[ i ];
+
+ if ( -- binding.useCount === 0 ) {
+
+ binding.restoreOriginalState();
+ this._takeBackBinding( binding );
+
+ }
+
+ }
+
+ this._takeBackAction( action );
+
+ }
+
+ }
+
+ // Memory manager
+
+ _initMemoryManager() {
+
+ this._actions = []; // 'nActiveActions' followed by inactive ones
+ this._nActiveActions = 0;
+
+ this._actionsByClip = {};
+ // inside:
+ // {
+ // knownActions: Array< AnimationAction > - used as prototypes
+ // actionByRoot: AnimationAction - lookup
+ // }
+
+
+ this._bindings = []; // 'nActiveBindings' followed by inactive ones
+ this._nActiveBindings = 0;
+
+ this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >
+
+
+ this._controlInterpolants = []; // same game as above
+ this._nActiveControlInterpolants = 0;
+
+ const scope = this;
+
+ this.stats = {
+
+ actions: {
+ get total() {
+
+ return scope._actions.length;
+
+ },
+ get inUse() {
+
+ return scope._nActiveActions;
+
+ }
+ },
+ bindings: {
+ get total() {
+
+ return scope._bindings.length;
+
+ },
+ get inUse() {
+
+ return scope._nActiveBindings;
+
+ }
+ },
+ controlInterpolants: {
+ get total() {
+
+ return scope._controlInterpolants.length;
+
+ },
+ get inUse() {
+
+ return scope._nActiveControlInterpolants;
+
+ }
+ }
+
+ };
+
+ }
+
+ // Memory management for AnimationAction objects
+
+ _isActiveAction( action ) {
+
+ const index = action._cacheIndex;
+ return index !== null && index < this._nActiveActions;
+
+ }
+
+ _addInactiveAction( action, clipUuid, rootUuid ) {
+
+ const actions = this._actions,
+ actionsByClip = this._actionsByClip;
+
+ let actionsForClip = actionsByClip[ clipUuid ];
+
+ if ( actionsForClip === undefined ) {
+
+ actionsForClip = {
+
+ knownActions: [ action ],
+ actionByRoot: {}
+
+ };
+
+ action._byClipCacheIndex = 0;
+
+ actionsByClip[ clipUuid ] = actionsForClip;
+
+ } else {
+
+ const knownActions = actionsForClip.knownActions;
+
+ action._byClipCacheIndex = knownActions.length;
+ knownActions.push( action );
+
+ }
+
+ action._cacheIndex = actions.length;
+ actions.push( action );
+
+ actionsForClip.actionByRoot[ rootUuid ] = action;
+
+ }
+
+ _removeInactiveAction( action ) {
+
+ const actions = this._actions,
+ lastInactiveAction = actions[ actions.length - 1 ],
+ cacheIndex = action._cacheIndex;
+
+ lastInactiveAction._cacheIndex = cacheIndex;
+ actions[ cacheIndex ] = lastInactiveAction;
+ actions.pop();
+
+ action._cacheIndex = null;
+
+
+ const clipUuid = action._clip.uuid,
+ actionsByClip = this._actionsByClip,
+ actionsForClip = actionsByClip[ clipUuid ],
+ knownActionsForClip = actionsForClip.knownActions,
+
+ lastKnownAction =
+ knownActionsForClip[ knownActionsForClip.length - 1 ],
+
+ byClipCacheIndex = action._byClipCacheIndex;
+
+ lastKnownAction._byClipCacheIndex = byClipCacheIndex;
+ knownActionsForClip[ byClipCacheIndex ] = lastKnownAction;
+ knownActionsForClip.pop();
+
+ action._byClipCacheIndex = null;
+
+
+ const actionByRoot = actionsForClip.actionByRoot,
+ rootUuid = ( action._localRoot || this._root ).uuid;
+
+ delete actionByRoot[ rootUuid ];
+
+ if ( knownActionsForClip.length === 0 ) {
+
+ delete actionsByClip[ clipUuid ];
+
+ }
+
+ this._removeInactiveBindingsForAction( action );
+
+ }
+
+ _removeInactiveBindingsForAction( action ) {
+
+ const bindings = action._propertyBindings;
+
+ for ( let i = 0, n = bindings.length; i !== n; ++ i ) {
+
+ const binding = bindings[ i ];
+
+ if ( -- binding.referenceCount === 0 ) {
+
+ this._removeInactiveBinding( binding );
+
+ }
+
+ }
+
+ }
+
+ _lendAction( action ) {
+
+ // [ active actions | inactive actions ]
+ // [ active actions >| inactive actions ]
+ // s a
+ // <-swap->
+ // a s
+
+ const actions = this._actions,
+ prevIndex = action._cacheIndex,
+
+ lastActiveIndex = this._nActiveActions ++,
+
+ firstInactiveAction = actions[ lastActiveIndex ];
+
+ action._cacheIndex = lastActiveIndex;
+ actions[ lastActiveIndex ] = action;
+
+ firstInactiveAction._cacheIndex = prevIndex;
+ actions[ prevIndex ] = firstInactiveAction;
+
+ }
+
+ _takeBackAction( action ) {
+
+ // [ active actions | inactive actions ]
+ // [ active actions |< inactive actions ]
+ // a s
+ // <-swap->
+ // s a
+
+ const actions = this._actions,
+ prevIndex = action._cacheIndex,
+
+ firstInactiveIndex = -- this._nActiveActions,
+
+ lastActiveAction = actions[ firstInactiveIndex ];
+
+ action._cacheIndex = firstInactiveIndex;
+ actions[ firstInactiveIndex ] = action;
+
+ lastActiveAction._cacheIndex = prevIndex;
+ actions[ prevIndex ] = lastActiveAction;
+
+ }
+
+ // Memory management for PropertyMixer objects
+
+ _addInactiveBinding( binding, rootUuid, trackName ) {
+
+ const bindingsByRoot = this._bindingsByRootAndName,
+ bindings = this._bindings;
+
+ let bindingByName = bindingsByRoot[ rootUuid ];
+
+ if ( bindingByName === undefined ) {
+
+ bindingByName = {};
+ bindingsByRoot[ rootUuid ] = bindingByName;
+
+ }
+
+ bindingByName[ trackName ] = binding;
+
+ binding._cacheIndex = bindings.length;
+ bindings.push( binding );
+
+ }
+
+ _removeInactiveBinding( binding ) {
+
+ const bindings = this._bindings,
+ propBinding = binding.binding,
+ rootUuid = propBinding.rootNode.uuid,
+ trackName = propBinding.path,
+ bindingsByRoot = this._bindingsByRootAndName,
+ bindingByName = bindingsByRoot[ rootUuid ],
+
+ lastInactiveBinding = bindings[ bindings.length - 1 ],
+ cacheIndex = binding._cacheIndex;
+
+ lastInactiveBinding._cacheIndex = cacheIndex;
+ bindings[ cacheIndex ] = lastInactiveBinding;
+ bindings.pop();
+
+ delete bindingByName[ trackName ];
+
+ if ( Object.keys( bindingByName ).length === 0 ) {
+
+ delete bindingsByRoot[ rootUuid ];
+
+ }
+
+ }
+
+ _lendBinding( binding ) {
+
+ const bindings = this._bindings,
+ prevIndex = binding._cacheIndex,
+
+ lastActiveIndex = this._nActiveBindings ++,
+
+ firstInactiveBinding = bindings[ lastActiveIndex ];
+
+ binding._cacheIndex = lastActiveIndex;
+ bindings[ lastActiveIndex ] = binding;
+
+ firstInactiveBinding._cacheIndex = prevIndex;
+ bindings[ prevIndex ] = firstInactiveBinding;
+
+ }
+
+ _takeBackBinding( binding ) {
+
+ const bindings = this._bindings,
+ prevIndex = binding._cacheIndex,
+
+ firstInactiveIndex = -- this._nActiveBindings,
+
+ lastActiveBinding = bindings[ firstInactiveIndex ];
+
+ binding._cacheIndex = firstInactiveIndex;
+ bindings[ firstInactiveIndex ] = binding;
+
+ lastActiveBinding._cacheIndex = prevIndex;
+ bindings[ prevIndex ] = lastActiveBinding;
+
+ }
+
+
+ // Memory management of Interpolants for weight and time scale
+
+ _lendControlInterpolant() {
+
+ const interpolants = this._controlInterpolants,
+ lastActiveIndex = this._nActiveControlInterpolants ++;
+
+ let interpolant = interpolants[ lastActiveIndex ];
+
+ if ( interpolant === undefined ) {
+
+ interpolant = new LinearInterpolant(
+ new Float32Array( 2 ), new Float32Array( 2 ),
+ 1, this._controlInterpolantsResultBuffer );
+
+ interpolant.__cacheIndex = lastActiveIndex;
+ interpolants[ lastActiveIndex ] = interpolant;
+
+ }
+
+ return interpolant;
+
+ }
+
+ _takeBackControlInterpolant( interpolant ) {
+
+ const interpolants = this._controlInterpolants,
+ prevIndex = interpolant.__cacheIndex,
+
+ firstInactiveIndex = -- this._nActiveControlInterpolants,
+
+ lastActiveInterpolant = interpolants[ firstInactiveIndex ];
+
+ interpolant.__cacheIndex = firstInactiveIndex;
+ interpolants[ firstInactiveIndex ] = interpolant;
+
+ lastActiveInterpolant.__cacheIndex = prevIndex;
+ interpolants[ prevIndex ] = lastActiveInterpolant;
+
+ }
+
+ // return an action for a clip optionally using a custom root target
+ // object (this method allocates a lot of dynamic memory in case a
+ // previously unknown clip/root combination is specified)
+ clipAction( clip, optionalRoot, blendMode ) {
+
+ const root = optionalRoot || this._root,
+ rootUuid = root.uuid;
+
+ let clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;
+
+ const clipUuid = clipObject !== null ? clipObject.uuid : clip;
+
+ const actionsForClip = this._actionsByClip[ clipUuid ];
+ let prototypeAction = null;
+
+ if ( blendMode === undefined ) {
+
+ if ( clipObject !== null ) {
+
+ blendMode = clipObject.blendMode;
+
+ } else {
+
+ blendMode = NormalAnimationBlendMode;
+
+ }
+
+ }
+
+ if ( actionsForClip !== undefined ) {
+
+ const existingAction = actionsForClip.actionByRoot[ rootUuid ];
+
+ if ( existingAction !== undefined && existingAction.blendMode === blendMode ) {
+
+ return existingAction;
+
+ }
+
+ // we know the clip, so we don't have to parse all
+ // the bindings again but can just copy
+ prototypeAction = actionsForClip.knownActions[ 0 ];
+
+ // also, take the clip from the prototype action
+ if ( clipObject === null )
+ clipObject = prototypeAction._clip;
+
+ }
+
+ // clip must be known when specified via string
+ if ( clipObject === null ) return null;
+
+ // allocate all resources required to run it
+ const newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );
+
+ this._bindAction( newAction, prototypeAction );
+
+ // and make the action known to the memory manager
+ this._addInactiveAction( newAction, clipUuid, rootUuid );
+
+ return newAction;
+
+ }
+
+ // get an existing action
+ existingAction( clip, optionalRoot ) {
+
+ const root = optionalRoot || this._root,
+ rootUuid = root.uuid,
+
+ clipObject = typeof clip === 'string' ?
+ AnimationClip.findByName( root, clip ) : clip,
+
+ clipUuid = clipObject ? clipObject.uuid : clip,
+
+ actionsForClip = this._actionsByClip[ clipUuid ];
+
+ if ( actionsForClip !== undefined ) {
+
+ return actionsForClip.actionByRoot[ rootUuid ] || null;
+
+ }
+
+ return null;
+
+ }
+
+ // deactivates all previously scheduled actions
+ stopAllAction() {
+
+ const actions = this._actions,
+ nActions = this._nActiveActions;
+
+ for ( let i = nActions - 1; i >= 0; -- i ) {
+
+ actions[ i ].stop();
+
+ }
+
+ return this;
+
+ }
+
+ // advance the time and update apply the animation
+ update( deltaTime ) {
+
+ deltaTime *= this.timeScale;
+
+ const actions = this._actions,
+ nActions = this._nActiveActions,
+
+ time = this.time += deltaTime,
+ timeDirection = Math.sign( deltaTime ),
+
+ accuIndex = this._accuIndex ^= 1;
+
+ // run active actions
+
+ for ( let i = 0; i !== nActions; ++ i ) {
+
+ const action = actions[ i ];
+
+ action._update( time, deltaTime, timeDirection, accuIndex );
+
+ }
+
+ // update scene graph
+
+ const bindings = this._bindings,
+ nBindings = this._nActiveBindings;
+
+ for ( let i = 0; i !== nBindings; ++ i ) {
+
+ bindings[ i ].apply( accuIndex );
+
+ }
+
+ return this;
+
+ }
+
+ // Allows you to seek to a specific time in an animation.
+ setTime( timeInSeconds ) {
+
+ this.time = 0; // Zero out time attribute for AnimationMixer object;
+ for ( let i = 0; i < this._actions.length; i ++ ) {
+
+ this._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.
+
+ }
+
+ return this.update( timeInSeconds ); // Update used to set exact time. Returns "this" AnimationMixer object.
+
+ }
+
+ // return this mixer's root target object
+ getRoot() {
+
+ return this._root;
+
+ }
+
+ // free all resources specific to a particular clip
+ uncacheClip( clip ) {
+
+ const actions = this._actions,
+ clipUuid = clip.uuid,
+ actionsByClip = this._actionsByClip,
+ actionsForClip = actionsByClip[ clipUuid ];
+
+ if ( actionsForClip !== undefined ) {
+
+ // note: just calling _removeInactiveAction would mess up the
+ // iteration state and also require updating the state we can
+ // just throw away
+
+ const actionsToRemove = actionsForClip.knownActions;
+
+ for ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {
+
+ const action = actionsToRemove[ i ];
+
+ this._deactivateAction( action );
+
+ const cacheIndex = action._cacheIndex,
+ lastInactiveAction = actions[ actions.length - 1 ];
+
+ action._cacheIndex = null;
+ action._byClipCacheIndex = null;
+
+ lastInactiveAction._cacheIndex = cacheIndex;
+ actions[ cacheIndex ] = lastInactiveAction;
+ actions.pop();
+
+ this._removeInactiveBindingsForAction( action );
+
+ }
+
+ delete actionsByClip[ clipUuid ];
+
+ }
+
+ }
+
+ // free all resources specific to a particular root target object
+ uncacheRoot( root ) {
+
+ const rootUuid = root.uuid,
+ actionsByClip = this._actionsByClip;
+
+ for ( const clipUuid in actionsByClip ) {
+
+ const actionByRoot = actionsByClip[ clipUuid ].actionByRoot,
+ action = actionByRoot[ rootUuid ];
+
+ if ( action !== undefined ) {
+
+ this._deactivateAction( action );
+ this._removeInactiveAction( action );
+
+ }
+
+ }
+
+ const bindingsByRoot = this._bindingsByRootAndName,
+ bindingByName = bindingsByRoot[ rootUuid ];
+
+ if ( bindingByName !== undefined ) {
+
+ for ( const trackName in bindingByName ) {
+
+ const binding = bindingByName[ trackName ];
+ binding.restoreOriginalState();
+ this._removeInactiveBinding( binding );
+
+ }
+
+ }
+
+ }
+
+ // remove a targeted clip from the cache
+ uncacheAction( clip, optionalRoot ) {
+
+ const action = this.existingAction( clip, optionalRoot );
+
+ if ( action !== null ) {
+
+ this._deactivateAction( action );
+ this._removeInactiveAction( action );
+
+ }
+
+ }
+
+}
+
+AnimationMixer.prototype._controlInterpolantsResultBuffer = new Float32Array( 1 );
+
+class Uniform {
+
+ constructor( value ) {
+
+ if ( typeof value === 'string' ) {
+
+ console.warn( 'THREE.Uniform: Type parameter is no longer needed.' );
+ value = arguments[ 1 ];
+
+ }
+
+ this.value = value;
+
+ }
+
+ clone() {
+
+ return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );
+
+ }
+
+}
+
+class InstancedInterleavedBuffer extends InterleavedBuffer {
+
+ constructor( array, stride, meshPerAttribute = 1 ) {
+
+ super( array, stride );
+
+ this.meshPerAttribute = meshPerAttribute;
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.meshPerAttribute = source.meshPerAttribute;
+
+ return this;
+
+ }
+
+ clone( data ) {
+
+ const ib = super.clone( data );
+
+ ib.meshPerAttribute = this.meshPerAttribute;
+
+ return ib;
+
+ }
+
+ toJSON( data ) {
+
+ const json = super.toJSON( data );
+
+ json.isInstancedInterleavedBuffer = true;
+ json.meshPerAttribute = this.meshPerAttribute;
+
+ return json;
+
+ }
+
+}
+
+InstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;
+
+class GLBufferAttribute {
+
+ constructor( buffer, type, itemSize, elementSize, count ) {
+
+ this.buffer = buffer;
+ this.type = type;
+ this.itemSize = itemSize;
+ this.elementSize = elementSize;
+ this.count = count;
+
+ this.version = 0;
+
+ }
+
+ set needsUpdate( value ) {
+
+ if ( value === true ) this.version ++;
+
+ }
+
+ setBuffer( buffer ) {
+
+ this.buffer = buffer;
+
+ return this;
+
+ }
+
+ setType( type, elementSize ) {
+
+ this.type = type;
+ this.elementSize = elementSize;
+
+ return this;
+
+ }
+
+ setItemSize( itemSize ) {
+
+ this.itemSize = itemSize;
+
+ return this;
+
+ }
+
+ setCount( count ) {
+
+ this.count = count;
+
+ return this;
+
+ }
+
+}
+
+GLBufferAttribute.prototype.isGLBufferAttribute = true;
+
+class Raycaster {
+
+ constructor( origin, direction, near = 0, far = Infinity ) {
+
+ this.ray = new Ray( origin, direction );
+ // direction is assumed to be normalized (for accurate distance calculations)
+
+ this.near = near;
+ this.far = far;
+ this.camera = null;
+ this.layers = new Layers();
+
+ this.params = {
+ Mesh: {},
+ Line: { threshold: 1 },
+ LOD: {},
+ Points: { threshold: 1 },
+ Sprite: {}
+ };
+
+ }
+
+ set( origin, direction ) {
+
+ // direction is assumed to be normalized (for accurate distance calculations)
+
+ this.ray.set( origin, direction );
+
+ }
+
+ setFromCamera( coords, camera ) {
+
+ if ( camera.isPerspectiveCamera ) {
+
+ this.ray.origin.setFromMatrixPosition( camera.matrixWorld );
+ this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();
+ this.camera = camera;
+
+ } else if ( camera.isOrthographicCamera ) {
+
+ this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera
+ this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );
+ this.camera = camera;
+
+ } else {
+
+ console.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type );
+
+ }
+
+ }
+
+ intersectObject( object, recursive = true, intersects = [] ) {
+
+ intersectObject( object, this, intersects, recursive );
+
+ intersects.sort( ascSort );
+
+ return intersects;
+
+ }
+
+ intersectObjects( objects, recursive = true, intersects = [] ) {
+
+ for ( let i = 0, l = objects.length; i < l; i ++ ) {
+
+ intersectObject( objects[ i ], this, intersects, recursive );
+
+ }
+
+ intersects.sort( ascSort );
+
+ return intersects;
+
+ }
+
+}
+
+function ascSort( a, b ) {
+
+ return a.distance - b.distance;
+
+}
+
+function intersectObject( object, raycaster, intersects, recursive ) {
+
+ if ( object.layers.test( raycaster.layers ) ) {
+
+ object.raycast( raycaster, intersects );
+
+ }
+
+ if ( recursive === true ) {
+
+ const children = object.children;
+
+ for ( let i = 0, l = children.length; i < l; i ++ ) {
+
+ intersectObject( children[ i ], raycaster, intersects, true );
+
+ }
+
+ }
+
+}
+
+/**
+ * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system
+ *
+ * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up.
+ * The azimuthal angle (theta) is measured from the positive z-axis.
+ */
+
+class Spherical {
+
+ constructor( radius = 1, phi = 0, theta = 0 ) {
+
+ this.radius = radius;
+ this.phi = phi; // polar angle
+ this.theta = theta; // azimuthal angle
+
+ return this;
+
+ }
+
+ set( radius, phi, theta ) {
+
+ this.radius = radius;
+ this.phi = phi;
+ this.theta = theta;
+
+ return this;
+
+ }
+
+ copy( other ) {
+
+ this.radius = other.radius;
+ this.phi = other.phi;
+ this.theta = other.theta;
+
+ return this;
+
+ }
+
+ // restrict phi to be betwee EPS and PI-EPS
+ makeSafe() {
+
+ const EPS = 0.000001;
+ this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );
+
+ return this;
+
+ }
+
+ setFromVector3( v ) {
+
+ return this.setFromCartesianCoords( v.x, v.y, v.z );
+
+ }
+
+ setFromCartesianCoords( x, y, z ) {
+
+ this.radius = Math.sqrt( x * x + y * y + z * z );
+
+ if ( this.radius === 0 ) {
+
+ this.theta = 0;
+ this.phi = 0;
+
+ } else {
+
+ this.theta = Math.atan2( x, z );
+ this.phi = Math.acos( clamp$1( y / this.radius, - 1, 1 ) );
+
+ }
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+}
+
+/**
+ * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system
+ */
+
+class Cylindrical {
+
+ constructor( radius = 1, theta = 0, y = 0 ) {
+
+ this.radius = radius; // distance from the origin to a point in the x-z plane
+ this.theta = theta; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis
+ this.y = y; // height above the x-z plane
+
+ return this;
+
+ }
+
+ set( radius, theta, y ) {
+
+ this.radius = radius;
+ this.theta = theta;
+ this.y = y;
+
+ return this;
+
+ }
+
+ copy( other ) {
+
+ this.radius = other.radius;
+ this.theta = other.theta;
+ this.y = other.y;
+
+ return this;
+
+ }
+
+ setFromVector3( v ) {
+
+ return this.setFromCartesianCoords( v.x, v.y, v.z );
+
+ }
+
+ setFromCartesianCoords( x, y, z ) {
+
+ this.radius = Math.sqrt( x * x + z * z );
+ this.theta = Math.atan2( x, z );
+ this.y = y;
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+}
+
+const _vector$4 = /*@__PURE__*/ new Vector2();
+
+class Box2 {
+
+ constructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {
+
+ this.min = min;
+ this.max = max;
+
+ }
+
+ set( min, max ) {
+
+ this.min.copy( min );
+ this.max.copy( max );
+
+ return this;
+
+ }
+
+ setFromPoints( points ) {
+
+ this.makeEmpty();
+
+ for ( let i = 0, il = points.length; i < il; i ++ ) {
+
+ this.expandByPoint( points[ i ] );
+
+ }
+
+ return this;
+
+ }
+
+ setFromCenterAndSize( center, size ) {
+
+ const halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );
+ this.min.copy( center ).sub( halfSize );
+ this.max.copy( center ).add( halfSize );
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ copy( box ) {
+
+ this.min.copy( box.min );
+ this.max.copy( box.max );
+
+ return this;
+
+ }
+
+ makeEmpty() {
+
+ this.min.x = this.min.y = + Infinity;
+ this.max.x = this.max.y = - Infinity;
+
+ return this;
+
+ }
+
+ isEmpty() {
+
+ // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
+
+ return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );
+
+ }
+
+ getCenter( target ) {
+
+ return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );
+
+ }
+
+ getSize( target ) {
+
+ return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );
+
+ }
+
+ expandByPoint( point ) {
+
+ this.min.min( point );
+ this.max.max( point );
+
+ return this;
+
+ }
+
+ expandByVector( vector ) {
+
+ this.min.sub( vector );
+ this.max.add( vector );
+
+ return this;
+
+ }
+
+ expandByScalar( scalar ) {
+
+ this.min.addScalar( - scalar );
+ this.max.addScalar( scalar );
+
+ return this;
+
+ }
+
+ containsPoint( point ) {
+
+ return point.x < this.min.x || point.x > this.max.x ||
+ point.y < this.min.y || point.y > this.max.y ? false : true;
+
+ }
+
+ containsBox( box ) {
+
+ return this.min.x <= box.min.x && box.max.x <= this.max.x &&
+ this.min.y <= box.min.y && box.max.y <= this.max.y;
+
+ }
+
+ getParameter( point, target ) {
+
+ // This can potentially have a divide by zero if the box
+ // has a size dimension of 0.
+
+ return target.set(
+ ( point.x - this.min.x ) / ( this.max.x - this.min.x ),
+ ( point.y - this.min.y ) / ( this.max.y - this.min.y )
+ );
+
+ }
+
+ intersectsBox( box ) {
+
+ // using 4 splitting planes to rule out intersections
+
+ return box.max.x < this.min.x || box.min.x > this.max.x ||
+ box.max.y < this.min.y || box.min.y > this.max.y ? false : true;
+
+ }
+
+ clampPoint( point, target ) {
+
+ return target.copy( point ).clamp( this.min, this.max );
+
+ }
+
+ distanceToPoint( point ) {
+
+ const clampedPoint = _vector$4.copy( point ).clamp( this.min, this.max );
+ return clampedPoint.sub( point ).length();
+
+ }
+
+ intersect( box ) {
+
+ this.min.max( box.min );
+ this.max.min( box.max );
+
+ return this;
+
+ }
+
+ union( box ) {
+
+ this.min.min( box.min );
+ this.max.max( box.max );
+
+ return this;
+
+ }
+
+ translate( offset ) {
+
+ this.min.add( offset );
+ this.max.add( offset );
+
+ return this;
+
+ }
+
+ equals( box ) {
+
+ return box.min.equals( this.min ) && box.max.equals( this.max );
+
+ }
+
+}
+
+Box2.prototype.isBox2 = true;
+
+const _startP = /*@__PURE__*/ new Vector3();
+const _startEnd = /*@__PURE__*/ new Vector3();
+
+class Line3 {
+
+ constructor( start = new Vector3(), end = new Vector3() ) {
+
+ this.start = start;
+ this.end = end;
+
+ }
+
+ set( start, end ) {
+
+ this.start.copy( start );
+ this.end.copy( end );
+
+ return this;
+
+ }
+
+ copy( line ) {
+
+ this.start.copy( line.start );
+ this.end.copy( line.end );
+
+ return this;
+
+ }
+
+ getCenter( target ) {
+
+ return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );
+
+ }
+
+ delta( target ) {
+
+ return target.subVectors( this.end, this.start );
+
+ }
+
+ distanceSq() {
+
+ return this.start.distanceToSquared( this.end );
+
+ }
+
+ distance() {
+
+ return this.start.distanceTo( this.end );
+
+ }
+
+ at( t, target ) {
+
+ return this.delta( target ).multiplyScalar( t ).add( this.start );
+
+ }
+
+ closestPointToPointParameter( point, clampToLine ) {
+
+ _startP.subVectors( point, this.start );
+ _startEnd.subVectors( this.end, this.start );
+
+ const startEnd2 = _startEnd.dot( _startEnd );
+ const startEnd_startP = _startEnd.dot( _startP );
+
+ let t = startEnd_startP / startEnd2;
+
+ if ( clampToLine ) {
+
+ t = clamp$1( t, 0, 1 );
+
+ }
+
+ return t;
+
+ }
+
+ closestPointToPoint( point, clampToLine, target ) {
+
+ const t = this.closestPointToPointParameter( point, clampToLine );
+
+ return this.delta( target ).multiplyScalar( t ).add( this.start );
+
+ }
+
+ applyMatrix4( matrix ) {
+
+ this.start.applyMatrix4( matrix );
+ this.end.applyMatrix4( matrix );
+
+ return this;
+
+ }
+
+ equals( line ) {
+
+ return line.start.equals( this.start ) && line.end.equals( this.end );
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+}
+
+const _vector$3 = /*@__PURE__*/ new Vector3();
+
+class SpotLightHelper extends Object3D {
+
+ constructor( light, color ) {
+
+ super();
+ this.light = light;
+ this.light.updateMatrixWorld();
+
+ this.matrix = light.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.color = color;
+
+ const geometry = new BufferGeometry();
+
+ const positions = [
+ 0, 0, 0, 0, 0, 1,
+ 0, 0, 0, 1, 0, 1,
+ 0, 0, 0, - 1, 0, 1,
+ 0, 0, 0, 0, 1, 1,
+ 0, 0, 0, 0, - 1, 1
+ ];
+
+ for ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {
+
+ const p1 = ( i / l ) * Math.PI * 2;
+ const p2 = ( j / l ) * Math.PI * 2;
+
+ positions.push(
+ Math.cos( p1 ), Math.sin( p1 ), 1,
+ Math.cos( p2 ), Math.sin( p2 ), 1
+ );
+
+ }
+
+ geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
+
+ const material = new LineBasicMaterial( { fog: false, toneMapped: false } );
+
+ this.cone = new LineSegments( geometry, material );
+ this.add( this.cone );
+
+ this.update();
+
+ }
+
+ dispose() {
+
+ this.cone.geometry.dispose();
+ this.cone.material.dispose();
+
+ }
+
+ update() {
+
+ this.light.updateMatrixWorld();
+
+ const coneLength = this.light.distance ? this.light.distance : 1000;
+ const coneWidth = coneLength * Math.tan( this.light.angle );
+
+ this.cone.scale.set( coneWidth, coneWidth, coneLength );
+
+ _vector$3.setFromMatrixPosition( this.light.target.matrixWorld );
+
+ this.cone.lookAt( _vector$3 );
+
+ if ( this.color !== undefined ) {
+
+ this.cone.material.color.set( this.color );
+
+ } else {
+
+ this.cone.material.color.copy( this.light.color );
+
+ }
+
+ }
+
+}
+
+const _vector$2 = /*@__PURE__*/ new Vector3();
+const _boneMatrix = /*@__PURE__*/ new Matrix4();
+const _matrixWorldInv = /*@__PURE__*/ new Matrix4();
+
+
+class SkeletonHelper extends LineSegments {
+
+ constructor( object ) {
+
+ const bones = getBoneList( object );
+
+ const geometry = new BufferGeometry();
+
+ const vertices = [];
+ const colors = [];
+
+ const color1 = new Color( 0, 0, 1 );
+ const color2 = new Color( 0, 1, 0 );
+
+ for ( let i = 0; i < bones.length; i ++ ) {
+
+ const bone = bones[ i ];
+
+ if ( bone.parent && bone.parent.isBone ) {
+
+ vertices.push( 0, 0, 0 );
+ vertices.push( 0, 0, 0 );
+ colors.push( color1.r, color1.g, color1.b );
+ colors.push( color2.r, color2.g, color2.b );
+
+ }
+
+ }
+
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ const material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );
+
+ super( geometry, material );
+
+ this.type = 'SkeletonHelper';
+ this.isSkeletonHelper = true;
+
+ this.root = object;
+ this.bones = bones;
+
+ this.matrix = object.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ const bones = this.bones;
+
+ const geometry = this.geometry;
+ const position = geometry.getAttribute( 'position' );
+
+ _matrixWorldInv.copy( this.root.matrixWorld ).invert();
+
+ for ( let i = 0, j = 0; i < bones.length; i ++ ) {
+
+ const bone = bones[ i ];
+
+ if ( bone.parent && bone.parent.isBone ) {
+
+ _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );
+ _vector$2.setFromMatrixPosition( _boneMatrix );
+ position.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );
+
+ _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );
+ _vector$2.setFromMatrixPosition( _boneMatrix );
+ position.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );
+
+ j += 2;
+
+ }
+
+ }
+
+ geometry.getAttribute( 'position' ).needsUpdate = true;
+
+ super.updateMatrixWorld( force );
+
+ }
+
+}
+
+
+function getBoneList( object ) {
+
+ const boneList = [];
+
+ if ( object.isBone === true ) {
+
+ boneList.push( object );
+
+ }
+
+ for ( let i = 0; i < object.children.length; i ++ ) {
+
+ boneList.push.apply( boneList, getBoneList( object.children[ i ] ) );
+
+ }
+
+ return boneList;
+
+}
+
+class PointLightHelper extends Mesh {
+
+ constructor( light, sphereSize, color ) {
+
+ const geometry = new SphereGeometry( sphereSize, 4, 2 );
+ const material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );
+
+ super( geometry, material );
+
+ this.light = light;
+ this.light.updateMatrixWorld();
+
+ this.color = color;
+
+ this.type = 'PointLightHelper';
+
+ this.matrix = this.light.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.update();
+
+
+ /*
+ // TODO: delete this comment?
+ const distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );
+ const distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );
+
+ this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );
+ this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );
+
+ const d = light.distance;
+
+ if ( d === 0.0 ) {
+
+ this.lightDistance.visible = false;
+
+ } else {
+
+ this.lightDistance.scale.set( d, d, d );
+
+ }
+
+ this.add( this.lightDistance );
+ */
+
+ }
+
+ dispose() {
+
+ this.geometry.dispose();
+ this.material.dispose();
+
+ }
+
+ update() {
+
+ if ( this.color !== undefined ) {
+
+ this.material.color.set( this.color );
+
+ } else {
+
+ this.material.color.copy( this.light.color );
+
+ }
+
+ /*
+ const d = this.light.distance;
+
+ if ( d === 0.0 ) {
+
+ this.lightDistance.visible = false;
+
+ } else {
+
+ this.lightDistance.visible = true;
+ this.lightDistance.scale.set( d, d, d );
+
+ }
+ */
+
+ }
+
+}
+
+const _vector$1 = /*@__PURE__*/ new Vector3();
+const _color1 = /*@__PURE__*/ new Color();
+const _color2 = /*@__PURE__*/ new Color();
+
+class HemisphereLightHelper extends Object3D {
+
+ constructor( light, size, color ) {
+
+ super();
+ this.light = light;
+ this.light.updateMatrixWorld();
+
+ this.matrix = light.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.color = color;
+
+ const geometry = new OctahedronGeometry( size );
+ geometry.rotateY( Math.PI * 0.5 );
+
+ this.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );
+ if ( this.color === undefined ) this.material.vertexColors = true;
+
+ const position = geometry.getAttribute( 'position' );
+ const colors = new Float32Array( position.count * 3 );
+
+ geometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );
+
+ this.add( new Mesh( geometry, this.material ) );
+
+ this.update();
+
+ }
+
+ dispose() {
+
+ this.children[ 0 ].geometry.dispose();
+ this.children[ 0 ].material.dispose();
+
+ }
+
+ update() {
+
+ const mesh = this.children[ 0 ];
+
+ if ( this.color !== undefined ) {
+
+ this.material.color.set( this.color );
+
+ } else {
+
+ const colors = mesh.geometry.getAttribute( 'color' );
+
+ _color1.copy( this.light.color );
+ _color2.copy( this.light.groundColor );
+
+ for ( let i = 0, l = colors.count; i < l; i ++ ) {
+
+ const color = ( i < ( l / 2 ) ) ? _color1 : _color2;
+
+ colors.setXYZ( i, color.r, color.g, color.b );
+
+ }
+
+ colors.needsUpdate = true;
+
+ }
+
+ mesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );
+
+ }
+
+}
+
+class GridHelper extends LineSegments {
+
+ constructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {
+
+ color1 = new Color( color1 );
+ color2 = new Color( color2 );
+
+ const center = divisions / 2;
+ const step = size / divisions;
+ const halfSize = size / 2;
+
+ const vertices = [], colors = [];
+
+ for ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {
+
+ vertices.push( - halfSize, 0, k, halfSize, 0, k );
+ vertices.push( k, 0, - halfSize, k, 0, halfSize );
+
+ const color = i === center ? color1 : color2;
+
+ color.toArray( colors, j ); j += 3;
+ color.toArray( colors, j ); j += 3;
+ color.toArray( colors, j ); j += 3;
+ color.toArray( colors, j ); j += 3;
+
+ }
+
+ const geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );
+
+ super( geometry, material );
+
+ this.type = 'GridHelper';
+
+ }
+
+}
+
+class PolarGridHelper extends LineSegments {
+
+ constructor( radius = 10, radials = 16, circles = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {
+
+ color1 = new Color( color1 );
+ color2 = new Color( color2 );
+
+ const vertices = [];
+ const colors = [];
+
+ // create the radials
+
+ for ( let i = 0; i <= radials; i ++ ) {
+
+ const v = ( i / radials ) * ( Math.PI * 2 );
+
+ const x = Math.sin( v ) * radius;
+ const z = Math.cos( v ) * radius;
+
+ vertices.push( 0, 0, 0 );
+ vertices.push( x, 0, z );
+
+ const color = ( i & 1 ) ? color1 : color2;
+
+ colors.push( color.r, color.g, color.b );
+ colors.push( color.r, color.g, color.b );
+
+ }
+
+ // create the circles
+
+ for ( let i = 0; i <= circles; i ++ ) {
+
+ const color = ( i & 1 ) ? color1 : color2;
+
+ const r = radius - ( radius / circles * i );
+
+ for ( let j = 0; j < divisions; j ++ ) {
+
+ // first vertex
+
+ let v = ( j / divisions ) * ( Math.PI * 2 );
+
+ let x = Math.sin( v ) * r;
+ let z = Math.cos( v ) * r;
+
+ vertices.push( x, 0, z );
+ colors.push( color.r, color.g, color.b );
+
+ // second vertex
+
+ v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );
+
+ x = Math.sin( v ) * r;
+ z = Math.cos( v ) * r;
+
+ vertices.push( x, 0, z );
+ colors.push( color.r, color.g, color.b );
+
+ }
+
+ }
+
+ const geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );
+
+ super( geometry, material );
+
+ this.type = 'PolarGridHelper';
+
+ }
+
+}
+
+const _v1 = /*@__PURE__*/ new Vector3();
+const _v2 = /*@__PURE__*/ new Vector3();
+const _v3 = /*@__PURE__*/ new Vector3();
+
+class DirectionalLightHelper extends Object3D {
+
+ constructor( light, size, color ) {
+
+ super();
+ this.light = light;
+ this.light.updateMatrixWorld();
+
+ this.matrix = light.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.color = color;
+
+ if ( size === undefined ) size = 1;
+
+ let geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( [
+ - size, size, 0,
+ size, size, 0,
+ size, - size, 0,
+ - size, - size, 0,
+ - size, size, 0
+ ], 3 ) );
+
+ const material = new LineBasicMaterial( { fog: false, toneMapped: false } );
+
+ this.lightPlane = new Line( geometry, material );
+ this.add( this.lightPlane );
+
+ geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );
+
+ this.targetLine = new Line( geometry, material );
+ this.add( this.targetLine );
+
+ this.update();
+
+ }
+
+ dispose() {
+
+ this.lightPlane.geometry.dispose();
+ this.lightPlane.material.dispose();
+ this.targetLine.geometry.dispose();
+ this.targetLine.material.dispose();
+
+ }
+
+ update() {
+
+ _v1.setFromMatrixPosition( this.light.matrixWorld );
+ _v2.setFromMatrixPosition( this.light.target.matrixWorld );
+ _v3.subVectors( _v2, _v1 );
+
+ this.lightPlane.lookAt( _v2 );
+
+ if ( this.color !== undefined ) {
+
+ this.lightPlane.material.color.set( this.color );
+ this.targetLine.material.color.set( this.color );
+
+ } else {
+
+ this.lightPlane.material.color.copy( this.light.color );
+ this.targetLine.material.color.copy( this.light.color );
+
+ }
+
+ this.targetLine.lookAt( _v2 );
+ this.targetLine.scale.z = _v3.length();
+
+ }
+
+}
+
+const _vector = /*@__PURE__*/ new Vector3();
+const _camera = /*@__PURE__*/ new Camera();
+
+/**
+ * - shows frustum, line of sight and up of the camera
+ * - suitable for fast updates
+ * - based on frustum visualization in lightgl.js shadowmap example
+ * https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html
+ */
+
+class CameraHelper extends LineSegments {
+
+ constructor( camera ) {
+
+ const geometry = new BufferGeometry();
+ const material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );
+
+ const vertices = [];
+ const colors = [];
+
+ const pointMap = {};
+
+ // colors
+
+ const colorFrustum = new Color( 0xffaa00 );
+ const colorCone = new Color( 0xff0000 );
+ const colorUp = new Color( 0x00aaff );
+ const colorTarget = new Color( 0xffffff );
+ const colorCross = new Color( 0x333333 );
+
+ // near
+
+ addLine( 'n1', 'n2', colorFrustum );
+ addLine( 'n2', 'n4', colorFrustum );
+ addLine( 'n4', 'n3', colorFrustum );
+ addLine( 'n3', 'n1', colorFrustum );
+
+ // far
+
+ addLine( 'f1', 'f2', colorFrustum );
+ addLine( 'f2', 'f4', colorFrustum );
+ addLine( 'f4', 'f3', colorFrustum );
+ addLine( 'f3', 'f1', colorFrustum );
+
+ // sides
+
+ addLine( 'n1', 'f1', colorFrustum );
+ addLine( 'n2', 'f2', colorFrustum );
+ addLine( 'n3', 'f3', colorFrustum );
+ addLine( 'n4', 'f4', colorFrustum );
+
+ // cone
+
+ addLine( 'p', 'n1', colorCone );
+ addLine( 'p', 'n2', colorCone );
+ addLine( 'p', 'n3', colorCone );
+ addLine( 'p', 'n4', colorCone );
+
+ // up
+
+ addLine( 'u1', 'u2', colorUp );
+ addLine( 'u2', 'u3', colorUp );
+ addLine( 'u3', 'u1', colorUp );
+
+ // target
+
+ addLine( 'c', 't', colorTarget );
+ addLine( 'p', 'c', colorCross );
+
+ // cross
+
+ addLine( 'cn1', 'cn2', colorCross );
+ addLine( 'cn3', 'cn4', colorCross );
+
+ addLine( 'cf1', 'cf2', colorCross );
+ addLine( 'cf3', 'cf4', colorCross );
+
+ function addLine( a, b, color ) {
+
+ addPoint( a, color );
+ addPoint( b, color );
+
+ }
+
+ function addPoint( id, color ) {
+
+ vertices.push( 0, 0, 0 );
+ colors.push( color.r, color.g, color.b );
+
+ if ( pointMap[ id ] === undefined ) {
+
+ pointMap[ id ] = [];
+
+ }
+
+ pointMap[ id ].push( ( vertices.length / 3 ) - 1 );
+
+ }
+
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ super( geometry, material );
+
+ this.type = 'CameraHelper';
+
+ this.camera = camera;
+ if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();
+
+ this.matrix = camera.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.pointMap = pointMap;
+
+ this.update();
+
+ }
+
+ update() {
+
+ const geometry = this.geometry;
+ const pointMap = this.pointMap;
+
+ const w = 1, h = 1;
+
+ // we need just camera projection matrix inverse
+ // world matrix must be identity
+
+ _camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );
+
+ // center / target
+
+ setPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 );
+ setPoint( 't', pointMap, geometry, _camera, 0, 0, 1 );
+
+ // near
+
+ setPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 );
+ setPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 );
+ setPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 );
+ setPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 );
+
+ // far
+
+ setPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 );
+ setPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 );
+ setPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 );
+ setPoint( 'f4', pointMap, geometry, _camera, w, h, 1 );
+
+ // up
+
+ setPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 );
+ setPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 );
+ setPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 );
+
+ // cross
+
+ setPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 );
+ setPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 );
+ setPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 );
+ setPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 );
+
+ setPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 );
+ setPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 );
+ setPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 );
+ setPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 );
+
+ geometry.getAttribute( 'position' ).needsUpdate = true;
+
+ }
+
+ dispose() {
+
+ this.geometry.dispose();
+ this.material.dispose();
+
+ }
+
+}
+
+
+function setPoint( point, pointMap, geometry, camera, x, y, z ) {
+
+ _vector.set( x, y, z ).unproject( camera );
+
+ const points = pointMap[ point ];
+
+ if ( points !== undefined ) {
+
+ const position = geometry.getAttribute( 'position' );
+
+ for ( let i = 0, l = points.length; i < l; i ++ ) {
+
+ position.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );
+
+ }
+
+ }
+
+}
+
+const _box = /*@__PURE__*/ new Box3();
+
+class BoxHelper extends LineSegments {
+
+ constructor( object, color = 0xffff00 ) {
+
+ const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );
+ const positions = new Float32Array( 8 * 3 );
+
+ const geometry = new BufferGeometry();
+ geometry.setIndex( new BufferAttribute( indices, 1 ) );
+ geometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );
+
+ super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
+
+ this.object = object;
+ this.type = 'BoxHelper';
+
+ this.matrixAutoUpdate = false;
+
+ this.update();
+
+ }
+
+ update( object ) {
+
+ if ( object !== undefined ) {
+
+ console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );
+
+ }
+
+ if ( this.object !== undefined ) {
+
+ _box.setFromObject( this.object );
+
+ }
+
+ if ( _box.isEmpty() ) return;
+
+ const min = _box.min;
+ const max = _box.max;
+
+ /*
+ 5____4
+ 1/___0/|
+ | 6__|_7
+ 2/___3/
+
+ 0: max.x, max.y, max.z
+ 1: min.x, max.y, max.z
+ 2: min.x, min.y, max.z
+ 3: max.x, min.y, max.z
+ 4: max.x, max.y, min.z
+ 5: min.x, max.y, min.z
+ 6: min.x, min.y, min.z
+ 7: max.x, min.y, min.z
+ */
+
+ const position = this.geometry.attributes.position;
+ const array = position.array;
+
+ array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;
+ array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;
+ array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;
+ array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;
+ array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;
+ array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;
+ array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;
+ array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;
+
+ position.needsUpdate = true;
+
+ this.geometry.computeBoundingSphere();
+
+
+ }
+
+ setFromObject( object ) {
+
+ this.object = object;
+ this.update();
+
+ return this;
+
+ }
+
+ copy( source ) {
+
+ LineSegments.prototype.copy.call( this, source );
+
+ this.object = source.object;
+
+ return this;
+
+ }
+
+}
+
+class Box3Helper extends LineSegments {
+
+ constructor( box, color = 0xffff00 ) {
+
+ const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );
+
+ const positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];
+
+ const geometry = new BufferGeometry();
+
+ geometry.setIndex( new BufferAttribute( indices, 1 ) );
+
+ geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
+
+ super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
+
+ this.box = box;
+
+ this.type = 'Box3Helper';
+
+ this.geometry.computeBoundingSphere();
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ const box = this.box;
+
+ if ( box.isEmpty() ) return;
+
+ box.getCenter( this.position );
+
+ box.getSize( this.scale );
+
+ this.scale.multiplyScalar( 0.5 );
+
+ super.updateMatrixWorld( force );
+
+ }
+
+}
+
+class PlaneHelper extends Line {
+
+ constructor( plane, size = 1, hex = 0xffff00 ) {
+
+ const color = hex;
+
+ const positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ];
+
+ const geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
+ geometry.computeBoundingSphere();
+
+ super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
+
+ this.type = 'PlaneHelper';
+
+ this.plane = plane;
+
+ this.size = size;
+
+ const positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];
+
+ const geometry2 = new BufferGeometry();
+ geometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );
+ geometry2.computeBoundingSphere();
+
+ this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ let scale = - this.plane.constant;
+
+ if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter
+
+ this.scale.set( 0.5 * this.size, 0.5 * this.size, scale );
+
+ this.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here
+
+ this.lookAt( this.plane.normal );
+
+ super.updateMatrixWorld( force );
+
+ }
+
+}
+
+const _axis = /*@__PURE__*/ new Vector3();
+let _lineGeometry, _coneGeometry;
+
+class ArrowHelper extends Object3D {
+
+ // dir is assumed to be normalized
+
+ constructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {
+
+ super();
+
+ this.type = 'ArrowHelper';
+
+ if ( _lineGeometry === undefined ) {
+
+ _lineGeometry = new BufferGeometry();
+ _lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );
+
+ _coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 );
+ _coneGeometry.translate( 0, - 0.5, 0 );
+
+ }
+
+ this.position.copy( origin );
+
+ this.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
+ this.line.matrixAutoUpdate = false;
+ this.add( this.line );
+
+ this.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );
+ this.cone.matrixAutoUpdate = false;
+ this.add( this.cone );
+
+ this.setDirection( dir );
+ this.setLength( length, headLength, headWidth );
+
+ }
+
+ setDirection( dir ) {
+
+ // dir is assumed to be normalized
+
+ if ( dir.y > 0.99999 ) {
+
+ this.quaternion.set( 0, 0, 0, 1 );
+
+ } else if ( dir.y < - 0.99999 ) {
+
+ this.quaternion.set( 1, 0, 0, 0 );
+
+ } else {
+
+ _axis.set( dir.z, 0, - dir.x ).normalize();
+
+ const radians = Math.acos( dir.y );
+
+ this.quaternion.setFromAxisAngle( _axis, radians );
+
+ }
+
+ }
+
+ setLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {
+
+ this.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458
+ this.line.updateMatrix();
+
+ this.cone.scale.set( headWidth, headLength, headWidth );
+ this.cone.position.y = length;
+ this.cone.updateMatrix();
+
+ }
+
+ setColor( color ) {
+
+ this.line.material.color.set( color );
+ this.cone.material.color.set( color );
+
+ }
+
+ copy( source ) {
+
+ super.copy( source, false );
+
+ this.line.copy( source.line );
+ this.cone.copy( source.cone );
+
+ return this;
+
+ }
+
+}
+
+class AxesHelper extends LineSegments {
+
+ constructor( size = 1 ) {
+
+ const vertices = [
+ 0, 0, 0, size, 0, 0,
+ 0, 0, 0, 0, size, 0,
+ 0, 0, 0, 0, 0, size
+ ];
+
+ const colors = [
+ 1, 0, 0, 1, 0.6, 0,
+ 0, 1, 0, 0.6, 1, 0,
+ 0, 0, 1, 0, 0.6, 1
+ ];
+
+ const geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );
+
+ super( geometry, material );
+
+ this.type = 'AxesHelper';
+
+ }
+
+ setColors( xAxisColor, yAxisColor, zAxisColor ) {
+
+ const color = new Color();
+ const array = this.geometry.attributes.color.array;
+
+ color.set( xAxisColor );
+ color.toArray( array, 0 );
+ color.toArray( array, 3 );
+
+ color.set( yAxisColor );
+ color.toArray( array, 6 );
+ color.toArray( array, 9 );
+
+ color.set( zAxisColor );
+ color.toArray( array, 12 );
+ color.toArray( array, 15 );
+
+ this.geometry.attributes.color.needsUpdate = true;
+
+ return this;
+
+ }
+
+ dispose() {
+
+ this.geometry.dispose();
+ this.material.dispose();
+
+ }
+
+}
+
+class ShapePath {
+
+ constructor() {
+
+ this.type = 'ShapePath';
+
+ this.color = new Color();
+
+ this.subPaths = [];
+ this.currentPath = null;
+
+ }
+
+ moveTo( x, y ) {
+
+ this.currentPath = new Path();
+ this.subPaths.push( this.currentPath );
+ this.currentPath.moveTo( x, y );
+
+ return this;
+
+ }
+
+ lineTo( x, y ) {
+
+ this.currentPath.lineTo( x, y );
+
+ return this;
+
+ }
+
+ quadraticCurveTo( aCPx, aCPy, aX, aY ) {
+
+ this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );
+
+ return this;
+
+ }
+
+ bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {
+
+ this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );
+
+ return this;
+
+ }
+
+ splineThru( pts ) {
+
+ this.currentPath.splineThru( pts );
+
+ return this;
+
+ }
+
+ toShapes( isCCW, noHoles ) {
+
+ function toShapesNoHoles( inSubpaths ) {
+
+ const shapes = [];
+
+ for ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {
+
+ const tmpPath = inSubpaths[ i ];
+
+ const tmpShape = new Shape();
+ tmpShape.curves = tmpPath.curves;
+
+ shapes.push( tmpShape );
+
+ }
+
+ return shapes;
+
+ }
+
+ function isPointInsidePolygon( inPt, inPolygon ) {
+
+ const polyLen = inPolygon.length;
+
+ // inPt on polygon contour => immediate success or
+ // toggling of inside/outside at every single! intersection point of an edge
+ // with the horizontal line through inPt, left of inPt
+ // not counting lowerY endpoints of edges and whole edges on that line
+ let inside = false;
+ for ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {
+
+ let edgeLowPt = inPolygon[ p ];
+ let edgeHighPt = inPolygon[ q ];
+
+ let edgeDx = edgeHighPt.x - edgeLowPt.x;
+ let edgeDy = edgeHighPt.y - edgeLowPt.y;
+
+ if ( Math.abs( edgeDy ) > Number.EPSILON ) {
+
+ // not parallel
+ if ( edgeDy < 0 ) {
+
+ edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;
+ edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;
+
+ }
+
+ if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue;
+
+ if ( inPt.y === edgeLowPt.y ) {
+
+ if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ?
+ // continue; // no intersection or edgeLowPt => doesn't count !!!
+
+ } else {
+
+ const perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );
+ if ( perpEdge === 0 ) return true; // inPt is on contour ?
+ if ( perpEdge < 0 ) continue;
+ inside = ! inside; // true intersection left of inPt
+
+ }
+
+ } else {
+
+ // parallel or collinear
+ if ( inPt.y !== edgeLowPt.y ) continue; // parallel
+ // edge lies on the same horizontal line as inPt
+ if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||
+ ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour !
+ // continue;
+
+ }
+
+ }
+
+ return inside;
+
+ }
+
+ const isClockWise = ShapeUtils.isClockWise;
+
+ const subPaths = this.subPaths;
+ if ( subPaths.length === 0 ) return [];
+
+ if ( noHoles === true ) return toShapesNoHoles( subPaths );
+
+
+ let solid, tmpPath, tmpShape;
+ const shapes = [];
+
+ if ( subPaths.length === 1 ) {
+
+ tmpPath = subPaths[ 0 ];
+ tmpShape = new Shape();
+ tmpShape.curves = tmpPath.curves;
+ shapes.push( tmpShape );
+ return shapes;
+
+ }
+
+ let holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );
+ holesFirst = isCCW ? ! holesFirst : holesFirst;
+
+ // console.log("Holes first", holesFirst);
+
+ const betterShapeHoles = [];
+ const newShapes = [];
+ let newShapeHoles = [];
+ let mainIdx = 0;
+ let tmpPoints;
+
+ newShapes[ mainIdx ] = undefined;
+ newShapeHoles[ mainIdx ] = [];
+
+ for ( let i = 0, l = subPaths.length; i < l; i ++ ) {
+
+ tmpPath = subPaths[ i ];
+ tmpPoints = tmpPath.getPoints();
+ solid = isClockWise( tmpPoints );
+ solid = isCCW ? ! solid : solid;
+
+ if ( solid ) {
+
+ if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++;
+
+ newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };
+ newShapes[ mainIdx ].s.curves = tmpPath.curves;
+
+ if ( holesFirst ) mainIdx ++;
+ newShapeHoles[ mainIdx ] = [];
+
+ //console.log('cw', i);
+
+ } else {
+
+ newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );
+
+ //console.log('ccw', i);
+
+ }
+
+ }
+
+ // only Holes? -> probably all Shapes with wrong orientation
+ if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths );
+
+
+ if ( newShapes.length > 1 ) {
+
+ let ambiguous = false;
+ let toChange = 0;
+
+ for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {
+
+ betterShapeHoles[ sIdx ] = [];
+
+ }
+
+ for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {
+
+ const sho = newShapeHoles[ sIdx ];
+
+ for ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {
+
+ const ho = sho[ hIdx ];
+ let hole_unassigned = true;
+
+ for ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {
+
+ if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {
+
+ if ( sIdx !== s2Idx ) toChange ++;
+
+ if ( hole_unassigned ) {
+
+ hole_unassigned = false;
+ betterShapeHoles[ s2Idx ].push( ho );
+
+ } else {
+
+ ambiguous = true;
+
+ }
+
+ }
+
+ }
+
+ if ( hole_unassigned ) {
+
+ betterShapeHoles[ sIdx ].push( ho );
+
+ }
+
+ }
+
+ }
+
+ if ( toChange > 0 && ambiguous === false ) {
+
+ newShapeHoles = betterShapeHoles;
+
+ }
+
+ }
+
+ let tmpHoles;
+
+ for ( let i = 0, il = newShapes.length; i < il; i ++ ) {
+
+ tmpShape = newShapes[ i ].s;
+ shapes.push( tmpShape );
+ tmpHoles = newShapeHoles[ i ];
+
+ for ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {
+
+ tmpShape.holes.push( tmpHoles[ j ].h );
+
+ }
+
+ }
+
+ //console.log("shape", shapes);
+
+ return shapes;
+
+ }
+
+}
+
+const _floatView = new Float32Array( 1 );
+const _int32View = new Int32Array( _floatView.buffer );
+
+class DataUtils {
+
+ // Converts float32 to float16 (stored as uint16 value).
+
+ static toHalfFloat( val ) {
+
+ if ( val > 65504 ) {
+
+ console.warn( 'THREE.DataUtils.toHalfFloat(): value exceeds 65504.' );
+
+ val = 65504; // maximum representable value in float16
+
+ }
+
+ // Source: http://gamedev.stackexchange.com/questions/17326/conversion-of-a-number-from-single-precision-floating-point-representation-to-a/17410#17410
+
+ /* This method is faster than the OpenEXR implementation (very often
+ * used, eg. in Ogre), with the additional benefit of rounding, inspired
+ * by James Tursa?s half-precision code. */
+
+ _floatView[ 0 ] = val;
+ const x = _int32View[ 0 ];
+
+ let bits = ( x >> 16 ) & 0x8000; /* Get the sign */
+ let m = ( x >> 12 ) & 0x07ff; /* Keep one extra bit for rounding */
+ const e = ( x >> 23 ) & 0xff; /* Using int is faster here */
+
+ /* If zero, or denormal, or exponent underflows too much for a denormal
+ * half, return signed zero. */
+ if ( e < 103 ) return bits;
+
+ /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */
+ if ( e > 142 ) {
+
+ bits |= 0x7c00;
+ /* If exponent was 0xff and one mantissa bit was set, it means NaN,
+ * not Inf, so make sure we set one mantissa bit too. */
+ bits |= ( ( e == 255 ) ? 0 : 1 ) && ( x & 0x007fffff );
+ return bits;
+
+ }
+
+ /* If exponent underflows but not too much, return a denormal */
+ if ( e < 113 ) {
+
+ m |= 0x0800;
+ /* Extra rounding may overflow and set mantissa to 0 and exponent
+ * to 1, which is OK. */
+ bits |= ( m >> ( 114 - e ) ) + ( ( m >> ( 113 - e ) ) & 1 );
+ return bits;
+
+ }
+
+ bits |= ( ( e - 112 ) << 10 ) | ( m >> 1 );
+ /* Extra rounding. An overflow will set mantissa to 0 and increment
+ * the exponent, which is OK. */
+ bits += m & 1;
+ return bits;
+
+ }
+
+}
+
+const LineStrip = 0;
+const LinePieces = 1;
+const NoColors = 0;
+const FaceColors = 1;
+const VertexColors = 2;
+
+function MeshFaceMaterial( materials ) {
+
+ console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' );
+ return materials;
+
+}
+
+function MultiMaterial( materials = [] ) {
+
+ console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' );
+ materials.isMultiMaterial = true;
+ materials.materials = materials;
+ materials.clone = function () {
+
+ return materials.slice();
+
+ };
+
+ return materials;
+
+}
+
+function PointCloud( geometry, material ) {
+
+ console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );
+ return new Points( geometry, material );
+
+}
+
+function Particle( material ) {
+
+ console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );
+ return new Sprite( material );
+
+}
+
+function ParticleSystem( geometry, material ) {
+
+ console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );
+ return new Points( geometry, material );
+
+}
+
+function PointCloudMaterial( parameters ) {
+
+ console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );
+ return new PointsMaterial( parameters );
+
+}
+
+function ParticleBasicMaterial( parameters ) {
+
+ console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );
+ return new PointsMaterial( parameters );
+
+}
+
+function ParticleSystemMaterial( parameters ) {
+
+ console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );
+ return new PointsMaterial( parameters );
+
+}
+
+function Vertex( x, y, z ) {
+
+ console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );
+ return new Vector3( x, y, z );
+
+}
+
+//
+
+function DynamicBufferAttribute( array, itemSize ) {
+
+ console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.' );
+ return new BufferAttribute( array, itemSize ).setUsage( DynamicDrawUsage );
+
+}
+
+function Int8Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );
+ return new Int8BufferAttribute( array, itemSize );
+
+}
+
+function Uint8Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );
+ return new Uint8BufferAttribute( array, itemSize );
+
+}
+
+function Uint8ClampedAttribute( array, itemSize ) {
+
+ console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );
+ return new Uint8ClampedBufferAttribute( array, itemSize );
+
+}
+
+function Int16Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );
+ return new Int16BufferAttribute( array, itemSize );
+
+}
+
+function Uint16Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );
+ return new Uint16BufferAttribute( array, itemSize );
+
+}
+
+function Int32Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );
+ return new Int32BufferAttribute( array, itemSize );
+
+}
+
+function Uint32Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );
+ return new Uint32BufferAttribute( array, itemSize );
+
+}
+
+function Float32Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );
+ return new Float32BufferAttribute( array, itemSize );
+
+}
+
+function Float64Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );
+ return new Float64BufferAttribute( array, itemSize );
+
+}
+
+//
+
+Curve.create = function ( construct, getPoint ) {
+
+ console.log( 'THREE.Curve.create() has been deprecated' );
+
+ construct.prototype = Object.create( Curve.prototype );
+ construct.prototype.constructor = construct;
+ construct.prototype.getPoint = getPoint;
+
+ return construct;
+
+};
+
+//
+
+Path.prototype.fromPoints = function ( points ) {
+
+ console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' );
+ return this.setFromPoints( points );
+
+};
+
+//
+
+function AxisHelper( size ) {
+
+ console.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' );
+ return new AxesHelper( size );
+
+}
+
+function BoundingBoxHelper( object, color ) {
+
+ console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );
+ return new BoxHelper( object, color );
+
+}
+
+function EdgesHelper( object, hex ) {
+
+ console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );
+ return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );
+
+}
+
+GridHelper.prototype.setColors = function () {
+
+ console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );
+
+};
+
+SkeletonHelper.prototype.update = function () {
+
+ console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' );
+
+};
+
+function WireframeHelper( object, hex ) {
+
+ console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );
+ return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );
+
+}
+
+//
+
+Loader.prototype.extractUrlBase = function ( url ) {
+
+ console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' );
+ return LoaderUtils.extractUrlBase( url );
+
+};
+
+Loader.Handlers = {
+
+ add: function ( /* regex, loader */ ) {
+
+ console.error( 'THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.' );
+
+ },
+
+ get: function ( /* file */ ) {
+
+ console.error( 'THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.' );
+
+ }
+
+};
+
+function XHRLoader( manager ) {
+
+ console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );
+ return new FileLoader( manager );
+
+}
+
+function BinaryTextureLoader( manager ) {
+
+ console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );
+ return new DataTextureLoader( manager );
+
+}
+
+//
+
+Box2.prototype.center = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );
+ return this.getCenter( optionalTarget );
+
+};
+
+Box2.prototype.empty = function () {
+
+ console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );
+ return this.isEmpty();
+
+};
+
+Box2.prototype.isIntersectionBox = function ( box ) {
+
+ console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );
+ return this.intersectsBox( box );
+
+};
+
+Box2.prototype.size = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );
+ return this.getSize( optionalTarget );
+
+};
+
+//
+
+Box3.prototype.center = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );
+ return this.getCenter( optionalTarget );
+
+};
+
+Box3.prototype.empty = function () {
+
+ console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );
+ return this.isEmpty();
+
+};
+
+Box3.prototype.isIntersectionBox = function ( box ) {
+
+ console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );
+ return this.intersectsBox( box );
+
+};
+
+Box3.prototype.isIntersectionSphere = function ( sphere ) {
+
+ console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );
+ return this.intersectsSphere( sphere );
+
+};
+
+Box3.prototype.size = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );
+ return this.getSize( optionalTarget );
+
+};
+
+//
+
+Euler.prototype.toVector3 = function () {
+
+ console.error( 'THREE.Euler: .toVector3() has been removed. Use Vector3.setFromEuler() instead' );
+
+};
+
+
+//
+
+Sphere.prototype.empty = function () {
+
+ console.warn( 'THREE.Sphere: .empty() has been renamed to .isEmpty().' );
+ return this.isEmpty();
+
+};
+
+//
+
+Frustum.prototype.setFromMatrix = function ( m ) {
+
+ console.warn( 'THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().' );
+ return this.setFromProjectionMatrix( m );
+
+};
+
+//
+
+Line3.prototype.center = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );
+ return this.getCenter( optionalTarget );
+
+};
+
+//
+
+Matrix3.prototype.flattenToArrayOffset = function ( array, offset ) {
+
+ console.warn( 'THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' );
+ return this.toArray( array, offset );
+
+};
+
+Matrix3.prototype.multiplyVector3 = function ( vector ) {
+
+ console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );
+ return vector.applyMatrix3( this );
+
+};
+
+Matrix3.prototype.multiplyVector3Array = function ( /* a */ ) {
+
+ console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' );
+
+};
+
+Matrix3.prototype.applyToBufferAttribute = function ( attribute ) {
+
+ console.warn( 'THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.' );
+ return attribute.applyMatrix3( this );
+
+};
+
+Matrix3.prototype.applyToVector3Array = function ( /* array, offset, length */ ) {
+
+ console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );
+
+};
+
+Matrix3.prototype.getInverse = function ( matrix ) {
+
+ console.warn( 'THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' );
+ return this.copy( matrix ).invert();
+
+};
+
+//
+
+Matrix4.prototype.extractPosition = function ( m ) {
+
+ console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );
+ return this.copyPosition( m );
+
+};
+
+Matrix4.prototype.flattenToArrayOffset = function ( array, offset ) {
+
+ console.warn( 'THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' );
+ return this.toArray( array, offset );
+
+};
+
+Matrix4.prototype.getPosition = function () {
+
+ console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );
+ return new Vector3().setFromMatrixColumn( this, 3 );
+
+};
+
+Matrix4.prototype.setRotationFromQuaternion = function ( q ) {
+
+ console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );
+ return this.makeRotationFromQuaternion( q );
+
+};
+
+Matrix4.prototype.multiplyToArray = function () {
+
+ console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );
+
+};
+
+Matrix4.prototype.multiplyVector3 = function ( vector ) {
+
+ console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
+ return vector.applyMatrix4( this );
+
+};
+
+Matrix4.prototype.multiplyVector4 = function ( vector ) {
+
+ console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
+ return vector.applyMatrix4( this );
+
+};
+
+Matrix4.prototype.multiplyVector3Array = function ( /* a */ ) {
+
+ console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' );
+
+};
+
+Matrix4.prototype.rotateAxis = function ( v ) {
+
+ console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );
+ v.transformDirection( this );
+
+};
+
+Matrix4.prototype.crossVector = function ( vector ) {
+
+ console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
+ return vector.applyMatrix4( this );
+
+};
+
+Matrix4.prototype.translate = function () {
+
+ console.error( 'THREE.Matrix4: .translate() has been removed.' );
+
+};
+
+Matrix4.prototype.rotateX = function () {
+
+ console.error( 'THREE.Matrix4: .rotateX() has been removed.' );
+
+};
+
+Matrix4.prototype.rotateY = function () {
+
+ console.error( 'THREE.Matrix4: .rotateY() has been removed.' );
+
+};
+
+Matrix4.prototype.rotateZ = function () {
+
+ console.error( 'THREE.Matrix4: .rotateZ() has been removed.' );
+
+};
+
+Matrix4.prototype.rotateByAxis = function () {
+
+ console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );
+
+};
+
+Matrix4.prototype.applyToBufferAttribute = function ( attribute ) {
+
+ console.warn( 'THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.' );
+ return attribute.applyMatrix4( this );
+
+};
+
+Matrix4.prototype.applyToVector3Array = function ( /* array, offset, length */ ) {
+
+ console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );
+
+};
+
+Matrix4.prototype.makeFrustum = function ( left, right, bottom, top, near, far ) {
+
+ console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );
+ return this.makePerspective( left, right, top, bottom, near, far );
+
+};
+
+Matrix4.prototype.getInverse = function ( matrix ) {
+
+ console.warn( 'THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' );
+ return this.copy( matrix ).invert();
+
+};
+
+//
+
+Plane.prototype.isIntersectionLine = function ( line ) {
+
+ console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );
+ return this.intersectsLine( line );
+
+};
+
+//
+
+Quaternion.prototype.multiplyVector3 = function ( vector ) {
+
+ console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );
+ return vector.applyQuaternion( this );
+
+};
+
+Quaternion.prototype.inverse = function ( ) {
+
+ console.warn( 'THREE.Quaternion: .inverse() has been renamed to invert().' );
+ return this.invert();
+
+};
+
+//
+
+Ray.prototype.isIntersectionBox = function ( box ) {
+
+ console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );
+ return this.intersectsBox( box );
+
+};
+
+Ray.prototype.isIntersectionPlane = function ( plane ) {
+
+ console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );
+ return this.intersectsPlane( plane );
+
+};
+
+Ray.prototype.isIntersectionSphere = function ( sphere ) {
+
+ console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );
+ return this.intersectsSphere( sphere );
+
+};
+
+//
+
+Triangle.prototype.area = function () {
+
+ console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' );
+ return this.getArea();
+
+};
+
+Triangle.prototype.barycoordFromPoint = function ( point, target ) {
+
+ console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );
+ return this.getBarycoord( point, target );
+
+};
+
+Triangle.prototype.midpoint = function ( target ) {
+
+ console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' );
+ return this.getMidpoint( target );
+
+};
+
+Triangle.prototypenormal = function ( target ) {
+
+ console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );
+ return this.getNormal( target );
+
+};
+
+Triangle.prototype.plane = function ( target ) {
+
+ console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' );
+ return this.getPlane( target );
+
+};
+
+Triangle.barycoordFromPoint = function ( point, a, b, c, target ) {
+
+ console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );
+ return Triangle.getBarycoord( point, a, b, c, target );
+
+};
+
+Triangle.normal = function ( a, b, c, target ) {
+
+ console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );
+ return Triangle.getNormal( a, b, c, target );
+
+};
+
+//
+
+Shape.prototype.extractAllPoints = function ( divisions ) {
+
+ console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' );
+ return this.extractPoints( divisions );
+
+};
+
+Shape.prototype.extrude = function ( options ) {
+
+ console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );
+ return new ExtrudeGeometry( this, options );
+
+};
+
+Shape.prototype.makeGeometry = function ( options ) {
+
+ console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );
+ return new ShapeGeometry( this, options );
+
+};
+
+//
+
+Vector2.prototype.fromAttribute = function ( attribute, index, offset ) {
+
+ console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );
+ return this.fromBufferAttribute( attribute, index, offset );
+
+};
+
+Vector2.prototype.distanceToManhattan = function ( v ) {
+
+ console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );
+ return this.manhattanDistanceTo( v );
+
+};
+
+Vector2.prototype.lengthManhattan = function () {
+
+ console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' );
+ return this.manhattanLength();
+
+};
+
+//
+
+Vector3.prototype.setEulerFromRotationMatrix = function () {
+
+ console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );
+
+};
+
+Vector3.prototype.setEulerFromQuaternion = function () {
+
+ console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );
+
+};
+
+Vector3.prototype.getPositionFromMatrix = function ( m ) {
+
+ console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );
+ return this.setFromMatrixPosition( m );
+
+};
+
+Vector3.prototype.getScaleFromMatrix = function ( m ) {
+
+ console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );
+ return this.setFromMatrixScale( m );
+
+};
+
+Vector3.prototype.getColumnFromMatrix = function ( index, matrix ) {
+
+ console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );
+ return this.setFromMatrixColumn( matrix, index );
+
+};
+
+Vector3.prototype.applyProjection = function ( m ) {
+
+ console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );
+ return this.applyMatrix4( m );
+
+};
+
+Vector3.prototype.fromAttribute = function ( attribute, index, offset ) {
+
+ console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );
+ return this.fromBufferAttribute( attribute, index, offset );
+
+};
+
+Vector3.prototype.distanceToManhattan = function ( v ) {
+
+ console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );
+ return this.manhattanDistanceTo( v );
+
+};
+
+Vector3.prototype.lengthManhattan = function () {
+
+ console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' );
+ return this.manhattanLength();
+
+};
+
+//
+
+Vector4$1.prototype.fromAttribute = function ( attribute, index, offset ) {
+
+ console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );
+ return this.fromBufferAttribute( attribute, index, offset );
+
+};
+
+Vector4$1.prototype.lengthManhattan = function () {
+
+ console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' );
+ return this.manhattanLength();
+
+};
+
+//
+
+Object3D.prototype.getChildByName = function ( name ) {
+
+ console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );
+ return this.getObjectByName( name );
+
+};
+
+Object3D.prototype.renderDepth = function () {
+
+ console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );
+
+};
+
+Object3D.prototype.translate = function ( distance, axis ) {
+
+ console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );
+ return this.translateOnAxis( axis, distance );
+
+};
+
+Object3D.prototype.getWorldRotation = function () {
+
+ console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' );
+
+};
+
+Object3D.prototype.applyMatrix = function ( matrix ) {
+
+ console.warn( 'THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().' );
+ return this.applyMatrix4( matrix );
+
+};
+
+Object.defineProperties( Object3D.prototype, {
+
+ eulerOrder: {
+ get: function () {
+
+ console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );
+ return this.rotation.order;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );
+ this.rotation.order = value;
+
+ }
+ },
+ useQuaternion: {
+ get: function () {
+
+ console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );
+
+ }
+ }
+
+} );
+
+Mesh.prototype.setDrawMode = function () {
+
+ console.error( 'THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );
+
+};
+
+Object.defineProperties( Mesh.prototype, {
+
+ drawMode: {
+ get: function () {
+
+ console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.' );
+ return TrianglesDrawMode;
+
+ },
+ set: function () {
+
+ console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );
+
+ }
+ }
+
+} );
+
+SkinnedMesh.prototype.initBones = function () {
+
+ console.error( 'THREE.SkinnedMesh: initBones() has been removed.' );
+
+};
+
+//
+
+PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {
+
+ console.warn( 'THREE.PerspectiveCamera.setLens is deprecated. ' +
+ 'Use .setFocalLength and .filmGauge for a photographic setup.' );
+
+ if ( filmGauge !== undefined ) this.filmGauge = filmGauge;
+ this.setFocalLength( focalLength );
+
+};
+
+//
+
+Object.defineProperties( Light.prototype, {
+ onlyShadow: {
+ set: function () {
+
+ console.warn( 'THREE.Light: .onlyShadow has been removed.' );
+
+ }
+ },
+ shadowCameraFov: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );
+ this.shadow.camera.fov = value;
+
+ }
+ },
+ shadowCameraLeft: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );
+ this.shadow.camera.left = value;
+
+ }
+ },
+ shadowCameraRight: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );
+ this.shadow.camera.right = value;
+
+ }
+ },
+ shadowCameraTop: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );
+ this.shadow.camera.top = value;
+
+ }
+ },
+ shadowCameraBottom: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );
+ this.shadow.camera.bottom = value;
+
+ }
+ },
+ shadowCameraNear: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );
+ this.shadow.camera.near = value;
+
+ }
+ },
+ shadowCameraFar: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );
+ this.shadow.camera.far = value;
+
+ }
+ },
+ shadowCameraVisible: {
+ set: function () {
+
+ console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );
+
+ }
+ },
+ shadowBias: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );
+ this.shadow.bias = value;
+
+ }
+ },
+ shadowDarkness: {
+ set: function () {
+
+ console.warn( 'THREE.Light: .shadowDarkness has been removed.' );
+
+ }
+ },
+ shadowMapWidth: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );
+ this.shadow.mapSize.width = value;
+
+ }
+ },
+ shadowMapHeight: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );
+ this.shadow.mapSize.height = value;
+
+ }
+ }
+} );
+
+//
+
+Object.defineProperties( BufferAttribute.prototype, {
+
+ length: {
+ get: function () {
+
+ console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );
+ return this.array.length;
+
+ }
+ },
+ dynamic: {
+ get: function () {
+
+ console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );
+ return this.usage === DynamicDrawUsage;
+
+ },
+ set: function ( /* value */ ) {
+
+ console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );
+ this.setUsage( DynamicDrawUsage );
+
+ }
+ }
+
+} );
+
+BufferAttribute.prototype.setDynamic = function ( value ) {
+
+ console.warn( 'THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.' );
+ this.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );
+ return this;
+
+};
+
+BufferAttribute.prototype.copyIndicesArray = function ( /* indices */ ) {
+
+ console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' );
+
+},
+
+BufferAttribute.prototype.setArray = function ( /* array */ ) {
+
+ console.error( 'THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );
+
+};
+
+//
+
+BufferGeometry.prototype.addIndex = function ( index ) {
+
+ console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );
+ this.setIndex( index );
+
+};
+
+BufferGeometry.prototype.addAttribute = function ( name, attribute ) {
+
+ console.warn( 'THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().' );
+
+ if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) {
+
+ console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );
+
+ return this.setAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );
+
+ }
+
+ if ( name === 'index' ) {
+
+ console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );
+ this.setIndex( attribute );
+
+ return this;
+
+ }
+
+ return this.setAttribute( name, attribute );
+
+};
+
+BufferGeometry.prototype.addDrawCall = function ( start, count, indexOffset ) {
+
+ if ( indexOffset !== undefined ) {
+
+ console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );
+
+ }
+
+ console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );
+ this.addGroup( start, count );
+
+};
+
+BufferGeometry.prototype.clearDrawCalls = function () {
+
+ console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );
+ this.clearGroups();
+
+};
+
+BufferGeometry.prototype.computeOffsets = function () {
+
+ console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );
+
+};
+
+BufferGeometry.prototype.removeAttribute = function ( name ) {
+
+ console.warn( 'THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().' );
+
+ return this.deleteAttribute( name );
+
+};
+
+BufferGeometry.prototype.applyMatrix = function ( matrix ) {
+
+ console.warn( 'THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().' );
+ return this.applyMatrix4( matrix );
+
+};
+
+Object.defineProperties( BufferGeometry.prototype, {
+
+ drawcalls: {
+ get: function () {
+
+ console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );
+ return this.groups;
+
+ }
+ },
+ offsets: {
+ get: function () {
+
+ console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );
+ return this.groups;
+
+ }
+ }
+
+} );
+
+InterleavedBuffer.prototype.setDynamic = function ( value ) {
+
+ console.warn( 'THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.' );
+ this.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );
+ return this;
+
+};
+
+InterleavedBuffer.prototype.setArray = function ( /* array */ ) {
+
+ console.error( 'THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );
+
+};
+
+//
+
+ExtrudeGeometry.prototype.getArrays = function () {
+
+ console.error( 'THREE.ExtrudeGeometry: .getArrays() has been removed.' );
+
+};
+
+ExtrudeGeometry.prototype.addShapeList = function () {
+
+ console.error( 'THREE.ExtrudeGeometry: .addShapeList() has been removed.' );
+
+};
+
+ExtrudeGeometry.prototype.addShape = function () {
+
+ console.error( 'THREE.ExtrudeGeometry: .addShape() has been removed.' );
+
+};
+
+//
+
+Scene.prototype.dispose = function () {
+
+ console.error( 'THREE.Scene: .dispose() has been removed.' );
+
+};
+
+//
+
+Uniform.prototype.onUpdate = function () {
+
+ console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );
+ return this;
+
+};
+
+//
+
+Object.defineProperties( Material.prototype, {
+
+ wrapAround: {
+ get: function () {
+
+ console.warn( 'THREE.Material: .wrapAround has been removed.' );
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.Material: .wrapAround has been removed.' );
+
+ }
+ },
+
+ overdraw: {
+ get: function () {
+
+ console.warn( 'THREE.Material: .overdraw has been removed.' );
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.Material: .overdraw has been removed.' );
+
+ }
+ },
+
+ wrapRGB: {
+ get: function () {
+
+ console.warn( 'THREE.Material: .wrapRGB has been removed.' );
+ return new Color();
+
+ }
+ },
+
+ shading: {
+ get: function () {
+
+ console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
+ this.flatShading = ( value === FlatShading );
+
+ }
+ },
+
+ stencilMask: {
+ get: function () {
+
+ console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );
+ return this.stencilFuncMask;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );
+ this.stencilFuncMask = value;
+
+ }
+ },
+
+ vertexTangents: {
+ get: function () {
+
+ console.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' );
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' );
+
+ }
+ },
+
+} );
+
+Object.defineProperties( ShaderMaterial.prototype, {
+
+ derivatives: {
+ get: function () {
+
+ console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );
+ return this.extensions.derivatives;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );
+ this.extensions.derivatives = value;
+
+ }
+ }
+
+} );
+
+//
+
+WebGLRenderer.prototype.clearTarget = function ( renderTarget, color, depth, stencil ) {
+
+ console.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' );
+ this.setRenderTarget( renderTarget );
+ this.clear( color, depth, stencil );
+
+};
+
+WebGLRenderer.prototype.animate = function ( callback ) {
+
+ console.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' );
+ this.setAnimationLoop( callback );
+
+};
+
+WebGLRenderer.prototype.getCurrentRenderTarget = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );
+ return this.getRenderTarget();
+
+};
+
+WebGLRenderer.prototype.getMaxAnisotropy = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' );
+ return this.capabilities.getMaxAnisotropy();
+
+};
+
+WebGLRenderer.prototype.getPrecision = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' );
+ return this.capabilities.precision;
+
+};
+
+WebGLRenderer.prototype.resetGLState = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' );
+ return this.state.reset();
+
+};
+
+WebGLRenderer.prototype.supportsFloatTextures = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' );
+ return this.extensions.get( 'OES_texture_float' );
+
+};
+
+WebGLRenderer.prototype.supportsHalfFloatTextures = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' );
+ return this.extensions.get( 'OES_texture_half_float' );
+
+};
+
+WebGLRenderer.prototype.supportsStandardDerivatives = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' );
+ return this.extensions.get( 'OES_standard_derivatives' );
+
+};
+
+WebGLRenderer.prototype.supportsCompressedTextureS3TC = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' );
+ return this.extensions.get( 'WEBGL_compressed_texture_s3tc' );
+
+};
+
+WebGLRenderer.prototype.supportsCompressedTexturePVRTC = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' );
+ return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );
+
+};
+
+WebGLRenderer.prototype.supportsBlendMinMax = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' );
+ return this.extensions.get( 'EXT_blend_minmax' );
+
+};
+
+WebGLRenderer.prototype.supportsVertexTextures = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );
+ return this.capabilities.vertexTextures;
+
+};
+
+WebGLRenderer.prototype.supportsInstancedArrays = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' );
+ return this.extensions.get( 'ANGLE_instanced_arrays' );
+
+};
+
+WebGLRenderer.prototype.enableScissorTest = function ( boolean ) {
+
+ console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );
+ this.setScissorTest( boolean );
+
+};
+
+WebGLRenderer.prototype.initMaterial = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.addPrePlugin = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.addPostPlugin = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.updateShadowMap = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.setFaceCulling = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.allocTextureUnit = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .allocTextureUnit() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.setTexture = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .setTexture() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.setTexture2D = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .setTexture2D() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.setTextureCube = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .setTextureCube() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.getActiveMipMapLevel = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().' );
+ return this.getActiveMipmapLevel();
+
+};
+
+Object.defineProperties( WebGLRenderer.prototype, {
+
+ shadowMapEnabled: {
+ get: function () {
+
+ return this.shadowMap.enabled;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );
+ this.shadowMap.enabled = value;
+
+ }
+ },
+ shadowMapType: {
+ get: function () {
+
+ return this.shadowMap.type;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );
+ this.shadowMap.type = value;
+
+ }
+ },
+ shadowMapCullFace: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );
+ return undefined;
+
+ },
+ set: function ( /* value */ ) {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );
+
+ }
+ },
+ context: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.' );
+ return this.getContext();
+
+ }
+ },
+ vr: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .vr has been renamed to .xr' );
+ return this.xr;
+
+ }
+ },
+ gammaInput: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );
+ return false;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );
+
+ }
+ },
+ gammaOutput: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );
+ return false;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );
+ this.outputEncoding = ( value === true ) ? sRGBEncoding : LinearEncoding;
+
+ }
+ },
+ toneMappingWhitePoint: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );
+ return 1.0;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );
+
+ }
+ },
+ gammaFactor: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' );
+ return 2;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' );
+
+ }
+ }
+} );
+
+Object.defineProperties( WebGLShadowMap.prototype, {
+
+ cullFace: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );
+ return undefined;
+
+ },
+ set: function ( /* cullFace */ ) {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );
+
+ }
+ },
+ renderReverseSided: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );
+ return undefined;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );
+
+ }
+ },
+ renderSingleSided: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );
+ return undefined;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );
+
+ }
+ }
+
+} );
+
+function WebGLRenderTargetCube( width, height, options ) {
+
+ console.warn( 'THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).' );
+ return new WebGLCubeRenderTarget( width, options );
+
+}
+
+//
+
+Object.defineProperties( WebGLRenderTarget.prototype, {
+
+ wrapS: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );
+ return this.texture.wrapS;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );
+ this.texture.wrapS = value;
+
+ }
+ },
+ wrapT: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );
+ return this.texture.wrapT;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );
+ this.texture.wrapT = value;
+
+ }
+ },
+ magFilter: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );
+ return this.texture.magFilter;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );
+ this.texture.magFilter = value;
+
+ }
+ },
+ minFilter: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );
+ return this.texture.minFilter;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );
+ this.texture.minFilter = value;
+
+ }
+ },
+ anisotropy: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );
+ return this.texture.anisotropy;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );
+ this.texture.anisotropy = value;
+
+ }
+ },
+ offset: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );
+ return this.texture.offset;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );
+ this.texture.offset = value;
+
+ }
+ },
+ repeat: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );
+ return this.texture.repeat;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );
+ this.texture.repeat = value;
+
+ }
+ },
+ format: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );
+ return this.texture.format;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );
+ this.texture.format = value;
+
+ }
+ },
+ type: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );
+ return this.texture.type;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );
+ this.texture.type = value;
+
+ }
+ },
+ generateMipmaps: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );
+ return this.texture.generateMipmaps;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );
+ this.texture.generateMipmaps = value;
+
+ }
+ }
+
+} );
+
+//
+
+Audio.prototype.load = function ( file ) {
+
+ console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );
+ const scope = this;
+ const audioLoader = new AudioLoader();
+ audioLoader.load( file, function ( buffer ) {
+
+ scope.setBuffer( buffer );
+
+ } );
+ return this;
+
+};
+
+
+AudioAnalyser.prototype.getData = function () {
+
+ console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );
+ return this.getFrequencyData();
+
+};
+
+//
+
+CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) {
+
+ console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' );
+ return this.update( renderer, scene );
+
+};
+
+CubeCamera.prototype.clear = function ( renderer, color, depth, stencil ) {
+
+ console.warn( 'THREE.CubeCamera: .clear() is now .renderTarget.clear().' );
+ return this.renderTarget.clear( renderer, color, depth, stencil );
+
+};
+
+ImageUtils.crossOrigin = undefined;
+
+ImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) {
+
+ console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );
+
+ const loader = new TextureLoader();
+ loader.setCrossOrigin( this.crossOrigin );
+
+ const texture = loader.load( url, onLoad, undefined, onError );
+
+ if ( mapping ) texture.mapping = mapping;
+
+ return texture;
+
+};
+
+ImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) {
+
+ console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );
+
+ const loader = new CubeTextureLoader();
+ loader.setCrossOrigin( this.crossOrigin );
+
+ const texture = loader.load( urls, onLoad, undefined, onError );
+
+ if ( mapping ) texture.mapping = mapping;
+
+ return texture;
+
+};
+
+ImageUtils.loadCompressedTexture = function () {
+
+ console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );
+
+};
+
+ImageUtils.loadCompressedTextureCube = function () {
+
+ console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );
+
+};
+
+//
+
+function CanvasRenderer() {
+
+ console.error( 'THREE.CanvasRenderer has been removed' );
+
+}
+
+//
+
+function JSONLoader() {
+
+ console.error( 'THREE.JSONLoader has been removed.' );
+
+}
+
+//
+
+const SceneUtils = {
+
+ createMultiMaterialObject: function ( /* geometry, materials */ ) {
+
+ console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );
+
+ },
+
+ detach: function ( /* child, parent, scene */ ) {
+
+ console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );
+
+ },
+
+ attach: function ( /* child, scene, parent */ ) {
+
+ console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );
+
+ }
+
+};
+
+//
+
+function LensFlare() {
+
+ console.error( 'THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js' );
+
+}
+
+//
+
+function ParametricGeometry() {
+
+ console.error( 'THREE.ParametricGeometry has been moved to /examples/jsm/geometries/ParametricGeometry.js' );
+ return new BufferGeometry();
+
+}
+
+function TextGeometry() {
+
+ console.error( 'THREE.TextGeometry has been moved to /examples/jsm/geometries/TextGeometry.js' );
+ return new BufferGeometry();
+
+}
+
+function FontLoader() {
+
+ console.error( 'THREE.FontLoader has been moved to /examples/jsm/loaders/FontLoader.js' );
+
+}
+
+function Font() {
+
+ console.error( 'THREE.Font has been moved to /examples/jsm/loaders/FontLoader.js' );
+
+}
+
+function ImmediateRenderObject() {
+
+ console.error( 'THREE.ImmediateRenderObject has been removed.' );
+
+}
+
+function WebGLMultisampleRenderTarget( width, height, options ) {
+
+ console.error( 'THREE.WebGLMultisampleRenderTarget has been removed. Use a normal render target and set the "samples" property to greater 0 to enable multisampling.' );
+ const renderTarget = new WebGLRenderTarget( width, height, options );
+ renderTarget.samples = 4;
+ return renderTarget;
+
+}
+
+function DataTexture2DArray( data, width, height, depth ) {
+
+ console.warn( 'THREE.DataTexture2DArray has been renamed to DataArrayTexture.' );
+ return new DataArrayTexture( data, width, height, depth );
+
+}
+
+function DataTexture3D( data, width, height, depth ) {
+
+ console.warn( 'THREE.DataTexture3D has been renamed to Data3DTexture.' );
+ return new Data3DTexture( data, width, height, depth );
+
+}
+
+if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {
+
+ __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {
+ revision: REVISION,
+ } } ) );
+
+}
+
+if ( typeof window !== 'undefined' ) {
+
+ if ( window.__THREE__ ) {
+
+ console.warn( 'WARNING: Multiple instances of Three.js being imported.' );
+
+ } else {
+
+ window.__THREE__ = REVISION;
+
+ }
+
+}
+
+/**
+ * Three targets are provided for both GLSL and Sculpt/JS api.
+ *
+ * 1: source -> Threejs shader source components (easy customization)
+ * 2: source -> Threejs material
+ * 3: source -> Threejs mesh (easy to use)
+ *
+ * TODO: make these materials 'plug in' to threejs' lighting model, like unity's surface shaders
+ */
+
+function glslToThreeJSShaderSource(source) {
+ return {
+ uniforms: baseUniforms(),
+ frag: threeHeader + 'const float STEP_SIZE_CONSTANT = 0.9;\n' + 'const int MAX_ITERATIONS = 300;\n' + uniformsToGLSL(baseUniforms()) + sculptureStarterCode + source + fragFooter,
+ vert: threeJSVertexSource
+ };
+}
+function glslToThreeJSMaterial(source, payload) {
+ var src = glslToThreeJSShaderSource(source);
+ return makeMaterial(src.uniforms, src.vert, src.frag, payload);
+}
+function glslToThreeJSMesh(source, payload) {
+ return makeBasicMesh(glslToThreeJSMaterial(source, payload));
+}
+function sculptToThreeJSShaderSource(source) {
+ var src = sculptToGLSL(source);
+
+ if (src.error) {
+ console.log(src.error);
+ }
+
+ var frg = threeHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(src.uniforms) + 'const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL + '\n' + src.colorGLSL + '\n' + fragFooter;
+ return {
+ uniforms: src.uniforms,
+ frag: frg,
+ vert: threeJSVertexSource,
+ error: src.error,
+ geoGLSL: src.geoGLSL,
+ colorGLSL: src.colorGLSL
+ };
+}
+function sculptToThreeJSMaterial(source, payload) {
+ var src = sculptToThreeJSShaderSource(source);
+ var material = makeMaterial(src.uniforms, src.vert, src.frag, payload);
+ material.uniformDescriptions = src.uniforms;
+ return material;
+}
+function sculptToThreeJSMesh(source, payload) {
+ source = convertFunctionToString(source);
+ return makeBasicMesh(sculptToThreeJSMaterial(source, payload));
+}
+function createSculptureWithGeometry(geometry, source) {
+ var uniformCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {
+ return {};
+ };
+ var params = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
+ geometry.computeBoundingSphere();
+ var radius = 'radius' in params ? params.radius : geometry.boundingSphere.radius;
+ params.radius = radius;
+ params.geometry = geometry;
+ return createSculpture(source, uniformCallback, params);
+} // uniformCallback
+
+function createSculpture(source) {
+ var uniformCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
+ return {};
+ };
+ var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ source = convertFunctionToString(source);
+ var radius = 'radius' in params ? params.radius : 2;
+ var geometry;
+
+ if ('geometry' in params) {
+ geometry = params.geometry;
+ } else {
+ var segments = 'segments' in params ? params.segments : 8;
+ geometry = new SphereGeometry(radius, segments, segments);
+ }
+
+ var material = sculptToThreeJSMaterial(source);
+ material.uniforms['opacity'].value = 1.0;
+ material.uniforms['mouse'].value = new Vector3();
+ material.uniforms['_scale'].value = radius;
+ var mesh = new Mesh(geometry, material);
+
+ mesh.onBeforeRender = function (renderer, scene, camera, geometry, material, group) {
+ var uniformsToUpdate = uniformCallback();
+
+ if (!(_typeof(uniformsToUpdate) === "object")) {
+ throw "createSculpture takes, (source, uniformCallback, params) the uniformCallback must be a function that returns a dictionary of uniforms to update";
+ }
+
+ for (var _i = 0, _Object$entries = Object.entries(uniformsToUpdate); _i < _Object$entries.length; _i++) {
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
+ uniform = _Object$entries$_i[0],
+ value = _Object$entries$_i[1];
+
+ material.uniforms[uniform].value = value;
+ } // material.uniforms['sculptureCenter'].value = geometry.position;
+
+ };
+
+ return mesh;
+}
+
+function uniformDescriptionToThreeJSFormat(unifs, payload) {
+ var finalUniforms = {};
+
+ if (payload && payload !== undefined && payload.msdfTexture !== undefined) {
+ finalUniforms["msdf"] = {
+ value: payload.msdfTexture || new Texture()
+ };
+ }
+
+ unifs.forEach(function (uniform) {
+ if (uniform.type === 'float') {
+ finalUniforms[uniform.name] = {
+ value: uniform.value
+ };
+ } else if (uniform.type === 'vec2') {
+ finalUniforms[uniform.name] = {
+ value: new Vector2(uniform.value.x, uniform.value.y)
+ };
+ } else if (uniform.type === 'vec3') {
+ finalUniforms[uniform.name] = {
+ value: new Vector3(uniform.value.x, uniform.value.y, uniform.value.z)
+ };
+ } else if (uniform.type === 'vec4') {
+ finalUniforms[uniform.name] = {
+ value: new Vector4(uniform.value.x, uniform.value.y, uniform.value.z, uniform.value.w)
+ };
+ }
+ });
+ return finalUniforms;
+} // could use a scale parameter
+
+
+function makeMaterial(unifs, vert, frag, payload) {
+ var material = new ShaderMaterial({
+ uniforms: uniformDescriptionToThreeJSFormat(unifs, payload),
+ vertexShader: vert,
+ fragmentShader: frag,
+ transparent: true,
+ side: BackSide
+ });
+ material.extensions.fragDepth = false;
+ return material;
+} // There should be more options supported like size and shape
+
+
+function makeBasicMesh(material) {
+ return new Mesh(new BoxGeometry(2, 2, 2), material);
+}
+
+function uniformToCpp(uniforms) {
+ var res = '';
+
+ for (var i = 0; i < uniforms.length; i++) {
+ var unif = uniforms[i];
+ res += unif.type + ' ' + unif.name + ' = ';
+
+ if (typeof unif.value === 'number') {
+ // float
+ res += unif.value + 0.0000001 + 'f';
+ } else {
+ // vec
+ res += 'vec' + unif.value.length + '(';
+
+ for (var j = 0; j < unif.value.length; j++) {
+ res += unif.value[j] + 0.0000001 + 'f';
+
+ if (j + 1 < unif.value.length) {
+ res += ', ';
+ }
+ }
+
+ res += ')';
+ }
+
+ res += ';\n';
+ }
+
+ return res;
+}
+
+var cppFooter = "\n\n";
+var cppHeader = uniformToCpp(baseUniforms());
+
+function glslToGLM(source) {
+ // converts all numbers to floats
+ var result = source.replace(/([^a-zA-Z][0-9]+([.][^a-zA-Z][0-9]*)|[.][0-9]+)()/g, '$1f'); // adds parentheses after swizzling for glm to pick up
+
+ result = result.replace(/([a-zA-Z0-9][.][w-z]{2,})()/g, '$1()');
+ return result;
+}
+
+function glslToOfflineRenderer(source) {}
+function sculptToOfflineRenderer(source) {
+ var src = sculptToGLSL(source); //console.log(filteredStarter);
+
+ return cppHeader + glslToGLM('const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + 'f;\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL + src.colorGLSL) + cppFooter;
+}
+
+function glslToMinimalRenderer(canvas, source, updateUniforms) {
+ var fullFrag = minimalHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(baseUniforms()) + 'const float STEP_SIZE_CONSTANT = 0.9;\n' + 'const int MAX_ITERATIONS = 300;\n' + sculptureStarterCode + source + fragFooter;
+ return fragToMinimalRenderer(canvas, fullFrag, updateUniforms);
+}
+/**
+ * for fast and efficient use on the web
+ * input - sculpt code
+ * output - a fully self-contained lightweight html file which renders the sculpture
+ **/
+
+function sculptToMinimalRenderer(canvas, source, updateUniforms) {
+ if (typeof source === "function") {
+ source = source.toString();
+ source = source.slice(source.indexOf("{") + 1, source.lastIndexOf("}"));
+ } else if (!(typeof source === "string")) {
+ throw "sculptToMinimalRenderer requires the source code to be a function, or a string";
+ }
+
+ var generatedGLSL = sculptToGLSL(source);
+ var fullFrag = minimalHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(generatedGLSL.uniforms) + 'const float STEP_SIZE_CONSTANT = ' + generatedGLSL.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + generatedGLSL.maxIterations + ';\n' + sculptureStarterCode + generatedGLSL.geoGLSL + '\n' + generatedGLSL.colorGLSL + '\n' + fragFooter;
+ return fragToMinimalRenderer(canvas, fullFrag, updateUniforms);
+}
+
+function fragToMinimalRenderer(canvas, fullFrag, updateUniforms) {
+ // if no update function is provided assume no-op
+ if (updateUniforms === undefined) {
+ updateUniforms = function updateUniforms() {
+ return {};
+ };
+ }
+
+ function resizeCanvas() {
+ var devicePixelRatio = window.devicePixelRatio || 1; // change this so canvas doesn't have to fill entire window
+
+ var width = window.innerWidth * devicePixelRatio;
+ var height = window.innerHeight * devicePixelRatio;
+
+ if (canvas.width != width || canvas.height != height) {
+ canvas.width = width;
+ canvas.height = height;
+ }
+ }
+
+ resizeCanvas();
+ window.addEventListener('resize', resizeCanvas);
+ var gl = canvas.getContext('webgl2');
+ var vertices = [-1.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0];
+ var indices = [3, 2, 1, 3, 1, 0];
+ var vertex_buffer = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
+ var Index_Buffer = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, Index_Buffer);
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
+ var vertShader = gl.createShader(gl.VERTEX_SHADER);
+ gl.shaderSource(vertShader, minimalVertexSource);
+ gl.compileShader(vertShader);
+ var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
+ gl.shaderSource(fragShader, fullFrag);
+ gl.compileShader(fragShader);
+
+ var logShaderComp = function logShaderComp(shader) {
+ var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
+ console.log('Shader compiled successfully: ' + compiled);
+ var compilationLog = gl.getShaderInfoLog(shader);
+ if (!compiled) console.error('Shader compiler log: ' + compilationLog);
+ };
+
+ logShaderComp(vertShader);
+ logShaderComp(fragShader);
+ var shaderProgram = gl.createProgram();
+ gl.attachShader(shaderProgram, vertShader);
+ gl.attachShader(shaderProgram, fragShader);
+ gl.linkProgram(shaderProgram); // Check if it linked.
+
+ var success = gl.getProgramParameter(shaderProgram, gl.LINK_STATUS);
+
+ if (!success) {
+ // something went wrong with the link; get the error
+ console.error("program failed to link:" + gl.getProgramInfoLog(shaderProgram));
+ }
+
+ gl.useProgram(shaderProgram);
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, Index_Buffer);
+ var coord = gl.getAttribLocation(shaderProgram, "coordinates");
+ gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, 0, 0);
+ gl.enableVertexAttribArray(coord);
+ gl.clearColor(1.0, 1.0, 1.0, 0.9);
+ gl.enable(gl.DEPTH_TEST);
+ var oTime = Date.now();
+ var loc = gl.getUniformLocation(shaderProgram, "time");
+
+ var _scale = gl.getUniformLocation(shaderProgram, "_scale");
+
+ var resolution = gl.getUniformLocation(shaderProgram, "resolution");
+ var opac = gl.getUniformLocation(shaderProgram, "opacity");
+ var mouseloc = gl.getUniformLocation(shaderProgram, "mouse");
+ gl.uniform1f(opac, 1.0);
+ gl.uniform1f(_scale, 1.0);
+ var userUniformUpdateFuncs = assignUniforms(updateUniforms);
+ canvas.addEventListener("pointermove", function (e) {
+ var devicePixelRatio = window.devicePixelRatio || 1;
+ var canvasX = (e.pageX - canvas.offsetLeft) * devicePixelRatio;
+ var canvasY = (e.pageY - canvas.offsetTop) * devicePixelRatio;
+ gl.uniform3f(mouseloc, 2.0 * canvasX / canvas.width - 1.0, 2.0 * (1.0 - canvasY / canvas.height) - 1.0, -0.5);
+ }, false);
+
+ function updateDraw() {
+ if (typeof updateUniforms === 'function') {
+ callUniformFuncs(userUniformUpdateFuncs, updateUniforms());
+ }
+
+ gl.uniform1f(loc, (Date.now() - oTime) * 0.001);
+ var devicePixelRatio = window.devicePixelRatio || 1;
+ var wwidth = window.innerWidth * devicePixelRatio;
+ var wheight = window.innerHeight * devicePixelRatio;
+ gl.uniform2fv(resolution, [wwidth, wheight]);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.viewport(0, 0, canvas.width, canvas.height);
+ gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0);
+ window.requestAnimationFrame(updateDraw);
+ }
+
+ updateDraw(); // loops through a dictionary and calls the function sotred in the value
+
+ function callUniformFuncs(uniformFuncs, updatedUniforms) {
+ if (_typeof(updatedUniforms) !== 'object') {
+ console.error('updateUniforms must return a dictionary of uniform names and values. Instead got: ', updateUniforms);
+ return;
+ }
+
+ Object.entries(uniformFuncs).forEach(function (keys) {
+ var _keys = _slicedToArray(keys, 2),
+ key = _keys[0],
+ uniformUpdateFunc = _keys[1];
+
+ if (key in updatedUniforms) {
+ uniformUpdateFunc(updatedUniforms[key]);
+ }
+ });
+ }
+
+ function assignUniforms(updateUniforms) {
+ if (typeof updateUniforms !== 'function') {
+ console.error('updateUniforms must be a function that returns a dictionary of uniform names and values');
+ return {};
+ }
+
+ var userUniformUpdateFuncs = {};
+ var uniformsDict = updateUniforms();
+
+ if (uniformsDict !== undefined && _typeof(uniformsDict) === 'object') {
+ Object.entries(uniformsDict).forEach(function (keys) {
+ var _keys2 = _slicedToArray(keys, 2),
+ key = _keys2[0],
+ val = _keys2[1];
+
+ var unifLocation = gl.getUniformLocation(shaderProgram, key);
+
+ if (typeof val === 'number') {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform1f(unifLocation, unif);
+ };
+ } else if (Array.isArray(val)) {
+ if (val.length === 1) {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform1f(unifLocation, unif[0]);
+ };
+ } else if (val.length === 2) {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform2iv(unifLocation, unif);
+ };
+ } else if (val.length === 3) {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform3iv(unifLocation, unif);
+ };
+ } else if (val.length === 4) {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform4iv(unifLocation, unif);
+ };
+ } else {
+ console.error('Uniforms must be either a float or an array with length 1, 2, 3 or 4');
+ }
+ } else {
+ console.error('Uniforms must be either a float or an array with length 1, 2, 3 or 4');
+ }
+ });
+ }
+
+ return userUniformUpdateFuncs;
+ }
+}
+
+/**
+ * for fast tesing
+ * input - sculpt code
+ * output - self-contained lightweight html which renders the sculpture
+ **/
+function sculptToMinimalHTMLRenderer(spCode, libPath) {
+ return makeHTML(spCode, 'sculptToMinimalRenderer', libPath);
+}
+function glslToMinimalHTMLRenderer(spCode, libPath) {
+ return makeHTML(spCode, 'glslToMinimalRenderer', libPath);
+}
+
+function makeHTML(spCode, minRenderFunc, libPath) {
+ return "\n\n\n Shader Park\n \n \n \n \n \n \n \n\n");
+}
+
+/**
+ * export for meshing with https://github.com/tdhooper/glsl-marching-cubes
+ * input - sculpt code
+ * output - glsl containing "mapDistance"
+ **/
+
+function sculptToRawSDF4Meshing(source) {
+ var minimalHeader = "\nprecision highp float;\nuniform float w_width;\nuniform float w_height;\nuniform mat4 projectionMatrix;\n#define cameraPosition vec3(0.0,0.0,-1.0)\n#define vUv vec2(0.0)\n#define worldPos vec4(vec2((gl_FragCoord.x/w_width-0.5)*(w_width/w_height),gl_FragCoord.y/w_height-0.5)*1.75,0.0,0.0)\n#define STEP_SIZE_CONSTANT 0.9\n#define MAX_ITERATIONS 300\n#define stepSize 0.9\n#define mouse vec3(0.0)\n#define time 0.0\n";
+ var generatedGLSL = sculptToGLSL(source);
+ var fullFrag = minimalHeader + usePBRHeader + useHemisphereLight //+ uniformsToGLSL(generatedGLSL.uniforms)
+ + sculptureStarterCode + generatedGLSL.geoGLSL;
+ return fullFrag.replace(/surfaceDistance/g, 'mapDistance');
+}
+
+/**
+ * TD target for GLSL and Sculpt/JS api.
+ *
+ * TODO: make these materials 'plug in' to Touch Designer's ' PBR lighting model.
+ */
+
+var TDHeader = "\nuniform float uShadowStrength;\nuniform vec3 uShadowColor;\nuniform vec4 uBaseColor;\nuniform float uMetallic;\nuniform float uRoughness;\nuniform float uSpecularLevel;\nuniform float uAmbientOcclusion;\nuniform vec3 cameraPosition;\nuniform sampler2D sBaseColorMap;\nuniform float useTDLighting;\n\n\nin Vertex\n{\n\tvec4 color;\n\tvec3 worldSpacePos;\n\tvec3 worldSpaceNorm;\n\tflat int cameraIndex;\n\tvec2 texCoord0;\n\tvec3 sculptureCenter;\n} iVert;\n\n#define sculptureCenter iVert.sculptureCenter;\n#define worldPos iVert.worldSpacePos\nlayout(location = 0) out vec4 oFragColor[TD_NUM_COLOR_BUFFERS];\nout float depthTexture;\n";
+var TDFooter = "\nvoid main()\n{\n\t// This allows things such as order independent transparency\n\t// and Dual-Paraboloid rendering to work properly\n\tTDCheckDiscard();\n\n\t// Raymarching\n\tvec3 rayOrigin = worldPos.xyz-sculptureCenter;\n\tvec3 rayDirection = getRayDirection();\n\trayOrigin -= rayDirection*2.0;\n\tfloat t = intersect(rayOrigin, rayDirection, stepSize);\n depthTexture = t;\n\n\tvec4 outcol = vec4(0.0, 0.0, 0.0, 0.0);\n\tvec3 diffuseSum = vec3(0.0, 0.0, 0.0);\n\tvec3 specularSum = vec3(0.0, 0.0, 0.0);\n\n\tvec3 worldSpaceNorm = normalize(iVert.worldSpaceNorm.xyz);\n\t// vec3 normal = normalize(worldSpaceNorm.xyz);\n\tif(t < 2.5) {\n\t\tvec3 p = (rayOrigin + rayDirection*t);\n\t\tvec3 normal = calcNormal(p);\n\t\tvec3 raymarchedColor = shade(p, normal);\n\t\n\t\tvec3 baseColor = uBaseColor.rgb;\n\n\t\t// 0.08 is the value for dielectric specular that\n\t\t// Substance Designer uses for it's top-end.\n\t\tfloat specularLevel = 0.08 * uSpecularLevel;\n\t\tfloat metallic = uMetallic;\n\n\t\tfloat roughness = uRoughness;\n\n\t\tfloat ambientOcclusion = uAmbientOcclusion;\n\n\t\tvec3 finalBaseColor = baseColor.rgb * iVert.color.rgb;\n\n\t\tvec2 texCoord0 = iVert.texCoord0.st;\n\t\tvec4 baseColorMap = texture(sBaseColorMap, texCoord0.st);\n\t\tfinalBaseColor *= baseColorMap.rgb;\n\n\n\t\t// A roughness of exactly 0 is not allowed\n\t\troughness = max(roughness, 0.0001);\n\n\t\tvec3 pbrDiffuseColor = finalBaseColor * (1.0 - metallic);\n\t\tvec3 pbrSpecularColor = mix(vec3(specularLevel), finalBaseColor, metallic);\n\n\t\tvec3 viewVec = normalize(uTDMats[iVert.cameraIndex].camInverse[3].xyz - iVert.worldSpacePos.xyz );\n\n\n\t\t// Your shader will be recompiled based on the number\n\t\t// of lights in your scene, so this continues to work\n\t\t// even if you change your lighting setup after the shader\n\t\t// has been exported from the Phong MAT\n\t\tfor (int i = 0; i < TD_NUM_LIGHTS; i++)\n\t\t{\n\t\t\tTDPBRResult res;\n\t\t\tres = TDLightingPBR(i,\n\t\t\t\t\t\t\t\tpbrDiffuseColor,\n\t\t\t\t\t\t\t\tpbrSpecularColor,\n\t\t\t\t\t\t\t\tiVert.worldSpacePos.xyz,\n\t\t\t\t\t\t\t\tnormal,\n\t\t\t\t\t\t\t\tuShadowStrength, uShadowColor,\n\t\t\t\t\t\t\t\tviewVec,\n\t\t\t\t\t\t\t\troughness);\n\t\t\tdiffuseSum += res.diffuse;\n\t\t\tspecularSum += res.specular;\n\t\t}\n\n\t\t// Environment lights\n\t\tfor (int i = 0; i < TD_NUM_ENV_LIGHTS; i++)\n\t\t{\n\t\t\tTDPBRResult res;\n\t\t\tres = TDEnvLightingPBR(i,\n\t\t\t\t\t\tpbrDiffuseColor,\n\t\t\t\t\t\tpbrSpecularColor,\n\t\t\t\t\t\tnormal,\n\t\t\t\t\t\tviewVec,\n\t\t\t\t\t\troughness,\n\t\t\t\t\t\tambientOcclusion);\n\t\t\tdiffuseSum += res.diffuse;\n\t\t\tspecularSum += res.specular;\n\t\t}\n\t\t// Final Diffuse Contribution\n\t\tvec3 finalDiffuse = diffuseSum;\n\t\toutcol.rgb += finalDiffuse;\n\n\t\t// Final Specular Contribution\n\t\tvec3 finalSpecular = vec3(0.0);\n\t\tfinalSpecular += specularSum;\n\n\t\toutcol.rgb += finalSpecular;\n\n\n\t\t// Apply fog, this does nothing if fog is disabled\n\t\toutcol = TDFog(outcol, iVert.worldSpacePos.xyz, iVert.cameraIndex);\n\n\t\t// Alpha Calculation\n\t\tfloat alpha = uBaseColor.a * iVert.color.a ;\n\n\t\t// Dithering, does nothing if dithering is disabled\n\t\toutcol = TDDither(outcol);\n\n\t\toutcol.rgb *= alpha;\n\n\t\t// Modern GL removed the implicit alpha test, so we need to apply\n\t\t// it manually here. This function does nothing if alpha test is disabled.\n\t\tTDAlphaTest(alpha);\n\n\t\toutcol.a = alpha;\n\t\toutcol = mix(vec4(raymarchedColor, 1.0), outcol, useTDLighting);\n\t\toFragColor[0] = TDOutputSwizzle(outcol);\n\n\n\t\t// TD_NUM_COLOR_BUFFERS will be set to the number of color buffers\n\t\t// active in the render. By default we want to output zero to every\n\t\t// buffer except the first one.\n\t\tfor (int i = 1; i < TD_NUM_COLOR_BUFFERS; i++)\n\t\t{\n\t\t\toFragColor[i] = vec4(0.0);\n\t\t}\n\t} else {\n\t\tdiscard;\n\t}\n}\n";
+function glslToTouchDesignerShaderSource(source) {
+ return {
+ uniforms: baseUniforms(),
+ frag: TDHeader + 'const float STEP_SIZE_CONSTANT = 0.9;\n' + 'const int MAX_ITERATIONS = 300;\n' + uniformsToGLSL(baseUniforms()) + sculptureStarterCode + source + TDFooter,
+ vert: minimalVertexSource
+ };
+}
+function sculptToTouchDesignerShaderSource(source) {
+ var src = sculptToGLSL(source);
+
+ if (src.error) {
+ console.log(src.error);
+ }
+
+ var frg = TDHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(src.uniforms) + 'const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL + '\n' + src.colorGLSL + '\n' + TDFooter;
+ var sdf = 'const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL;
+ return {
+ uniforms: src.uniforms,
+ frag: frg,
+ vert: minimalVertexSource,
+ error: src.error,
+ geoGLSL: src.geoGLSL,
+ colorGLSL: src.colorGLSL,
+ sdf: sdf,
+ glslUniforms: uniformsToGLSL(src.uniforms)
+ };
+}
+
+console.log('using shader-park-core version: 0.1.26'); /// Generate code for various targets
+
+exports.baseUniforms = baseUniforms;
+exports.bindStaticData = bindStaticData;
+exports.createSculpture = createSculpture;
+exports.createSculptureWithGeometry = createSculptureWithGeometry;
+exports.defaultFragSourceGLSL = defaultFragSourceGLSL;
+exports.fragFooter = fragFooter;
+exports.glslToMinimalHTMLRenderer = glslToMinimalHTMLRenderer;
+exports.glslToMinimalRenderer = glslToMinimalRenderer;
+exports.glslToOfflineRenderer = glslToOfflineRenderer;
+exports.glslToThreeJSMaterial = glslToThreeJSMaterial;
+exports.glslToThreeJSMesh = glslToThreeJSMesh;
+exports.glslToThreeJSShaderSource = glslToThreeJSShaderSource;
+exports.glslToTouchDesignerShaderSource = glslToTouchDesignerShaderSource;
+exports.minimalHeader = minimalHeader;
+exports.minimalVertexSource = minimalVertexSource;
+exports.sculptToGLSL = sculptToGLSL;
+exports.sculptToMinimalHTMLRenderer = sculptToMinimalHTMLRenderer;
+exports.sculptToMinimalRenderer = sculptToMinimalRenderer;
+exports.sculptToOfflineRenderer = sculptToOfflineRenderer;
+exports.sculptToRawSDF4Meshing = sculptToRawSDF4Meshing;
+exports.sculptToThreeJSMaterial = sculptToThreeJSMaterial;
+exports.sculptToThreeJSMesh = sculptToThreeJSMesh;
+exports.sculptToThreeJSShaderSource = sculptToThreeJSShaderSource;
+exports.sculptToTouchDesignerShaderSource = sculptToTouchDesignerShaderSource;
+exports.sculptureStarterCode = sculptureStarterCode;
+exports.uniformsToGLSL = uniformsToGLSL;
+exports.useHemisphereLight = useHemisphereLight;
+exports.usePBRHeader = usePBRHeader;
diff --git a/libai/shader-park-core.esm.js b/libai/shader-park-core.esm.js
new file mode 100644
index 0000000..883f952
--- /dev/null
+++ b/libai/shader-park-core.esm.js
@@ -0,0 +1,96358 @@
+/* Version: 0.1.26 - May 29, 2022 01:18:38 */
+function _typeof(obj) {
+ "@babel/helpers - typeof";
+
+ if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
+ _typeof = function (obj) {
+ return typeof obj;
+ };
+ } else {
+ _typeof = function (obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ }
+
+ return _typeof(obj);
+}
+
+var REACT_ELEMENT_TYPE;
+
+function _jsx(type, props, key, children) {
+ if (!REACT_ELEMENT_TYPE) {
+ REACT_ELEMENT_TYPE = typeof Symbol === "function" && Symbol["for"] && Symbol["for"]("react.element") || 0xeac7;
+ }
+
+ var defaultProps = type && type.defaultProps;
+ var childrenLength = arguments.length - 3;
+
+ if (!props && childrenLength !== 0) {
+ props = {
+ children: void 0
+ };
+ }
+
+ if (childrenLength === 1) {
+ props.children = children;
+ } else if (childrenLength > 1) {
+ var childArray = new Array(childrenLength);
+
+ for (var i = 0; i < childrenLength; i++) {
+ childArray[i] = arguments[i + 3];
+ }
+
+ props.children = childArray;
+ }
+
+ if (props && defaultProps) {
+ for (var propName in defaultProps) {
+ if (props[propName] === void 0) {
+ props[propName] = defaultProps[propName];
+ }
+ }
+ } else if (!props) {
+ props = defaultProps || {};
+ }
+
+ return {
+ $$typeof: REACT_ELEMENT_TYPE,
+ type: type,
+ key: key === undefined ? null : '' + key,
+ ref: null,
+ props: props,
+ _owner: null
+ };
+}
+
+function _asyncIterator(iterable) {
+ var method;
+
+ if (typeof Symbol !== "undefined") {
+ if (Symbol.asyncIterator) {
+ method = iterable[Symbol.asyncIterator];
+ if (method != null) return method.call(iterable);
+ }
+
+ if (Symbol.iterator) {
+ method = iterable[Symbol.iterator];
+ if (method != null) return method.call(iterable);
+ }
+ }
+
+ throw new TypeError("Object is not async iterable");
+}
+
+function _AwaitValue(value) {
+ this.wrapped = value;
+}
+
+function _AsyncGenerator(gen) {
+ var front, back;
+
+ function send(key, arg) {
+ return new Promise(function (resolve, reject) {
+ var request = {
+ key: key,
+ arg: arg,
+ resolve: resolve,
+ reject: reject,
+ next: null
+ };
+
+ if (back) {
+ back = back.next = request;
+ } else {
+ front = back = request;
+ resume(key, arg);
+ }
+ });
+ }
+
+ function resume(key, arg) {
+ try {
+ var result = gen[key](arg);
+ var value = result.value;
+ var wrappedAwait = value instanceof _AwaitValue;
+ Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
+ if (wrappedAwait) {
+ resume(key === "return" ? "return" : "next", arg);
+ return;
+ }
+
+ settle(result.done ? "return" : "normal", arg);
+ }, function (err) {
+ resume("throw", err);
+ });
+ } catch (err) {
+ settle("throw", err);
+ }
+ }
+
+ function settle(type, value) {
+ switch (type) {
+ case "return":
+ front.resolve({
+ value: value,
+ done: true
+ });
+ break;
+
+ case "throw":
+ front.reject(value);
+ break;
+
+ default:
+ front.resolve({
+ value: value,
+ done: false
+ });
+ break;
+ }
+
+ front = front.next;
+
+ if (front) {
+ resume(front.key, front.arg);
+ } else {
+ back = null;
+ }
+ }
+
+ this._invoke = send;
+
+ if (typeof gen.return !== "function") {
+ this.return = undefined;
+ }
+}
+
+if (typeof Symbol === "function" && Symbol.asyncIterator) {
+ _AsyncGenerator.prototype[Symbol.asyncIterator] = function () {
+ return this;
+ };
+}
+
+_AsyncGenerator.prototype.next = function (arg) {
+ return this._invoke("next", arg);
+};
+
+_AsyncGenerator.prototype.throw = function (arg) {
+ return this._invoke("throw", arg);
+};
+
+_AsyncGenerator.prototype.return = function (arg) {
+ return this._invoke("return", arg);
+};
+
+function _wrapAsyncGenerator(fn) {
+ return function () {
+ return new _AsyncGenerator(fn.apply(this, arguments));
+ };
+}
+
+function _awaitAsyncGenerator(value) {
+ return new _AwaitValue(value);
+}
+
+function _asyncGeneratorDelegate(inner, awaitWrap) {
+ var iter = {},
+ waiting = false;
+
+ function pump(key, value) {
+ waiting = true;
+ value = new Promise(function (resolve) {
+ resolve(inner[key](value));
+ });
+ return {
+ done: false,
+ value: awaitWrap(value)
+ };
+ }
+
+ ;
+
+ if (typeof Symbol === "function" && Symbol.iterator) {
+ iter[Symbol.iterator] = function () {
+ return this;
+ };
+ }
+
+ iter.next = function (value) {
+ if (waiting) {
+ waiting = false;
+ return value;
+ }
+
+ return pump("next", value);
+ };
+
+ if (typeof inner.throw === "function") {
+ iter.throw = function (value) {
+ if (waiting) {
+ waiting = false;
+ throw value;
+ }
+
+ return pump("throw", value);
+ };
+ }
+
+ if (typeof inner.return === "function") {
+ iter.return = function (value) {
+ if (waiting) {
+ waiting = false;
+ return value;
+ }
+
+ return pump("return", value);
+ };
+ }
+
+ return iter;
+}
+
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
+ try {
+ var info = gen[key](arg);
+ var value = info.value;
+ } catch (error) {
+ reject(error);
+ return;
+ }
+
+ if (info.done) {
+ resolve(value);
+ } else {
+ Promise.resolve(value).then(_next, _throw);
+ }
+}
+
+function _asyncToGenerator(fn) {
+ return function () {
+ var self = this,
+ args = arguments;
+ return new Promise(function (resolve, reject) {
+ var gen = fn.apply(self, args);
+
+ function _next(value) {
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
+ }
+
+ function _throw(err) {
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
+ }
+
+ _next(undefined);
+ });
+ };
+}
+
+function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+}
+
+function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+}
+
+function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+}
+
+function _defineEnumerableProperties(obj, descs) {
+ for (var key in descs) {
+ var desc = descs[key];
+ desc.configurable = desc.enumerable = true;
+ if ("value" in desc) desc.writable = true;
+ Object.defineProperty(obj, key, desc);
+ }
+
+ if (Object.getOwnPropertySymbols) {
+ var objectSymbols = Object.getOwnPropertySymbols(descs);
+
+ for (var i = 0; i < objectSymbols.length; i++) {
+ var sym = objectSymbols[i];
+ var desc = descs[sym];
+ desc.configurable = desc.enumerable = true;
+ if ("value" in desc) desc.writable = true;
+ Object.defineProperty(obj, sym, desc);
+ }
+ }
+
+ return obj;
+}
+
+function _defaults(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);
+
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var value = Object.getOwnPropertyDescriptor(defaults, key);
+
+ if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }
+
+ return obj;
+}
+
+function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+}
+
+function _extends() {
+ _extends = Object.assign || function (target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+
+ return target;
+ };
+
+ return _extends.apply(this, arguments);
+}
+
+function _objectSpread(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i] != null ? Object(arguments[i]) : {};
+ var ownKeys = Object.keys(source);
+
+ if (typeof Object.getOwnPropertySymbols === 'function') {
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
+ }));
+ }
+
+ ownKeys.forEach(function (key) {
+ _defineProperty(target, key, source[key]);
+ });
+ }
+
+ return target;
+}
+
+function ownKeys(object, enumerableOnly) {
+ var keys = Object.keys(object);
+
+ if (Object.getOwnPropertySymbols) {
+ var symbols = Object.getOwnPropertySymbols(object);
+ if (enumerableOnly) symbols = symbols.filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
+ });
+ keys.push.apply(keys, symbols);
+ }
+
+ return keys;
+}
+
+function _objectSpread2(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i] != null ? arguments[i] : {};
+
+ if (i % 2) {
+ ownKeys(Object(source), true).forEach(function (key) {
+ _defineProperty(target, key, source[key]);
+ });
+ } else if (Object.getOwnPropertyDescriptors) {
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
+ } else {
+ ownKeys(Object(source)).forEach(function (key) {
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
+ });
+ }
+ }
+
+ return target;
+}
+
+function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function");
+ }
+
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ writable: true,
+ configurable: true
+ }
+ });
+ if (superClass) _setPrototypeOf(subClass, superClass);
+}
+
+function _inheritsLoose(subClass, superClass) {
+ subClass.prototype = Object.create(superClass.prototype);
+ subClass.prototype.constructor = subClass;
+
+ _setPrototypeOf(subClass, superClass);
+}
+
+function _getPrototypeOf(o) {
+ _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
+ return o.__proto__ || Object.getPrototypeOf(o);
+ };
+ return _getPrototypeOf(o);
+}
+
+function _setPrototypeOf(o, p) {
+ _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
+ o.__proto__ = p;
+ return o;
+ };
+
+ return _setPrototypeOf(o, p);
+}
+
+function _isNativeReflectConstruct() {
+ if (typeof Reflect === "undefined" || !Reflect.construct) return false;
+ if (Reflect.construct.sham) return false;
+ if (typeof Proxy === "function") return true;
+
+ try {
+ Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+function _construct(Parent, args, Class) {
+ if (_isNativeReflectConstruct()) {
+ _construct = Reflect.construct;
+ } else {
+ _construct = function _construct(Parent, args, Class) {
+ var a = [null];
+ a.push.apply(a, args);
+ var Constructor = Function.bind.apply(Parent, a);
+ var instance = new Constructor();
+ if (Class) _setPrototypeOf(instance, Class.prototype);
+ return instance;
+ };
+ }
+
+ return _construct.apply(null, arguments);
+}
+
+function _isNativeFunction(fn) {
+ return Function.toString.call(fn).indexOf("[native code]") !== -1;
+}
+
+function _wrapNativeSuper(Class) {
+ var _cache = typeof Map === "function" ? new Map() : undefined;
+
+ _wrapNativeSuper = function _wrapNativeSuper(Class) {
+ if (Class === null || !_isNativeFunction(Class)) return Class;
+
+ if (typeof Class !== "function") {
+ throw new TypeError("Super expression must either be null or a function");
+ }
+
+ if (typeof _cache !== "undefined") {
+ if (_cache.has(Class)) return _cache.get(Class);
+
+ _cache.set(Class, Wrapper);
+ }
+
+ function Wrapper() {
+ return _construct(Class, arguments, _getPrototypeOf(this).constructor);
+ }
+
+ Wrapper.prototype = Object.create(Class.prototype, {
+ constructor: {
+ value: Wrapper,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ return _setPrototypeOf(Wrapper, Class);
+ };
+
+ return _wrapNativeSuper(Class);
+}
+
+function _instanceof(left, right) {
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
+ return !!right[Symbol.hasInstance](left);
+ } else {
+ return left instanceof right;
+ }
+}
+
+function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+}
+
+function _getRequireWildcardCache() {
+ if (typeof WeakMap !== "function") return null;
+ var cache = new WeakMap();
+
+ _getRequireWildcardCache = function () {
+ return cache;
+ };
+
+ return cache;
+}
+
+function _interopRequireWildcard(obj) {
+ if (obj && obj.__esModule) {
+ return obj;
+ }
+
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
+ return {
+ default: obj
+ };
+ }
+
+ var cache = _getRequireWildcardCache();
+
+ if (cache && cache.has(obj)) {
+ return cache.get(obj);
+ }
+
+ var newObj = {};
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
+
+ for (var key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
+
+ if (desc && (desc.get || desc.set)) {
+ Object.defineProperty(newObj, key, desc);
+ } else {
+ newObj[key] = obj[key];
+ }
+ }
+ }
+
+ newObj.default = obj;
+
+ if (cache) {
+ cache.set(obj, newObj);
+ }
+
+ return newObj;
+}
+
+function _newArrowCheck(innerThis, boundThis) {
+ if (innerThis !== boundThis) {
+ throw new TypeError("Cannot instantiate an arrow function");
+ }
+}
+
+function _objectDestructuringEmpty(obj) {
+ if (obj == null) throw new TypeError("Cannot destructure undefined");
+}
+
+function _objectWithoutPropertiesLoose(source, excluded) {
+ if (source == null) return {};
+ var target = {};
+ var sourceKeys = Object.keys(source);
+ var key, i;
+
+ for (i = 0; i < sourceKeys.length; i++) {
+ key = sourceKeys[i];
+ if (excluded.indexOf(key) >= 0) continue;
+ target[key] = source[key];
+ }
+
+ return target;
+}
+
+function _objectWithoutProperties(source, excluded) {
+ if (source == null) return {};
+
+ var target = _objectWithoutPropertiesLoose(source, excluded);
+
+ var key, i;
+
+ if (Object.getOwnPropertySymbols) {
+ var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
+
+ for (i = 0; i < sourceSymbolKeys.length; i++) {
+ key = sourceSymbolKeys[i];
+ if (excluded.indexOf(key) >= 0) continue;
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
+ target[key] = source[key];
+ }
+ }
+
+ return target;
+}
+
+function _assertThisInitialized(self) {
+ if (self === void 0) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }
+
+ return self;
+}
+
+function _possibleConstructorReturn(self, call) {
+ if (call && (typeof call === "object" || typeof call === "function")) {
+ return call;
+ }
+
+ return _assertThisInitialized(self);
+}
+
+function _createSuper(Derived) {
+ var hasNativeReflectConstruct = _isNativeReflectConstruct();
+
+ return function _createSuperInternal() {
+ var Super = _getPrototypeOf(Derived),
+ result;
+
+ if (hasNativeReflectConstruct) {
+ var NewTarget = _getPrototypeOf(this).constructor;
+
+ result = Reflect.construct(Super, arguments, NewTarget);
+ } else {
+ result = Super.apply(this, arguments);
+ }
+
+ return _possibleConstructorReturn(this, result);
+ };
+}
+
+function _superPropBase(object, property) {
+ while (!Object.prototype.hasOwnProperty.call(object, property)) {
+ object = _getPrototypeOf(object);
+ if (object === null) break;
+ }
+
+ return object;
+}
+
+function _get(target, property, receiver) {
+ if (typeof Reflect !== "undefined" && Reflect.get) {
+ _get = Reflect.get;
+ } else {
+ _get = function _get(target, property, receiver) {
+ var base = _superPropBase(target, property);
+
+ if (!base) return;
+ var desc = Object.getOwnPropertyDescriptor(base, property);
+
+ if (desc.get) {
+ return desc.get.call(receiver);
+ }
+
+ return desc.value;
+ };
+ }
+
+ return _get(target, property, receiver || target);
+}
+
+function set(target, property, value, receiver) {
+ if (typeof Reflect !== "undefined" && Reflect.set) {
+ set = Reflect.set;
+ } else {
+ set = function set(target, property, value, receiver) {
+ var base = _superPropBase(target, property);
+
+ var desc;
+
+ if (base) {
+ desc = Object.getOwnPropertyDescriptor(base, property);
+
+ if (desc.set) {
+ desc.set.call(receiver, value);
+ return true;
+ } else if (!desc.writable) {
+ return false;
+ }
+ }
+
+ desc = Object.getOwnPropertyDescriptor(receiver, property);
+
+ if (desc) {
+ if (!desc.writable) {
+ return false;
+ }
+
+ desc.value = value;
+ Object.defineProperty(receiver, property, desc);
+ } else {
+ _defineProperty(receiver, property, value);
+ }
+
+ return true;
+ };
+ }
+
+ return set(target, property, value, receiver);
+}
+
+function _set(target, property, value, receiver, isStrict) {
+ var s = set(target, property, value, receiver || target);
+
+ if (!s && isStrict) {
+ throw new Error('failed to set property');
+ }
+
+ return value;
+}
+
+function _taggedTemplateLiteral(strings, raw) {
+ if (!raw) {
+ raw = strings.slice(0);
+ }
+
+ return Object.freeze(Object.defineProperties(strings, {
+ raw: {
+ value: Object.freeze(raw)
+ }
+ }));
+}
+
+function _taggedTemplateLiteralLoose(strings, raw) {
+ if (!raw) {
+ raw = strings.slice(0);
+ }
+
+ strings.raw = raw;
+ return strings;
+}
+
+function _readOnlyError(name) {
+ throw new TypeError("\"" + name + "\" is read-only");
+}
+
+function _writeOnlyError(name) {
+ throw new TypeError("\"" + name + "\" is write-only");
+}
+
+function _classNameTDZError(name) {
+ throw new Error("Class \"" + name + "\" cannot be referenced in computed property keys.");
+}
+
+function _temporalUndefined() {}
+
+function _tdz(name) {
+ throw new ReferenceError(name + " is not defined - temporal dead zone");
+}
+
+function _temporalRef(val, name) {
+ return val === _temporalUndefined ? _tdz(name) : val;
+}
+
+function _slicedToArray(arr, i) {
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
+}
+
+function _slicedToArrayLoose(arr, i) {
+ return _arrayWithHoles(arr) || _iterableToArrayLimitLoose(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
+}
+
+function _toArray(arr) {
+ return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();
+}
+
+function _toConsumableArray(arr) {
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
+}
+
+function _arrayWithoutHoles(arr) {
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
+}
+
+function _arrayWithHoles(arr) {
+ if (Array.isArray(arr)) return arr;
+}
+
+function _maybeArrayLike(next, arr, i) {
+ if (arr && !Array.isArray(arr) && typeof arr.length === "number") {
+ var len = arr.length;
+ return _arrayLikeToArray(arr, i !== void 0 && i < len ? i : len);
+ }
+
+ return next(arr, i);
+}
+
+function _iterableToArray(iter) {
+ if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
+}
+
+function _iterableToArrayLimit(arr, i) {
+ if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
+ var _arr = [];
+ var _n = true;
+ var _d = false;
+ var _e = undefined;
+
+ try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);
+
+ if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;
+ _e = err;
+ } finally {
+ try {
+ if (!_n && _i["return"] != null) _i["return"]();
+ } finally {
+ if (_d) throw _e;
+ }
+ }
+
+ return _arr;
+}
+
+function _iterableToArrayLimitLoose(arr, i) {
+ if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
+ var _arr = [];
+
+ for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
+ _arr.push(_step.value);
+
+ if (i && _arr.length === i) break;
+ }
+
+ return _arr;
+}
+
+function _unsupportedIterableToArray(o, minLen) {
+ if (!o) return;
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
+ var n = Object.prototype.toString.call(o).slice(8, -1);
+ if (n === "Object" && o.constructor) n = o.constructor.name;
+ if (n === "Map" || n === "Set") return Array.from(o);
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
+}
+
+function _arrayLikeToArray(arr, len) {
+ if (len == null || len > arr.length) len = arr.length;
+
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
+
+ return arr2;
+}
+
+function _nonIterableSpread() {
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+}
+
+function _nonIterableRest() {
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+}
+
+function _createForOfIteratorHelper(o, allowArrayLike) {
+ var it;
+
+ if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
+ if (it) o = it;
+ var i = 0;
+
+ var F = function () {};
+
+ return {
+ s: F,
+ n: function () {
+ if (i >= o.length) return {
+ done: true
+ };
+ return {
+ done: false,
+ value: o[i++]
+ };
+ },
+ e: function (e) {
+ throw e;
+ },
+ f: F
+ };
+ }
+
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+ }
+
+ var normalCompletion = true,
+ didErr = false,
+ err;
+ return {
+ s: function () {
+ it = o[Symbol.iterator]();
+ },
+ n: function () {
+ var step = it.next();
+ normalCompletion = step.done;
+ return step;
+ },
+ e: function (e) {
+ didErr = true;
+ err = e;
+ },
+ f: function () {
+ try {
+ if (!normalCompletion && it.return != null) it.return();
+ } finally {
+ if (didErr) throw err;
+ }
+ }
+ };
+}
+
+function _createForOfIteratorHelperLoose(o, allowArrayLike) {
+ var it;
+
+ if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
+ if (it) o = it;
+ var i = 0;
+ return function () {
+ if (i >= o.length) return {
+ done: true
+ };
+ return {
+ done: false,
+ value: o[i++]
+ };
+ };
+ }
+
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+ }
+
+ it = o[Symbol.iterator]();
+ return it.next.bind(it);
+}
+
+function _skipFirstGeneratorNext(fn) {
+ return function () {
+ var it = fn.apply(this, arguments);
+ it.next();
+ return it;
+ };
+}
+
+function _toPrimitive(input, hint) {
+ if (typeof input !== "object" || input === null) return input;
+ var prim = input[Symbol.toPrimitive];
+
+ if (prim !== undefined) {
+ var res = prim.call(input, hint || "default");
+ if (typeof res !== "object") return res;
+ throw new TypeError("@@toPrimitive must return a primitive value.");
+ }
+
+ return (hint === "string" ? String : Number)(input);
+}
+
+function _toPropertyKey(arg) {
+ var key = _toPrimitive(arg, "string");
+
+ return typeof key === "symbol" ? key : String(key);
+}
+
+function _initializerWarningHelper(descriptor, context) {
+ throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');
+}
+
+function _initializerDefineProperty(target, property, descriptor, context) {
+ if (!descriptor) return;
+ Object.defineProperty(target, property, {
+ enumerable: descriptor.enumerable,
+ configurable: descriptor.configurable,
+ writable: descriptor.writable,
+ value: descriptor.initializer ? descriptor.initializer.call(context) : void 0
+ });
+}
+
+function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
+ var desc = {};
+ Object.keys(descriptor).forEach(function (key) {
+ desc[key] = descriptor[key];
+ });
+ desc.enumerable = !!desc.enumerable;
+ desc.configurable = !!desc.configurable;
+
+ if ('value' in desc || desc.initializer) {
+ desc.writable = true;
+ }
+
+ desc = decorators.slice().reverse().reduce(function (desc, decorator) {
+ return decorator(target, property, desc) || desc;
+ }, desc);
+
+ if (context && desc.initializer !== void 0) {
+ desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
+ desc.initializer = undefined;
+ }
+
+ if (desc.initializer === void 0) {
+ Object.defineProperty(target, property, desc);
+ desc = null;
+ }
+
+ return desc;
+}
+
+var id = 0;
+
+function _classPrivateFieldLooseKey(name) {
+ return "__private_" + id++ + "_" + name;
+}
+
+function _classPrivateFieldLooseBase(receiver, privateKey) {
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
+ throw new TypeError("attempted to use private field on non-instance");
+ }
+
+ return receiver;
+}
+
+function _classPrivateFieldGet(receiver, privateMap) {
+ var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get");
+
+ return _classApplyDescriptorGet(receiver, descriptor);
+}
+
+function _classPrivateFieldSet(receiver, privateMap, value) {
+ var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set");
+
+ _classApplyDescriptorSet(receiver, descriptor, value);
+
+ return value;
+}
+
+function _classPrivateFieldDestructureSet(receiver, privateMap) {
+ var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set");
+
+ return _classApplyDescriptorDestructureSet(receiver, descriptor);
+}
+
+function _classExtractFieldDescriptor(receiver, privateMap, action) {
+ if (!privateMap.has(receiver)) {
+ throw new TypeError("attempted to " + action + " private field on non-instance");
+ }
+
+ return privateMap.get(receiver);
+}
+
+function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) {
+ _classCheckPrivateStaticAccess(receiver, classConstructor);
+
+ _classCheckPrivateStaticFieldDescriptor(descriptor, "get");
+
+ return _classApplyDescriptorGet(receiver, descriptor);
+}
+
+function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) {
+ _classCheckPrivateStaticAccess(receiver, classConstructor);
+
+ _classCheckPrivateStaticFieldDescriptor(descriptor, "set");
+
+ _classApplyDescriptorSet(receiver, descriptor, value);
+
+ return value;
+}
+
+function _classStaticPrivateMethodGet(receiver, classConstructor, method) {
+ _classCheckPrivateStaticAccess(receiver, classConstructor);
+
+ return method;
+}
+
+function _classStaticPrivateMethodSet() {
+ throw new TypeError("attempted to set read only static private field");
+}
+
+function _classApplyDescriptorGet(receiver, descriptor) {
+ if (descriptor.get) {
+ return descriptor.get.call(receiver);
+ }
+
+ return descriptor.value;
+}
+
+function _classApplyDescriptorSet(receiver, descriptor, value) {
+ if (descriptor.set) {
+ descriptor.set.call(receiver, value);
+ } else {
+ if (!descriptor.writable) {
+ throw new TypeError("attempted to set read only private field");
+ }
+
+ descriptor.value = value;
+ }
+}
+
+function _classApplyDescriptorDestructureSet(receiver, descriptor) {
+ if (descriptor.set) {
+ if (!("__destrObj" in descriptor)) {
+ descriptor.__destrObj = {
+ set value(v) {
+ descriptor.set.call(receiver, v);
+ }
+
+ };
+ }
+
+ return descriptor.__destrObj;
+ } else {
+ if (!descriptor.writable) {
+ throw new TypeError("attempted to set read only private field");
+ }
+
+ return descriptor;
+ }
+}
+
+function _classStaticPrivateFieldDestructureSet(receiver, classConstructor, descriptor) {
+ _classCheckPrivateStaticAccess(receiver, classConstructor);
+
+ _classCheckPrivateStaticFieldDescriptor(descriptor, "set");
+
+ return _classApplyDescriptorDestructureSet(receiver, descriptor);
+}
+
+function _classCheckPrivateStaticAccess(receiver, classConstructor) {
+ if (receiver !== classConstructor) {
+ throw new TypeError("Private static access of wrong provenance");
+ }
+}
+
+function _classCheckPrivateStaticFieldDescriptor(descriptor, action) {
+ if (descriptor === undefined) {
+ throw new TypeError("attempted to " + action + " private static field before its declaration");
+ }
+}
+
+function _decorate(decorators, factory, superClass, mixins) {
+ var api = _getDecoratorsApi();
+
+ if (mixins) {
+ for (var i = 0; i < mixins.length; i++) {
+ api = mixins[i](api);
+ }
+ }
+
+ var r = factory(function initialize(O) {
+ api.initializeInstanceElements(O, decorated.elements);
+ }, superClass);
+ var decorated = api.decorateClass(_coalesceClassElements(r.d.map(_createElementDescriptor)), decorators);
+ api.initializeClassElements(r.F, decorated.elements);
+ return api.runClassFinishers(r.F, decorated.finishers);
+}
+
+function _getDecoratorsApi() {
+ _getDecoratorsApi = function () {
+ return api;
+ };
+
+ var api = {
+ elementsDefinitionOrder: [["method"], ["field"]],
+ initializeInstanceElements: function (O, elements) {
+ ["method", "field"].forEach(function (kind) {
+ elements.forEach(function (element) {
+ if (element.kind === kind && element.placement === "own") {
+ this.defineClassElement(O, element);
+ }
+ }, this);
+ }, this);
+ },
+ initializeClassElements: function (F, elements) {
+ var proto = F.prototype;
+ ["method", "field"].forEach(function (kind) {
+ elements.forEach(function (element) {
+ var placement = element.placement;
+
+ if (element.kind === kind && (placement === "static" || placement === "prototype")) {
+ var receiver = placement === "static" ? F : proto;
+ this.defineClassElement(receiver, element);
+ }
+ }, this);
+ }, this);
+ },
+ defineClassElement: function (receiver, element) {
+ var descriptor = element.descriptor;
+
+ if (element.kind === "field") {
+ var initializer = element.initializer;
+ descriptor = {
+ enumerable: descriptor.enumerable,
+ writable: descriptor.writable,
+ configurable: descriptor.configurable,
+ value: initializer === void 0 ? void 0 : initializer.call(receiver)
+ };
+ }
+
+ Object.defineProperty(receiver, element.key, descriptor);
+ },
+ decorateClass: function (elements, decorators) {
+ var newElements = [];
+ var finishers = [];
+ var placements = {
+ static: [],
+ prototype: [],
+ own: []
+ };
+ elements.forEach(function (element) {
+ this.addElementPlacement(element, placements);
+ }, this);
+ elements.forEach(function (element) {
+ if (!_hasDecorators(element)) return newElements.push(element);
+ var elementFinishersExtras = this.decorateElement(element, placements);
+ newElements.push(elementFinishersExtras.element);
+ newElements.push.apply(newElements, elementFinishersExtras.extras);
+ finishers.push.apply(finishers, elementFinishersExtras.finishers);
+ }, this);
+
+ if (!decorators) {
+ return {
+ elements: newElements,
+ finishers: finishers
+ };
+ }
+
+ var result = this.decorateConstructor(newElements, decorators);
+ finishers.push.apply(finishers, result.finishers);
+ result.finishers = finishers;
+ return result;
+ },
+ addElementPlacement: function (element, placements, silent) {
+ var keys = placements[element.placement];
+
+ if (!silent && keys.indexOf(element.key) !== -1) {
+ throw new TypeError("Duplicated element (" + element.key + ")");
+ }
+
+ keys.push(element.key);
+ },
+ decorateElement: function (element, placements) {
+ var extras = [];
+ var finishers = [];
+
+ for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {
+ var keys = placements[element.placement];
+ keys.splice(keys.indexOf(element.key), 1);
+ var elementObject = this.fromElementDescriptor(element);
+ var elementFinisherExtras = this.toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject);
+ element = elementFinisherExtras.element;
+ this.addElementPlacement(element, placements);
+
+ if (elementFinisherExtras.finisher) {
+ finishers.push(elementFinisherExtras.finisher);
+ }
+
+ var newExtras = elementFinisherExtras.extras;
+
+ if (newExtras) {
+ for (var j = 0; j < newExtras.length; j++) {
+ this.addElementPlacement(newExtras[j], placements);
+ }
+
+ extras.push.apply(extras, newExtras);
+ }
+ }
+
+ return {
+ element: element,
+ finishers: finishers,
+ extras: extras
+ };
+ },
+ decorateConstructor: function (elements, decorators) {
+ var finishers = [];
+
+ for (var i = decorators.length - 1; i >= 0; i--) {
+ var obj = this.fromClassDescriptor(elements);
+ var elementsAndFinisher = this.toClassDescriptor((0, decorators[i])(obj) || obj);
+
+ if (elementsAndFinisher.finisher !== undefined) {
+ finishers.push(elementsAndFinisher.finisher);
+ }
+
+ if (elementsAndFinisher.elements !== undefined) {
+ elements = elementsAndFinisher.elements;
+
+ for (var j = 0; j < elements.length - 1; j++) {
+ for (var k = j + 1; k < elements.length; k++) {
+ if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) {
+ throw new TypeError("Duplicated element (" + elements[j].key + ")");
+ }
+ }
+ }
+ }
+ }
+
+ return {
+ elements: elements,
+ finishers: finishers
+ };
+ },
+ fromElementDescriptor: function (element) {
+ var obj = {
+ kind: element.kind,
+ key: element.key,
+ placement: element.placement,
+ descriptor: element.descriptor
+ };
+ var desc = {
+ value: "Descriptor",
+ configurable: true
+ };
+ Object.defineProperty(obj, Symbol.toStringTag, desc);
+ if (element.kind === "field") obj.initializer = element.initializer;
+ return obj;
+ },
+ toElementDescriptors: function (elementObjects) {
+ if (elementObjects === undefined) return;
+ return _toArray(elementObjects).map(function (elementObject) {
+ var element = this.toElementDescriptor(elementObject);
+ this.disallowProperty(elementObject, "finisher", "An element descriptor");
+ this.disallowProperty(elementObject, "extras", "An element descriptor");
+ return element;
+ }, this);
+ },
+ toElementDescriptor: function (elementObject) {
+ var kind = String(elementObject.kind);
+
+ if (kind !== "method" && kind !== "field") {
+ throw new TypeError('An element descriptor\'s .kind property must be either "method" or' + ' "field", but a decorator created an element descriptor with' + ' .kind "' + kind + '"');
+ }
+
+ var key = _toPropertyKey(elementObject.key);
+
+ var placement = String(elementObject.placement);
+
+ if (placement !== "static" && placement !== "prototype" && placement !== "own") {
+ throw new TypeError('An element descriptor\'s .placement property must be one of "static",' + ' "prototype" or "own", but a decorator created an element descriptor' + ' with .placement "' + placement + '"');
+ }
+
+ var descriptor = elementObject.descriptor;
+ this.disallowProperty(elementObject, "elements", "An element descriptor");
+ var element = {
+ kind: kind,
+ key: key,
+ placement: placement,
+ descriptor: Object.assign({}, descriptor)
+ };
+
+ if (kind !== "field") {
+ this.disallowProperty(elementObject, "initializer", "A method descriptor");
+ } else {
+ this.disallowProperty(descriptor, "get", "The property descriptor of a field descriptor");
+ this.disallowProperty(descriptor, "set", "The property descriptor of a field descriptor");
+ this.disallowProperty(descriptor, "value", "The property descriptor of a field descriptor");
+ element.initializer = elementObject.initializer;
+ }
+
+ return element;
+ },
+ toElementFinisherExtras: function (elementObject) {
+ var element = this.toElementDescriptor(elementObject);
+
+ var finisher = _optionalCallableProperty(elementObject, "finisher");
+
+ var extras = this.toElementDescriptors(elementObject.extras);
+ return {
+ element: element,
+ finisher: finisher,
+ extras: extras
+ };
+ },
+ fromClassDescriptor: function (elements) {
+ var obj = {
+ kind: "class",
+ elements: elements.map(this.fromElementDescriptor, this)
+ };
+ var desc = {
+ value: "Descriptor",
+ configurable: true
+ };
+ Object.defineProperty(obj, Symbol.toStringTag, desc);
+ return obj;
+ },
+ toClassDescriptor: function (obj) {
+ var kind = String(obj.kind);
+
+ if (kind !== "class") {
+ throw new TypeError('A class descriptor\'s .kind property must be "class", but a decorator' + ' created a class descriptor with .kind "' + kind + '"');
+ }
+
+ this.disallowProperty(obj, "key", "A class descriptor");
+ this.disallowProperty(obj, "placement", "A class descriptor");
+ this.disallowProperty(obj, "descriptor", "A class descriptor");
+ this.disallowProperty(obj, "initializer", "A class descriptor");
+ this.disallowProperty(obj, "extras", "A class descriptor");
+
+ var finisher = _optionalCallableProperty(obj, "finisher");
+
+ var elements = this.toElementDescriptors(obj.elements);
+ return {
+ elements: elements,
+ finisher: finisher
+ };
+ },
+ runClassFinishers: function (constructor, finishers) {
+ for (var i = 0; i < finishers.length; i++) {
+ var newConstructor = (0, finishers[i])(constructor);
+
+ if (newConstructor !== undefined) {
+ if (typeof newConstructor !== "function") {
+ throw new TypeError("Finishers must return a constructor.");
+ }
+
+ constructor = newConstructor;
+ }
+ }
+
+ return constructor;
+ },
+ disallowProperty: function (obj, name, objectType) {
+ if (obj[name] !== undefined) {
+ throw new TypeError(objectType + " can't have a ." + name + " property.");
+ }
+ }
+ };
+ return api;
+}
+
+function _createElementDescriptor(def) {
+ var key = _toPropertyKey(def.key);
+
+ var descriptor;
+
+ if (def.kind === "method") {
+ descriptor = {
+ value: def.value,
+ writable: true,
+ configurable: true,
+ enumerable: false
+ };
+ } else if (def.kind === "get") {
+ descriptor = {
+ get: def.value,
+ configurable: true,
+ enumerable: false
+ };
+ } else if (def.kind === "set") {
+ descriptor = {
+ set: def.value,
+ configurable: true,
+ enumerable: false
+ };
+ } else if (def.kind === "field") {
+ descriptor = {
+ configurable: true,
+ writable: true,
+ enumerable: true
+ };
+ }
+
+ var element = {
+ kind: def.kind === "field" ? "field" : "method",
+ key: key,
+ placement: def.static ? "static" : def.kind === "field" ? "own" : "prototype",
+ descriptor: descriptor
+ };
+ if (def.decorators) element.decorators = def.decorators;
+ if (def.kind === "field") element.initializer = def.value;
+ return element;
+}
+
+function _coalesceGetterSetter(element, other) {
+ if (element.descriptor.get !== undefined) {
+ other.descriptor.get = element.descriptor.get;
+ } else {
+ other.descriptor.set = element.descriptor.set;
+ }
+}
+
+function _coalesceClassElements(elements) {
+ var newElements = [];
+
+ var isSameElement = function (other) {
+ return other.kind === "method" && other.key === element.key && other.placement === element.placement;
+ };
+
+ for (var i = 0; i < elements.length; i++) {
+ var element = elements[i];
+ var other;
+
+ if (element.kind === "method" && (other = newElements.find(isSameElement))) {
+ if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {
+ if (_hasDecorators(element) || _hasDecorators(other)) {
+ throw new ReferenceError("Duplicated methods (" + element.key + ") can't be decorated.");
+ }
+
+ other.descriptor = element.descriptor;
+ } else {
+ if (_hasDecorators(element)) {
+ if (_hasDecorators(other)) {
+ throw new ReferenceError("Decorators can't be placed on different accessors with for " + "the same property (" + element.key + ").");
+ }
+
+ other.decorators = element.decorators;
+ }
+
+ _coalesceGetterSetter(element, other);
+ }
+ } else {
+ newElements.push(element);
+ }
+ }
+
+ return newElements;
+}
+
+function _hasDecorators(element) {
+ return element.decorators && element.decorators.length;
+}
+
+function _isDataDescriptor(desc) {
+ return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);
+}
+
+function _optionalCallableProperty(obj, name) {
+ var value = obj[name];
+
+ if (value !== undefined && typeof value !== "function") {
+ throw new TypeError("Expected '" + name + "' to be a function");
+ }
+
+ return value;
+}
+
+function _classPrivateMethodGet(receiver, privateSet, fn) {
+ if (!privateSet.has(receiver)) {
+ throw new TypeError("attempted to get private field on non-instance");
+ }
+
+ return fn;
+}
+
+function _classPrivateMethodSet() {
+ throw new TypeError("attempted to reassign private method");
+}
+
+function _wrapRegExp(re, groups) {
+ _wrapRegExp = function (re, groups) {
+ return new BabelRegExp(re, undefined, groups);
+ };
+
+ var _RegExp = _wrapNativeSuper(RegExp);
+
+ var _super = RegExp.prototype;
+
+ var _groups = new WeakMap();
+
+ function BabelRegExp(re, flags, groups) {
+ var _this = _RegExp.call(this, re, flags);
+
+ _groups.set(_this, groups || _groups.get(re));
+
+ return _this;
+ }
+
+ _inherits(BabelRegExp, _RegExp);
+
+ BabelRegExp.prototype.exec = function (str) {
+ var result = _super.exec.call(this, str);
+
+ if (result) result.groups = buildGroups(result, this);
+ return result;
+ };
+
+ BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {
+ if (typeof substitution === "string") {
+ var groups = _groups.get(this);
+
+ return _super[Symbol.replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) {
+ return "$" + groups[name];
+ }));
+ } else if (typeof substitution === "function") {
+ var _this = this;
+
+ return _super[Symbol.replace].call(this, str, function () {
+ var args = [];
+ args.push.apply(args, arguments);
+
+ if (typeof args[args.length - 1] !== "object") {
+ args.push(buildGroups(args, _this));
+ }
+
+ return substitution.apply(this, args);
+ });
+ } else {
+ return _super[Symbol.replace].call(this, str, substitution);
+ }
+ };
+
+ function buildGroups(result, re) {
+ var g = _groups.get(re);
+
+ return Object.keys(g).reduce(function (groups, name) {
+ groups[name] = result[g[name]];
+ return groups;
+ }, Object.create(null));
+ }
+
+ return _wrapRegExp.apply(this, arguments);
+}
+
+// Numbers represent type -
+// 1:float 2:vec2 3:vec3 4:vec4
+var geometryFunctions = {
+ sphere: {
+ args: [1]
+ },
+ line: {
+ args: [3, 3, 1]
+ },
+ cone: {
+ args: [1, 1]
+ },
+ roundCone: {
+ args: [3, 3, 1, 1]
+ },
+ plane: {
+ args: [1, 1, 1, 1]
+ }
+};
+var mathFunctions = {
+ nsin: {
+ args: [1],
+ ret: 1
+ },
+ ncos: {
+ args: [1],
+ ret: 1
+ },
+ round: {
+ args: [1],
+ ret: 1
+ },
+ hsv2rgb: {
+ args: [3],
+ ret: 3
+ },
+ rgb2hsv: {
+ args: [3],
+ ret: 3
+ },
+ rotateVec: {
+ args: [3, 3, 1],
+ ret: 3
+ },
+ toSpherical: {
+ args: [3],
+ ret: 3
+ },
+ fromSpherical: {
+ args: [3],
+ ret: 3
+ },
+ getRayDirection: {
+ args: [],
+ ret: 3
+ },
+ osc: {
+ args: [1],
+ ret: 1
+ },
+ _hash33: {
+ args: [3],
+ ret: 3
+ },
+ _hash13: {
+ args: [3],
+ ret: 1
+ },
+ noise: {
+ args: [3],
+ ret: 1
+ },
+ fractalNoise: {
+ args: [3],
+ ret: 1
+ },
+ sphericalDistribution: {
+ args: [3, 1],
+ ret: 4
+ }
+}; // these all have a single input/output and are overloaded for
+// all types so a list of names is all we need to generate them
+
+var glslBuiltInOneToOne = ["sin", "cos", "tan", "asin", "acos", "exp", "log", "exp2", "log2", "sqrt", "inversesqrt", "abs", "sign", "floor", "ceil", "fract"]; // need better overloading system
+
+var glslBuiltInOther = {
+ // overload pow somehow?
+ // pow: { args:[1,1], ret:1 },
+ mod: {
+ args: [1, 1],
+ ret: 1
+ },
+ min: {
+ args: [1, 1],
+ ret: 1
+ },
+ max: {
+ args: [1, 1],
+ ret: 1
+ },
+ atan: {
+ args: [1, 1],
+ ret: 1
+ },
+ clamp: {
+ args: [1, 1, 1],
+ ret: 1
+ },
+ step: {
+ args: [1, 1],
+ ret: 1
+ },
+ smoothstep: {
+ args: [1, 1, 1],
+ ret: 1
+ },
+ // also overload length for vec3 and vec2?
+ length: {
+ args: [3],
+ ret: 1
+ },
+ distance: {
+ args: [3, 3],
+ ret: 1
+ },
+ dot: {
+ args: [3, 3],
+ ret: 1
+ },
+ cross: {
+ args: [3, 3],
+ ret: 3
+ },
+ normalize: {
+ args: [3],
+ ret: 3
+ },
+ reflect: {
+ args: [3, 3],
+ ret: 3
+ },
+ refract: {
+ args: [3, 3],
+ ret: 3
+ }
+}; // let arg = {
+// 'mix' : (a, b, c) => (a.dim === b.dim && (c.dim === 1 || c.dim === a.dim))? a.dim: -1,
+// };
+
+function convertFunctionToString(source) {
+ if (typeof source === "function") {
+ source = source.toString();
+ return source.slice(source.indexOf("{") + 1, source.lastIndexOf("}"));
+ } else if (!(typeof source === "string")) {
+ throw "your Shader Park code requires the source code to be a function, or a string";
+ }
+
+ return source;
+}
+
+var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+function getDefaultExportFromCjs (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+}
+
+function getDefaultExportFromNamespaceIfPresent (n) {
+ return n && Object.prototype.hasOwnProperty.call(n, 'default') ? n['default'] : n;
+}
+
+function getDefaultExportFromNamespaceIfNotNamed (n) {
+ return n && Object.prototype.hasOwnProperty.call(n, 'default') && Object.keys(n).length === 1 ? n['default'] : n;
+}
+
+function getAugmentedNamespace(n) {
+ if (n.__esModule) return n;
+ var a = Object.defineProperty({}, '__esModule', {value: true});
+ Object.keys(n).forEach(function (k) {
+ var d = Object.getOwnPropertyDescriptor(n, k);
+ Object.defineProperty(a, k, d.get ? d : {
+ enumerable: true,
+ get: function () {
+ return n[k];
+ }
+ });
+ });
+ return a;
+}
+
+function createCommonjsModule(fn) {
+ var module = { exports: {} };
+ return fn(module, module.exports), module.exports;
+}
+
+function commonjsRequire (path) {
+ throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
+}
+
+var glslParser = createCommonjsModule(function (module, exports) {
+ // Adapted from https://github.com/cimaron/cwebgl/blob/master/external/glsl2js/glsl.js
+
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+ (function () {
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+ var glsl = {
+ runParse: function runParse(src, options) {
+ var state, result, irs;
+ state = new GlslState(options);
+ state.setSource(src); //Preprocess
+
+ result = this.preprocessor.process(state); //Parse into AST
+
+ if (result) {
+ result = this.parser.parse(state);
+ }
+ /*
+ //Generate IR
+ if (result) {
+ result = this.generate(state);
+ }
+ */
+
+
+ if (result) {
+ state.status = true;
+ }
+
+ return state;
+ },
+
+ /**
+ * Compilation targets
+ */
+ target: {
+ fragment: 0,
+ 'x-fragment': 0,
+ 'x-shader/x-fragment': 0,
+ vertex: 1,
+ 'x-vertex': 1,
+ 'x-shader/x-vertex': 1
+ }
+ }; // Copyright Joyent, Inc. and other Node contributors.
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a
+ // copy of this software and associated documentation files (the
+ // "Software"), to deal in the Software without restriction, including
+ // without limitation the rights to use, copy, modify, merge, publish,
+ // distribute, sublicense, and/or sell copies of the Software, and to permit
+ // persons to whom the Software is furnished to do so, subject to the
+ // following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included
+ // in all copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ // USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ /**
+ * Select node.js util functions
+ */
+
+ var util = {};
+
+ (function (exports) {
+ var formatRegExp = /%[sdj%]/g;
+
+ exports.format = function (f) {
+ if (!isString(f)) {
+ var objects = [];
+
+ for (var i = 0; i < arguments.length; i++) {
+ objects.push(inspect(arguments[i]));
+ }
+
+ return objects.join(' ');
+ }
+
+ var i = 1;
+ var args = arguments;
+ var len = args.length;
+ var str = String(f).replace(formatRegExp, function (x) {
+ if (x === '%%') return '%';
+ if (i >= len) return x;
+
+ switch (x) {
+ case '%s':
+ return String(args[i++]);
+
+ case '%d':
+ return Number(args[i++]);
+
+ case '%j':
+ try {
+ return JSON.stringify(args[i++]);
+ } catch (_) {
+ return '[Circular]';
+ }
+
+ default:
+ return x;
+ }
+ });
+
+ for (var x = args[i]; i < len; x = args[++i]) {
+ //if (isNull(x) || !isObject(x)) {
+ str += ' ' + x; //} else {
+ // str += ' ' + inspect(x);
+ //}
+ }
+
+ return str;
+ };
+
+ function isString(arg) {
+ return typeof arg === 'string';
+ }
+
+ exports.isString = isString;
+ /**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * The Function.prototype.inherits from lang.js rewritten as a standalone
+ * function (not on Function.prototype). NOTE: If this file is to be loaded
+ * during bootstrapping this function needs to be rewritten using some native
+ * functions as prototype setup using normal JavaScript does not work as
+ * expected during bootstrapping (see mirror.js in r114903).
+ *
+ * @param {function} ctor Constructor function which needs to inherit the
+ * prototype.
+ * @param {function} superCtor Constructor function to inherit prototype from.
+ */
+
+ exports.inherits = function (ctor, superCtor) {
+ ctor.super_ = superCtor;
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+ })(util);
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+ function GlslState(options) {
+ var i;
+ this.options = {
+ target: 0,
+ language_version: 100,
+ opt: {
+ fold_constants: true
+ }
+ };
+
+ for (i in options) {
+ this.options[i] = options[i];
+ }
+
+ this.symbols = new SymbolTable();
+ symbol_table_init(this.symbols, options.target);
+ this.status = false;
+ this.translation_unit = "";
+ this.ast = [];
+ this.ir = null;
+ this.errors = [];
+ this.warnings = [];
+ }
+
+ proto = GlslState.prototype = {};
+ /**
+ * Get identifier type
+ *
+ * @param object state GLSL state
+ * @param string name Identifier name
+ * Add error to state
+ *
+ * @return string
+ * @param string msg Message
+ * @param int line Message
+ * @param int column Message
+ */
+
+ proto.classify_identifier = function (state, name) {
+ if (this.symbols.get_variable(name) || this.symbols.get_function(name)) {
+ return 'IDENTIFIER';
+ } else if (this.symbols.get_type(name)) {
+ return 'TYPE_IDENTIFIER';
+ } else {
+ return 'NEW_IDENTIFIER';
+ }
+ };
+
+ proto.setSource = function (src) {
+ this.src = src;
+ };
+
+ proto.getSource = function () {
+ return this.src;
+ };
+
+ proto.setTranslationUnit = function (tu) {
+ this.translation_unit = tu;
+ };
+
+ proto.getTranslationUnit = function () {
+ return this.translation_unit;
+ };
+
+ proto.addAstNode = function (node) {
+ this.ast.push(node);
+ };
+
+ proto.getAst = function () {
+ return this.ast;
+ };
+
+ proto.setIR = function (ir) {
+ this.ir = ir;
+ };
+
+ proto.getIR = function () {
+ return this.ir;
+ };
+
+ proto.getStatus = function () {
+ return this.status;
+ };
+ /**
+ * Add error to state
+ *
+ * @param string msg Message
+ * @param int line Message
+ * @param int column Message
+ */
+
+
+ proto.addError = function (msg, line, column) {
+ var err;
+
+ if (!line && !column) {
+ this.errors.push(msg);
+ return;
+ }
+
+ err = util.format("%s at line %s, column %s", msg, line, column);
+ this.errors.push(err);
+ };
+ /**
+ * Add warning to state
+ *
+ * @param string msg Message
+ * @param int line Message
+ * @param int column Message
+ */
+
+
+ proto.addWarning = function (msg, line, column) {
+ var warn;
+
+ if (!line && !column) {
+ this.warnings.push(msg);
+ return;
+ }
+
+ warn = util.format("%s at line %s, column %s", msg, line, column);
+ this.warnings.push(warn);
+ };
+ /**
+ * Get compile errors
+ *
+ * @return mixed
+ */
+
+
+ proto.getErrors = function () {
+ return this.errors;
+ };
+ /**
+ * Get compile errors
+ *
+ * @return mixed
+ */
+
+
+ proto.getWarnings = function () {
+ return this.warnings;
+ };
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * Preprocessor Class
+ */
+
+
+ function Preprocessor() {}
+
+ Preprocessor.modules = {};
+ var proto = Preprocessor.prototype;
+
+ proto.process = function (state) {
+ var m,
+ out = state.getSource();
+
+ for (m in Preprocessor.modules) {
+ try {
+ out = Preprocessor.modules[m].process(out);
+ } catch (e) {
+ state.addError(e.message, e.lineNumber, e.columnNumber);
+ return false;
+ }
+ }
+
+ state.setTranslationUnit(out);
+ return true;
+ };
+
+ glsl.preprocessor = new Preprocessor();
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ Preprocessor.modules.comments = {
+ process: function process(src) {
+ var i,
+ chr,
+ la,
+ out = "",
+ line = 1,
+ in_single = 0,
+ in_multi = 0;
+
+ for (i = 0; i < src.length; i++) {
+ chr = src.substr(i, 1);
+ la = src.substr(i + 1, 1); //Enter single line comment
+
+ if (chr == '/' && la == '/' && !in_single && !in_multi) {
+ in_single = line;
+ i++;
+ continue;
+ } //Exit single line comment
+
+
+ if (chr == "\n" && in_single) {
+ in_single = 0;
+ } //Enter multi line comment
+
+
+ if (chr == '/' && la == '*' && !in_multi && !in_single) {
+ in_multi = line;
+ i++;
+ continue;
+ } //Exit multi line comment
+
+
+ if (chr == '*' && la == '/' && in_multi) {
+ //Treat single line multi-comment as space
+ if (in_multi == line) {
+ out += " ";
+ }
+
+ in_multi = 0;
+ i++;
+ continue;
+ } //Newlines are preserved
+
+
+ if (!in_multi && !in_single || chr == "\n") {
+ out += chr;
+ line++;
+ }
+ }
+
+ return out;
+ }
+ };
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ Preprocessor.modules.directives = {
+ state: {
+ lines: [],
+ defines: {}
+ },
+ process: function process(src) {
+ var i, l;
+ this.state.lines = src.split("\n");
+ this.state.defines = {
+ GL_ES: '1',
+ __FILE__: '0',
+ __LINE__: '0',
+ __VERSION__: '300'
+ };
+ this.state.cond_stack = [];
+ i = 0;
+ l = this.state.lines.length;
+
+ while (i < l) {
+ this.state.lines[i] = this.processLine(this.state.lines[i], i);
+ i++;
+ }
+
+ return this.state.lines.join("\n");
+ },
+ processLine: function processLine(line, i) {
+ var d, matches, raw, e, sub, cond;
+ matches = line.match(/^([ \t]*)#(.*)$/);
+
+ if (!matches) {
+ if (this.state.cond_stack.length != 0 && !this.state.cond_stack.slice(-1)[0]) {
+ return "";
+ }
+
+ line = this.processDefines(line, i);
+ return line;
+ }
+
+ raw = matches[2];
+
+ if (raw.match(/^\s*$/)) {
+ return "";
+ }
+
+ var lmatches = raw.split(/\s+/);
+
+ try {
+ switch (lmatches[0]) {
+ case 'define':
+ case 'undef':
+ case 'ifdef':
+ case 'endif':
+ this[lmatches[0]](line, lmatches);
+ return "";
+ }
+
+ throw new Error("Invalid directive");
+ } catch (e) {
+ e.lineNumber = i + 1;
+ e.columnNumber = matches[1].length + 1;
+ throw e;
+ }
+ },
+ processDefines: function processDefines(line, i) {
+ this.state.defines.__LINE__ = i + 1;
+
+ for (var d in this.state.defines) {
+ //easy global replace
+ line = line.split(d).join(this.state.defines[d]);
+ }
+
+ return line;
+ },
+ define: function define(line, matches) {
+ if (matches.length <= 1 || matches.length > 3) {
+ throw new Error("Syntax error in #define");
+ }
+
+ this.state.defines[matches[1]] = matches[2] || "";
+ },
+ undef: function undef(line, matches) {
+ if (matches.length != 2) {
+ throw new Error("Syntax error in #undef");
+ }
+
+ delete this.state.defines[matches[1]];
+ },
+ ifdef: function ifdef(line, matches) {
+ var def;
+ def = !!this.state.defines[matches[1]];
+ this.state.cond_stack.push(def);
+ },
+ endif: function endif(line, matches) {
+ if (this.state.cond_stack.length) {
+ this.state.cond_stack.pop();
+ } else {
+ throw new Error("unmatched #endif");
+ }
+ }
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ function Type(name, size, slots, base) {
+ this.name = name;
+ this.size = size;
+ this.slots = slots;
+ this.swizzle = size / slots != 4 ? "xyzw".slice(0, size / slots) : "";
+ this.base = base || name;
+ }
+ /**
+ * Do a cast on a constant
+ *
+ * @param string val Value to cast
+ * @param string from From type
+ * @param string to To type
+ *
+ * @return string
+ */
+
+
+ Type.castTo = function (val, from, to) {
+ var f32;
+
+ switch (to) {
+ case 'int':
+ return "" + parseInt(val);
+
+ case 'float':
+ //Should we keep maximum precision, or use the following to force to 32bit precision??
+
+ /*
+ f32 = new Float32Array(1);
+ f32[0] = parseFloat(val);
+ return "" + f32[0];
+ */
+ return "" + parseFloat(val);
+
+ case 'bool':
+ return parseFloat(val) ? "1" : "0";
+ }
+
+ return val;
+ };
+ /**
+ * Determine if can cast from one type to another
+ *
+ * @param string from From type
+ * @param string to To type
+ *
+ * @return bool
+ */
+
+
+ Type.canCast = function (from, to) {
+ var t1, t2;
+ t1 = types[from];
+ t2 = types[to];
+ return t1.size === 1 && t2.size === 1;
+ };
+
+ var types = {
+ _void: new Type("void", 1, 1),
+ bool: new Type("bool", 1, 1),
+ int: new Type("int", 1, 1),
+ float: new Type("float", 1, 1),
+ vec2: new Type("vec2", 2, 1, 'float'),
+ vec3: new Type("vec3", 3, 1, 'float'),
+ vec4: new Type("vec4", 4, 1, 'float'),
+ bvec2: new Type("bvec2", 2, 1, 'bool'),
+ bvec3: new Type("bvec3", 3, 1, 'bool'),
+ bvec4: new Type("bvec4", 4, 1, 'bool'),
+ ivec2: new Type("ivec2", 2, 1, 'int'),
+ ivec3: new Type("ivec3", 3, 1, 'int'),
+ ivec4: new Type("ivec4", 4, 1, 'int'),
+ mat2: new Type("mat2", 4, 2, 'float'),
+ mat3: new Type("mat3", 9, 3, 'float'),
+ mat4: new Type("mat4", 16, 4, 'float'),
+ sampler2D: new Type("sampler2D", 1, 1),
+ samplerCube: new Type("samplerCube", 1, 1)
+ }; //Compatibility
+
+ types['void'] = types._void;
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * SymbolTableEntry constructor
+ */
+
+ function SymbolTableEntry(name, typedef) {
+ this.depth = null;
+ this.typedef = typedef; //Variable name
+
+ this.name = name; //Type
+
+ this.type = null; //Base type (if array)
+
+ this.base_type = null; //Function definition
+
+ this.definition = []; //Qualifier
+
+ this.qualifier = null; //IR name
+
+ this.out = name; //Constant value
+
+ this.constant = null; //Array size
+
+ this.size = null; //Temp vars for IR generation
+
+ this.code = null;
+ this.Ast = null;
+ }
+
+ SymbolTableEntry.typedef = {
+ variable: 0,
+ func: 1,
+ type: 2
+ };
+
+ SymbolTableEntry.prototype.getType = function () {
+ return types[this.type];
+ };
+ /**
+ * symbol_table constructor
+ */
+
+
+ function SymbolTable() {
+ this.table = {};
+ this.depth = 0;
+ }
+
+ SymbolTable.prototype = {};
+ var proto = SymbolTable.prototype;
+ /**
+ *
+ */
+
+ proto.push_scope = function () {
+ this.depth++;
+ };
+ /**
+ *
+ */
+
+
+ proto.pop_scope = function () {
+ var n, t;
+
+ for (n in this.table) {
+ if (this.table.hasOwnProperty(n)) {
+ t = this.table[n];
+
+ while (t[0] && t[0].depth === this.depth) {
+ t.splice(0, 1);
+ }
+
+ if (t.length === 0) {
+ delete this.table[n];
+ }
+ }
+ }
+
+ this.depth--;
+ };
+ /**
+ *
+ */
+
+
+ proto.name_declared_this_scope = function (name) {
+ var e = this.get_entry(name);
+ return e && e.depth === this.depth;
+ };
+ /**
+ *
+ */
+
+
+ proto.add_variable = function (name, type) {
+ var entry = new SymbolTableEntry(name, SymbolTableEntry.typedef.variable);
+ entry.type = type;
+ return this._add_entry(entry);
+ };
+ /**
+ *
+ */
+
+
+ proto.add_type = function (name, t) {
+ var entry = new SymbolTableEntry(name, SymbolTableEntry.typedef.type);
+ entry.definition = t;
+ return this._add_entry(entry);
+ };
+ /**
+ *
+ */
+
+
+ proto.add_function = function (name, type, def) {
+ var entry;
+ entry = new SymbolTableEntry(name, SymbolTableEntry.typedef.func);
+ entry.type = type;
+
+ if (def) {
+ entry.definition = def;
+ }
+
+ return this._add_entry(entry);
+ };
+ /**
+ *
+ */
+
+
+ proto.get_variable = function (name) {
+ var entry = this.get_entry(name, SymbolTableEntry.typedef.variable);
+ return entry;
+ };
+ /**
+ *
+ */
+
+
+ proto.get_type = function (name) {
+ var entry = this.get_entry(name, SymbolTableEntry.typedef.type);
+ return entry;
+ };
+ /**
+ *
+ */
+
+
+ proto.get_function = function (name, def) {
+ var entry = this.get_entry(name, SymbolTableEntry.typedef.func, def);
+ return entry;
+ };
+ /**
+ * @protected
+ */
+
+
+ proto._match_definition = function (def, entry) {
+ var i;
+
+ if (!def) {
+ return true;
+ }
+
+ if (def.length !== entry.length) {
+ return false;
+ }
+
+ for (i = 0; i < def.length; i++) {
+ if (def[i] !== entry[i]) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+ /**
+ * @protected
+ */
+
+
+ proto._add_entry = function (entry) {
+ if (!this.table[entry.name]) {
+ this.table[entry.name] = [];
+ }
+
+ this.table[entry.name].splice(0, 0, entry);
+ entry.depth = this.depth;
+ return entry;
+ };
+ /**
+ * @protected
+ */
+
+
+ proto.get_entry = function (name, typedef, def) {
+ var t, i, entry;
+ t = this.table[name] || []; //Look for 'void' instead of empty definition list
+
+ if (def && def.length == 0) {
+ def = ["void"];
+ }
+
+ for (i = 0; i < t.length; i++) {
+ entry = t[i]; //Not type of variable we're looking for
+
+ if (entry.typedef !== typedef) {
+ continue;
+ } //Normal variable
+
+
+ if (typedef !== SymbolTableEntry.typedef.func) {
+ return entry;
+ } //Match any function definition
+
+
+ if (!def) {
+ return entry;
+ } //Match specific function definition
+
+
+ if (def.join(',') === entry.definition.join(',')) {
+ return entry;
+ }
+ }
+
+ return null;
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * Base class of all abstract syntax tree nodes
+ */
+
+
+ function AstNode() {
+ //public:
+ this.location = {
+ first_line: 0,
+ first_column: 0,
+ last_line: 0,
+ last_column: 0
+ }; //The following are used during IR generation
+
+ this.Dest = null;
+ this.Type = null;
+ this.Const = false;
+ }
+
+ var proto = AstNode.prototype; //public:
+
+ proto.getLocation = function () {
+ return this.location;
+ };
+
+ proto.setLocation = function (loc) {
+ this.location.first_line = loc.first_line;
+ this.location.first_column = loc.first_column;
+ this.location.last_line = loc.last_line;
+ this.location.last_column = loc.last_column;
+ };
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+
+ proto.toString = function () {
+ return this.constructor.name;
+ };
+
+ proto.ir = function (state, irs) {//throw new Error("Missing ir generator for node of type " + this.constructor.name);
+ }; //inverse of operators
+
+
+ var ast_operators = ["=", "POS", "NEG", "+", "-", "*", "/", "%", "<<", ">>", "<", ">", "<=", ">=", "==", "!=", "&", "^", "|", "~", "&&", "^^", "||", "!", "*=", "/=", "%=", "+=", "-=", "<<=", ">>=", "&=", "^=", "|=", "?:", "++x", "--x", "x++", "x--", ".", "[]", "()", "ident", "float", "int", "bool"];
+ var ast_precision = {
+ none: 0,
+ highp: 1,
+ mediump: 2,
+ lowp: 3
+ };
+ /**
+ * AST Type Specifier Class
+ */
+
+ function AstTypeSpecifier(specifier) {
+ AstNode.apply(this);
+ this.type_specifier = null;
+ this.type_name = null;
+ this.structure = null;
+ this.is_array = 0;
+ this.array_size = null;
+ this.precision = 2;
+ this.is_precision_statement = null;
+
+ if (AstTypeSpecifier[_typeof(specifier)]) {
+ AstTypeSpecifier[_typeof(specifier)].call(this, specifier);
+ }
+ }
+
+ util.inherits(AstTypeSpecifier, AstNode);
+ proto = AstTypeSpecifier.prototype; //overloaded constructors
+
+ AstTypeSpecifier.number = function (specifier) {
+ this.type_specifier = specifier;
+ this.precision = ast_precision.none;
+ this.is_precision_statement = false;
+ this.type_name = types[specifier].name;
+ };
+
+ AstTypeSpecifier.string = function (name) {
+ this.type_specifier = types[name];
+ this.type_name = name;
+ this.is_array = false;
+ this.precision = ast_precision.none;
+ this.is_precision_statement = false;
+ };
+
+ AstTypeSpecifier.object = function (s) {
+ this.type_specifier = types.struct;
+ this.type_name = s.name;
+ this.structure = s;
+ this.is_array = false;
+ this.precision = ast_precision.none;
+ this.is_precision_statement = false;
+ };
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+
+ proto.toString = function () {
+ var i, prec;
+
+ if (this.is_precision_statement) {
+ for (i in ast_precision) {
+ if (ast_precision.hasOwnProperty(i) && ast_precision[i] === this.precision) {
+ prec = i;
+ break;
+ }
+ }
+
+ return util.format("precision %s %s;\n", prec, this.type_name);
+ }
+
+ return (this.type_specifier === types.struct ? this.structure : this.type_name) + (this.is_array ? util.format("[%s]", this.array_size || "") : "");
+ };
+ /**
+ * AST Function Class
+ */
+
+
+ function AstFunction() {
+ AstNode.apply(this);
+ this.return_type = null;
+ this.identifier = null;
+ this.parameters = [];
+ this.entry = null;
+ }
+
+ util.inherits(AstFunction, AstNode);
+ proto = AstFunction.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("%s %s(%s)", this.return_type, this.identifier, this.parameters.join(", "));
+ };
+ /**
+ * AST Expression Class
+ */
+
+
+ function AstExpression(oper, ex0, ex1, ex2) {
+ AstNode.apply(this);
+ this.oper = oper;
+ this.grouped = false;
+ this.subexpressions = [null, null, null];
+ this.primary_expression = {};
+ this.expressions = [];
+
+ if (ast_operators.indexOf(this.oper) === -1) {
+ this.oper = 'ident';
+ this.primary_expression.identifier = oper;
+ } else {
+ this.subexpressions[0] = ex0;
+ this.subexpressions[1] = ex1;
+ this.subexpressions[2] = ex2;
+ }
+ }
+
+ util.inherits(AstExpression, AstNode);
+ proto = AstExpression.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ var output;
+
+ switch (this.oper) {
+ case '=':
+ case '+':
+ case '-':
+ case '*':
+ case '/':
+ case '%':
+ case "<<":
+ case ">>":
+ case "<":
+ case ">":
+ case "<=":
+ case ">=":
+ case "==":
+ case "!=":
+ case "&":
+ case "^":
+ case "|":
+ case "~":
+ case "&&":
+ case "^^":
+ case "||":
+ case '*=':
+ case '/=':
+ case '%=':
+ case '+=':
+ case '-=':
+ case '<<=':
+ case '>>=':
+ case '&=':
+ case '^=':
+ case '|=':
+ output = util.format("%s %s %s", this.subexpressions[0], this.oper, this.subexpressions[1]);
+ break;
+
+ case '.':
+ output = util.format("%s.%s", this.subexpressions[0], this.primary_expression.identifier);
+ break;
+
+ case 'POS':
+ output = util.format("+%s", this.subexpressions[0]);
+ break;
+
+ case 'NEG':
+ output = util.format("-%s", this.subexpressions[0]);
+ break;
+
+ case '~':
+ case '!':
+ output = util.format("%s%s", this.oper, this.subexpressions[0]);
+ break;
+
+ case '++x':
+ case '--x':
+ output = util.format("%s%s", this.oper.replace('x', ''), this.subexpressions[0]);
+ break;
+
+ case 'x++':
+ case 'x--':
+ output = util.format("%s%s", this.subexpressions[0], this.oper.replace('x', ''));
+ break;
+
+ case '?:':
+ output = util.format("%s ? %s : %s", this.subexpressions[0], this.subexpressions[1], this.subexpressions[2]);
+ break;
+
+ case '[]':
+ output = util.format("%s[%s]", this.subexpressions[0], this.subexpressions[1]);
+ break;
+
+ case '()':
+ output = util.format("%s(%s)", this.subexpressions[0], this.expressions.join(", "));
+ break;
+
+ case 'ident':
+ output = util.format("%s", this.primary_expression.identifier);
+ break;
+
+ case 'float':
+ output = util.format("%s", this.primary_expression.float_constant);
+ break;
+
+ case 'int':
+ output = util.format("%s", this.primary_expression.int_constant);
+ break;
+
+ case 'bool':
+ output = util.format("%s", this.primary_expression.bool_constant ? 'true' : 'false');
+ break;
+ }
+
+ return this.grouped ? util.format("(%s)", output) : output;
+ };
+ /**
+ * AST Fully Specified Type Class
+ */
+
+
+ function AstFullySpecifiedType() {
+ AstNode.apply(this);
+ this.qualifier = [];
+ this.specifier = null;
+ }
+
+ util.inherits(AstFullySpecifiedType, AstNode);
+ proto = AstFullySpecifiedType.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ var output;
+ output = this.qualifier.slice(0);
+ output.push(this.specifier);
+ return output.join(' ');
+ };
+ /**
+ * AST Declaration Class
+ */
+
+
+ function AstDeclaration(identifier, is_array, array_size, initializer) {
+ AstNode.apply(this);
+ this.identifier = identifier;
+ this.is_array = is_array;
+ this.array_size = array_size;
+ this.initializer = initializer;
+ }
+
+ util.inherits(AstDeclaration, AstNode);
+ proto = AstDeclaration.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return this.identifier + (this.is_array ? util.format("[%s]", this.array_size === undefined ? '' : this.array_size) : '') + (this.initializer ? util.format(" = %s", this.initializer) : "");
+ };
+ /**
+ * AST Declarator List Class
+ */
+
+
+ function AstDeclaratorList(type) {
+ AstNode.apply(this);
+ this.type = type;
+ this.declarations = [];
+ this.invariant = 0;
+ }
+
+ util.inherits(AstDeclaratorList, AstNode);
+ proto = AstDeclaratorList.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("%s %s;\n", this.type || "invariant ", this.declarations.join(", "));
+ };
+ /**
+ * AST Parameter Declarator Class
+ */
+
+
+ function AstParameterDeclarator() {
+ AstNode.apply(this);
+ this.type = null;
+ this.identifier = null;
+ this.is_array = false;
+ this.array_size = 0;
+ this.formal_parameter = null;
+ this.is_void = null;
+ }
+
+ util.inherits(AstParameterDeclarator, AstNode);
+ proto = AstParameterDeclarator.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return this.type + (this.identifier ? " " + this.identifier : "") + (this.is_array ? util.format("[%s]", this.array_size) : "");
+ };
+ /**
+ * AST Expression Statement Class
+ */
+
+
+ function AstExpressionStatement(ex) {
+ AstNode.apply(this);
+ this.expression = ex;
+ }
+
+ util.inherits(AstExpressionStatement, AstNode);
+ proto = AstExpressionStatement.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("%s;\n", this.expression || "");
+ };
+ /**
+ * AST Compound Statement Class
+ */
+
+
+ function AstCompoundStatement(new_scope, statements) {
+ AstNode.apply(this);
+ this.new_scope = new_scope;
+
+ if (statements) {
+ this.statements = statements;
+ } else {
+ this.statements = [];
+ }
+ }
+
+ util.inherits(AstCompoundStatement, AstNode);
+ proto = AstCompoundStatement.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ var str, stmts, indent;
+ AstCompoundStatement._depth++;
+ indent = new Array(AstCompoundStatement._depth).join(" ");
+ stmts = indent + " " + this.statements.join(indent + " ");
+ str = "\n" + indent + "{\n" + stmts + indent + "}\n";
+ AstCompoundStatement._depth--;
+ return str;
+ }; //Used for toString indentation
+
+
+ AstCompoundStatement._depth = 0;
+ /**
+ * AST Function Definition Class
+ */
+
+ function AstFunctionDefinition() {
+ AstNode.apply(this);
+ this.proto_type = null;
+ this.body = null;
+ }
+
+ util.inherits(AstFunctionDefinition, AstNode);
+ proto = AstFunctionDefinition.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("%s %s", this.proto_type, this.body);
+ };
+ /**
+ * AST Function Definition Class
+ */
+
+
+ function AstExpressionBin(oper, ex0, ex1) {
+ AstExpression.apply(this, [oper, ex0, ex1]);
+ }
+
+ util.inherits(AstExpressionBin, AstExpression);
+ proto = AstExpressionBin.prototype;
+ /**
+ * AST Function Expression Class
+ */
+
+ function AstFunctionExpression(arg) {
+ AstExpression.apply(this);
+ this.cons = false;
+
+ if (arg.constructor.name === 'AstExpression') {
+ this.cons = false;
+ AstExpression.call(this, '()', arg);
+ } else if (arg.constructor.name === 'AstTypeSpecifier') {
+ this.cons = true;
+ AstExpression.call(this, '()', arg);
+ }
+ }
+
+ util.inherits(AstFunctionExpression, AstExpression);
+ proto = AstFunctionExpression.prototype;
+
+ proto.is_constructor = function () {
+ return this.cons;
+ };
+
+ proto.toString = function () {
+ return util.format("%s(%s)", this.subexpressions[0], this.expressions.join(", "));
+ };
+ /**
+ * AST Selection Statement Class
+ */
+
+
+ function AstSelectionStatement(condition, then_statement, else_statement) {
+ AstNode.apply(this);
+ this.condition = condition;
+ this.then_statement = then_statement;
+ this.else_statement = else_statement;
+ }
+
+ util.inherits(AstSelectionStatement, AstNode);
+ proto = AstSelectionStatement.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("if (%s) %s %s", this.condition, this.then_statement, this.else_statement ? util.format("else %s", this.else_statement) : "");
+ };
+ /**
+ * AST Struct Specifier Class
+ */
+
+
+ function AstStructSpecifier(identifier, declarator_list) {
+ AstNode.apply(this);
+ this.name = null;
+ this.declarations = [];
+
+ if (identifier === null) {
+ identifier = util.format("#anon_struct%d", AstStructSpecifier.anon_count);
+ AstStructSpecifier.anon_count++;
+ }
+
+ this.name = identifier;
+ this.declarations = declarator_list.declarations;
+ }
+
+ AstStructSpecifier.anon_count = 1;
+ util.inherits(AstStructSpecifier, AstNode);
+ proto = AstStructSpecifier.prototype;
+ /**
+ * AST Jump
+ */
+
+ function AstJumpStatement(mode, return_value) {
+ AstNode.apply(this);
+ this.opt_return_value = null;
+ this.mode = mode;
+
+ if (mode === 'return') {
+ this.opt_return_value = return_value;
+ }
+ }
+
+ util.inherits(AstJumpStatement, AstNode);
+ proto = AstJumpStatement.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ switch (this.mode) {
+ case 'continue':
+ case 'break':
+ case 'discard':
+ case 'debugger':
+ return this.mode + ";\n";
+
+ case 'return':
+ return util.format("return%s;\n", this.opt_return_value ? " " + this.opt_return_value : "");
+ }
+ };
+
+ glsl.ast = {
+ Node: AstNode,
+ TypeSpecifier: AstTypeSpecifier,
+ Function: AstFunction,
+ Expression: AstExpression,
+ FullySpecifiedType: AstFullySpecifiedType,
+ Declaration: AstDeclaration,
+ DeclaratorList: AstDeclaratorList,
+ ParameterDeclarator: AstParameterDeclarator,
+ ExpressionStatement: AstExpressionStatement,
+ CompoundStatement: AstCompoundStatement,
+ FunctionDefinition: AstFunctionDefinition,
+ ExpressionBin: AstExpressionBin,
+ FunctionExpression: AstFunctionExpression,
+ SelectionStatement: AstSelectionStatement,
+ StructSpecifier: AstStructSpecifier,
+ JumpStatement: AstJumpStatement
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ var builtin = {
+ vars: {
+ vertex: [{
+ position: 0,
+ type: 'vec4',
+ name: 'gl_Position',
+ out: 'result@0'
+ }, {
+ position: 1,
+ type: 'float',
+ name: 'gl_PointSize',
+ out: 'result@1'
+ }],
+ fragment: [{
+ position: 0,
+ type: 'vec4',
+ name: 'gl_FragColor',
+ out: 'result@0'
+ }]
+ },
+
+ /**
+ * List of instructions for operators
+ *
+ * Denoted by operator, then by definition of param types to output type
+ */
+ oper: {
+ "!": {
+ "bool:bool": ["SEQ %1.x %2.x 0.0"]
+ },
+ "+": {
+ "int,int:int": ["ADD %1.x %2.x %3.x"],
+ "float,float:float": ["ADD %1.x %2.x %3.x"],
+ "float,vec2:vec2": ["ADD %1.xy %2.x %3.xy"],
+ "float,vec3:vec3": ["ADD %1.xyz %2.x %3.xyz"],
+ "float,vec4:vec4": ["ADD %1 %2.x %3"],
+ "vec2,float:vec2": ["ADD %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["ADD %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["ADD %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["ADD %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["ADD %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["ADD %1 %2 %3"]
+ },
+ "-": {
+ "int,int:int": ["SUB %1.x %2.x %3.x"],
+ "float,float:float": ["SUB %1.x %2.x %3.x"],
+ "float,vec2:vec2": ["SUB %1.xy %2.x %3.xy"],
+ "float,vec3:vec3": ["SUB %1.xyz %2.x %3.xyz"],
+ "float,vec4:vec4": ["SUB %1 %2.x %3"],
+ "vec2,float:vec2": ["SUB %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["SUB %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["SUB %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["SUB %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["SUB %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["SUB %1 %2 %3"]
+ },
+ "*": {
+ "int,int:int": ["MUL %1.x %2.x %3.x"],
+ "float,float:float": ["MUL %1.x %2.x %3.x"],
+ "float,vec2:vec2": ["MUL %1.xy %2.x %3.xy"],
+ "float,vec3:vec3": ["MUL %1.xyz %2.x %3.xyz"],
+ "float,vec4:vec4": ["MUL %1 %2.x %3"],
+ "vec2,float:vec2": ["MUL %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["MUL %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["MUL %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["MUL %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["MUL %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["MUL %1 %2 %3"],
+ "mat3,vec3:vec3": ["MUL %1.xyz %2.xyz %3.x", "MAD %1.xyz %2@1.xyz %3.y %1", "MAD %1.xyz %2@2.xyz %3.z %1"],
+ "mat4,vec4:vec4": ["MUL %1 %2 %3.x", "MAD %1 %2@1 %3.y %1", "MAD %1 %2@2 %3.z %1", "MAD %1 %2@3 %3.w %1"],
+ "mat4,mat4:mat4": ["MUL %1 %2 %3.x", "MAD %1 %2@1 %3.y %1", "MAD %1 %2@2 %3.z %1", "MAD %1 %2@3 %3.w %1", "MUL %1@1 %2 %3@1.x", "MAD %1@1 %2@1 %3@1.y %1@1", "MAD %1@1 %2@2 %3@1.z %1@1", "MAD %1@1 %2@3 %3@1.w %1@1", "MUL %1@2 %2 %3@2.x", "MAD %1@2 %2@1 %3@2.y %1@2", "MAD %1@2 %2@2 %3@2.z %1@2", "MAD %1@2 %2@3 %3@2.w %1@2", "MUL %1@3 %2 %3@3.x", "MAD %1@3 %2@1 %3@3.y %1@3", "MAD %1@3 %2@2 %3@3.z %1@3", "MAD %1@3 %2@3 %3@3.w %1@3"]
+ },
+ "/": {
+ "int,int:int": ["DIV %1.x %2.x %3.x"],
+ "float,float:float": ["DIV %1.x %2.x %3.x"],
+ "float,vec2:vec2": ["DIV %1.xy %2.x %3.xy"],
+ "float,vec3:vec3": ["DIV %1.xyz %2.x %3.xyz"],
+ "float,vec4:vec4": ["DIV %1 %2.x %3"],
+ "vec2,float:vec2": ["DIV %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["DIV %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["DIV %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["DIV %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["DIV %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["DIV %1 %2 %3"]
+ },
+ "<": {
+ "int,int:bool": ["SLT %1.x %2.x %3.x"],
+ "float,float:bool": ["SLT %1.x %2.x %3.x"]
+ },
+ ">": {
+ "int,int:bool": ["SGT %1.x %2.x %3.x"],
+ "float,float:bool": ["SGT %1.x %2.x %3.x"]
+ },
+ "<=": {
+ "int,int:bool": ["SLE %1.x %2.x %3.x"],
+ "float,float:bool": ["SLE %1.x %2.x %3.x"]
+ },
+ ">=": {
+ "int,int:bool": ["SGE %1.x %2.x %3.x"],
+ "float,float:bool": ["SGE %1.x %2.x %3.x"]
+ },
+ "==": {
+ "int,int:bool": ["SEQ %1.x %2.x %3.x"],
+ "float,float:bool": ["SEQ %1.x %2.x %3.x"]
+ },
+ "!=": {
+ "int,int:bool": ["SNE %1.x %2.x %3.x"],
+ "float,float:bool": ["SNE %1.x %2.x %3.x"]
+ },
+ "&&": {
+ "bool,bool:bool": ["AND %1.x %2.x %3.x", "AND %1.x %1.x 1"]
+ },
+ "^^": {
+ "bool,bool:bool": ["XOR %1.x %2.x %3.x", "AND %1.x %1.x 1"]
+ },
+ "||": {
+ "bool,bool:bool": ["OR %1.x %2.x %3.x", "AND %1.x %1.x 1"]
+ }
+ },
+
+ /**
+ * List of instructions for built in functions
+ *
+ * Denoted by function name, then by definition of param types to output type
+ */
+ func: {
+ "abs": {
+ "float:float": ["ABS %1.x %2.x"],
+ "vec2:vec2": ["ABS %1.xy %2.xy"],
+ "vec3:vec3": ["ABS %1.xyz %2.xyz"],
+ "vec4:vec4": ["ABS %1 %2"]
+ },
+ "ceil": {
+ "float:float": ["CEIL %1.x %2.x"],
+ "vec2:vec2": ["CEIL %1.xy %2.xy"],
+ "vec3:vec3": ["CEIL %1.xyz %2.xyz"],
+ "vec4:vec4": ["CEIL %1 %2"]
+ },
+ "clamp": {
+ "float,float,float:float": ["MAX %1.x %2.x %3.x", "MIN %1.x %1.x %4.x"],
+ "vec2,float,float:vec2": ["MAX %1.xy %2.xy %3.x", "MIN %1.xy %1.xy %4.x"],
+ "vec3,float,float:vec3": ["MAX %1.xyz %2.xyz %3.x", "MIN %1.xyz %1.xyz %4.x"],
+ "vec4,float,float:vec4": ["MAX %1 %2 %3.x", "MIN %1 %1 %4.x"],
+ "vec2,vec2,vec2:vec2": ["MAX %1.xy %2.xy %3.xy", "MIN %1.xy %1.xy %4.xy"],
+ "vec3,vec3,vec3:vec3": ["MAX %1.xyz %2.xyz %3.xyz", "MIN %1.xyz %1.xyz %4.xyz"],
+ "vec4,vec4,vec4:vec4": ["MAX %1 %2 %3", "MIN %1 %1 %4"]
+ },
+ "cos": {
+ "float:float": ["COS %1.x %2.x"],
+ "vec2:vec2": ["COS %1.xy %2.xy"],
+ "vec3:vec3": ["COS %1.xyz %2.xyz"],
+ "vec4:vec4": ["COS %1 %2"]
+ },
+ "degrees": {
+ "float:float": ["MUL %1.x %2.x " + 180 / Math.PI],
+ "vec2:vec2": ["MUL %1.xy %2.xy " + 180 / Math.PI],
+ "vec3:vec3": ["MUL %1.xyz %2.xyz " + 180 / Math.PI],
+ "vec4:vec4": ["MUL %1 %2 " + 180 / Math.PI]
+ },
+ "dot": {
+ "vec2,vec2:float": ["DP2 %1.x %2.xy %3.xy"],
+ "vec3,vec3:float": ["DP3 %1.x %2.xyz %3.xyz"],
+ "vec4,vec4:float": ["DP4 %1.x %2 %3"]
+ },
+ "floor": {
+ "float:float": ["FLR %1.x %2.x"],
+ "vec2:vec2": ["FLR %1.xy %2.xy"],
+ "vec3:vec3": ["FLR %1.xyz %2.xyz"],
+ "vec4:vec4": ["FLR %1 %2"]
+ },
+ "fract": {
+ "float:float": ["FRC %1.x %2.x"],
+ "vec2:vec2": ["FRC %1.xy %2.xy"],
+ "vec3:vec3": ["FRC %1.xyz %2.xyz"],
+ "vec4:vec4": ["FRC %1 %2"]
+ },
+ "max": {
+ "float,float:float": ["MAX %1.x %2.x %3.x"],
+ "vec2,float:vec2": ["MAX %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["MAX %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["MAX %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["MAX %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["MAX %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["MAX %1 %2 %3"]
+ },
+ "min": {
+ "float,float:float": ["MIN %1.x %2.x %3.x"],
+ "vec2,float:vec2": ["MIN %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["MIN %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["MIN %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["MIN %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["MIN %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["MIN %1 %2 %3"]
+ },
+ "mix": {
+ "float,float,float:float": ["MAD %1.x -%2.x %4.x %2.x", "MAD %1.x %3.x %4.x %1.x"],
+ "vec2,vec2,float:vec2": ["MAD %1.xy -%2.xy %4.x %2.xy", "MAD %1.xy %3.xy %4.x %1.xy"],
+ "vec3,vec3,float:vec3": ["MAD %1.xyz -%2.xyz %4.x %2.xyz", "MAD %1.xyz %3.xyz %4.x %1.xyz"],
+ "vec4,vec4,float:vec4": ["MAD %1 -%2 %4.x %2", "MAD %1 %3 %4.x %1"],
+ "vec2,vec2,vec2:vec2": ["MAD %1.xy -%2.xy %4.xy %2.xy", "MAD %1.xy %3.xy %4.xy %1.xy"],
+ "vec3,vec3,vec3:vec3": ["MAD %1.xyz -%2.xyz %4.xyz %2.xyz", "MAD %1.xyz %3.xyz %4.xyz %1.xyz"],
+ "vec4,vec4,vec4:vec4": ["MAD %1 -%2 %4 %2", "MAD %1 %3 %4 %1"]
+ },
+ "mod": {
+ "float,float:float": ["MOD %1.x %2.x %3.x"],
+ "vec2,float:vec2": ["MOD %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["MOD %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["MOD %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["MOD %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["MOD %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["MOD %1 %2 %3"]
+ },
+ "normalize": {
+ "vec3:vec3": ["DP3 %1.x %2 %2", "RSQ %1.x %1.x", "MUL %1.xyz %2.xyz %1.x"],
+ "vec4:vec4": ["DP4 %1.x %2 %2", "RSQ %1.x %1.x", "MUL %1 %2 %1.x"]
+ },
+ "pow": {
+ "float,float:float": ["POW %1.x %2.x %3.x"]
+ },
+ "reflect": {
+ "vec3,vec3:vec3": ["DP3 %1.x %3 %2", "MUL %1.xyz %3 %1.x", "MAD %1.xyz -%1 2.0 %2"]
+ },
+ "radians": {
+ "float:float": ["MUL %1.x %2.x " + Math.PI / 180],
+ "vec2:vec2": ["MUL %1.xy %2.xy " + Math.PI / 180],
+ "vec3:vec3": ["MUL %1.xyz %2.xyz " + Math.PI / 180],
+ "vec4:vec4": ["MUL %1 %2 " + Math.PI / 180]
+ },
+ "sign": {
+ "float:float": ["SGT %t1.x %2.x 0", "SLT %t1.y %2.x 0", "ADD %1.x %t1.x -%t1.y"],
+ "vec2:vec2": ["SGT %t1.xy %2.xy 0", "SLT %t1.zw %2.zw 0", "ADD %1.xy %t1.xy -%t1.zw"],
+ "vec3:vec3": ["SGT %t1.xyz %2.xyz 0", "SLT %t2.xyz %2.xyz 0", "ADD %1.xyz %t1.xyz -%t2.xyz"],
+ "vec4:vec4": ["SGT %t1 %2 0", "SLT %t2 %2 0", "ADD %1 %t1 -%t2"]
+ },
+ "sin": {
+ "float:float": ["SIN %1.x %2.x"],
+ "vec2:vec2": ["SIN %1.xy %2.xy"],
+ "vec3:vec3": ["SIN %1.xyz %2.xyz"],
+ "vec4:vec4": ["SIN %1 %2"]
+ },
+ "step": {
+ "float,float:float": ["SGE %1.x %3.x %2.x"],
+ "float,vec2:vec2": ["SGE %1.xy %3.x %2.xy"],
+ "float,vec3:vec3": ["SGE %1.xyz %3.x %2.xyz"],
+ "float,vec4:vec4": ["SGE %1 %3.x %2"],
+ "vec2,vec2:vec2": ["SGE %1.xy %3.xy %2.xy"],
+ "vec3,vec3:vec3": ["SGE %1.xyz %3.xyz %2.xyz"],
+ "vec4,vec4:vec4": ["SGE %1 %3 %3"]
+ },
+ "tan": {
+ "float:float": ["TAN %1.x %2.x"],
+ "vec2:vec2": ["TAN %1.xy %2.xy"],
+ "vec3:vec3": ["TAN %1.xyz %2.xyz"],
+ "vec4:vec4": ["TAN %1 %2"]
+ },
+ "texture2D": {
+ "sampler2D,vec2:vec4": ["TEX %1 %3 %2 \"2D\""]
+ }
+ }
+ };
+
+ function _builtinParseType(str) {
+ var parts, ret;
+ parts = str.split(":");
+ parts[0] = parts[0].split(",");
+ ret = {
+ src: parts[0],
+ dest: parts[1]
+ };
+ return ret;
+ }
+
+ function symbol_table_init(table, target) {
+ var i, j, vars, v, entry, types, name;
+ vars = target === glsl.target.vertex ? builtin.vars.vertex : builtin.vars.fragment;
+
+ for (i = 0; i < vars.length; i++) {
+ v = vars[i];
+ entry = table.add_variable(v.name, v.type);
+ entry.position = v.position;
+ entry.out = v.out;
+ }
+
+ vars = builtin.func;
+
+ for (name in vars) {
+ v = vars[name];
+
+ for (j in v) {
+ types = _builtinParseType(j);
+ entry = table.add_function(name, types.dest, types.src);
+ entry.code = v[j];
+ }
+ }
+ }
+ /* parser generated by jison 0.4.15 */
+
+ /*
+ Returns a Parser object of the following structure:
+
+ Parser: {
+ yy: {}
+ }
+
+ Parser.prototype: {
+ yy: {},
+ trace: function(),
+ symbols_: {associative list: name ==> number},
+ terminals_: {associative list: number ==> name},
+ productions_: [...],
+ performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+ table: [...],
+ defaultActions: {...},
+ parseError: function(str, hash),
+ parse: function(input),
+
+ lexer: {
+ EOF: 1,
+ parseError: function(str, hash),
+ setInput: function(input),
+ input: function(),
+ unput: function(str),
+ more: function(),
+ less: function(n),
+ pastInput: function(),
+ upcomingInput: function(),
+ showPosition: function(),
+ test_match: function(regex_match_array, rule_index),
+ next: function(),
+ lex: function(),
+ begin: function(condition),
+ popState: function(),
+ _currentRules: function(),
+ topState: function(),
+ pushState: function(condition),
+
+ options: {
+ ranges: boolean (optional: true ==> token location info will include a .range[] member)
+ flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+ backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+ },
+
+ performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+ rules: [...],
+ conditions: {associative list: name ==> set},
+ }
+ }
+
+
+ token location info (@$, _$, etc.): {
+ first_line: n,
+ last_line: n,
+ first_column: n,
+ last_column: n,
+ range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
+ }
+
+
+ the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+ text: (matched text)
+ token: (the produced terminal token, if any)
+ line: (yylineno)
+ }
+ while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+ loc: (yylloc)
+ expected: (string describing the set of expected tokens)
+ recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+ }
+ */
+
+
+ var parser = function () {
+ var o = function o(k, v, _o, l) {
+ for (_o = _o || {}, l = k.length; l--; _o[k[l]] = v) {
+ ;
+ }
+
+ return _o;
+ },
+ $V0 = [13, 14, 15, 16, 17, 21, 22, 47, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $V1 = [1, 18],
+ $V2 = [1, 19],
+ $V3 = [1, 20],
+ $V4 = [1, 21],
+ $V5 = [1, 22],
+ $V6 = [1, 53],
+ $V7 = [1, 54],
+ $V8 = [1, 17],
+ $V9 = [1, 44],
+ $Va = [1, 45],
+ $Vb = [1, 28],
+ $Vc = [1, 47],
+ $Vd = [1, 48],
+ $Ve = [1, 49],
+ $Vf = [1, 50],
+ $Vg = [1, 40],
+ $Vh = [1, 41],
+ $Vi = [1, 42],
+ $Vj = [1, 43],
+ $Vk = [1, 46],
+ $Vl = [1, 55],
+ $Vm = [1, 56],
+ $Vn = [1, 57],
+ $Vo = [1, 58],
+ $Vp = [1, 59],
+ $Vq = [1, 60],
+ $Vr = [1, 61],
+ $Vs = [1, 62],
+ $Vt = [1, 63],
+ $Vu = [1, 64],
+ $Vv = [1, 65],
+ $Vw = [1, 66],
+ $Vx = [1, 67],
+ $Vy = [1, 68],
+ $Vz = [1, 69],
+ $VA = [1, 70],
+ $VB = [1, 71],
+ $VC = [1, 72],
+ $VD = [1, 73],
+ $VE = [1, 74],
+ $VF = [1, 75],
+ $VG = [1, 76],
+ $VH = [1, 37],
+ $VI = [1, 38],
+ $VJ = [1, 39],
+ $VK = [1, 77],
+ $VL = [5, 13, 14, 15, 16, 17, 21, 47, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $VM = [1, 82],
+ $VN = [1, 83],
+ $VO = [1, 84],
+ $VP = [1, 86],
+ $VQ = [1, 87],
+ $VR = [49, 106],
+ $VS = [21, 47, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $VT = [2, 121],
+ $VU = [1, 101],
+ $VV = [1, 102],
+ $VW = [1, 103],
+ $VX = [1, 100],
+ $VY = [2, 159],
+ $VZ = [21, 25, 26, 49, 106],
+ $V_ = [2, 141],
+ $V$ = [21, 25, 26, 30, 32, 49, 106],
+ $V01 = [21, 47, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 169],
+ $V11 = [21, 47, 120, 121, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $V21 = [21, 25, 26, 30, 32, 34, 49, 106],
+ $V31 = [2, 177],
+ $V41 = [2, 12],
+ $V51 = [11, 23, 30, 32, 34, 36, 38, 39, 40, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106, 170],
+ $V61 = [5, 10, 13, 14, 15, 16, 17, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 172, 189, 191, 193, 194, 195, 196, 197, 198, 202, 203, 204, 205, 206],
+ $V71 = [1, 169],
+ $V81 = [1, 170],
+ $V91 = [1, 171],
+ $Va1 = [1, 172],
+ $Vb1 = [1, 156],
+ $Vc1 = [1, 157],
+ $Vd1 = [1, 182],
+ $Ve1 = [1, 163],
+ $Vf1 = [1, 164],
+ $Vg1 = [1, 165],
+ $Vh1 = [1, 166],
+ $Vi1 = [1, 136],
+ $Vj1 = [1, 127],
+ $Vk1 = [1, 138],
+ $Vl1 = [1, 139],
+ $Vm1 = [1, 140],
+ $Vn1 = [1, 141],
+ $Vo1 = [1, 142],
+ $Vp1 = [1, 143],
+ $Vq1 = [1, 144],
+ $Vr1 = [1, 145],
+ $Vs1 = [1, 146],
+ $Vt1 = [1, 147],
+ $Vu1 = [1, 148],
+ $Vv1 = [1, 149],
+ $Vw1 = [32, 49],
+ $Vx1 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 172, 189, 193, 194, 195, 196, 197, 198, 202, 203, 204, 205, 206],
+ $Vy1 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 172, 189, 191, 193, 194, 195, 196, 197, 198, 202, 203, 204, 205, 206],
+ $Vz1 = [1, 216],
+ $VA1 = [23, 32, 36, 49, 106],
+ $VB1 = [23, 32, 36, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $VC1 = [2, 58],
+ $VD1 = [23, 32, 36, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106],
+ $VE1 = [1, 251],
+ $VF1 = [23, 32, 36, 49, 88, 90, 106],
+ $VG1 = [1, 252],
+ $VH1 = [23, 32, 34, 36, 38, 39, 40, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106],
+ $VI1 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $VJ1 = [23, 32, 36, 49, 86, 88, 90, 106],
+ $VK1 = [1, 253],
+ $VL1 = [23, 32, 36, 49, 84, 86, 88, 90, 106],
+ $VM1 = [1, 256],
+ $VN1 = [23, 32, 36, 49, 82, 84, 86, 88, 90, 106],
+ $VO1 = [1, 257],
+ $VP1 = [23, 32, 36, 49, 80, 82, 84, 86, 88, 90, 106],
+ $VQ1 = [1, 261],
+ $VR1 = [23, 32, 36, 49, 78, 80, 82, 84, 86, 88, 90, 106],
+ $VS1 = [1, 264],
+ $VT1 = [1, 265],
+ $VU1 = [10, 21, 25, 26, 28, 29, 30, 32, 39, 40, 47, 51, 57, 58, 59, 60, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $VV1 = [23, 32, 36, 49, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $VW1 = [1, 266],
+ $VX1 = [1, 267],
+ $VY1 = [1, 268],
+ $VZ1 = [1, 269],
+ $V_1 = [23, 32, 36, 49, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $V$1 = [1, 270],
+ $V02 = [1, 271],
+ $V12 = [23, 32, 36, 49, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $V22 = [1, 272],
+ $V32 = [1, 273],
+ $V42 = [23, 32, 36, 49, 57, 58, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $V52 = [1, 274],
+ $V62 = [1, 275],
+ $V72 = [1, 276],
+ $V82 = [21, 47, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 172],
+ $V92 = [1, 306],
+ $Va2 = [30, 34],
+ $Vb2 = [32, 106],
+ $Vc2 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169];
+
+ var parser = {
+ trace: function trace() {},
+ yy: {},
+ symbols_: {
+ "error": 2,
+ "glsl-start": 3,
+ "translation_unit": 4,
+ "EOF": 5,
+ "version_statement": 6,
+ "extension_statement_list": 7,
+ "external_declaration_list": 8,
+ "VERSION": 9,
+ "INTCONSTANT": 10,
+ "EOL": 11,
+ "pragma_statement": 12,
+ "PRAGMA_DEBUG_ON": 13,
+ "PRAGMA_DEBUG_OFF": 14,
+ "PRAGMA_OPTIMIZE_ON": 15,
+ "PRAGMA_OPTIMIZE_OFF": 16,
+ "PRAGMA_INVARIANT_ALL": 17,
+ "extension_statement": 18,
+ "any_identifier": 19,
+ "variable_identifier": 20,
+ "TYPE_IDENTIFIER": 21,
+ "EXTENSION": 22,
+ ":": 23,
+ "external_declaration": 24,
+ "IDENTIFIER": 25,
+ "NEW_IDENTIFIER": 26,
+ "primary_expression": 27,
+ "FLOATCONSTANT": 28,
+ "BOOLCONSTANT": 29,
+ "(": 30,
+ "expression": 31,
+ ")": 32,
+ "postfix_expression": 33,
+ "[": 34,
+ "integer_expression": 35,
+ "]": 36,
+ "function_call": 37,
+ ".": 38,
+ "++": 39,
+ "--": 40,
+ "function_call_or_method": 41,
+ "function_call_generic": 42,
+ "method_call_generic": 43,
+ "function_call_header_with_parameters": 44,
+ "function_call_header_no_parameters": 45,
+ "function_call_header": 46,
+ "VOID": 47,
+ "assignment_expression": 48,
+ ",": 49,
+ "type_specifier": 50,
+ "FIELD_SELECTION": 51,
+ "method_call_header_with_parameters": 52,
+ "method_call_header_no_parameters": 53,
+ "method_call_header": 54,
+ "unary_expression": 55,
+ "unary_operator": 56,
+ "+": 57,
+ "-": 58,
+ "!": 59,
+ "~": 60,
+ "multiplicative_expression": 61,
+ "*": 62,
+ "/": 63,
+ "%": 64,
+ "additive_expression": 65,
+ "shift_expression": 66,
+ "<<": 67,
+ ">>": 68,
+ "relational_expression": 69,
+ "<": 70,
+ ">": 71,
+ "<=": 72,
+ ">=": 73,
+ "equality_expression": 74,
+ "==": 75,
+ "!=": 76,
+ "and_expression": 77,
+ "&": 78,
+ "exclusive_or_expression": 79,
+ "^": 80,
+ "inclusive_or_expression": 81,
+ "|": 82,
+ "logical_and_expression": 83,
+ "&&": 84,
+ "logical_xor_expression": 85,
+ "^^": 86,
+ "logical_or_expression": 87,
+ "||": 88,
+ "conditional_expression": 89,
+ "?": 90,
+ "assignment_operator": 91,
+ "=": 92,
+ "*=": 93,
+ "/=": 94,
+ "%=": 95,
+ "+=": 96,
+ "-=": 97,
+ "<<=": 98,
+ ">>=": 99,
+ "&=": 100,
+ "^=": 101,
+ "|=": 102,
+ "constant_expression": 103,
+ "declaration": 104,
+ "function_prototype": 105,
+ ";": 106,
+ "init_declarator_list": 107,
+ "PRECISION": 108,
+ "precision_qualifier": 109,
+ "type_specifier_no_prec": 110,
+ "function_declarator": 111,
+ "function_header": 112,
+ "function_header_with_parameters": 113,
+ "parameter_declaration": 114,
+ "fully_specified_type": 115,
+ "parameter_declarator": 116,
+ "parameter_type_qualifier": 117,
+ "parameter_qualifier": 118,
+ "parameter_type_specifier": 119,
+ "IN": 120,
+ "OUT": 121,
+ "INOUT": 122,
+ "single_declaration": 123,
+ "initializer": 124,
+ "INVARIANT": 125,
+ "type_qualifier": 126,
+ "layout_qualifier": 127,
+ "LAYOUT": 128,
+ "layout_qualifier_id_list": 129,
+ "layout_qualifier_id": 130,
+ "interpolation_qualifier": 131,
+ "SMOOTH": 132,
+ "FLAT": 133,
+ "NOPERSPECTIVE": 134,
+ "CONST": 135,
+ "storage_qualifier": 136,
+ "ATTRIBUTE": 137,
+ "VARYING": 138,
+ "CENTROID": 139,
+ "UNIFORM": 140,
+ "type_specifier_nonarray": 141,
+ "basic_type_specifier_nonarray": 142,
+ "struct_specifier": 143,
+ "FLOAT": 144,
+ "DOUBLE": 145,
+ "INT": 146,
+ "BOOL": 147,
+ "VEC2": 148,
+ "VEC3": 149,
+ "VEC4": 150,
+ "BVEC2": 151,
+ "BVEC3": 152,
+ "BVEC4": 153,
+ "IVEC2": 154,
+ "IVEC3": 155,
+ "IVEC4": 156,
+ "MAT2X2": 157,
+ "MAT3X3": 158,
+ "MAT4X4": 159,
+ "SAMPLER1D": 160,
+ "SAMPLER2D": 161,
+ "SAMPLER3D": 162,
+ "SAMPLERCUBE": 163,
+ "SAMPLER1DSHADOW": 164,
+ "SAMPLER2DSHADOW": 165,
+ "HIGHP": 166,
+ "MEDIUMP": 167,
+ "LOWP": 168,
+ "STRUCT": 169,
+ "{": 170,
+ "struct_declaration_list": 171,
+ "}": 172,
+ "struct_declaration": 173,
+ "struct_declarator_list": 174,
+ "struct_declarator": 175,
+ "declaration_statement": 176,
+ "statement": 177,
+ "compound_statement": 178,
+ "simple_statement": 179,
+ "expression_statement": 180,
+ "selection_statement": 181,
+ "switch_statement": 182,
+ "case_label": 183,
+ "iteration_statement": 184,
+ "jump_statement": 185,
+ "statement_list": 186,
+ "statement_no_new_scope": 187,
+ "compound_statement_no_new_scope": 188,
+ "IF": 189,
+ "selection_rest_statement": 190,
+ "ELSE": 191,
+ "condition": 192,
+ "SWITCH": 193,
+ "CASE": 194,
+ "DEFAULT": 195,
+ "WHILE": 196,
+ "DO": 197,
+ "FOR": 198,
+ "for_init_statement": 199,
+ "for_rest_statement": 200,
+ "conditionopt": 201,
+ "CONTINUE": 202,
+ "BREAK": 203,
+ "RETURN": 204,
+ "DISCARD": 205,
+ "DEBUGGER": 206,
+ "function_definition": 207,
+ "$accept": 0,
+ "$end": 1
+ },
+ terminals_: {
+ 2: "error",
+ 5: "EOF",
+ 9: "VERSION",
+ 10: "INTCONSTANT",
+ 11: "EOL",
+ 13: "PRAGMA_DEBUG_ON",
+ 14: "PRAGMA_DEBUG_OFF",
+ 15: "PRAGMA_OPTIMIZE_ON",
+ 16: "PRAGMA_OPTIMIZE_OFF",
+ 17: "PRAGMA_INVARIANT_ALL",
+ 21: "TYPE_IDENTIFIER",
+ 22: "EXTENSION",
+ 23: ":",
+ 25: "IDENTIFIER",
+ 26: "NEW_IDENTIFIER",
+ 28: "FLOATCONSTANT",
+ 29: "BOOLCONSTANT",
+ 30: "(",
+ 32: ")",
+ 34: "[",
+ 36: "]",
+ 38: ".",
+ 39: "++",
+ 40: "--",
+ 47: "VOID",
+ 49: ",",
+ 51: "FIELD_SELECTION",
+ 57: "+",
+ 58: "-",
+ 59: "!",
+ 60: "~",
+ 62: "*",
+ 63: "/",
+ 64: "%",
+ 67: "<<",
+ 68: ">>",
+ 70: "<",
+ 71: ">",
+ 72: "<=",
+ 73: ">=",
+ 75: "==",
+ 76: "!=",
+ 78: "&",
+ 80: "^",
+ 82: "|",
+ 84: "&&",
+ 86: "^^",
+ 88: "||",
+ 90: "?",
+ 92: "=",
+ 93: "*=",
+ 94: "/=",
+ 95: "%=",
+ 96: "+=",
+ 97: "-=",
+ 98: "<<=",
+ 99: ">>=",
+ 100: "&=",
+ 101: "^=",
+ 102: "|=",
+ 106: ";",
+ 108: "PRECISION",
+ 120: "IN",
+ 121: "OUT",
+ 122: "INOUT",
+ 125: "INVARIANT",
+ 128: "LAYOUT",
+ 132: "SMOOTH",
+ 133: "FLAT",
+ 134: "NOPERSPECTIVE",
+ 135: "CONST",
+ 137: "ATTRIBUTE",
+ 138: "VARYING",
+ 139: "CENTROID",
+ 140: "UNIFORM",
+ 144: "FLOAT",
+ 145: "DOUBLE",
+ 146: "INT",
+ 147: "BOOL",
+ 148: "VEC2",
+ 149: "VEC3",
+ 150: "VEC4",
+ 151: "BVEC2",
+ 152: "BVEC3",
+ 153: "BVEC4",
+ 154: "IVEC2",
+ 155: "IVEC3",
+ 156: "IVEC4",
+ 157: "MAT2X2",
+ 158: "MAT3X3",
+ 159: "MAT4X4",
+ 160: "SAMPLER1D",
+ 161: "SAMPLER2D",
+ 162: "SAMPLER3D",
+ 163: "SAMPLERCUBE",
+ 164: "SAMPLER1DSHADOW",
+ 165: "SAMPLER2DSHADOW",
+ 166: "HIGHP",
+ 167: "MEDIUMP",
+ 168: "LOWP",
+ 169: "STRUCT",
+ 170: "{",
+ 172: "}",
+ 189: "IF",
+ 191: "ELSE",
+ 193: "SWITCH",
+ 194: "CASE",
+ 195: "DEFAULT",
+ 196: "WHILE",
+ 197: "DO",
+ 198: "FOR",
+ 202: "CONTINUE",
+ 203: "BREAK",
+ 204: "RETURN",
+ 205: "DISCARD",
+ 206: "DEBUGGER"
+ },
+ productions_: [0, [3, 2], [4, 3], [6, 0], [6, 3], [12, 2], [12, 2], [12, 2], [12, 2], [12, 2], [7, 0], [7, 2], [19, 1], [19, 1], [18, 5], [8, 1], [8, 2], [20, 1], [20, 1], [27, 1], [27, 1], [27, 1], [27, 1], [27, 3], [33, 1], [33, 4], [33, 1], [33, 3], [33, 2], [33, 2], [35, 1], [37, 1], [41, 1], [41, 3], [42, 2], [42, 2], [45, 2], [45, 1], [44, 2], [44, 3], [46, 2], [46, 2], [46, 1], [43, 2], [43, 2], [53, 2], [53, 1], [52, 2], [52, 3], [54, 2], [55, 1], [55, 2], [55, 2], [55, 2], [56, 1], [56, 1], [56, 1], [56, 1], [61, 1], [61, 3], [61, 3], [61, 3], [65, 1], [65, 3], [65, 3], [66, 1], [66, 3], [66, 3], [69, 1], [69, 3], [69, 3], [69, 3], [69, 3], [74, 1], [74, 3], [74, 3], [77, 1], [77, 3], [79, 1], [79, 3], [81, 1], [81, 3], [83, 1], [83, 3], [85, 1], [85, 3], [87, 1], [87, 3], [89, 1], [89, 5], [48, 1], [48, 3], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [31, 1], [31, 3], [103, 1], [104, 2], [104, 2], [104, 4], [105, 2], [111, 1], [111, 1], [113, 2], [113, 3], [112, 3], [116, 2], [116, 5], [114, 3], [114, 2], [114, 3], [114, 2], [118, 0], [118, 1], [118, 1], [118, 1], [119, 1], [107, 1], [107, 3], [107, 5], [107, 6], [107, 7], [107, 8], [107, 5], [123, 1], [123, 2], [123, 4], [123, 5], [123, 6], [123, 7], [123, 4], [123, 2], [115, 1], [115, 2], [127, 4], [129, 1], [129, 3], [130, 1], [130, 3], [131, 1], [131, 1], [131, 1], [117, 1], [126, 1], [126, 1], [126, 2], [126, 1], [126, 2], [126, 2], [126, 3], [126, 1], [136, 1], [136, 1], [136, 1], [136, 2], [136, 1], [136, 1], [136, 2], [136, 2], [136, 1], [50, 1], [50, 2], [110, 1], [110, 3], [110, 4], [141, 1], [141, 1], [141, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [109, 1], [109, 1], [109, 1], [143, 5], [143, 4], [171, 1], [171, 2], [173, 3], [174, 1], [174, 3], [175, 1], [175, 4], [124, 1], [176, 1], [177, 1], [177, 1], [179, 1], [179, 1], [179, 1], [179, 1], [179, 1], [179, 1], [179, 1], [178, 2], [178, 3], [187, 1], [187, 1], [188, 2], [188, 3], [186, 1], [186, 2], [180, 1], [180, 2], [181, 5], [190, 3], [190, 1], [192, 1], [192, 4], [182, 5], [183, 3], [183, 2], [184, 5], [184, 7], [184, 6], [199, 1], [199, 1], [201, 1], [201, 0], [200, 2], [200, 3], [185, 2], [185, 2], [185, 2], [185, 3], [185, 2], [185, 2], [24, 1], [24, 1], [24, 1], [207, 2]],
+ performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate
+ /* action[1] */
+ , $$
+ /* vstack */
+ , _$
+ /* lstack */
+ ) {
+ /* this == yyval */
+ var $0 = $$.length - 1;
+
+ switch (yystate) {
+ case 1:
+ return $$[$0 - 1];
+ break;
+
+ case 15:
+ case 16:
+ if ($$[$0] !== null) {
+ yy.state.addAstNode($$[$0]);
+ }
+
+ break;
+
+ case 19:
+ this.$ = new AstExpression('ident');
+ this.$.setLocation(_$[$0]);
+ this.$.primary_expression.identifier = $$[$0];
+ break;
+
+ case 20:
+ this.$ = new AstExpression('int');
+ this.$.setLocation(_$[$0]);
+ this.$.primary_expression.int_constant = $$[$0];
+ this.$.primary_expression.type = 'int';
+ break;
+
+ case 21:
+ this.$ = new AstExpression('float');
+ this.$.setLocation(_$[$0]);
+ this.$.primary_expression.float_constant = $$[$0];
+ this.$.primary_expression.type = 'float';
+ break;
+
+ case 22:
+ this.$ = new AstExpression('bool');
+ this.$.setLocation(_$[$0]);
+ this.$.primary_expression.bool_constant = $$[$0];
+ this.$.primary_expression.type = 'bool';
+ break;
+
+ case 23:
+ this.$ = $$[$0 - 1];
+ this.$.grouped = true;
+ break;
+
+ case 25:
+ this.$ = new AstExpression('[]', $$[$0 - 3], $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 3]);
+ break;
+
+ case 27:
+ this.$ = new AstExpression('.', $$[$0 - 2]);
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.primary_expression.identifier = $$[$0];
+ break;
+
+ case 28:
+ this.$ = new AstExpression('x++', $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 29:
+ this.$ = new AstExpression('x--', $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 38:
+ this.$ = $$[$0 - 1];
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.expressions.push($$[$0]);
+ break;
+
+ case 39:
+ this.$ = $$[$0 - 2];
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.expressions.push($$[$0]);
+ break;
+
+ case 40:
+ this.$ = new AstFunctionExpression($$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 41:
+ var callee = new AstExpression($$[$0 - 1]);
+ this.$ = new AstFunctionExpression(callee);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 51:
+ this.$ = new AstExpression('++x', $$[$0]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 52:
+ this.$ = new AstExpression('--x', $$[$0]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 53:
+ this.$ = new AstExpression($$[$0 - 1], $$[$0]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 54:
+ this.$ = 'POS';
+ break;
+
+ case 55:
+ this.$ = 'NEG';
+ break;
+
+ case 59:
+ case 60:
+ case 61:
+ case 63:
+ case 64:
+ case 66:
+ case 67:
+ case 69:
+ case 70:
+ case 71:
+ case 72:
+ case 74:
+ case 75:
+ case 77:
+ case 79:
+ case 81:
+ case 83:
+ case 85:
+ case 87:
+ this.$ = new AstExpressionBin($$[$0 - 1], $$[$0 - 2], $$[$0]);
+ this.$.setLocation(_$[$0 - 2]);
+ break;
+
+ case 89:
+ this.$ = new AstExpression($$[$0 - 3], $$[$0 - 4], $$[$0 - 2], $$[$0]);
+ this.$.setLocation(_$[$0 - 4]);
+ break;
+
+ case 91:
+ this.$ = new AstExpression($$[$0 - 1], $$[$0 - 2], $$[$0]);
+ this.$.setLocation(_$[$0 - 2]);
+ break;
+
+ case 103:
+ this.$ = $$[$0];
+ break;
+
+ case 104:
+ if ($$[$0 - 2].oper !== $$[$0 - 1]) {
+ this.$ = new AstExpression($$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.expressions.push($$[$0 - 2]);
+ } else {
+ this.$ = $$[$0 - 2];
+ }
+
+ this.$.expressions.push($$[$0]);
+ break;
+
+ case 106:
+ yy.state.symbols.pop_scope();
+ this.$ = $$[$0 - 1];
+ break;
+
+ case 107:
+ this.$ = $$[$0 - 1];
+ break;
+
+ case 108:
+ $$[$0 - 1].precision = $$[$0 - 2];
+ $$[$0 - 1].is_precision_statement = true;
+ this.$ = $$[$0 - 1];
+ break;
+
+ case 112:
+ this.$ = $$[$0 - 1];
+ this.$.parameters.push($$[$0]);
+ break;
+
+ case 113:
+ this.$ = $$[$0 - 2];
+ this.$.parameters.push($$[$0]);
+ break;
+
+ case 114:
+ this.$ = new AstFunction();
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.return_type = $$[$0 - 2];
+ this.$.identifier = $$[$0 - 1]; //Check for duplicates
+
+ if ($$[$0 - 1] == 'main') {
+ if (yy.state.symbols.get_function($$[$0 - 1])) {
+ var e = new Error("Cannot define main() more than once");
+ e.lineNumber = _$[$0 - 2].first_line;
+ e.columnNumber = _$[$0 - 2].first_column;
+ throw e;
+ }
+ }
+
+ this.$.entry = yy.state.symbols.add_function($$[$0 - 1], $$[$0 - 2].specifier.type_name);
+ this.$.entry.Ast = this.$;
+ yy.state.symbols.push_scope();
+ break;
+
+ case 115:
+ this.$ = new AstParameterDeclarator();
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.type = new AstFullySpecifiedType();
+ this.$.type.setLocation(_$[$0 - 1]);
+ this.$.type.specifier = $$[$0 - 1];
+ this.$.identifier = $$[$0];
+ break;
+
+ case 117:
+ $$[$0 - 2].concat($$[$0 - 1]);
+ this.$ = $$[$0];
+ this.$.type.qualifier = $$[$0 - 2];
+ break;
+
+ case 118:
+ this.$ = $$[$0];
+ this.$.type.qualifier = $$[$0 - 1];
+ break;
+
+ case 119:
+ $$[$0 - 2].concat($$[$0 - 1]);
+ this.$ = new AstParameterDeclarator();
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.type = new AstFullySpecifiedType();
+ this.$.type.qualifier = $$[$0 - 2];
+ this.$.type.specifier = $$[$0];
+ break;
+
+ case 120:
+ this.$ = new AstParameterDeclarator();
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.type = new AstFullySpecifiedType();
+ this.$.type.qualifier = $$[$0 - 1];
+ this.$.type.specifier = $$[$0];
+ break;
+
+ case 121:
+ this.$ = [];
+ break;
+
+ case 122:
+ this.$ = ['in'];
+ break;
+
+ case 123:
+ this.$ = ['out'];
+ break;
+
+ case 124:
+ this.$ = ['inout'];
+ break;
+
+ case 127:
+ var decl = new AstDeclaration($$[$0], false);
+ decl.setLocation(_$[$0 - 2]);
+ this.$ = $$[$0 - 2];
+ this.$.declarations.push(decl);
+ /*yy.state.symbols.add_variable($$[$0]);*/
+
+ break;
+
+ case 129:
+ var decl = new AstDeclaration($$[$0 - 3], true, $$[$0 - 1]);
+ decl.setLocation(_$[$0 - 5]);
+ this.$ = $$[$0 - 5];
+ this.$.declarations.push(decl);
+ /*yy.state.symbols.add_variable($$[$0-3]);*/
+
+ break;
+
+ case 132:
+ var decl = new AstDeclaration($$[$0 - 2], false, null, $$[$0]);
+ decl.setLocation(_$[$0 - 4]);
+ this.$ = $$[$0 - 4];
+ this.$.declarations.push(decl);
+ /*yy.state.symbols.add_variable($$[$0-2]);*/
+
+ break;
+
+ case 133:
+ if ($$[$0].specifier.type_specifier !== types.struct) {
+ yy.state.addError("empty declaration list", _$[$0].first_line, _$[$0].first_column);
+ return 0;
+ }
+
+ this.$ = new AstDeclaratorList($$[$0]);
+ this.$.setLocation(_$[$0]);
+ break;
+
+ case 134:
+ var decl = new AstDeclaration($$[$0], false);
+ decl.setLocation(_$[$0]);
+ this.$ = new AstDeclaratorList($$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 135:
+ var decl = new AstDeclaration($$[$0 - 2], true);
+ decl.setLocation(_$[$0 - 2]);
+ this.$ = new AstDeclaratorList($$[$0 - 3]);
+ this.$.setLocation(_$[$0 - 3]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 136:
+ var decl = new AstDeclaration($$[$0 - 3], true, $$[$0 - 1]);
+ decl.setLocation(_$[$0 - 3]);
+ this.$ = new AstDeclaratorList($$[$0 - 4]);
+ this.$.setLocation(_$[$0 - 4]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 137:
+ var decl = new AstDeclaration($$[$0 - 4], true, null, $$[$0]);
+ decl.setLocation(_$[$0 - 4]);
+ this.$ = new AstDeclaratorList($$[$0 - 5]);
+ this.$.setLocation(_$[$0 - 5]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 138:
+ var decl = new AstDeclaration($$[$0 - 5], true, $$[$0 - 3], $$[$0]);
+ decl.setLocation(_$[$0 - 5]);
+ this.$ = new AstDeclaratorList($$[$0 - 6]);
+ this.$.setLocation(_$[$0 - 6]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 139:
+ var decl = new AstDeclaration($$[$0 - 2], false, null, $$[$0]);
+ decl.setLocation(_$[$0 - 2]);
+ this.$ = new AstDeclaratorList($$[$0 - 3]);
+ this.$.setLocation(_$[$0 - 3]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 141:
+ this.$ = new AstFullySpecifiedType();
+ this.$.setLocation(_$[$0]);
+ this.$.specifier = $$[$0];
+ break;
+
+ case 142:
+ this.$ = new AstFullySpecifiedType();
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.qualifier = $$[$0 - 1];
+ this.$.specifier = $$[$0];
+ break;
+
+ case 143:
+ this.$ = $$[$0 - 1];
+ break;
+
+ case 151:
+ case 160:
+ this.$ = ['const'];
+ break;
+
+ case 161:
+ this.$ = ['attribute'];
+ break;
+
+ case 162:
+ this.$ = ['varying'];
+ break;
+
+ case 163:
+ this.$ = ['centroid', 'varying'];
+ break;
+
+ case 164:
+ this.$ = ['in'];
+ break;
+
+ case 165:
+ this.$ = ['out'];
+ break;
+
+ case 166:
+ this.$ = ['centroid', 'in'];
+ break;
+
+ case 167:
+ this.$ = ['centroid', 'out'];
+ break;
+
+ case 168:
+ this.$ = ['uniform'];
+ break;
+
+ case 169:
+ this.$ = $$[$0];
+ break;
+
+ case 170:
+ this.$ = $$[$0];
+ this.$.precision = $$[$0 - 1];
+ break;
+
+ case 174:
+ case 175:
+ case 176:
+ this.$ = new AstTypeSpecifier($$[$0]);
+ this.$.setLocation(_$[$0]);
+ break;
+
+ case 200:
+ this.$ = ast_precision.highp;
+ break;
+
+ case 201:
+ this.$ = ast_precision.mediump;
+ break;
+
+ case 202:
+ this.$ = ast_precision.lowp;
+ break;
+
+ case 203:
+ this.$ = new AstStructSpecifier($$[$0 - 3], $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 4]);
+ yy.state.symbols.add_type($$[$0 - 3], types._void);
+ break;
+
+ case 205:
+ this.$ = [$$[$0]];
+ break;
+
+ case 206:
+ this.$ = $$[$0 - 1];
+ this.$.push($$[$0]);
+ break;
+
+ case 207:
+ var type = new AstFullySpecifiedType();
+ type.setLocation(_$[$0 - 2]);
+ type.specifier = $$[$0 - 2];
+ this.$ = new AstDeclaratorList(type);
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.declarations = $$[$0 - 1];
+ break;
+
+ case 210:
+ this.$ = new AstDeclaration($$[$0], false);
+ this.$.setLocation(_$[$0]);
+ yy.state.symbols.add_variable($$[$0]);
+ break;
+
+ case 219:
+ case 220:
+ case 258:
+ this.$ = null;
+ break;
+
+ case 223:
+ this.$ = new AstCompoundStatement(true);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 224:
+ yy.state.symbols.push_scope();
+ this.$ = new AstCompoundStatement(true, $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 2]);
+ yy.state.symbols.pop_scope();
+ break;
+
+ case 228:
+ this.$ = new AstCompoundStatement(false, $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 2]);
+ break;
+
+ case 229:
+ if ($$[$0] === null) {
+ yy.state.addError(" statement", _$[$0].first_line, _$[$0].first_column);
+ } else {
+ this.$ = [$$[$0]];
+ }
+
+ break;
+
+ case 230:
+ if ($$[$0] === null) {
+ yy.state.addError(" statement", _$[$0 - 1].first_line, _$[$0 - 1].first_column);
+ }
+
+ this.$ = $$[$0 - 1];
+ this.$.push($$[$0]);
+ break;
+
+ case 232:
+ this.$ = new AstExpressionStatement($$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 233:
+ this.$ = new AstSelectionStatement($$[$0 - 2], $$[$0].then_statement, $$[$0].else_statement);
+ this.$.setLocation(_$[$0 - 4]);
+ break;
+
+ case 234:
+ this.$ = {};
+ this.$.then_statement = $$[$0 - 2];
+ this.$.else_statement = $$[$0];
+ break;
+
+ case 235:
+ this.$.then_statement = $$[$0];
+ break;
+
+ case 250:
+ this.$ = new AstJumpStatement('continue');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 251:
+ this.$ = new AstJumpStatement('break');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 252:
+ this.$ = new AstJumpStatement('return');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 253:
+ this.$ = new AstJumpStatement('return', $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 2]);
+ break;
+
+ case 254:
+ /* Fragment shader only.*/
+ this.$ = new AstJumpStatement('discard');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 255:
+ this.$ = new AstJumpStatement('debugger');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 256:
+ case 257:
+ this.$ = $$[$0];
+ break;
+
+ case 259:
+ this.$ = new AstFunctionDefinition();
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.proto_type = $$[$0 - 1];
+ this.$.body = $$[$0];
+ yy.state.symbols.pop_scope();
+ break;
+ }
+ },
+ table: [o($V0, [2, 3], {
+ 3: 1,
+ 4: 2,
+ 6: 3,
+ 9: [1, 4]
+ }), {
+ 1: [3]
+ }, {
+ 5: [1, 5]
+ }, o($V0, [2, 10], {
+ 7: 6
+ }), {
+ 10: [1, 7]
+ }, {
+ 1: [2, 1]
+ }, {
+ 8: 8,
+ 12: 14,
+ 13: $V1,
+ 14: $V2,
+ 15: $V3,
+ 16: $V4,
+ 17: $V5,
+ 18: 9,
+ 21: $V6,
+ 22: [1, 11],
+ 24: 10,
+ 47: $V7,
+ 50: 29,
+ 104: 13,
+ 105: 15,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 207: 12
+ }, {
+ 11: [1, 78]
+ }, {
+ 5: [2, 2],
+ 12: 14,
+ 13: $V1,
+ 14: $V2,
+ 15: $V3,
+ 16: $V4,
+ 17: $V5,
+ 21: $V6,
+ 24: 79,
+ 47: $V7,
+ 50: 29,
+ 104: 13,
+ 105: 15,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 207: 12
+ }, o($V0, [2, 11]), o($VL, [2, 15]), {
+ 19: 80,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }, o($VL, [2, 256]), o($VL, [2, 257]), o($VL, [2, 258]), {
+ 106: $VP,
+ 170: $VQ,
+ 188: 85
+ }, {
+ 49: [1, 89],
+ 106: [1, 88]
+ }, {
+ 109: 90,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ
+ }, {
+ 11: [1, 91]
+ }, {
+ 11: [1, 92]
+ }, {
+ 11: [1, 93]
+ }, {
+ 11: [1, 94]
+ }, {
+ 11: [1, 95]
+ }, {
+ 32: [1, 96]
+ }, o($VR, [2, 126]), o($VS, $VT, {
+ 114: 97,
+ 117: 98,
+ 118: 99,
+ 32: [2, 110],
+ 120: $VU,
+ 121: $VV,
+ 122: $VW,
+ 135: $VX
+ }), {
+ 32: [2, 111],
+ 49: [1, 104]
+ }, o($VR, [2, 133], {
+ 19: 105,
+ 20: 106,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }), o($VS, $VY, {
+ 20: 107,
+ 136: 108,
+ 131: 109,
+ 25: $VN,
+ 26: $VO,
+ 120: $V9,
+ 121: $Va,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }), o($VZ, $V_), {
+ 21: $V6,
+ 47: $V7,
+ 50: 110,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($V$, [2, 169]), {
+ 21: $V6,
+ 47: $V7,
+ 110: 111,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 169: $VK
+ }, o($VS, [2, 152]), o($VS, [2, 153], {
+ 136: 112,
+ 120: $V9,
+ 121: $Va,
+ 135: $Vg,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }), o($VS, [2, 155], {
+ 136: 113,
+ 120: $V9,
+ 121: $Va,
+ 135: $Vg,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }), o($V$, [2, 171], {
+ 34: [1, 114]
+ }), o($V01, [2, 200]), o($V01, [2, 201]), o($V01, [2, 202]), o($VS, [2, 160]), o($VS, [2, 161]), o($VS, [2, 162]), {
+ 120: [1, 116],
+ 121: [1, 117],
+ 138: [1, 115]
+ }, o($VS, [2, 164]), o($VS, [2, 165]), o($VS, [2, 168]), {
+ 30: [1, 118]
+ }, o($V11, [2, 148]), o($V11, [2, 149]), o($V11, [2, 150]), o($V21, [2, 174]), o($V21, [2, 175]), o($V21, [2, 176]), o($V21, $V31), o($V21, [2, 178]), o($V21, [2, 179]), o($V21, [2, 180]), o($V21, [2, 181]), o($V21, [2, 182]), o($V21, [2, 183]), o($V21, [2, 184]), o($V21, [2, 185]), o($V21, [2, 186]), o($V21, [2, 187]), o($V21, [2, 188]), o($V21, [2, 189]), o($V21, [2, 190]), o($V21, [2, 191]), o($V21, [2, 192]), o($V21, [2, 193]), o($V21, [2, 194]), o($V21, [2, 195]), o($V21, [2, 196]), o($V21, [2, 197]), o($V21, [2, 198]), o($V21, [2, 199]), {
+ 19: 119,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 170: [1, 120]
+ }, o($V0, [2, 4]), o($VL, [2, 16]), {
+ 23: [1, 121]
+ }, o([11, 23, 32, 34, 49, 92, 106, 170], $V41), o([11, 23, 32, 34, 36, 38, 39, 40, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106, 170], [2, 13]), o($V51, [2, 17]), o($V51, [2, 18]), o($VL, [2, 259]), o($V61, [2, 106]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 172: [1, 122],
+ 176: 128,
+ 177: 124,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 186: 123,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($V61, [2, 107]), {
+ 19: 187,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 110: 188,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 169: $VK
+ }, o($VL, [2, 5]), o($VL, [2, 6]), o($VL, [2, 7]), o($VL, [2, 8]), o($VL, [2, 9]), o([106, 170], [2, 109]), o($Vw1, [2, 112]), o($VS, $VT, {
+ 118: 189,
+ 120: $VU,
+ 121: $VV,
+ 122: $VW
+ }), {
+ 21: $V6,
+ 47: $V7,
+ 50: 192,
+ 109: 32,
+ 110: 31,
+ 116: 190,
+ 119: 191,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o([21, 47, 120, 121, 122, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], [2, 151]), o($VS, [2, 122]), o($VS, [2, 123]), o($VS, [2, 124]), o($VS, $VT, {
+ 117: 98,
+ 118: 99,
+ 114: 193,
+ 120: $VU,
+ 121: $VV,
+ 122: $VW,
+ 135: $VX
+ }), o($VR, [2, 134], {
+ 34: [1, 194],
+ 92: [1, 195]
+ }), o([34, 49, 92, 106], $V41, {
+ 30: [1, 196]
+ }), o($VR, [2, 140]), o($VS, [2, 157]), {
+ 120: $V9,
+ 121: $Va,
+ 135: $Vg,
+ 136: 197,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }, o($VZ, [2, 142]), o($V$, [2, 170]), o($VS, [2, 154]), o($VS, [2, 156]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 36: [1, 198],
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 199,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VS, [2, 163]), o($VS, [2, 166]), o($VS, [2, 167]), {
+ 19: 205,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 129: 203,
+ 130: 204
+ }, {
+ 170: [1, 206]
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 50: 209,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 171: 207,
+ 173: 208
+ }, {
+ 19: 210,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }, o($V61, [2, 227]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 172: [1, 211],
+ 176: 128,
+ 177: 212,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($Vx1, [2, 229]), o($Vy1, [2, 214]), o($Vy1, [2, 215]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 172: [1, 213],
+ 176: 128,
+ 177: 124,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 186: 214,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($Vy1, [2, 216]), o($Vy1, [2, 217]), o($Vy1, [2, 218]), o($Vy1, [2, 219]), o($Vy1, [2, 220]), o($Vy1, [2, 221]), o($Vy1, [2, 222]), o($Vy1, [2, 213]), o($Vy1, [2, 231]), {
+ 49: $Vz1,
+ 106: [1, 215]
+ }, {
+ 30: [1, 217]
+ }, {
+ 30: [1, 218]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 219,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 23: [1, 220]
+ }, {
+ 30: [1, 221]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 176: 128,
+ 177: 222,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, {
+ 30: [1, 223]
+ }, {
+ 106: [1, 224]
+ }, {
+ 106: [1, 225]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 227,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 106: [1, 226],
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 106: [1, 228]
+ }, {
+ 106: [1, 229]
+ }, {
+ 106: $VP
+ }, o($VA1, [2, 103]), o($VA1, [2, 90]), o($VB1, $VC1, {
+ 91: 230,
+ 92: [1, 231],
+ 93: [1, 232],
+ 94: [1, 233],
+ 95: [1, 234],
+ 96: [1, 235],
+ 97: [1, 236],
+ 98: [1, 237],
+ 99: [1, 238],
+ 100: [1, 239],
+ 101: [1, 240],
+ 102: [1, 241]
+ }), o($VA1, [2, 88], {
+ 88: [1, 243],
+ 90: [1, 242]
+ }), o($VD1, [2, 50], {
+ 34: [1, 244],
+ 38: [1, 245],
+ 39: [1, 246],
+ 40: [1, 247]
+ }), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 248,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 249,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 250,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VZ, $V_, {
+ 30: $VE1
+ }), o($VF1, [2, 86], {
+ 86: $VG1
+ }), o($VH1, [2, 24]), o($VH1, [2, 26]), o($VI1, [2, 54]), o($VI1, [2, 55]), o($VI1, [2, 56]), o($VI1, [2, 57]), o($VJ1, [2, 84], {
+ 84: $VK1
+ }), o($VH1, [2, 19], {
+ 30: [1, 254]
+ }), o($VH1, [2, 20]), o($VH1, [2, 21]), o($VH1, [2, 22]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 255,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 31]), o($VL1, [2, 82], {
+ 82: $VM1
+ }), o($VH1, [2, 32]), o($VN1, [2, 80], {
+ 80: $VO1
+ }), {
+ 32: [1, 258],
+ 49: [1, 259]
+ }, {
+ 32: [1, 260]
+ }, o($VP1, [2, 78], {
+ 78: $VQ1
+ }), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 32: [2, 37],
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: [1, 263],
+ 48: 262,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VR1, [2, 76], {
+ 75: $VS1,
+ 76: $VT1
+ }), o($VU1, [2, 42]), o($VV1, [2, 73], {
+ 70: $VW1,
+ 71: $VX1,
+ 72: $VY1,
+ 73: $VZ1
+ }), o($V_1, [2, 68], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V12, [2, 65], {
+ 57: $V22,
+ 58: $V32
+ }), o($V42, [2, 62], {
+ 62: $V52,
+ 63: $V62,
+ 64: $V72
+ }), o($VR, [2, 127], {
+ 34: [1, 277],
+ 92: [1, 278]
+ }), {
+ 106: [1, 279]
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 50: 192,
+ 109: 32,
+ 110: 31,
+ 116: 280,
+ 119: 281,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($Vw1, [2, 118]), o($Vw1, [2, 120]), o($Vw1, [2, 125], {
+ 20: 81,
+ 19: 282,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }), o($Vw1, [2, 113]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 36: [1, 283],
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 284,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 285,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o([21, 32, 47, 120, 121, 122, 135, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], [2, 114]), o($VS, [2, 158]), o($V$, [2, 172]), {
+ 36: [1, 287]
+ }, {
+ 36: [2, 105]
+ }, o($VB1, $VC1), {
+ 30: $VE1
+ }, {
+ 32: [1, 288],
+ 49: [1, 289]
+ }, o($Vw1, [2, 144]), o($Vw1, [2, 146], {
+ 92: [1, 290]
+ }), {
+ 21: $V6,
+ 47: $V7,
+ 50: 209,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 171: 291,
+ 173: 208
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 50: 209,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 172: [1, 292],
+ 173: 293
+ }, o($V82, [2, 205]), {
+ 19: 296,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 174: 294,
+ 175: 295
+ }, {
+ 11: [1, 297]
+ }, o($V61, [2, 228]), o($Vx1, [2, 230]), o($Vy1, [2, 223]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 172: [1, 298],
+ 176: 128,
+ 177: 212,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($Vy1, [2, 232]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 299,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 300,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 301,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 23: [1, 302],
+ 49: $Vz1
+ }, o($Vy1, [2, 240]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 304,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 115: 305,
+ 120: $V9,
+ 121: $Va,
+ 125: $V92,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 192: 303
+ }, {
+ 196: [1, 307]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 176: 310,
+ 180: 309,
+ 199: 308
+ }, o($Vy1, [2, 250]), o($Vy1, [2, 251]), o($Vy1, [2, 252]), {
+ 49: $Vz1,
+ 106: [1, 311]
+ }, o($Vy1, [2, 254]), o($Vy1, [2, 255]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 312,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VI1, [2, 92]), o($VI1, [2, 93]), o($VI1, [2, 94]), o($VI1, [2, 95]), o($VI1, [2, 96]), o($VI1, [2, 97]), o($VI1, [2, 98]), o($VI1, [2, 99]), o($VI1, [2, 100]), o($VI1, [2, 101]), o($VI1, [2, 102]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 313,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 314,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 316,
+ 33: 155,
+ 35: 315,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 19: 317,
+ 20: 319,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 43: 318,
+ 52: 320,
+ 53: 321,
+ 54: 322
+ }, o($VH1, [2, 28]), o($VH1, [2, 29]), o($VD1, [2, 51]), o($VD1, [2, 52]), o($VD1, [2, 53]), o($VU1, [2, 40]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 323,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 324,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VU1, [2, 41]), {
+ 32: [1, 325],
+ 49: $Vz1
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 326,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 327,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 34]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 328,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 35]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 329,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($Vw1, [2, 38]), o($Va2, $V31, {
+ 32: [2, 36]
+ }), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 330,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 331,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 332,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 333,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 334,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 335,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 336,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 337,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 338,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 339,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 340,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 341,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 342,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 36: [1, 343],
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 344,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 345,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($V61, [2, 108]), o($Vw1, [2, 117]), o($Vw1, [2, 119]), o($Vw1, [2, 115], {
+ 34: [1, 346]
+ }), o($VR, [2, 135], {
+ 92: [1, 347]
+ }), {
+ 36: [1, 348]
+ }, o($VR, [2, 139]), o([32, 49, 106], [2, 212]), o($V$, [2, 173]), o($V11, [2, 143]), {
+ 19: 205,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 130: 349
+ }, {
+ 10: [1, 350]
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 50: 209,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 172: [1, 351],
+ 173: 293
+ }, o($V21, [2, 204]), o($V82, [2, 206]), {
+ 49: [1, 353],
+ 106: [1, 352]
+ }, o($VR, [2, 208]), o($VR, [2, 210], {
+ 34: [1, 354]
+ }), o($V0, [2, 14]), o($Vy1, [2, 224]), o($VA1, [2, 104]), {
+ 32: [1, 355],
+ 49: $Vz1
+ }, {
+ 32: [1, 356],
+ 49: $Vz1
+ }, o($Vy1, [2, 239]), {
+ 32: [1, 357]
+ }, o($Vb2, [2, 236], {
+ 49: $Vz1
+ }), {
+ 19: 358,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }, o($VS, $VY, {
+ 136: 108,
+ 131: 109,
+ 120: $V9,
+ 121: $Va,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }), {
+ 30: [1, 359]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 304,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 106: [2, 247],
+ 109: 32,
+ 110: 31,
+ 115: 305,
+ 120: $V9,
+ 121: $Va,
+ 125: $V92,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 192: 362,
+ 200: 360,
+ 201: 361
+ }, o($Vc2, [2, 244]), o($Vc2, [2, 245]), o($Vy1, [2, 253]), o($VA1, [2, 91]), {
+ 23: [1, 363],
+ 49: $Vz1
+ }, o($VF1, [2, 87], {
+ 86: $VG1
+ }), {
+ 36: [1, 364]
+ }, {
+ 36: [2, 30],
+ 49: $Vz1
+ }, o($VH1, [2, 27]), o($VH1, [2, 33]), o($VH1, $V41, {
+ 30: [1, 365]
+ }), {
+ 32: [1, 366],
+ 49: [1, 367]
+ }, {
+ 32: [1, 368]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 32: [2, 46],
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: [1, 370],
+ 48: 369,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VJ1, [2, 85], {
+ 84: $VK1
+ }), o($VL1, [2, 83], {
+ 82: $VM1
+ }), o($VH1, [2, 23]), o($VN1, [2, 81], {
+ 80: $VO1
+ }), o($VP1, [2, 79], {
+ 78: $VQ1
+ }), o($Vw1, [2, 39]), o($VR1, [2, 77], {
+ 75: $VS1,
+ 76: $VT1
+ }), o($VV1, [2, 74], {
+ 70: $VW1,
+ 71: $VX1,
+ 72: $VY1,
+ 73: $VZ1
+ }), o($VV1, [2, 75], {
+ 70: $VW1,
+ 71: $VX1,
+ 72: $VY1,
+ 73: $VZ1
+ }), o($V_1, [2, 69], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V_1, [2, 70], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V_1, [2, 71], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V_1, [2, 72], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V12, [2, 66], {
+ 57: $V22,
+ 58: $V32
+ }), o($V12, [2, 67], {
+ 57: $V22,
+ 58: $V32
+ }), o($V42, [2, 63], {
+ 62: $V52,
+ 63: $V62,
+ 64: $V72
+ }), o($V42, [2, 64], {
+ 62: $V52,
+ 63: $V62,
+ 64: $V72
+ }), o($VB1, [2, 59]), o($VB1, [2, 60]), o($VB1, [2, 61]), o($VR, [2, 128], {
+ 92: [1, 371]
+ }), {
+ 36: [1, 372]
+ }, o($VR, [2, 132]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 373,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 374,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VR, [2, 136], {
+ 92: [1, 375]
+ }), o($Vw1, [2, 145]), o($Vw1, [2, 147]), o($V21, [2, 203]), o($V82, [2, 207]), {
+ 19: 296,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 175: 376
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 377,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 176: 128,
+ 177: 379,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 190: 378,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, {
+ 170: $Vj1,
+ 178: 380
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $VQ,
+ 176: 128,
+ 179: 383,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 187: 381,
+ 188: 382,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, {
+ 92: [1, 384]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 385,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 32: [1, 386]
+ }, {
+ 106: [1, 387]
+ }, {
+ 106: [2, 246]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 388,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 25]), o($VU1, [2, 49]), o($VH1, [2, 43]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 389,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 44]), o($Vw1, [2, 47]), o($Va2, $V31, {
+ 32: [2, 45]
+ }), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 390,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VR, [2, 129], {
+ 92: [1, 391]
+ }), {
+ 36: [1, 392]
+ }, o($VR, [2, 137]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 393,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VR, [2, 209]), {
+ 36: [1, 394]
+ }, o($Vy1, [2, 233]), o($Vx1, [2, 235], {
+ 191: [1, 395]
+ }), o($Vy1, [2, 238]), o($Vy1, [2, 241]), o($Vy1, [2, 225]), o($Vy1, [2, 226]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 396,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 32: [1, 397],
+ 49: $Vz1
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $VQ,
+ 176: 128,
+ 179: 383,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 187: 398,
+ 188: 382,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 399,
+ 32: [2, 248],
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VA1, [2, 89]), o($Vw1, [2, 48]), o($VR, [2, 130]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 400,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($Vw1, [2, 116]), o($VR, [2, 138]), o($VR, [2, 211]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 176: 128,
+ 177: 401,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($Vb2, [2, 237]), {
+ 106: [1, 402]
+ }, o($Vy1, [2, 243]), {
+ 32: [2, 249],
+ 49: $Vz1
+ }, o($VR, [2, 131]), o($Vy1, [2, 234]), o($Vy1, [2, 242])],
+ defaultActions: {
+ 5: [2, 1],
+ 200: [2, 105],
+ 362: [2, 246]
+ },
+ parseError: function parseError(str, hash) {
+ if (hash.recoverable) {
+ this.trace(str);
+ } else {
+ throw new Error(str);
+ }
+ },
+ parse: function parse(input) {
+ var self = this,
+ stack = [0],
+ tstack = [],
+ vstack = [null],
+ lstack = [],
+ table = this.table,
+ yytext = '',
+ yylineno = 0,
+ yyleng = 0,
+ recovering = 0,
+ TERROR = 2,
+ EOF = 1;
+ var args = lstack.slice.call(arguments, 1);
+ var lexer = Object.create(this.lexer);
+ var sharedState = {
+ yy: {}
+ };
+
+ for (var k in this.yy) {
+ if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+ sharedState.yy[k] = this.yy[k];
+ }
+ }
+
+ lexer.setInput(input, sharedState.yy);
+ sharedState.yy.lexer = lexer;
+ sharedState.yy.parser = this;
+
+ if (typeof lexer.yylloc == 'undefined') {
+ lexer.yylloc = {};
+ }
+
+ var yyloc = lexer.yylloc;
+ lstack.push(yyloc);
+ var ranges = lexer.options && lexer.options.ranges;
+
+ if (typeof sharedState.yy.parseError === 'function') {
+ this.parseError = sharedState.yy.parseError;
+ } else {
+ this.parseError = Object.getPrototypeOf(this).parseError;
+ }
+
+ function popStack(n) {
+ stack.length = stack.length - 2 * n;
+ vstack.length = vstack.length - n;
+ lstack.length = lstack.length - n;
+ }
+
+ function lex() {
+ var token;
+ token = lexer.lex() || EOF;
+
+ if (typeof token !== 'number') {
+ token = self.symbols_[token] || token;
+ }
+
+ return token;
+ }
+
+ var symbol,
+ preErrorSymbol,
+ state,
+ action,
+ a,
+ r,
+ yyval = {},
+ p,
+ len,
+ newState,
+ expected;
+
+ while (true) {
+ state = stack[stack.length - 1];
+
+ if (this.defaultActions[state]) {
+ action = this.defaultActions[state];
+ } else {
+ if (symbol === null || typeof symbol == 'undefined') {
+ symbol = lex();
+ }
+
+ action = table[state] && table[state][symbol];
+ }
+
+ if (typeof action === 'undefined' || !action.length || !action[0]) {
+ var errStr = '';
+ expected = [];
+
+ for (p in table[state]) {
+ if (this.terminals_[p] && p > TERROR) {
+ expected.push('\'' + this.terminals_[p] + '\'');
+ }
+ }
+
+ if (lexer.showPosition) {
+ errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+ } else {
+ errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+ }
+
+ this.parseError(errStr, {
+ text: lexer.match,
+ token: this.terminals_[symbol] || symbol,
+ line: lexer.yylineno,
+ loc: yyloc,
+ expected: expected
+ });
+ }
+
+ if (action[0] instanceof Array && action.length > 1) {
+ throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+ }
+
+ switch (action[0]) {
+ case 1:
+ stack.push(symbol);
+ vstack.push(lexer.yytext);
+ lstack.push(lexer.yylloc);
+ stack.push(action[1]);
+ symbol = null;
+
+ if (!preErrorSymbol) {
+ yyleng = lexer.yyleng;
+ yytext = lexer.yytext;
+ yylineno = lexer.yylineno;
+ yyloc = lexer.yylloc;
+
+ if (recovering > 0) {
+ recovering--;
+ }
+ } else {
+ symbol = preErrorSymbol;
+ preErrorSymbol = null;
+ }
+
+ break;
+
+ case 2:
+ len = this.productions_[action[1]][1];
+ yyval.$ = vstack[vstack.length - len];
+ yyval._$ = {
+ first_line: lstack[lstack.length - (len || 1)].first_line,
+ last_line: lstack[lstack.length - 1].last_line,
+ first_column: lstack[lstack.length - (len || 1)].first_column,
+ last_column: lstack[lstack.length - 1].last_column
+ };
+
+ if (ranges) {
+ yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
+ }
+
+ r = this.performAction.apply(yyval, [yytext, yyleng, yylineno, sharedState.yy, action[1], vstack, lstack].concat(args));
+
+ if (typeof r !== 'undefined') {
+ return r;
+ }
+
+ if (len) {
+ stack = stack.slice(0, -1 * len * 2);
+ vstack = vstack.slice(0, -1 * len);
+ lstack = lstack.slice(0, -1 * len);
+ }
+
+ stack.push(this.productions_[action[1]][0]);
+ vstack.push(yyval.$);
+ lstack.push(yyval._$);
+ newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+ stack.push(newState);
+ break;
+
+ case 3:
+ return true;
+ }
+ }
+
+ return true;
+ }
+ };
+
+ function Parser() {
+ this.yy = {};
+ }
+
+ Parser.prototype = parser;
+ parser.Parser = Parser;
+ return new Parser();
+ }();
+
+ if (typeof commonjsRequire !== 'undefined' && 'object' !== 'undefined') {
+ exports.parser = parser;
+ exports.Parser = parser.Parser;
+
+ exports.parse = function () {
+ return parser.parse.apply(parser, arguments);
+ };
+ }
+ /* generated by jison-lex 0.3.4 */
+
+
+ var lexer = function () {
+ var lexer = {
+ EOF: 1,
+ parseError: function parseError(str, hash) {
+ if (this.yy.parser) {
+ this.yy.parser.parseError(str, hash);
+ } else {
+ throw new Error(str);
+ }
+ },
+ // resets the lexer, sets new input
+ setInput: function setInput(input, yy) {
+ this.yy = yy || this.yy || {};
+ this._input = input;
+ this._more = this._backtrack = this.done = false;
+ this.yylineno = this.yyleng = 0;
+ this.yytext = this.matched = this.match = '';
+ this.conditionStack = ['INITIAL'];
+ this.yylloc = {
+ first_line: 1,
+ first_column: 0,
+ last_line: 1,
+ last_column: 0
+ };
+
+ if (this.options.ranges) {
+ this.yylloc.range = [0, 0];
+ }
+
+ this.offset = 0;
+ return this;
+ },
+ // consumes and returns one char from the input
+ input: function input() {
+ var ch = this._input[0];
+ this.yytext += ch;
+ this.yyleng++;
+ this.offset++;
+ this.match += ch;
+ this.matched += ch;
+ var lines = ch.match(/(?:\r\n?|\n).*/g);
+
+ if (lines) {
+ this.yylineno++;
+ this.yylloc.last_line++;
+ } else {
+ this.yylloc.last_column++;
+ }
+
+ if (this.options.ranges) {
+ this.yylloc.range[1]++;
+ }
+
+ this._input = this._input.slice(1);
+ return ch;
+ },
+ // unshifts one char (or a string) into the input
+ unput: function unput(ch) {
+ var len = ch.length;
+ var lines = ch.split(/(?:\r\n?|\n)/g);
+ this._input = ch + this._input;
+ this.yytext = this.yytext.substr(0, this.yytext.length - len); //this.yyleng -= len;
+
+ this.offset -= len;
+ var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+ this.match = this.match.substr(0, this.match.length - 1);
+ this.matched = this.matched.substr(0, this.matched.length - 1);
+
+ if (lines.length - 1) {
+ this.yylineno -= lines.length - 1;
+ }
+
+ var r = this.yylloc.range;
+ this.yylloc = {
+ first_line: this.yylloc.first_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.first_column,
+ last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len
+ };
+
+ if (this.options.ranges) {
+ this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+ }
+
+ this.yyleng = this.yytext.length;
+ return this;
+ },
+ // When called from action, caches matched text and appends it on next action
+ more: function more() {
+ this._more = true;
+ return this;
+ },
+ // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+ reject: function reject() {
+ if (this.options.backtrack_lexer) {
+ this._backtrack = true;
+ } else {
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+ text: "",
+ token: null,
+ line: this.yylineno
+ });
+ }
+
+ return this;
+ },
+ // retain first n characters of the match
+ less: function less(n) {
+ this.unput(this.match.slice(n));
+ },
+ // displays already matched input, i.e. for error messages
+ pastInput: function pastInput() {
+ var past = this.matched.substr(0, this.matched.length - this.match.length);
+ return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\n/g, "");
+ },
+ // displays upcoming input, i.e. for error messages
+ upcomingInput: function upcomingInput() {
+ var next = this.match;
+
+ if (next.length < 20) {
+ next += this._input.substr(0, 20 - next.length);
+ }
+
+ return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+ },
+ // displays the character position where the lexing error occurred, i.e. for error messages
+ showPosition: function showPosition() {
+ var pre = this.pastInput();
+ var c = new Array(pre.length + 1).join("-");
+ return pre + this.upcomingInput() + "\n" + c + "^";
+ },
+ // test the lexed token: return FALSE when not a match, otherwise return token
+ test_match: function test_match(match, indexed_rule) {
+ var token, lines, backup;
+
+ if (this.options.backtrack_lexer) {
+ // save context
+ backup = {
+ yylineno: this.yylineno,
+ yylloc: {
+ first_line: this.yylloc.first_line,
+ last_line: this.last_line,
+ first_column: this.yylloc.first_column,
+ last_column: this.yylloc.last_column
+ },
+ yytext: this.yytext,
+ match: this.match,
+ matches: this.matches,
+ matched: this.matched,
+ yyleng: this.yyleng,
+ offset: this.offset,
+ _more: this._more,
+ _input: this._input,
+ yy: this.yy,
+ conditionStack: this.conditionStack.slice(0),
+ done: this.done
+ };
+
+ if (this.options.ranges) {
+ backup.yylloc.range = this.yylloc.range.slice(0);
+ }
+ }
+
+ lines = match[0].match(/(?:\r\n?|\n).*/g);
+
+ if (lines) {
+ this.yylineno += lines.length;
+ }
+
+ this.yylloc = {
+ first_line: this.yylloc.last_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.last_column,
+ last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length
+ };
+ this.yytext += match[0];
+ this.match += match[0];
+ this.matches = match;
+ this.yyleng = this.yytext.length;
+
+ if (this.options.ranges) {
+ this.yylloc.range = [this.offset, this.offset += this.yyleng];
+ }
+
+ this._more = false;
+ this._backtrack = false;
+ this._input = this._input.slice(match[0].length);
+ this.matched += match[0];
+ token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+
+ if (this.done && this._input) {
+ this.done = false;
+ }
+
+ if (token) {
+ return token;
+ } else if (this._backtrack) {
+ // recover context
+ for (var k in backup) {
+ this[k] = backup[k];
+ }
+
+ return false; // rule action called reject() implying the next rule should be tested instead.
+ }
+
+ return false;
+ },
+ // return next match in input
+ next: function next() {
+ if (this.done) {
+ return this.EOF;
+ }
+
+ if (!this._input) {
+ this.done = true;
+ }
+
+ var token, match, tempMatch, index;
+
+ if (!this._more) {
+ this.yytext = '';
+ this.match = '';
+ }
+
+ var rules = this._currentRules();
+
+ for (var i = 0; i < rules.length; i++) {
+ tempMatch = this._input.match(this.rules[rules[i]]);
+
+ if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+ match = tempMatch;
+ index = i;
+
+ if (this.options.backtrack_lexer) {
+ token = this.test_match(tempMatch, rules[i]);
+
+ if (token !== false) {
+ return token;
+ } else if (this._backtrack) {
+ match = false;
+ continue; // rule action called reject() implying a rule MISmatch.
+ } else {
+ // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+ return false;
+ }
+ } else if (!this.options.flex) {
+ break;
+ }
+ }
+ }
+
+ if (match) {
+ token = this.test_match(match, rules[index]);
+
+ if (token !== false) {
+ return token;
+ } // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+
+
+ return false;
+ }
+
+ if (this._input === "") {
+ return this.EOF;
+ } else {
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+ text: "",
+ token: null,
+ line: this.yylineno
+ });
+ }
+ },
+ // return next match that has a token
+ lex: function lex() {
+ var r = this.next();
+
+ if (r) {
+ return r;
+ } else {
+ return this.lex();
+ }
+ },
+ // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+ begin: function begin(condition) {
+ this.conditionStack.push(condition);
+ },
+ // pop the previously active lexer condition state off the condition stack
+ popState: function popState() {
+ var n = this.conditionStack.length - 1;
+
+ if (n > 0) {
+ return this.conditionStack.pop();
+ } else {
+ return this.conditionStack[0];
+ }
+ },
+ // produce the lexer rule set which is active for the currently active lexer condition state
+ _currentRules: function _currentRules() {
+ if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+ return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+ } else {
+ return this.conditions["INITIAL"].rules;
+ }
+ },
+ // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+ topState: function topState(n) {
+ n = this.conditionStack.length - 1 - Math.abs(n || 0);
+
+ if (n >= 0) {
+ return this.conditionStack[n];
+ } else {
+ return "INITIAL";
+ }
+ },
+ // alias for begin(condition)
+ pushState: function pushState(condition) {
+ this.begin(condition);
+ },
+ // return the number of states currently on the stack
+ stateStackSize: function stateStackSize() {
+ return this.conditionStack.length;
+ },
+ options: {
+ "moduleName": ""
+ },
+ performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {
+ var YYSTATE = YY_START;
+
+ switch ($avoiding_name_collisions) {
+ case 0:
+ ;
+ break;
+
+ case 1:
+ break;
+
+ case 2:
+ this.begin('PP');
+ return 'VERSION';
+ break;
+
+ case 3:
+ this.begin('PP');
+ return 'EXTENSION';
+ break;
+
+ case 4:
+ /* Eat characters until the first digit is
+ * encountered
+ */
+ var ptr = 0;
+
+ while (yy_.yytext.slice(0, 1) < '0' || yy_.yytext.slice(0, 1) > '9') {
+ ptr++;
+ }
+ /* Subtract one from the line number because
+ * yy_.yylineno is zero-based instead of
+ * one-based.
+ */
+
+
+ yy_.yylineno = parseInt(yy_.yytext.slice(0, 1), 10) - 1;
+ yy_.yylloc.source = parseInt(yy_.yytext.slice(0), 10);
+ break;
+
+ case 5:
+ /* Eat characters until the first digit is
+ * encountered
+ */
+ var ptr = 0;
+
+ while (yy_.yytext.slice(0, 1) < '0' || yy_.yytext.slice(0, 1) > '9') {
+ ptr++;
+ }
+ /* Subtract one from the line number because
+ * yy_.yylineno is zero-based instead of
+ * one-based.
+ */
+
+
+ yy_.yylineno = parseInt(yy_.yytext.slice(0, 1), 10) - 1;
+ break;
+
+ case 6:
+ this.begin('PP');
+ return 'PRAGMA_DEBUG_ON';
+ break;
+
+ case 7:
+ this.begin('PP');
+ return 'PRAGMA_DEBUG_OFF';
+ break;
+
+ case 8:
+ this.begin('PP');
+ return 'PRAGMA_OPTIMIZE_ON';
+ break;
+
+ case 9:
+ this.begin('PP');
+ return 'PRAGMA_OPTIMIZE_OFF';
+ break;
+
+ case 10:
+ this.begin('PP');
+ return 'PRAGMA_INVARIANT_ALL';
+ break;
+
+ case 11:
+ this.begin('PRAGMA');
+ break;
+
+ case 12:
+ this.begin('INITIAL');
+ yy_.yylineno++;
+ yycolumn = 0;
+ break;
+
+ case 13:
+ break;
+
+ case 14:
+ break;
+
+ case 15:
+ break;
+
+ case 16:
+ return ":";
+ break;
+
+ case 17:
+ yylval.identifier = strdup(yy_.yytext);
+ return 'IDENTIFIER';
+ break;
+
+ case 18:
+ yylval.n = parseInt(yy_.yytext);
+ return 'INTCONSTANT';
+ break;
+
+ case 19:
+ this.begin('INITIAL');
+ yy_.yylineno++;
+ yycolumn = 0;
+ return 'EOL';
+ break;
+
+ case 20:
+ /*yy_.yylineno++; yycolumn = 0;*/
+ break;
+
+ case 21:
+ return 'ATTRIBUTE';
+ break;
+
+ case 22:
+ return 'CONST';
+ break;
+
+ case 23:
+ return 'BOOL';
+ break;
+
+ case 24:
+ return 'FLOAT';
+ break;
+
+ case 25:
+ return 'INT';
+ break;
+
+ case 26:
+ return 'BREAK';
+ break;
+
+ case 27:
+ return 'CONTINUE';
+ break;
+
+ case 28:
+ return 'DO';
+ break;
+
+ case 29:
+ return 'WHILE';
+ break;
+
+ case 30:
+ return 'ELSE';
+ break;
+
+ case 31:
+ return 'FOR';
+ break;
+
+ case 32:
+ return 'IF';
+ break;
+
+ case 33:
+ return 'DISCARD';
+ break;
+
+ case 34:
+ return 'RETURN';
+ break;
+
+ case 35:
+ return 'DEBUGGER';
+ break;
+
+ case 36:
+ return 'BVEC2';
+ break;
+
+ case 37:
+ return 'BVEC3';
+ break;
+
+ case 38:
+ return 'BVEC4';
+ break;
+
+ case 39:
+ return 'IVEC2';
+ break;
+
+ case 40:
+ return 'IVEC3';
+ break;
+
+ case 41:
+ return 'IVEC4';
+ break;
+
+ case 42:
+ return 'VEC2';
+ break;
+
+ case 43:
+ return 'VEC3';
+ break;
+
+ case 44:
+ return 'VEC4';
+ break;
+
+ case 45:
+ return 'MAT2X2';
+ break;
+
+ case 46:
+ return 'MAT3X3';
+ break;
+
+ case 47:
+ return 'MAT4X4';
+ break;
+
+ case 48:
+ return 'IN';
+ break;
+
+ case 49:
+ return 'OUT';
+ break;
+
+ case 50:
+ return 'INOUT';
+ break;
+
+ case 51:
+ return 'UNIFORM';
+ break;
+
+ case 52:
+ return 'VARYING';
+ break;
+
+ case 53:
+ return 'INVARIANT';
+ break;
+
+ case 54:
+ return 'FLAT';
+ break;
+
+ case 55:
+ return 'SMOOTH';
+ break;
+
+ case 56:
+ return 'SAMPLER1D';
+ break;
+
+ case 57:
+ return 'SAMPLER2D';
+ break;
+
+ case 58:
+ return 'SAMPLER3D';
+ break;
+
+ case 59:
+ return 'SAMPLERCUBE';
+ break;
+
+ case 60:
+ return 'SAMPLER1DSHADOW';
+ break;
+
+ case 61:
+ return 'SAMPLER2DSHADOW';
+ break;
+
+ case 62:
+ return 'STRUCT';
+ break;
+
+ case 63:
+ return 'VOID';
+ break;
+
+ case 64:
+ /*copy manually*/
+ break;
+
+ case 65:
+ return '++';
+ break;
+
+ case 66:
+ return '--';
+ break;
+
+ case 67:
+ return '<=';
+ break;
+
+ case 68:
+ return '>=';
+ break;
+
+ case 69:
+ return '==';
+ break;
+
+ case 70:
+ return '!=';
+ break;
+
+ case 71:
+ return '&&';
+ break;
+
+ case 72:
+ return '||';
+ break;
+
+ case 73:
+ return '^^';
+ break;
+
+ case 74:
+ return '<<';
+ break;
+
+ case 75:
+ return '>>';
+ break;
+
+ case 76:
+ return '*=';
+ break;
+
+ case 77:
+ return '/=';
+ break;
+
+ case 78:
+ return '+=';
+ break;
+
+ case 79:
+ return '%=';
+ break;
+
+ case 80:
+ return '<<=';
+ break;
+
+ case 81:
+ return '>>=';
+ break;
+
+ case 82:
+ return '&=';
+ break;
+
+ case 83:
+ return '^=';
+ break;
+
+ case 84:
+ return '|=';
+ break;
+
+ case 85:
+ return '-=';
+ break;
+
+ case 86:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 87:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 88:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 89:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 90:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 91:
+ this.yylval = parseInt(yy_.yytext + 2, 16);
+ return 'INTCONSTANT';
+ break;
+
+ case 92:
+ this.yylval = parseInt(yy_.yytext, 8);
+ return 'INTCONSTANT';
+ break;
+
+ case 93:
+ this.yylval = parseInt(yy_.yytext);
+ return 'INTCONSTANT';
+ break;
+
+ case 94:
+ this.yylval = 1;
+ return 'BOOLCONSTANT';
+ break;
+
+ case 95:
+ this.yylval = 0;
+ return 'BOOLCONSTANT';
+ break;
+
+ case 96:
+ return 'ASM';
+ break;
+
+ case 97:
+ return 'CLASS';
+ break;
+
+ case 98:
+ return 'UNION';
+ break;
+
+ case 99:
+ return 'ENUM';
+ break;
+
+ case 100:
+ return 'TYPEDEF';
+ break;
+
+ case 101:
+ return 'TEMPLATE';
+ break;
+
+ case 102:
+ return 'THIS';
+ break;
+
+ case 103:
+ return 'PACKED';
+ break;
+
+ case 104:
+ return 'GOTO';
+ break;
+
+ case 105:
+ return 'SWITCH';
+ break;
+
+ case 106:
+ return 'DEFAULT';
+ break;
+
+ case 107:
+ return 'INLINE';
+ break;
+
+ case 108:
+ return 'NOINLINE';
+ break;
+
+ case 109:
+ return 'VOLATILE';
+ break;
+
+ case 110:
+ return 'PUBLIC';
+ break;
+
+ case 111:
+ return 'STATIC';
+ break;
+
+ case 112:
+ return 'EXTERN';
+ break;
+
+ case 113:
+ return 'EXTERNAL';
+ break;
+
+ case 114:
+ return 'INTERFACE';
+ break;
+
+ case 115:
+ return 'LONG';
+ break;
+
+ case 116:
+ return 'SHORT';
+ break;
+
+ case 117:
+ return 'DOUBLE';
+ break;
+
+ case 118:
+ return 'HALF';
+ break;
+
+ case 119:
+ return 'FIXED';
+ break;
+
+ case 120:
+ return 'UNSIGNED';
+ break;
+
+ case 121:
+ return 'INPUT';
+ break;
+
+ case 122:
+ return 'OUTPUT';
+ break;
+
+ case 123:
+ return 'HVEC2';
+ break;
+
+ case 124:
+ return 'HVEC3';
+ break;
+
+ case 125:
+ return 'HVEC4';
+ break;
+
+ case 126:
+ return 'DVEC2';
+ break;
+
+ case 127:
+ return 'DVEC3';
+ break;
+
+ case 128:
+ return 'DVEC4';
+ break;
+
+ case 129:
+ return 'FVEC2';
+ break;
+
+ case 130:
+ return 'FVEC3';
+ break;
+
+ case 131:
+ return 'FVEC4';
+ break;
+
+ case 132:
+ return 'SAMPLER2DRECT';
+ break;
+
+ case 133:
+ return 'SAMPLER3DRECT';
+ break;
+
+ case 134:
+ return 'SAMPLER2DRECTSHADOW';
+ break;
+
+ case 135:
+ return 'SIZEOF';
+ break;
+
+ case 136:
+ return 'CAST';
+ break;
+
+ case 137:
+ return 'NAMESPACE';
+ break;
+
+ case 138:
+ return 'USING';
+ break;
+
+ case 139:
+ return 'LOWP';
+ break;
+
+ case 140:
+ return 'MEDIUMP';
+ break;
+
+ case 141:
+ return 'HIGHP';
+ break;
+
+ case 142:
+ return 'PRECISION';
+ break;
+
+ case 143:
+ yy.yylval = yy_.yytext;
+ return yy.state.classify_identifier(yy.state, yy_.yytext);
+ break;
+
+ case 144:
+ return yy_.yytext;
+ break;
+
+ case 145:
+ return 'EOF';
+ break;
+ }
+ },
+ rules: [/^(?:[ \r\t]+)/, /^(?:[ \t]*#[ \t]*$)/, /^(?:[ \t]*#[ \t]*version\b)/, /^(?:[ \t]*#[ \t]*extension\b)/, /^(?:(^([ \t]*)([ \t]*))line([ \t]+)((([1-9][0-9]*)|([xX][0-9a-fA-F]+)|([0-7]*)))([ \t]+)((([1-9][0-9]*)|([xX][0-9a-fA-F]+)|([0-7]*)))([ \t]*)$)/, /^(?:(^([ \t]*)([ \t]*))line([ \t]+)((([1-9][0-9]*)|([xX][0-9a-fA-F]+)|([0-7]*)))([ \t]*)$)/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)debug([ \t]*)\(([ \t]*)on([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)debug([ \t]*)\(([ \t]*)off([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)optimize([ \t]*)\(([ \t]*)on([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)optimize([ \t]*)\(([ \t]*)off([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)STDGL([ \t]+)invariant([ \t]*)\(([ \t]*)all([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+))/, /^(?:[\n])/, /^(?:.)/, /^(?:\/\/[^\n]*)/, /^(?:[ \t\r]*)/, /^(?::)/, /^(?:[_a-zA-Z][_a-zA-Z0-9]*)/, /^(?:[1-9][0-9]*)/, /^(?:[\n])/, /^(?:[\n])/, /^(?:attribute\b)/, /^(?:const\b)/, /^(?:bool\b)/, /^(?:float\b)/, /^(?:int\b)/, /^(?:break\b)/, /^(?:continue\b)/, /^(?:do\b)/, /^(?:while\b)/, /^(?:else\b)/, /^(?:for\b)/, /^(?:if\b)/, /^(?:discard\b)/, /^(?:return\b)/, /^(?:debugger\b)/, /^(?:bvec2\b)/, /^(?:bvec3\b)/, /^(?:bvec4\b)/, /^(?:ivec2\b)/, /^(?:ivec3\b)/, /^(?:ivec4\b)/, /^(?:vec2\b)/, /^(?:vec3\b)/, /^(?:vec4\b)/, /^(?:mat2\b)/, /^(?:mat3\b)/, /^(?:mat4\b)/, /^(?:in\b)/, /^(?:out\b)/, /^(?:inout\b)/, /^(?:uniform\b)/, /^(?:varying\b)/, /^(?:invariant\b)/, /^(?:flat\b)/, /^(?:smooth\b)/, /^(?:sampler1D\b)/, /^(?:sampler2D\b)/, /^(?:sampler3D\b)/, /^(?:samplerCube\b)/, /^(?:sampler1DShadow\b)/, /^(?:sampler2DShadow\b)/, /^(?:struct\b)/, /^(?:void\b)/, /^(?:layout\b)/, /^(?:\+\+)/, /^(?:--)/, /^(?:<=)/, /^(?:>=)/, /^(?:==)/, /^(?:!=)/, /^(?:&&)/, /^(?:\|\|)/, /^(?:\^\^)/, /^(?:<<)/, /^(?:>>)/, /^(?:\*=)/, /^(?:\/=)/, /^(?:\+=)/, /^(?:%=)/, /^(?:<<=)/, /^(?:>>=)/, /^(?:&=)/, /^(?:\^=)/, /^(?:\|=)/, /^(?:-=)/, /^(?:[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]?)/, /^(?:\.[0-9]+([eE][+-]?[0-9]+)?[fF]?)/, /^(?:[0-9]+\.([eE][+-]?[0-9]+)?[fF]?)/, /^(?:[0-9]+[eE][+-]?[0-9]+[fF]?)/, /^(?:[0-9]+[fF])/, /^(?:0[xX][0-9a-fA-F]+)/, /^(?:0[0-7]*)/, /^(?:[1-9][0-9]*)/, /^(?:true\b)/, /^(?:false\b)/, /^(?:asm\b)/, /^(?:class\b)/, /^(?:union\b)/, /^(?:enum\b)/, /^(?:typedef\b)/, /^(?:template\b)/, /^(?:this\b)/, /^(?:packed\b)/, /^(?:goto\b)/, /^(?:switch\b)/, /^(?:default\b)/, /^(?:inline\b)/, /^(?:noinline\b)/, /^(?:volatile\b)/, /^(?:public\b)/, /^(?:static\b)/, /^(?:extern\b)/, /^(?:external\b)/, /^(?:interface\b)/, /^(?:long\b)/, /^(?:short\b)/, /^(?:double\b)/, /^(?:half\b)/, /^(?:fixed\b)/, /^(?:unsigned\b)/, /^(?:input\b)/, /^(?:output\b)/, /^(?:hvec2\b)/, /^(?:hvec3\b)/, /^(?:hvec4\b)/, /^(?:dvec2\b)/, /^(?:dvec3\b)/, /^(?:dvec4\b)/, /^(?:fvec2\b)/, /^(?:fvec3\b)/, /^(?:fvec4\b)/, /^(?:sampler2DRect\b)/, /^(?:sampler3DRect\b)/, /^(?:sampler2DRectShadow\b)/, /^(?:sizeof\b)/, /^(?:cast\b)/, /^(?:namespace\b)/, /^(?:using\b)/, /^(?:lowp\b)/, /^(?:mediump\b)/, /^(?:highp\b)/, /^(?:precision\b)/, /^(?:[_a-zA-Z][_a-zA-Z0-9]*)/, /^(?:.)/, /^(?:$)/],
+ conditions: {
+ "PRAGMA": {
+ "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145],
+ "inclusive": true
+ },
+ "PP": {
+ "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145],
+ "inclusive": true
+ },
+ "INITIAL": {
+ "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145],
+ "inclusive": true
+ }
+ }
+ };
+ return lexer;
+ }();
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * GLSL Parser Class
+ */
+
+
+ function GlslParser() {
+ //Jison Global
+ this.jison = parser;
+ this.jison.lexer = lexer;
+ }
+
+ var proto = GlslParser.prototype;
+ /**
+ * Parse Program
+ */
+
+ proto.parse = function (state) {
+ var result;
+ this.jison.yy = {
+ test: 1,
+ state: state
+ };
+
+ try {
+ this.jison.parse(state.getTranslationUnit());
+ } catch (e) {
+ state.addError(e.message, e.lineNumber, e.columnNumber);
+ return false;
+ }
+
+ return true;
+ };
+
+ glsl.parser = new GlslParser();
+ /**
+ * External Parse
+ *
+ * @param string src Source code
+ * @param object options Compilation options
+ *
+ * @return object
+ */
+
+ glsl.parse = function (src, options) {
+ var state, result, irs;
+ state = new GlslState(options);
+ state.setSource(src); //Preprocess
+
+ result = this.preprocessor.process(state); //Parse into AST
+
+ if (result) {
+ result = this.parser.parse(state);
+ }
+
+ if (result) {
+ state.status = true;
+ }
+
+ return state;
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * Constructs a program's object code from an ast and symbol table
+ *
+ * @param string The error message
+ * @param AstNode The error AstNode
+ *
+ * @return string
+ */
+
+
+ glsl.generate = function (state) {
+ var irs, ast, i, main;
+ irs = new Ir(state.options.target);
+ ast = state.getAst();
+
+ try {
+ for (i = 0; i < ast.length; i++) {
+ ast[i].ir(state, irs);
+ }
+
+ main = state.symbols.get_function('main'); //Accept main, but warn if params not void
+
+ if (main.definition.join(",") !== "void") {
+ state.addWarning("main() should take no parameters");
+ }
+
+ state.symbols.add_variable("", irs.getTemp(main.getType().slots));
+
+ if (main.type != 'void') {
+ state.addWarning("main() should be type void");
+ }
+
+ if (!main) {
+ state.addError("main() is not defined");
+ return false;
+ }
+
+ main.Ast.body.ir(state, irs);
+ } catch (e) {
+ if (!e.ir) {
+ e.message = "compiler error: " + e.message;
+ }
+
+ state.addError(e.message, e.lineNumber, e.columnNumber);
+ return false;
+ }
+
+ state.setIR(irs);
+ return true;
+ };
+ /**
+ * Constructs an error message
+ *
+ * @param string The error message
+ * @param AstNode The error AstNode
+ *
+ * @return string
+ */
+
+
+ AstNode.prototype.ir_error = function (message) {
+ var e = new IrError();
+
+ if (this.location) {
+ e.lineNumber = this.location.first_line;
+ e.columnNumber = this.location.first_column;
+ e.message = message;
+ }
+
+ throw e;
+ };
+ /**
+ * Default IR
+ */
+
+
+ AstNode.prototype.irx = function (state, irs) {
+ this.ir_error(util.format("Can't generate ir for %s", this.typeOf()));
+ };
+ /**
+ * Constructs a type specifier code block
+ *
+ * @param object state parser state
+ */
+
+
+ AstTypeSpecifier.prototype.ir = function (state, irs) {
+ if (this.is_precision_statement) {
+ return;
+ } // this.ir_error("Cannot generate type specifier");
+
+ };
+ /**
+ * Constructs a declaration list
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstDeclaratorList.prototype.ir = function (state, irs) {
+ var i;
+
+ for (i = 0; i < this.declarations.length; i++) {
+ this.declarations[i].ir(state, irs, this.type);
+ }
+ };
+ /**
+ * Constructs a declaration
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstDeclaration.prototype.ir = function (state, irs, type) {
+ var qualifier, name, entry, constant, assign, lhs, size;
+
+ if (type.qualifier) {
+ qualifier = type.qualifier;
+ }
+
+ name = this.identifier; //add symbol table entry
+
+ entry = state.symbols.add_variable(name);
+ entry.type = type.specifier.type_name;
+ entry.qualifier = qualifier;
+
+ if (qualifier.indexOf('uniform') !== -1) {
+ entry.out = irs.getUniform(entry);
+ } else if (qualifier.indexOf('attribute') !== -1) {
+ entry.out = irs.getAttribute(entry);
+ } else if (qualifier.indexOf('varying') !== -1) {
+ entry.out = irs.getVarying(entry);
+ } else {
+ entry.out = irs.getTemp(entry.getType().slots);
+ }
+
+ constant = qualifier === 'const';
+
+ if (this.is_array) {
+ this.array_size.ir(state, irs);
+
+ if (this.array_size.Type != 'int') {
+ this.ir_error("array size must be an integer");
+ }
+
+ if (!this.array_size.Const) {
+ this.ir_error("array size must be constant");
+ }
+
+ size = parseInt(this.array_size.Dest);
+
+ if (size < 1) {
+ this.ir_error("array size cannot be less than 1");
+ }
+
+ entry.size = size; //Change the type of the entry so that expressions without indexing will fail
+
+ entry.base_type = entry.type;
+ entry.type += '[]';
+ }
+
+ if (this.initializer) {
+ //@todo: generate constants at compile time (this may be able to be taken care of in the generator)
+ if (constant) {//entry.constant = this.initializer.Dest;
+ } else {
+ lhs = new AstExpression('ident');
+ lhs.primary_expression.identifier = name;
+ assign = new AstExpression('=', lhs, this.initializer);
+ assign.setLocation(this.location);
+ assign.ir(state, irs);
+ }
+ } else {
+ if (constant) {
+ this.ir_error("Declaring const without initialier");
+ }
+ }
+ };
+ /**
+ * Constructs a function definition block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstFunctionDefinition.prototype.ir = function (state, irs) {
+ //handle function proto
+ this.proto_type.ir(state, irs);
+ this.proto_type.entry.Ast = this;
+ };
+ /**
+ * Constructs a function header code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstFunction.prototype.ir = function (state, irs) {
+ var i;
+
+ if (this.parameters.length == 0) {
+ this.entry.definition.push('void');
+ } //generate param list
+
+
+ for (i = 0; i < this.parameters.length; i++) {
+ this.entry.definition.push(this.parameters[i].type.specifier.type_name);
+ }
+ };
+ /**
+ * Constructs a compound statement code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstCompoundStatement.prototype.ir = function (state, irs) {
+ var i, stmt, retd_entry, maybe_returned;
+ retd_entry = state.symbols.get_variable("");
+ maybe_returned = false;
+
+ for (i = 0; i < this.statements.length; i++) {
+ stmt = this.statements[i];
+ stmt.ir(state, irs);
+
+ if (stmt instanceof AstJumpStatement && stmt.mode == 'return') {
+ //Returning from block, set return status, and skip following instructions in block (unreachable)
+ retd_entry.Passed = true;
+ irs.push(new IrInstruction("MOV", retd_entry.out + ".x", "1.0"));
+ break;
+ }
+
+ if (!maybe_returned && retd_entry.Passed) {
+ maybe_returned = true;
+ irs.push(new IrInstruction("IF", retd_entry.out + ".x"));
+ }
+ }
+
+ if (maybe_returned) {
+ irs.push(new IrInstruction("ENDIF"));
+ }
+ };
+ /**
+ * Constructs an expression statement code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpressionStatement.prototype.ir = function (state, irs) {
+ this.expression.ir(state, irs);
+ };
+ /**
+ * Constructs an expression code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir = function (state, irs) {
+ var i; //simple (variable, or value)
+
+ for (i in this.primary_expression) {
+ return this.ir_simple(state, irs);
+ } //operator
+
+
+ if (this.oper) {
+ return this.ir_op(state, irs);
+ } //cast
+
+
+ if (this.constructor.name == 'AstTypeSpecifier') {
+ this.Type = this.type_specifier;
+ return;
+ }
+
+ this.ir_error("Could not translate unknown expression type");
+ };
+ /**
+ * Constructs an operator expression code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_op = function (state, irs) {
+ var se, temp, ops;
+
+ if (se = this.subexpressions) {
+ se[0] ? se[0].ir(state, irs) : null;
+ se[1] ? se[1].ir(state, irs) : null;
+ se[2] ? se[2].ir(state, irs) : null;
+ }
+
+ switch (this.oper) {
+ //case '+=':
+ case '=':
+ this.ir_assign(state, irs);
+ break;
+
+ case 'POS':
+ //useless
+ this.Dest = se[0].Dest;
+ this.Type = se[0].Type;
+ break;
+
+ case 'NEG':
+ if (se[0].Dest.substring(0, 1) != '-') {
+ this.Dest = "-" + se[0].Dest;
+ } else {
+ this.Dest = se[0].Dest.substring(1);
+ }
+
+ this.Type = se[0].Type;
+
+ if (se[0].Const) {
+ this.Const = se[0].Const;
+ }
+
+ break;
+ //Arithmetic
+
+ case '+':
+ case '-':
+ case '*':
+ case '/':
+ case '%':
+ case '&':
+ case '^':
+ case '|':
+ case '~':
+ case '<<':
+ case '>>':
+ this.ir_generate(state, irs, 2, true);
+ break;
+ //Boolean
+
+ case '<':
+ case '>':
+ case '<=':
+ case '>=':
+ case '==':
+ case '!=':
+ case '&&':
+ case '^^':
+ case '||':
+ this.ir_generate(state, irs, 2);
+ break;
+
+ case '!':
+ this.ir_generate(state, irs, 1);
+ break;
+
+ /*
+ case '*=':
+ case '/=':
+ case '%=':
+ case '+=':
+ case '-=':
+ case '<<=':
+ case '>>=':
+ case '&=':
+ case '^=':
+ case '|=':
+ break;
+ case '?:':
+ break;
+ */
+ //Increment / Decrement
+
+ case '++x':
+ case '--x':
+ case 'x++':
+ case 'x--':
+ this.ir_incdec(state, irs);
+ break;
+ //case '.': break;
+
+ case '[]':
+ this.ir_arr_index(state, irs);
+ break;
+
+ /*
+ case 'VAR':
+ case 'int':
+ case 'float':
+ case 'bool':
+ ir_expression_simple(e, se);
+ break;
+ */
+
+ default:
+ this.ir_error(util.format("Could not translate unknown expression %s (%s)", this, this.oper));
+ }
+ };
+ /**
+ * Constructs an assignment expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_assign = function (state, irs, skip_comment
+ /*, local*/
+ ) {
+ var cond, ir, temp, size, slots, swz, i, entry, lhs, rhs, com;
+ lhs = this.subexpressions[0];
+ rhs = this.subexpressions[1];
+
+ if (lhs.Type != rhs.Type || rhs.Const) {
+ this.ir_cast.apply(rhs, [state, irs, lhs.Type]);
+ }
+
+ this.Type = lhs.Type;
+
+ if (lhs.Entry && lhs.Entry.constant) {
+ this.ir_error(util.format("Cannot assign value to constant %s", lhs.Dest));
+ }
+
+ if (!skip_comment) {
+ com = util.format("%s => %s %s <%s>", rhs.Dest, lhs.Type, lhs.Dest, lhs.toString());
+ irs.push(new IrComment(com, this.location));
+ }
+
+ size = types[this.Type].size;
+ slots = types[this.Type].slots; //get the swizzle for each slot
+
+ swz = Ir.swizzles[0].substring(0, 4 - (slots * 4 - size) / slots); //all components are used up in all slots
+
+ if (swz == Ir.swizzles[0]) {
+ swz = "";
+ }
+
+ for (i = 0; i < slots; i++) {
+ /*
+ if (cond && !local) {
+ ir = new IR('CMP', se[0].Dest, "-" + cond, se[1].Dest, se[0].Dest);
+ ir.addOffset(i);
+ ir.setSwizzle(swz);
+ irs.push(ir);
+ } else {
+ */
+ ir = new IrInstruction('MOV', lhs.Dest, rhs.Dest);
+ ir.addOffset(i);
+ ir.setSwizzle(swz);
+ irs.push(ir);
+ /*
+ }
+ */
+ }
+ };
+ /**
+ * Constructs a cast operation
+ */
+
+
+ AstExpression.prototype.ir_cast = function (state, irs, type) {
+ //Can cast to type?
+ if (Type.canCast(this.Type, type)) {
+ //Simple case, constant
+ if (this.Const) {
+ this.Dest = Type.castTo(this.Dest, this.Type, type);
+ this.Type = type;
+ } else {
+ //@todo: generate cast instructions
+ this.ir_error(util.format("Could not assign value of type %s to %s", this.Type, type));
+ }
+ } else {
+ this.ir_error(util.format("Could not assign value of type %s to %s", this.Type, type));
+ }
+ };
+ /**
+ * Constructs a simple expression code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_simple = function (state, irs) {
+ var name, entry, t;
+
+ if (this.oper == '.') {
+ this.ir_field(state, irs);
+ return;
+ } //identifier
+
+
+ if (name = this.primary_expression.identifier) {
+ //lookup identifier in symbol table
+ entry = state.symbols.get_variable(name) || state.symbols.get_function(name);
+
+ if (!entry
+ /*|| !entry.type*/
+ ) {
+ this.ir_error(util.format("%s is undefined", name));
+ }
+
+ this.Type = entry.type;
+ this.Entry = entry;
+
+ if (entry.constant) {
+ this.Dest = entry.constant;
+ } else {
+ this.Dest = entry.out;
+ }
+
+ return;
+ } //float constant
+
+
+ if (this.primary_expression.type == 'float') {
+ this.Type = 'float';
+ this.Dest = this.primary_expression.float_constant;
+ this.Const = true;
+ return;
+ } //int constant
+
+
+ if (this.primary_expression.type == 'int') {
+ this.Type = 'int';
+ this.Dest = this.primary_expression.int_constant;
+ this.Const = true;
+ return;
+ }
+
+ this.ir_error("Cannot translate unknown simple expression type");
+ };
+ /**
+ * Constructs the code for an expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_generate = function (state, irs, len, arith) {
+ var table, se, oprd_types, dest, i, j, def, match, comment, cnst;
+
+ if (!(table = builtin.oper[this.oper])) {
+ this.ir_error(util.format("Could not generate operation %s", this.oper));
+ }
+
+ se = this.subexpressions; //Fold constants
+
+ if (state.options.opt.fold_constants && arith) {
+ if (se[0].Const && se[1].Const) {
+ cnst = eval(se[0].Dest + this.oper + se[1].Dest); //If the calculation results in an error, resume normal IR generation and let it be handled at runtime
+
+ if (Number.isFinite(cnst)) {
+ this.Dest = "" + cnst;
+ this.Type = 'float';
+ this.Const = true;
+ return;
+ }
+ }
+ }
+
+ oprd_types = [];
+ dest = [];
+
+ for (i = 0; i < len; i++) {
+ oprd_types.push(se[i].Type);
+ dest.push(se[i].Dest);
+ }
+
+ def = new RegExp(oprd_types.join(",") + "\:(.*)");
+
+ for (j in table) {
+ if (match = j.match(def)) {
+ break;
+ }
+ }
+
+ if (!match) {
+ this.ir_error(util.format("Could not apply operation %s to %s", this.oper, oprd_types.join(", ")));
+ }
+
+ this.Type = match[1];
+ this.Dest = irs.getTemp(types[this.Type].slots);
+ dest.splice(0, 0, this.Dest);
+
+ if (len <= 4) {//this.Dest += util.format(".%s", swizzles[0].substring(0, glsl.type.size[this.Type]));
+ }
+
+ if (len == 1) {
+ comment = util.format("(%s %s %s) => %s %s", this.oper, se[0].Type, se[0].Dest, this.Type, this.Dest);
+ } else if (len == 2) {
+ comment = util.format("(%s %s %s %s %s) => %s %s", se[0].Type, se[0].Dest, this.oper, se[1].Type, se[1].Dest, this.Type, this.Dest);
+ } else if (len == 3) {
+ comment = util.format("(%s %s ? %s %s : %s %s) => %s %s", se[0].Type, se[0].Dest, se[1].Type, se[1].Dest, se[2].Type, se[2].Dest, this.Type, this.Dest);
+ }
+
+ irs.push(new IrComment(comment, this.location));
+ irs.build(table[j], dest);
+ };
+ /**
+ * Constructs an pre/post increment/decrement expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_incdec = function (state, irs) {
+ var se, op, ins, post, type, i, ir;
+ se = this.subexpressions[0];
+ op = this.oper.replace('x', '');
+ ins = op === '++' ? 'ADD' : 'SUB';
+ post = this.oper.indexOf('x') === 0;
+ type = types[se.Type]; //Type check: base type must be int or float
+
+ if (type.base != 'int' && type.base != 'float') {
+ this.ir_error(util.format("Could not apply operation %s to %s", op, se.Type));
+ }
+
+ this.Type = se.Type;
+
+ if (post) {
+ //For post increment, the returned happens before the increment, so we need a temp to store it
+ this.Dest = irs.getTemp(type.slots);
+ } else {
+ this.Dest = se.Dest;
+ }
+
+ irs.push(new IrComment(util.format("(%s%s) => %s %s", post ? se.Dest : op, post ? op : se.Dest, this.Type, this.Dest), this.location));
+
+ for (i = 0; i < type.slots; i++) {
+ if (post) {
+ this.Dest = irs.getTemp(type.slots);
+ ir = new IrInstruction('MOV', this.Dest, se.Dest);
+ ir.addOffset(i);
+ ir.setSwizzle(type.swizzle);
+ irs.push(ir);
+ }
+
+ ir = new IrInstruction(ins, se.Dest, se.Dest, "1.0");
+ ir.addOffset(i);
+ ir.setSwizzle(type.swizzle);
+ irs.push(ir);
+ }
+ };
+ /**
+ * Constructs an array index expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_arr_index = function (state, irs) {
+ var arr, idx, entry, size, cnst, oprd;
+ arr = this.subexpressions[0];
+ idx = this.subexpressions[1];
+ entry = arr.Entry; //Ensure array index is integer
+
+ if (idx.Type != 'int') {
+ this.ir_error("array index out of bounds");
+ } //@todo: Need to implement array indexing syntax for vector components
+
+
+ if (!entry.size) {
+ this.ir_error("cannot index a non-array value");
+ } //@todo: Need to implement array indexing for matrices
+
+
+ if (types[entry.base_type].slots > 1) {
+ this.ir_error("array indexing for matrices not implemented yet");
+ }
+
+ this.Type = entry.base_type; //If constant index, we can do some additional error checking
+
+ if (idx.Const) {
+ cnst = parseInt(idx.Dest);
+
+ if (cnst < 0 || cnst >= entry.size) {
+ this.ir_error("array index out of bounds");
+ }
+
+ oprd = new IrOperand(arr.Dest);
+ oprd.index = cnst;
+ this.Dest = oprd.toString();
+ } else {
+ //@todo: variable indexing is permitted by spec, but behavior is undefined for out of bounds
+ this.ir_error("variable indexing not implemented yet");
+ }
+ };
+ /**
+ * Constructs a function expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstFunctionExpression.prototype.ir = function (state, irs) {
+ var i, e, name, entry, ret_entry, retd_entry, call_types, operands, param, proto, loc;
+
+ if (this.cons) {
+ return this.ir_constructor(state, irs);
+ }
+
+ name = this.subexpressions[0].primary_expression.identifier;
+ operands = [];
+ call_types = [];
+
+ for (i = 0; i < this.expressions.length; i++) {
+ e = this.expressions[i];
+ e.ir(state, irs);
+ call_types.push(e.Type);
+ operands.push(e.Dest);
+ }
+
+ entry = state.symbols.get_function(name, call_types);
+
+ if (!entry) {
+ this.ir_error(util.format("Function %s(%s) is not defined", name, call_types.join(", ")));
+ }
+
+ this.Type = entry.type;
+ this.Dest = irs.getTemp(entry.getType().slots);
+ irs.push(new IrComment(util.format("%s(%s) => %s %s", name, operands.join(", "), this.Type, this.Dest), this.location));
+
+ if (entry.code) {
+ //Use function template
+ operands.unshift(this.Dest);
+ irs.build(entry.code, operands);
+ } else if (entry.Ast) {
+ //Rebuild inline function from AST
+ state.symbols.push_scope(); //Enter vars into local symbol table
+
+ proto = entry.Ast.proto_type;
+
+ for (i = 0; i < proto.parameters.length; i++) {
+ param = proto.parameters[i];
+ loc = state.symbols.add_variable(param.identifier, param.type.specifier.type_name);
+ loc.out = irs.getTemp(loc.getType().slots); //Add MOV operation from called param to local param
+
+ irs.push(new IrComment(util.format("PARAM %s => %s %s", operands[i], loc.out, param.type.specifier.type_name), param.location)); //Piggy-back off assignment generation
+
+ lhs = new AstExpression('');
+ lhs.setLocation(this.getLocation());
+ lhs.Type = loc.type;
+ lhs.Dest = loc.out;
+ assign = new AstExpression('=', lhs, this.expressions[i]);
+ assign.setLocation(this.getLocation());
+ assign.ir_assign(state, irs, true);
+ } //Create a return entry for the new call scope
+
+
+ ret_entry = state.symbols.add_variable("", this.Type);
+ ret_entry.out = this.Dest;
+ retd_entry = state.symbols.add_variable("", "bool");
+ retd_entry.out = irs.getTemp(retd_entry.getType().slots);
+ entry.Ast.body.ir(state, irs);
+ state.symbols.pop_scope();
+ }
+ };
+ /**
+ * Constructs a type constructor
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstFunctionExpression.prototype.ir_constructor = function (state, irs) {
+ var type, comment_text, comment, i, expr, src_expr, src_i, src_c, oprd, dest;
+ type = this.subexpressions[0].type_specifier;
+ this.Type = type.name;
+ this.Dest = irs.getTemp(type.slots);
+ comment_text = [];
+ comment = new IrComment("", this.location);
+ irs.push(comment); //Prepare components
+
+ for (i = 0; i < this.expressions.length; i++) {
+ expr = this.expressions[i];
+
+ if (expr) {
+ expr.ir(state, irs);
+ comment_text.push(expr.Dest);
+ }
+ }
+
+ src_expr = this.expressions[0];
+ src_i = 0; //Source expression index
+
+ src_c = 0; //Component of source expression
+
+ for (dest_i = 0; dest_i < type.size; dest_i++) {
+ if (!src_expr) {
+ this.ir_error("Not enough parameters to constructor");
+ } //@todo: need to add support for > vec4
+
+
+ if (types[src_expr.Type].size > 4) {
+ this.ir_error("Matrix components not implemented yet");
+ } //compute destination
+
+
+ dest = util.format("%s.%s", this.Dest, Ir.swizzles[0][dest_i]); //compute source
+
+ oprd = new IrOperand(src_expr.Dest);
+
+ if (!oprd.swizzle) {
+ oprd.swizzle = Ir.swizzles[0][src_c];
+ }
+
+ irs.push(new IrInstruction('MOV', dest, oprd.toString()));
+ src_c++; //Get next source component expression
+
+ if (src_c >= types[src_expr.Type].size) {
+ if (this.expressions[src_i + 1]) {
+ src_i++;
+ src_expr = this.expressions[src_i];
+ src_c = 0;
+ }
+ }
+ }
+
+ comment.comment = util.format("%s(%s) => %s %s", this.Type, comment_text.join(", "), this.Type, this.Dest);
+ };
+ /**
+ * Constructs a field selection code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_field = function (state, irs) {
+ var field, swz, base, se; //pick swizzle set
+
+ field = this.primary_expression.identifier;
+ se = this.subexpressions[0];
+ se.ir(state, irs);
+
+ if (Ir.isSwizzle(field)) {
+ base = types[se.Type].base;
+
+ if (field.length > 1) {
+ if (base == 'int') {
+ base = 'ivec' + field.length;
+ }
+
+ if (base == 'bool') {
+ base = 'bvec' + field.length;
+ }
+
+ if (base == 'float') {
+ base = 'vec' + field.length;
+ }
+ }
+
+ this.Type = base;
+
+ if (field.length > 4 || !this.Type) {
+ this.ir_error(util.format("Invalid field selection %s.%s", se, field));
+ }
+
+ this.Dest = util.format("%s.%s", se.Dest, Ir.normalizeSwizzle(field));
+ }
+ };
+ /**
+ * Constructs a selection statement
+ *
+ * @param ast_node Statement
+ */
+
+
+ AstSelectionStatement.prototype.ir = function (state, irs) {
+ var ir, cond;
+ this.condition.ir(state, irs); //@todo: add a check that condition is bool type?
+
+ irs.push(new IrComment(util.format("if %s then", this.condition.Dest), this.location)); //set a flag based on the result
+
+ ir = new IrInstruction('IF', this.condition.Dest);
+
+ if (['bool', 'int', 'float'].indexOf(this.condition.Type) === -1) {
+ this.ir_error("boolean expression expected");
+ }
+
+ if (!ir.d.swizzle) {
+ ir.d.swizzle = 'x';
+ }
+
+ irs.push(ir);
+ this.then_statement.ir(state, irs);
+
+ if (this.else_statement) {
+ irs.push(new IrInstruction('ELSE'));
+ this.else_statement.ir(state, irs);
+ }
+
+ irs.push(new IrInstruction('ENDIF'));
+ };
+ /**
+ * Constructs a jump statement
+ *
+ * Note: jump semantics are a bit different in glsl as there is no true "jumping":
+ * functions are inlined, loops are unrolled, etc.
+ *
+ * @param ast_node Statement
+ */
+
+
+ AstJumpStatement.prototype.ir = function (state, irs) {
+ var ret, ret_entry, assign, lhs;
+
+ switch (this.mode) {
+ case 'return':
+ ret = this.opt_return_value;
+
+ if (ret) {
+ ret.ir(state, irs);
+ ret_entry = state.symbols.get_variable(''); //@todo: need to compare return value type with current function type
+
+ irs.push(new IrComment(util.format("return => %s %s", ret.Dest, ret.Type), this.location)); //Piggy-back off assignment generation
+
+ lhs = new AstExpression('');
+ lhs.setLocation(this.getLocation());
+ lhs.Type = ret.Type;
+ lhs.Dest = ret_entry.out;
+ assign = new AstExpression('=', lhs, ret);
+ assign.setLocation(this.getLocation());
+ assign.ir_assign(state, irs, true);
+ } else {
+ irs.push(new IrComment("return", this.location));
+ }
+
+ break;
+
+ case 'debugger':
+ irs.push(new IrComment("debugger", this.location));
+ irs.push(new IrInstruction("DBGR"));
+ break;
+
+ default: //@todo:
+
+ }
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * IR Class
+ *
+ * Stores IR code tree
+ */
+
+
+ function Ir(target) {
+ this.target = target;
+ this.symbols = {
+ uniform: {
+ next: 0,
+ entries: {}
+ },
+ attribute: {
+ next: 0,
+ entries: {}
+ },
+ varying: {
+ next: 0,
+ entries: {}
+ },
+ temp: {
+ next: 0
+ }
+ };
+ this.code = [];
+ this.last = null;
+ }
+
+ Ir.prototype.getTemp = function (n) {
+ var t;
+ n = n || 1;
+ t = 'temp@' + this.symbols.temp.next;
+ this.symbols.temp.next += n;
+ return t;
+ };
+ /**
+ * Add a symbol table entry into the local symbol table and return a new IR identifier
+ *
+ * @param object entry Symbol table entry
+ *
+ * @return string
+ */
+
+
+ Ir.prototype.getUniform = function (entry) {
+ var table = this.symbols.uniform,
+ out;
+
+ if (!table.entries[entry.name]) {
+ table.entries[entry.name] = entry;
+ entry.out = 'uniform@' + table.next;
+ table.next += entry.getType().slots;
+ }
+
+ return entry.out;
+ };
+ /**
+ * Add a symbol table entry into the local symbol table and return a new IR identifier
+ *
+ * @param object entry Symbol table entry
+ *
+ * @return string
+ */
+
+
+ Ir.prototype.getAttribute = function (entry) {
+ var table = this.symbols.attribute,
+ out;
+
+ if (!table.entries[entry.name]) {
+ table.entries[entry.name] = entry;
+ entry.out = 'attribute@' + table.next;
+ table.next += entry.getType().slots;
+ }
+
+ return entry.out;
+ };
+ /**
+ * Add a symbol table entry into the local symbol table and return a new IR identifier
+ *
+ * @param object entry Symbol table entry
+ *
+ * @return string
+ */
+
+
+ Ir.prototype.getVarying = function (entry) {
+ var table = this.symbols.varying,
+ out;
+
+ if (!table.entries[entry.name]) {
+ table.entries[entry.name] = entry;
+ entry.out = 'varying@' + table.next;
+ table.next += entry.getType().slots;
+ }
+
+ return entry.out;
+ };
+
+ Ir.prototype.get = function (i) {
+ return this.code[i];
+ };
+
+ Ir.prototype.push = function (ir) {
+ this.code.push(ir);
+ this.last = ir;
+ };
+
+ Ir.isSwizzle = function (swz) {
+ if (swz.match(/[xyzw]+/)) {
+ return true;
+ }
+
+ if (swz.match(/[rgba]+/)) {
+ return true;
+ }
+
+ if (swz.match(/[stpq]+/)) {
+ return true;
+ }
+ };
+
+ Ir.normalizeSwizzle = function (swz) {
+ var n;
+
+ if (!this.isSwizzle(swz)) {
+ return null;
+ }
+
+ n = swz.replace(/[rs]/g, 'x').replace(/[gt]/g, 'y').replace(/[bp]/g, 'z').replace(/[aq]/g, 'w');
+ return n;
+ };
+
+ Ir.swizzles = ["xyzw", "rgba", "stpq"];
+ /**
+ * Replaces all instances of an operand name and base index in all instructions after start
+ *
+ * @param integer Starting instruction number
+ * @param string Old name to search for
+ * @param string New name to replace with
+ * @param integer Add offset
+ * @param boolean True if replacing with a completely new operand
+ */
+
+ Ir.prototype.replaceName = function (start, old, nw, index, repl) {
+ var i, j, ir, f, name, neg_const;
+ neg_const = old.match(/^\-([0-9]+\.[0-9]+)/);
+
+ if (neg_const) {
+ old = neg_const[1];
+ neg_const = true;
+ }
+
+ for (i = start; i < this.code.length; i++) {
+ ir = this.code[i]; //foreach each operand field
+
+ for (j = 0; j < IR.operands.length; j++) {
+ f = IR.operands[j];
+
+ if (ir[f] && ir[f].name == old) {
+ if (repl) {
+ ir[f] = new Ir.Operand(ir[f].neg + nw);
+ } else {
+ ir[f].name = nw;
+ ir[f].addOffset(index);
+ }
+
+ if (neg_const && ir[f].neg) {
+ ir[f].neg = "";
+ }
+ }
+ }
+ }
+ };
+
+ Ir.prototype.toString = function () {
+ return this.code.join("\n");
+ };
+ /**
+ * Builds instructions from code table record
+ *
+ * @param array List of instruction strings
+ * @param array List of operands
+ */
+
+
+ Ir.prototype.build = function (code, oprds) {
+ var dest, i, j, k, o, n, t, oprd, ir, new_swz, temps; //Parse operands
+
+ for (i = 0; i < oprds.length; i++) {
+ oprd = new IrOperand(oprds[i]);
+
+ if (oprd.swizzle) {
+ //need a new temp to move the swizzle so our code pattern works
+ new_swz = Ir.swizzles[0].substring(0, oprd.swizzle.length);
+
+ if (oprd.swizzle != new_swz) {
+ dest = this.getTemp();
+ ir = new IrInstruction('MOV', util.format("%s.%s", dest, new_swz), oprd.full);
+ this.push(ir);
+ oprd = new IrOperand(dest);
+ }
+ }
+
+ oprds[i] = oprd;
+ }
+
+ temps = []; //Merge template with passed operands
+
+ for (i = 0; i < code.length; i++) {
+ ir = new IrInstruction(code[i]); //For each operand
+
+ for (j = 0; j < IrInstruction.operands.length; j++) {
+ o = IrInstruction.operands[j];
+ oprd = ir[o];
+
+ if (!oprd) {
+ break;
+ } //Normal src/dest
+
+
+ n = oprd.name.match(/%(\d+)/);
+
+ if (n) {
+ n = parseInt(n[1]);
+ ir[o] = new IrOperand(oprds[n - 1].toString());
+ ir[o].addOffset(oprd.address);
+ ir[o].swizzle = oprd.swizzle;
+ ir[o].neg = oprd.neg;
+ } //Need temp
+
+
+ t = oprd.name.match(/%t(\d+)/);
+
+ if (t) {
+ //Build up enough temps
+ t = parseInt(t[1]);
+
+ while (temps.length < t) {
+ temps.push(this.getTemp());
+ }
+
+ t = temps[t - 1].split('@');
+ oprd.name = t[0];
+ oprd.address = t[1];
+ oprd.full = oprd.toString();
+ }
+ }
+
+ this.push(ir);
+ }
+ };
+ /**
+ * Ir Error Class
+ *
+ * Used to differentiate between a compilation error and a compiler error
+ */
+
+
+ function IrError(msg) {
+ this.msg = msg;
+ this.ir = true;
+ }
+
+ IrError.prototype = Error.prototype;
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * IR Instruction Class
+ *
+ * Represents a single assembly-like instruction
+ */
+
+ function IrInstruction(op, d, s1, s2, s3) {
+ var args;
+ this.str = null;
+ this.line = null;
+
+ if (arguments.length == 1) {
+ args = op.split(/[\s,]/);
+ op = args[0];
+ d = args[1];
+ s1 = args[2];
+ s2 = args[3];
+ s3 = args[4];
+ }
+
+ this.op = op;
+ this.d = this.operand(d);
+ this.s1 = this.operand(s1);
+ this.s2 = this.operand(s2);
+ this.s3 = this.operand(s3);
+ }
+
+ IrInstruction.operands = ['d', 's1', 's2', 's3'];
+
+ IrInstruction.prototype.operand = function (opr) {
+ return opr ? new IrOperand(opr) : "";
+ };
+ /**
+ * Adds the offset to all operands
+ *
+ * @param integer The offset to set
+ */
+
+
+ IrInstruction.prototype.addOffset = function (offset) {
+ var i, o;
+
+ for (i = 0; i < IrInstruction.operands.length; i++) {
+ o = IrInstruction.operands[i];
+
+ if (this[o]) {
+ this[o].addOffset(offset);
+ }
+ }
+ };
+ /**
+ * Set the swizzle components on all operands
+ *
+ * @param string The swizzle to set
+ */
+
+
+ IrInstruction.prototype.setSwizzle = function (swz) {
+ var i, o;
+
+ for (i = 0; i < IrInstruction.operands.length; i++) {
+ o = IrInstruction.operands[i];
+
+ if (this[o] && !this[o].swizzle) {
+ this[o].swizzle = swz;
+ }
+ }
+ };
+ /**
+ * toString method
+ *
+ * @return string
+ */
+
+
+ IrInstruction.prototype.toString = function () {
+ var out;
+ out = util.format("%s%s%s%s%s;", this.op, this.d ? ' ' + this.d : '', this.s1 ? ', ' + this.s1 : '', this.s2 ? ', ' + this.s2 : '', this.s3 ? ', ' + this.s3 : '');
+ return out;
+ };
+ /**
+ * IR Comment Class
+ *
+ * Represents a single comment
+ */
+
+
+ function IrComment(comment, loc) {
+ this.comment = comment;
+ this.loc = loc;
+ }
+
+ IrComment.prototype.toString = function () {
+ var c = this.comment;
+
+ if (this.loc) {
+ c = util.format("%s [%s:%s-%s:%s]", c, this.loc.first_line, this.loc.first_column, this.loc.last_line, this.loc.last_column);
+ }
+
+ c = "\n# " + c;
+ return c;
+ };
+ /**
+ * IR Operand Class
+ *
+ * Represents a single operand
+ */
+
+
+ function IrOperand(str, raw) {
+ this.full = "";
+ this.neg = "";
+ this.name = "";
+ this.address = "";
+ this.swizzle = "";
+ this.number = "";
+ this.raw = "";
+ this.index = "";
+
+ if (raw) {
+ this.full = str;
+ this.raw = str;
+ } else {
+ this.parse(str);
+ }
+ }
+ /**
+ * Parses operand string
+ *
+ * @param string string that represents a single variable
+ */
+
+
+ IrOperand.prototype.parse = function (str) {
+ var parts, regex;
+
+ if (!str) {
+ return;
+ }
+
+ if (!isNaN(parseFloat(str))) {
+ this.raw = str;
+ return;
+ } //neg
+
+
+ regex = "(\-)?"; //name (include '%' for our code substitution rules)
+
+ regex += "([\\w%]+)"; //number
+
+ regex += "(?:@(\\d+))?"; //index
+
+ regex += "(?:\\[(\\d+)\\])?"; //swizzle
+
+ regex += "(?:\\.([xyzw]+))?";
+ regex = new RegExp("^" + regex + "$");
+
+ if (parts = str.match(regex)) {
+ this.neg = parts[1] || "";
+ this.name = parts[2];
+ this.address = parseInt(parts[3]) || 0;
+ this.index = parseInt(parts[4]) || 0;
+ this.swizzle = parts[5] || "";
+ } else {
+ if (parts = str.match(/^"(.*)"$/)) {
+ this.raw = parts[1];
+ } else {
+ this.raw = str;
+ }
+ }
+
+ this.full = this.toString();
+ };
+ /**
+ * Adds an offset
+ *
+ * @param integer Offset to add
+ */
+
+
+ IrOperand.prototype.addOffset = function (offset) {
+ this.address = this.address || 0;
+ this.address += offset;
+ };
+ /**
+ * toString method
+ *
+ * @return string
+ */
+
+
+ IrOperand.prototype.toString = function () {
+ var str;
+
+ if (this.raw) {
+ str = this.raw;
+ } else {
+ str = this.neg + this.name + ("@" + this.address) + (this.index !== "" ? "[" + this.index + "]" : "") + (this.swizzle ? "." + this.swizzle : "");
+ }
+
+ return str;
+ };
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * GlslProgramJavascript class
+ */
+
+
+ function GlslProgramJavascript() {
+ this.vertex_code = [];
+ this.fragment_code = [];
+ this.symbols = new GlslProgramJavascriptVars();
+ this.context = new GlslProgramJavascriptContext();
+ this.library = {
+ tex: function tex(dest, i, sampler, src, j, dim) {
+ dest[i] = 0;
+ dest[i + 1] = 0;
+ dest[i + 2] = 0;
+ dest[i + 3] = 1;
+ }
+ };
+ this.vertex = null;
+ this.shader = null;
+ }
+
+ var proto = GlslProgramJavascript.prototype;
+ GlslProgramJavascript.translation_table = {
+ 'ABS': '%1.* = Math.abs(%2.*);',
+ 'ADD': '%1.* = %2.* + %3.*;',
+ 'AND': '%1.* = %2.* & %3.*;',
+ //'ARL' : false,
+ 'CEIL': '%1.* = Math.ceil(%2.*);',
+ 'CMP': '%1.* = (%2.* < 0.0) ? %3.* : %4.*;',
+ 'COS': '%1.* = Math.cos(%2.*);',
+ 'DIV': '%1.* = %2.* / %3.*;',
+ 'DBGR': 'debugger;',
+ 'DP2': '%1.x = (%2.x * %3.x) + (%2.y * %3.y);',
+ 'DP3': '%1.x = (%2.x * %3.x) + (%2.y * %3.y) + (%2.z * %3.z);',
+ 'DP4': '%1.x = (%2.x * %3.x) + (%2.y * %3.y) + (%2.z * %3.z) + (%2.w * %3.w);',
+ //'DPH' : '%1.* = (%2.x * %3.x + %2.y * %3.y + %2.z + %3.z + %3.w);',
+ //'DST' : '%1.* = [1, %2.y * %3.y, %2.z, %3.w];',
+ 'ELSE': '} else {',
+ 'ENDIF': '}',
+ 'FLR': '%1.* = Math.floor(%2.*);',
+ 'FRC': '%1.* = %2.* - Math.floor(%2.*);',
+ 'IF': 'if (%1.x) {',
+ 'MAD': '%1.* = (%2.* * %3.*) + %4.*;',
+ 'MAX': '%1.* = Math.max(%2.*, %3.*);',
+ 'MIN': '%1.* = Math.min(%2.*, %3.*);',
+ 'MOD': '%1.* = %2.* % %3.*;',
+ 'MOV': '%1.* = %2.*;',
+ 'MUL': '%1.* = %2.* * %3.*;',
+ 'OR': '%1.* = %2.* | %3.*;',
+ 'POW': '%1.x = Math.pow(%2.x, %3.x);',
+ 'RET': 'return;',
+ 'RSQ': '%1.* = (1.0 / Math.sqrt(%2.*));',
+ 'SEQ': '%1.* = (%2.* === %3.*) ? 1.0 : 0.0;',
+ 'SGE': '%1.* = (%2.* >= %3.*) ? 1.0 : 0.0;',
+ 'SGT': '%1.* = (%2.* > %3.*) ? 1.0 : 0.0;',
+ 'SIN': '%1.* = Math.sin(%2.*);',
+ 'SLE': '%1.* = (%2.* <= %3.*) ? 1.0 : 0.0;',
+ 'SLT': '%1.* = (%2.* < %3.*) ? 1.0 : 0.0;',
+ 'SNE': '%1.* = (%2.* !== %3.*) ? 1.0 : 0.0;',
+ 'SUB': '%1.* = %2.* - %3.*;',
+ 'TAN': '%1.* = Math.tan(%2.*);',
+ //Non-standard opcode for NV_gpu
+ 'TEX': 'tex(%1, %4, %2, %5, %3.x, 0);',
+ //%4 = address of %1, %5 = address of %2
+ 'XOR': '%1.* = %2.* ^ %3.*;'
+ };
+ /**
+ * Return string representation of program
+ *
+ * @param int target target
+ *
+ * @return string
+ */
+
+ proto.toString = function (target) {
+ if (target === glsl.target.fragment) {
+ return this.fragment_code.join("\n");
+ } else if (target === glsl.target.vertex) {
+ return this.vertex_code.join("\n");
+ } else {
+ return this.current.join("\n");
+ }
+ };
+ /**
+ * Translates IR code into a javascript representation
+ *
+ * @return bool true if there were no errors
+ */
+
+
+ proto.addObjectCode = function (object, target) {
+ var i, errors; //optimize(irs, symbols);
+
+ this.mergeSymbols(object);
+ this.current = [];
+
+ for (i = 0; i < object.code.length; i++) {
+ try {
+ this.instruction(object.code[i]);
+ } catch (e) {
+ this.error = util.format("%s at %s:%s", e.message, e.lineNumber, e.columnNumber);
+ return false;
+ }
+ }
+
+ if (target == glsl.target.vertex) {
+ this.vertex_code = this.current;
+ } else if (target == glsl.target.fragment) {
+ this.fragment_code = this.current;
+ }
+
+ return true;
+ };
+ /**
+ * Merge symbol code into program table
+ */
+
+
+ proto.mergeSymbols = function (object) {
+ var s, t, n, entry, sym, start, slots, comp;
+
+ for (s in object.symbols) {
+ t = object.symbols[s].entries;
+
+ for (n in t) {
+ entry = t[n];
+ start = parseInt(entry.out.split('@')[1]);
+ slots = entry.getType().slots;
+ comp = entry.getType().size / slots;
+
+ if (s == 'uniform') {
+ sym = this.symbols.addUniform(entry.name, start, slots, comp);
+
+ if (this.findSymbolCollision(this.symbols.uniform, sym)) {
+ this.rewriteSymbol(this.symbols.uniform, sym, object);
+ }
+ } else if (s == 'attribute') {
+ this.symbols.addAttribute(entry.name, start, slots, comp);
+ } else if (s == 'varying') {
+ this.symbols.addVarying(entry.name, start, slots, comp);
+ }
+ }
+ }
+ };
+ /**
+ * Scan symbol table to find collisions
+ */
+
+
+ proto.findSymbolCollision = function (table, symbol) {
+ var i, my_start, my_end, start, end;
+ my_start = symbol.pos;
+ my_end = my_start + symbol.slots - 1;
+
+ for (i in table) {
+ if (i == symbol.name) {
+ continue;
+ }
+
+ start = table[i].pos;
+ end = start + table[i].slots - 1;
+
+ if (my_start >= start && my_start <= end || my_end >= start && my_end <= end) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+ /**
+ * Rewrite symbol table entry position in code
+ */
+
+
+ proto.findNewSymbolPosition = function (table, symbol) {
+ var i, size, addresses, last, next;
+ addresses = []; //find new address
+
+ for (i in table) {
+ if (symbol.name == i) {
+ continue;
+ } //start address
+
+
+ addresses.push(table[i].pos); //end address
+
+ addresses.push(table[i].pos + table[i].slots - 1);
+ }
+
+ addresses.sort(); //Can insert at beginning
+
+ if (addresses[0] >= symbol.slots) {
+ return 0;
+ } //Can insert in between
+
+
+ for (i = 1; i < addresses.length; i += 2) {
+ last = addresses[i];
+ next = addresses[i];
+
+ if (next - last - 1 > symbol.slots) {
+ return last + 1;
+ }
+ } //Can insert at end
+
+
+ return addresses.slice(-1)[0] + 1;
+ };
+ /**
+ * Rewrite symbol table entry position in code
+ */
+
+
+ proto.rewriteSymbol = function (table, symbol, object) {
+ var pos, old_start, old_end, diff, i, ins;
+ old_start = symbol.pos;
+ old_end = old_start + symbol.slots - 1;
+ symbol.pos = this.findNewSymbolPosition(table, symbol);
+ diff = symbol.pos - old_start;
+
+ for (i = 0; i < object.code.length; i++) {
+ ins = object.code[i];
+
+ if (!(ins instanceof IrInstruction)) {
+ continue;
+ }
+
+ this.rewriteOperandAddress(ins.d, old_start, old_end, diff, symbol);
+ this.rewriteOperandAddress(ins.s1, old_start, old_end, diff, symbol);
+ this.rewriteOperandAddress(ins.s2, old_start, old_end, diff, symbol);
+ this.rewriteOperandAddress(ins.s3, old_start, old_end, diff, symbol);
+ }
+ };
+ /**
+ * Rewrite symbol table entry position in code
+ */
+
+
+ proto.rewriteOperandAddress = function (oprd, old_start, old_end, diff, symbol) {
+ var diff;
+
+ if (!oprd) {
+ return;
+ }
+
+ if (oprd.name != symbol.type) {
+ return;
+ }
+
+ if (oprd.address >= old_start && oprd.address <= old_end) {
+ oprd.address += diff;
+ }
+ };
+ /**
+ * Build a program
+ *
+ * @return function
+ */
+
+
+ proto.build = function () {
+ var module, shaders;
+ module = new Function("stdlib", "foreign", "heap", "//\"use asm\";\n" + "var\n" + "uniform_f32 = new stdlib.Float32Array(heap, 0, 128),\n" + "attribute_f32 = new stdlib.Float32Array(heap, 512, 128),\n" + "varying_f32 = new stdlib.Float32Array(heap, 1024, 128),\n" + "result_f32 = new stdlib.Float32Array(heap, 1536, 128),\n" + "temp_f32 = new stdlib.Float32Array(heap, 2048, 128),\n" + "jstemp = new stdlib.Float32Array(heap, 2544, 4),\n" + "tex = foreign.tex;\n" + ";\n" + "function vs() {\n" + this.vertex_code.join("\n") + "\n" + "}\n" + "function fs() {\n" + this.fragment_code.join("\n") + "\n" + "}\n" + "return { fragment : fs, vertex : vs };");
+ shaders = module(window, this.library, this.context.heap);
+ this.vertex = shaders.vertex;
+ this.fragment = shaders.fragment;
+ };
+ /**
+ * Translates ASM instruction into output format
+ *
+ * @param string string that represents a single instruction
+ */
+
+
+ proto.instruction = function (ins) {
+ var tpl, dest, src, i, j, k, code, js;
+
+ if (ins instanceof IrComment) {
+ this.current.push('// ' + ins.toString().replace("\n", ""));
+ return;
+ }
+
+ this.current.push('// ' + ins.toString());
+
+ if (!(tpl = GlslProgramJavascript.translation_table[ins.op])) {
+ throw new Error(util.format("Could not translate opcode '%s'", ins.op));
+ } //variables
+
+
+ dest = this.buildComponents(ins.d, true);
+
+ if (!dest) {
+ this.current.push(tpl);
+ return;
+ }
+
+ src = [];
+ src.push(this.buildComponents(ins.s1));
+ src.push(this.buildComponents(ins.s2));
+ src.push(this.buildComponents(ins.s3));
+
+ if (ins.op == 'TEX') {
+ js = tpl.replace(/%1/g, dest.name);
+ js = js.replace(/%2/g, src[0].name);
+ js = this.replaceOperand(js, '%3', src[1], 0);
+ js = js.replace(/%4/g, dest.start);
+ js = js.replace(/%5/g, src[0].start);
+ this.current.push(js);
+ this.current.push("");
+ return;
+ }
+
+ this.generateTemp(dest, src, tpl);
+
+ for (i = 0; i < dest.components.length; i++) {
+ js = this.replaceOperand(tpl, '%1', dest, i);
+
+ for (j = 0; j < 3; j++) {
+ if (src[j]) {
+ js = this.replaceOperand(js, '%' + (j + 2), src[j], i);
+ }
+ }
+
+ this.current.push(js);
+ }
+
+ this.current.push("");
+ };
+ /**
+ * Replace an operand into code template
+ *
+ * @param string tpl Template
+ * @param string from Template operand
+ * @param object op Operand info
+ * @param int n Current component iteration
+ */
+
+
+ proto.replaceOperand = function (tpl, from, op, n) {
+ var i,
+ out,
+ name,
+ addr,
+ swz = ['x', 'y', 'z', 'w'];
+
+ if (op.raw) {
+ name = op.name;
+ } else {
+ if (op.jstemp && op.jstemp[n]) {
+ name = 'jstemp';
+ addr = n;
+ } else {
+ name = op.name;
+
+ if (op.components) {
+ addr = op.start + op.components[n];
+ }
+ }
+ }
+
+ if (op.components) {
+ out = tpl.replace(from + '.*', util.format("%s[%s]", name, addr));
+ } else {
+ out = tpl.replace(from + '.*', name);
+ }
+
+ for (i = 0; i < swz.length; i++) {
+ out = out.replace(new RegExp(from + '\.' + swz[i], 'g'), util.format("%s[%s]", name, op.start + i));
+ }
+
+ return out;
+ };
+ /**
+ * Prepares info on IR operand
+ *
+ * @param IrOperand opr Operand
+ * @param bool dest Is destination?
+ *
+ * @return object
+ */
+
+
+ proto.buildComponents = function (opr, dest) {
+ var i, swz, out;
+
+ if (!opr) {
+ return null;
+ }
+
+ out = {};
+
+ if (opr.raw) {
+ out.name = opr.raw;
+ out.raw = true;
+ return out;
+ }
+
+ out.name = opr.neg + opr.name + '_f32';
+ out.start = 4 * opr.address + 4 * opr.index;
+ out.components = [];
+ out.jstemp = []; //generate array representation of swizzle components, expanding if necessary
+
+ swz = opr.swizzle || "xyzw";
+ swz = swz.split("");
+
+ for (i = 0; i < 4; i++) {
+ //exact swizzle specified and less than 4 components, grab last one
+ if (swz.length <= i) {
+ if (!dest) {
+ //repeat last one
+ out.components.push(out.components[i - 1]);
+ out.jstemp.push(null);
+ }
+ } else {
+ out.components.push("xyzw".indexOf(swz[i]));
+ out.jstemp.push(null);
+ }
+ }
+
+ return out;
+ };
+
+ proto.generateTemp = function (dest, src, tpl) {
+ var i, c, op, written;
+
+ for (i = 0; i < dest.components.length; i++) {
+ written = dest.components.slice(0, i);
+
+ for (c = 0; c < src.length; c++) {
+ op = src[c];
+
+ if (op && op.name == dest.name && op.start == dest.start && written.indexOf(op.components[i]) != -1) {
+ op.jstemp[i] = true;
+ this.current.push(util.format("jstemp[%s] = %s[%s]", i, op.name, op.start + op.components[i]));
+ }
+ }
+ } //console.log(tpl, dest, src);
+ //debugger;
+
+ };
+ /**
+ * Get Uniform Location
+ *
+ * @param string name Name
+ *
+ * @return int
+ */
+
+
+ proto.getUniformLocation = function (name) {
+ if (this.symbols.uniform[name]) {
+ return this.symbols.uniform[name].start;
+ }
+
+ return false;
+ };
+ /**
+ * Get Uniform Size
+ *
+ * @param string name Name
+ *
+ * @return int
+ */
+
+
+ proto.getUniformSize = function (name) {
+ if (this.symbols.uniform[name]) {
+ return this.symbols.uniform[name].size;
+ }
+
+ return false;
+ };
+ /**
+ * Set Uniform data
+ *
+ * @param string name Name
+ * @param array data Data
+ */
+
+
+ proto.setUniformData = function (name, data) {
+ var i, l, s, d;
+ d = data.length;
+ l = this.getUniformSize(name);
+ s = this.getUniformLocation(name);
+
+ if (l === false) {
+ return;
+ }
+
+ this.context.uniform_f32.set(data, i + s);
+ };
+ /**
+ * Get Attribute Location
+ *
+ * @param string name Name
+ *
+ * @return int
+ */
+
+
+ proto.getAttributeLocation = function (name) {
+ if (this.symbols.attribute[name]) {
+ return this.symbols.attribute[name].start;
+ }
+
+ return false;
+ };
+ /**
+ * Get Attribute Size
+ *
+ * @param string name Name
+ *
+ * @return int
+ */
+
+
+ proto.getAttributeSize = function (name) {
+ if (this.symbols.attribute[name]) {
+ return this.symbols.attribute[name].size;
+ }
+
+ return false;
+ };
+ /**
+ * Set Attribute data
+ *
+ * @param string name Name
+ * @param array data Data
+ */
+
+
+ proto.setAttributeData = function (name, data) {
+ var i, l, s, d;
+ d = data.length;
+ l = this.getAttributeSize(name);
+ s = this.getAttributeLocation(name);
+
+ if (l === false) {
+ return;
+ }
+
+ this.context.attribute_f32.set(data, i + s);
+ };
+ /**
+ * Get result data
+ *
+ * @param int start Start pos
+ * @param int size Size
+ *
+ * @return array
+ */
+
+
+ proto.getResultData = function (start, size) {
+ var res;
+ res = Array.prototype.slice.apply(this.context.result_f32, [start, size]);
+ return res;
+ };
+ /**
+ * Set TEX lookup function
+ *
+ *
+ */
+
+
+ proto.setTexFunction = function (func) {
+ this.library.tex = func;
+ };
+
+ glsl.program = GlslProgramJavascript;
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * GlslProgramJavascriptContext class
+ */
+
+ function GlslProgramJavascriptContext() {
+ this.heap = new ArrayBuffer(640 * 4);
+ this.uniform_f32 = new Float32Array(this.heap, 0, 128);
+ this.attribute_f32 = new Float32Array(this.heap, 128 * 4, 128);
+ this.varying_f32 = new Float32Array(this.heap, 256 * 4, 128);
+ this.result_f32 = new Float32Array(this.heap, 384 * 4, 128);
+ }
+
+ var proto = GlslProgramJavascriptContext.prototype;
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * GlslProgramJavascriptVars Class
+ */
+
+ function GlslProgramJavascriptVars() {
+ this.uniform = {};
+ this.attribute = {};
+ this.varying = {};
+ }
+
+ var proto = GlslProgramJavascriptVars.prototype;
+ /**
+ * Add uniform variable
+ */
+
+ proto.addUniform = function (name, pos, slots, comp) {
+ this.uniform[name] = new GlslProgramJavascriptVar(name, pos, slots, comp, 'uniform');
+ return this.uniform[name];
+ };
+ /**
+ * Add attribute variable
+ */
+
+
+ proto.addAttribute = function (name, pos, slots, comp) {
+ this.attribute[name] = new GlslProgramJavascriptVar(name, pos, slots, comp, 'attribute');
+ return this.attribute[name];
+ };
+ /**
+ * Add varying variable
+ */
+
+
+ proto.addVarying = function (name, pos, slots, comp) {
+ this.varying[name] = new GlslProgramJavascriptVar(name, pos, slots, comp, 'varying');
+ return this.varying[name];
+ };
+ /**
+ * GlslProgramJavascriptVar Class
+ */
+
+
+ function GlslProgramJavascriptVar(name, pos, slots, comp, type) {
+ this.name = name;
+ this.pos = pos;
+ this.slots = slots;
+ this.components = comp;
+ this.type = type;
+ } //this.glsl = glsl;
+
+
+ if ('object' !== 'undefined') {
+ module.exports = glsl;
+ }
+ })();
+});
+
+var ast$1 = createCommonjsModule(function (module, exports) {
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.makeEveryOtherGenerator = exports.makeGenerator = exports.visit = exports.evaluate = void 0;
+var isNode = function (node) { return !!(node === null || node === void 0 ? void 0 : node.type); };
+var isTraversable = function (node) { return isNode(node) || Array.isArray(node); };
+var evaluate = function (ast, visitors) {
+ var visit = function (node) {
+ var visitor = visitors[node.type];
+ if (!visitor) {
+ throw new Error("No evaluate() visitor for " + node.type);
+ }
+ return visitors[node.type](node, visit);
+ };
+ return visit(ast);
+};
+exports.evaluate = evaluate;
+var makePath = function (node, parent, parentPath, key, index) { return ({
+ node: node,
+ parent: parent,
+ parentPath: parentPath,
+ key: key,
+ index: index,
+ skip: function () {
+ this.skipped = true;
+ },
+ remove: function () {
+ this.removed = true;
+ },
+ replaceWith: function (replacer) {
+ this.replaced = replacer;
+ },
+ findParent: function (test) {
+ return !parentPath
+ ? parentPath
+ : test(parentPath)
+ ? parentPath
+ : parentPath.findParent(test);
+ },
+}); };
+/**
+ * Apply the visitor pattern to an AST that conforms to this compiler's spec
+ */
+var visit = function (ast, visitors) {
+ var visitNode = function (node, parent, parentPath, key, index) {
+ var _a;
+ var visitor = visitors[node.type];
+ var path = makePath(node, parent, parentPath, key, index);
+ if (visitor === null || visitor === void 0 ? void 0 : visitor.enter) {
+ visitor.enter(path);
+ if (path.removed) {
+ if (!key || !parent) {
+ throw new Error("Asked to remove " + node.id + " but no parent key was present in " + (parent === null || parent === void 0 ? void 0 : parent.id));
+ }
+ if (typeof index === 'number') {
+ parent[key].splice(index, 1);
+ }
+ else {
+ parent[key] = null;
+ }
+ return path;
+ }
+ if (path.replaced) {
+ if (!key || !parent) {
+ throw new Error("Asked to remove " + node.id + " but no parent key was present in " + (parent === null || parent === void 0 ? void 0 : parent.id));
+ }
+ if (typeof index === 'number') {
+ parent[key].splice(index, 1, path.replaced);
+ }
+ else {
+ parent[key] = path.replaced;
+ }
+ }
+ if (path.skipped) {
+ return path;
+ }
+ }
+ Object.entries(node)
+ .filter(function (_a) {
+ var nodeKey = _a[0], nodeValue = _a[1];
+ return isTraversable(nodeValue);
+ })
+ .forEach(function (_a) {
+ var nodeKey = _a[0], nodeValue = _a[1];
+ if (Array.isArray(nodeValue)) {
+ for (var i = 0, offset = 0; i - offset < nodeValue.length; i++) {
+ var child = nodeValue[i - offset];
+ var res = visitNode(child, node, path, nodeKey, i - offset);
+ if (res === null || res === void 0 ? void 0 : res.removed) {
+ offset += 1;
+ }
+ }
+ }
+ else {
+ visitNode(nodeValue, node, path, nodeKey);
+ }
+ });
+ (_a = visitor === null || visitor === void 0 ? void 0 : visitor.exit) === null || _a === void 0 ? void 0 : _a.call(visitor, path);
+ // visitor?.exit?.(node, parent, key, index);
+ };
+ return visitNode(ast);
+};
+exports.visit = visit;
+/**
+ * Stringify an AST
+ */
+var makeGenerator = function (generators) {
+ var gen = function (ast) {
+ return typeof ast === 'string'
+ ? ast
+ : ast === null || ast === undefined
+ ? ''
+ : Array.isArray(ast)
+ ? ast.map(gen).join('')
+ : ast.type in generators
+ ? generators[ast.type](ast)
+ : "NO GENERATOR FOR " + ast.type + ast;
+ };
+ return gen;
+};
+exports.makeGenerator = makeGenerator;
+var makeEveryOtherGenerator = function (generate) {
+ var everyOther = function (nodes, eo) {
+ return nodes.reduce(function (output, node, index) {
+ return output +
+ generate(node) +
+ (index === nodes.length - 1 ? '' : generate(eo[index]));
+ }, '');
+ };
+ return everyOther;
+};
+exports.makeEveryOtherGenerator = makeEveryOtherGenerator;
+});
+
+var ast$2 = /*@__PURE__*/getDefaultExportFromCjs(ast$1);
+
+"use strict";
+
+
+var generators = {
+ program: function (node) { return generate(node.ws) + generate(node.program); },
+ preprocessor: function (node) { return generate(node.line) + generate(node._); },
+ keyword: function (node) { return generate(node.token) + generate(node.whitespace); },
+ precision: function (node) {
+ return generate(node.prefix) + generate(node.qualifier) + generate(node.specifier);
+ },
+ // Statements
+ expression_statement: function (node) {
+ return generate(node.expression) + generate(node.semi);
+ },
+ if_statement: function (node) {
+ return generate(node.if) +
+ generate(node.lp) +
+ generate(node.condition) +
+ generate(node.rp) +
+ generate(node.body) +
+ generate(node.else);
+ },
+ switch_statement: function (node) {
+ return generate(node.switch) +
+ generate(node.lp) +
+ generate(node.expression) +
+ generate(node.rp) +
+ generate(node.lb) +
+ generate(node.cases) +
+ generate(node.rb);
+ },
+ break_statement: function (node) { return generate(node.break) + generate(node.semi); },
+ do_statement: function (node) {
+ return generate(node.do) +
+ generate(node.body) +
+ generate(node.while) +
+ generate(node.lp) +
+ generate(node.expression) +
+ generate(node.rp) +
+ generate(node.semi);
+ },
+ continue_statement: function (node) { return generate(node.continue) + generate(node.semi); },
+ return_statement: function (node) {
+ return generate(node.return) + generate(node.expression) + generate(node.semi);
+ },
+ discard_statement: function (node) { return generate(node.discard) + generate(node.semi); },
+ while_statement: function (node) {
+ return generate(node.while) +
+ generate(node.lp) +
+ generate(node.condition) +
+ generate(node.rp) +
+ generate(node.body);
+ },
+ for_statement: function (node) {
+ return generate(node.for) +
+ generate(node.lp) +
+ generate(node.init) +
+ generate(node.initSemi) +
+ generate(node.condition) +
+ generate(node.conditionSemi) +
+ generate(node.operation) +
+ generate(node.rp) +
+ generate(node.body);
+ },
+ condition_expression: function (node) {
+ return generate(node.specified_type) +
+ generate(node.identifier) +
+ generate(node.declarator) +
+ generate(node.op) +
+ generate(node.initializer);
+ },
+ declaration_statement: function (node) {
+ return generate(node.declaration) + generate(node.semi);
+ },
+ fully_specified_type: function (node) {
+ return generate(node.qualifiers) + generate(node.specifier);
+ },
+ layout_qualifier: function (node) {
+ return generate(node.layout) +
+ generate(node.lp) +
+ generateWithEveryOther(node.qualifiers, node.commas) +
+ generate(node.rp);
+ },
+ layout_qualifier_id: function (node) {
+ return generate(node.identifier) +
+ generate(node.operator) +
+ generate(node.expression);
+ },
+ switch_case: function (node) {
+ return generate(node.case) +
+ generate(node.test) +
+ generate(node.colon) +
+ generate(node.statements);
+ },
+ default_case: function (node) {
+ return generate(node.default) + generate(node.colon) + generate(node.statements);
+ },
+ declaration: function (node) {
+ return generate(node.specified_type) +
+ generate(node.identifier) +
+ generate(node.quantifier) +
+ generate(node.operator) +
+ generate(node.initializer);
+ },
+ declarator_list: function (node) {
+ return generate(node.specified_type) +
+ generateWithEveryOther(node.declarations, node.commas);
+ },
+ declarator: function (node) {
+ return generate(node.specified_type) +
+ generate(node.identifier) +
+ generate(node.qualifiers) +
+ generate(node.quantifier);
+ },
+ type_specifier: function (node) {
+ return generate(node.specifier) +
+ generate(node.quantifier) +
+ generate(node.declarations);
+ },
+ array_specifiers: function (node) { return generate(node.specifiers); },
+ array_specifier: function (node) {
+ return generate(node.lb) + generate(node.expression) + generate(node.rb);
+ },
+ identifier: function (node) { return node.identifier + generate(node.whitespace); },
+ function: function (node) {
+ return generate(node['prototype']) + generate(node.body) + generate(node.rp);
+ },
+ function_header: function (node) {
+ return generate(node.returnType) + generate(node.name) + generate(node.lp);
+ },
+ function_prototype: function (node) {
+ return generate(node.header.returnType) +
+ generate(node.header.name) +
+ generate(node.header.lp) +
+ (node.parameters
+ ? generateWithEveryOther(node.parameters, node.commas)
+ : '') +
+ generate(node.rp);
+ },
+ parameter_declaration: function (node) {
+ return generate(node.qualifier) + generate(node.declaration);
+ },
+ compound_statement: function (node) {
+ return generate(node.lb) + generate(node.statements) + generate(node.rb);
+ },
+ function_call: function (node) {
+ return generate(node.identifier) +
+ generate(node.lp) +
+ generate(node.args) +
+ generate(node.rp);
+ },
+ parameter_declarator: function (node) {
+ return generate(node.qualifier) +
+ generate(node.specifier) +
+ generate(node.identifier) +
+ generate(node.quantifier);
+ },
+ postfix: function (node) { return generate(node.expr) + generate(node.postfix); },
+ quantifier: function (node) {
+ return generate(node.lb) + generate(node.expr) + generate(node.rb);
+ },
+ quantified_identifier: function (node) {
+ return generate(node.identifier) + generate(node.quantifier);
+ },
+ field_selection: function (node) { return generate(node.dot) + generate(node.selection); },
+ subroutine_qualifier: function (node) {
+ return generate(node.subroutine) +
+ generate(node.lp) +
+ generate(node.type_names) +
+ generate(node.commas) +
+ generate(node.rp);
+ },
+ assignment: function (node) {
+ return generate(node.left) + generate(node.operator) + generate(node.right);
+ },
+ ternary: function (node) {
+ return generate(node.expr) +
+ generate(node.question) +
+ generate(node.left) +
+ generate(node.colon) +
+ generate(node.right);
+ },
+ binary: function (node) {
+ return generate(node.left) + generate(node.operator) + generate(node.right);
+ },
+ group: function (node) {
+ return generate(node.lp) + generate(node.expression) + generate(node.rp);
+ },
+ unary: function (node) { return generate(node.operator) + generate(node.expression); },
+ float_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ double_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ int_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ uint_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ bool_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ literal: function (node) { return generate(node.literal) + generate(node.whitespace); },
+ struct: function (node) {
+ return generate(node.struct) +
+ generate(node.typeName) +
+ generate(node.lb) +
+ generate(node.declarations) +
+ generate(node.rb);
+ },
+ struct_declaration: function (node) {
+ return generate(node.declaration) + generate(node.semi);
+ },
+ interface_declarator: function (node) {
+ return generate(node.qualifiers) +
+ generate(node.interface_type) +
+ generate(node.lp) +
+ generate(node.declarations) +
+ generate(node.rp) +
+ generate(node.identifier);
+ },
+ struct_declarator: function (node) {
+ return generate(node.specified_type) +
+ generateWithEveryOther(node.declarations, node.commas);
+ },
+ initializer_list: function (node) {
+ return generate(node.lb) +
+ generateWithEveryOther(node.initializers, node.commas) +
+ generate(node.rb);
+ },
+ qualifier_declarator: function (node) {
+ return generate(node.qualifiers) +
+ generateWithEveryOther(node.declarations, node.commas);
+ },
+};
+var generate = (0, ast$1.makeGenerator)(generators);
+var generateWithEveryOther = (0, ast$1.makeEveryOtherGenerator)(generate);
+var _default = generate;
+
+var generator = /*#__PURE__*/Object.defineProperty({
+ default: _default
+}, '__esModule', {value: true});
+
+// Generated by Peggy 1.2.0.
+//
+// https://peggyjs.org/
+
+"use strict";
+
+function peg$subclass(child, parent) {
+ function C() { this.constructor = child; }
+ C.prototype = parent.prototype;
+ child.prototype = new C();
+}
+
+function peg$SyntaxError(message, expected, found, location) {
+ var self = Error.call(this, message);
+ if (Object.setPrototypeOf) {
+ Object.setPrototypeOf(self, peg$SyntaxError.prototype);
+ }
+ self.expected = expected;
+ self.found = found;
+ self.location = location;
+ self.name = "SyntaxError";
+ return self;
+}
+
+peg$subclass(peg$SyntaxError, Error);
+
+function peg$padEnd(str, targetLength, padString) {
+ padString = padString || " ";
+ if (str.length > targetLength) { return str; }
+ targetLength -= str.length;
+ padString += padString.repeat(targetLength);
+ return str + padString.slice(0, targetLength);
+}
+
+peg$SyntaxError.prototype.format = function(sources) {
+ var str = "Error: " + this.message;
+ if (this.location) {
+ var src = null;
+ var k;
+ for (k = 0; k < sources.length; k++) {
+ if (sources[k].source === this.location.source) {
+ src = sources[k].text.split(/\r\n|\n|\r/g);
+ break;
+ }
+ }
+ var s = this.location.start;
+ var loc = this.location.source + ":" + s.line + ":" + s.column;
+ if (src) {
+ var e = this.location.end;
+ var filler = peg$padEnd("", s.line.toString().length);
+ var line = src[s.line - 1];
+ var last = s.line === e.line ? e.column : line.length + 1;
+ str += "\n --> " + loc + "\n"
+ + filler + " |\n"
+ + s.line + " | " + line + "\n"
+ + filler + " | " + peg$padEnd("", s.column - 1)
+ + peg$padEnd("", last - s.column, "^");
+ } else {
+ str += "\n at " + loc;
+ }
+ }
+ return str;
+};
+
+peg$SyntaxError.buildMessage = function(expected, found) {
+ var DESCRIBE_EXPECTATION_FNS = {
+ literal: function(expectation) {
+ return "\"" + literalEscape(expectation.text) + "\"";
+ },
+
+ class: function(expectation) {
+ var escapedParts = expectation.parts.map(function(part) {
+ return Array.isArray(part)
+ ? classEscape(part[0]) + "-" + classEscape(part[1])
+ : classEscape(part);
+ });
+
+ return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
+ },
+
+ any: function() {
+ return "any character";
+ },
+
+ end: function() {
+ return "end of input";
+ },
+
+ other: function(expectation) {
+ return expectation.description;
+ }
+ };
+
+ function hex(ch) {
+ return ch.charCodeAt(0).toString(16).toUpperCase();
+ }
+
+ function literalEscape(s) {
+ return s
+ .replace(/\\/g, "\\\\")
+ .replace(/"/g, "\\\"")
+ .replace(/\0/g, "\\0")
+ .replace(/\t/g, "\\t")
+ .replace(/\n/g, "\\n")
+ .replace(/\r/g, "\\r")
+ .replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); })
+ .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); });
+ }
+
+ function classEscape(s) {
+ return s
+ .replace(/\\/g, "\\\\")
+ .replace(/\]/g, "\\]")
+ .replace(/\^/g, "\\^")
+ .replace(/-/g, "\\-")
+ .replace(/\0/g, "\\0")
+ .replace(/\t/g, "\\t")
+ .replace(/\n/g, "\\n")
+ .replace(/\r/g, "\\r")
+ .replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); })
+ .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); });
+ }
+
+ function describeExpectation(expectation) {
+ return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
+ }
+
+ function describeExpected(expected) {
+ var descriptions = expected.map(describeExpectation);
+ var i, j;
+
+ descriptions.sort();
+
+ if (descriptions.length > 0) {
+ for (i = 1, j = 1; i < descriptions.length; i++) {
+ if (descriptions[i - 1] !== descriptions[i]) {
+ descriptions[j] = descriptions[i];
+ j++;
+ }
+ }
+ descriptions.length = j;
+ }
+
+ switch (descriptions.length) {
+ case 1:
+ return descriptions[0];
+
+ case 2:
+ return descriptions[0] + " or " + descriptions[1];
+
+ default:
+ return descriptions.slice(0, -1).join(", ")
+ + ", or "
+ + descriptions[descriptions.length - 1];
+ }
+ }
+
+ function describeFound(found) {
+ return found ? "\"" + literalEscape(found) + "\"" : "end of input";
+ }
+
+ return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
+};
+
+function peg$parse(input, options) {
+ options = options !== undefined ? options : {};
+
+ var peg$FAILED = {};
+ var peg$source = options.grammarSource;
+
+ var peg$startRuleFunctions = { start: peg$parsestart };
+ var peg$startRuleFunction = peg$parsestart;
+
+ var peg$c0 = "attribute";
+ var peg$c1 = "varying";
+ var peg$c2 = "const";
+ var peg$c3 = "bool";
+ var peg$c4 = "float";
+ var peg$c5 = "double";
+ var peg$c6 = "int";
+ var peg$c7 = "uint";
+ var peg$c8 = "break";
+ var peg$c9 = "continue";
+ var peg$c10 = "do";
+ var peg$c11 = "else";
+ var peg$c12 = "for";
+ var peg$c13 = "if";
+ var peg$c14 = "discard";
+ var peg$c15 = "return";
+ var peg$c16 = "switch";
+ var peg$c17 = "case";
+ var peg$c18 = "default";
+ var peg$c19 = "subroutine";
+ var peg$c20 = "bvec2";
+ var peg$c21 = "bvec3";
+ var peg$c22 = "bvec4";
+ var peg$c23 = "ivec2";
+ var peg$c24 = "ivec3";
+ var peg$c25 = "ivec4";
+ var peg$c26 = "uvec2";
+ var peg$c27 = "uvec3";
+ var peg$c28 = "uvec4";
+ var peg$c29 = "vec2";
+ var peg$c30 = "vec3";
+ var peg$c31 = "vec4";
+ var peg$c32 = "mat2";
+ var peg$c33 = "mat3";
+ var peg$c34 = "mat4";
+ var peg$c35 = "centroid";
+ var peg$c36 = "in";
+ var peg$c37 = "out";
+ var peg$c38 = "inout";
+ var peg$c39 = "uniform";
+ var peg$c40 = "patch";
+ var peg$c41 = "sample";
+ var peg$c42 = "buffer";
+ var peg$c43 = "shared";
+ var peg$c44 = "coherent";
+ var peg$c45 = "volatile";
+ var peg$c46 = "restrict";
+ var peg$c47 = "readonly";
+ var peg$c48 = "writeonly";
+ var peg$c49 = "dvec2";
+ var peg$c50 = "dvec3";
+ var peg$c51 = "dvec4";
+ var peg$c52 = "dmat2";
+ var peg$c53 = "dmat3";
+ var peg$c54 = "dmat4";
+ var peg$c55 = "noperspective";
+ var peg$c56 = "flat";
+ var peg$c57 = "smooth";
+ var peg$c58 = "layout";
+ var peg$c59 = "mat2x2";
+ var peg$c60 = "mat2x3";
+ var peg$c61 = "mat2x4";
+ var peg$c62 = "mat3x2";
+ var peg$c63 = "mat3x3";
+ var peg$c64 = "mat3x4";
+ var peg$c65 = "mat4x2";
+ var peg$c66 = "mat4x3";
+ var peg$c67 = "mat4x4";
+ var peg$c68 = "dmat2x2";
+ var peg$c69 = "dmat2x3";
+ var peg$c70 = "dmat2x4";
+ var peg$c71 = "dmat3x2";
+ var peg$c72 = "dmat3x3";
+ var peg$c73 = "dmat3x4";
+ var peg$c74 = "dmat4x2";
+ var peg$c75 = "dmat4x3";
+ var peg$c76 = "dmat4x4";
+ var peg$c77 = "atomic_uint";
+ var peg$c78 = "sampler1D";
+ var peg$c79 = "sampler2D";
+ var peg$c80 = "sampler3D";
+ var peg$c81 = "samplerCube";
+ var peg$c82 = "sampler1DShadow";
+ var peg$c83 = "sampler2DShadow";
+ var peg$c84 = "samplerCubeShadow";
+ var peg$c85 = "sampler1DArray";
+ var peg$c86 = "sampler2DArray";
+ var peg$c87 = "sampler1DArrayShadow";
+ var peg$c88 = "sampler2DArrayshadow";
+ var peg$c89 = "isampler1D";
+ var peg$c90 = "isampler2D";
+ var peg$c91 = "isampler3D";
+ var peg$c92 = "isamplerCube";
+ var peg$c93 = "isampler1Darray";
+ var peg$c94 = "isampler2DArray";
+ var peg$c95 = "usampler1D";
+ var peg$c96 = "usampler2D";
+ var peg$c97 = "usampler3D";
+ var peg$c98 = "usamplerCube";
+ var peg$c99 = "usampler1DArray";
+ var peg$c100 = "usampler2DArray";
+ var peg$c101 = "sampler2DRect";
+ var peg$c102 = "sampler2DRectshadow";
+ var peg$c103 = "isampler2DRect";
+ var peg$c104 = "usampler2DRect";
+ var peg$c105 = "samplerBuffer";
+ var peg$c106 = "isamplerBuffer";
+ var peg$c107 = "usamplerBuffer";
+ var peg$c108 = "samplerCubeArray";
+ var peg$c109 = "samplerCubeArrayShadow";
+ var peg$c110 = "isamplerCubeArray";
+ var peg$c111 = "usamplerCubeArray";
+ var peg$c112 = "sampler2DMS";
+ var peg$c113 = "isampler2DMS";
+ var peg$c114 = "usampler2DMS";
+ var peg$c115 = "sampler2DMSArray";
+ var peg$c116 = "isampler2DMSArray";
+ var peg$c117 = "usampler2DMSArray";
+ var peg$c118 = "image1D";
+ var peg$c119 = "iimage1D";
+ var peg$c120 = "uimage1D";
+ var peg$c121 = "image2D";
+ var peg$c122 = "iimage2D";
+ var peg$c123 = "uimage2D";
+ var peg$c124 = "image3D";
+ var peg$c125 = "iimage3D";
+ var peg$c126 = "uimage3D";
+ var peg$c127 = "image2DRect";
+ var peg$c128 = "iimage2DRect";
+ var peg$c129 = "uimage2DRect";
+ var peg$c130 = "imageCube";
+ var peg$c131 = "iimageCube";
+ var peg$c132 = "uimageCube";
+ var peg$c133 = "imageBuffer";
+ var peg$c134 = "iimageBuffer";
+ var peg$c135 = "uimageBuffer";
+ var peg$c136 = "image1DArray";
+ var peg$c137 = "iimage1DArray";
+ var peg$c138 = "uimage1DArray";
+ var peg$c139 = "image2DArray";
+ var peg$c140 = "iimage2DArray";
+ var peg$c141 = "uimage2DArray";
+ var peg$c142 = "imageCubeArray";
+ var peg$c143 = "iimageCubeArray";
+ var peg$c144 = "uimageCubeArray";
+ var peg$c145 = "image2DMS";
+ var peg$c146 = "iimage2DMS";
+ var peg$c147 = "uimage2DMS";
+ var peg$c148 = "image2DMArray";
+ var peg$c149 = "iimage2DMSArray";
+ var peg$c150 = "uimage2DMSArray";
+ var peg$c151 = "struct";
+ var peg$c152 = "void";
+ var peg$c153 = "while";
+ var peg$c154 = "invariant";
+ var peg$c155 = "precise";
+ var peg$c156 = "highp";
+ var peg$c157 = "mediump";
+ var peg$c158 = "lowp";
+ var peg$c159 = "precision";
+ var peg$c160 = "true";
+ var peg$c161 = "false";
+ var peg$c162 = "<<";
+ var peg$c163 = ">>";
+ var peg$c164 = "++";
+ var peg$c165 = "--";
+ var peg$c166 = "<=";
+ var peg$c167 = ">=";
+ var peg$c168 = "==";
+ var peg$c169 = "!=";
+ var peg$c170 = "&&";
+ var peg$c171 = "||";
+ var peg$c172 = "^^";
+ var peg$c173 = "*=";
+ var peg$c174 = "/=";
+ var peg$c175 = "+=";
+ var peg$c176 = "%=";
+ var peg$c177 = "<<=";
+ var peg$c178 = ">>=";
+ var peg$c179 = "&=";
+ var peg$c180 = "^=";
+ var peg$c181 = "|=";
+ var peg$c182 = "-=";
+ var peg$c183 = "(";
+ var peg$c184 = ")";
+ var peg$c185 = "[";
+ var peg$c186 = "]";
+ var peg$c187 = "{";
+ var peg$c188 = "}";
+ var peg$c189 = ".";
+ var peg$c190 = ",";
+ var peg$c191 = ":";
+ var peg$c192 = "=";
+ var peg$c193 = ";";
+ var peg$c194 = "!";
+ var peg$c195 = "-";
+ var peg$c196 = "~";
+ var peg$c197 = "+";
+ var peg$c198 = "*";
+ var peg$c199 = "/";
+ var peg$c200 = "%";
+ var peg$c201 = "<";
+ var peg$c202 = ">";
+ var peg$c203 = "|";
+ var peg$c204 = "^";
+ var peg$c205 = "&";
+ var peg$c206 = "?";
+ var peg$c207 = "0";
+ var peg$c208 = "lf";
+ var peg$c209 = "LF";
+ var peg$c210 = "#";
+ var peg$c211 = "//";
+ var peg$c212 = "/*";
+ var peg$c213 = "*/";
+
+ var peg$r0 = /^[A-Za-z_]/;
+ var peg$r1 = /^[A-Za-z_0-9]/;
+ var peg$r2 = /^[uU]/;
+ var peg$r3 = /^[1-9]/;
+ var peg$r4 = /^[0-7]/;
+ var peg$r5 = /^[xX]/;
+ var peg$r6 = /^[0-9a-fA-F]/;
+ var peg$r7 = /^[0-9]/;
+ var peg$r8 = /^[eE]/;
+ var peg$r9 = /^[+\-]/;
+ var peg$r10 = /^[fF]/;
+ var peg$r11 = /^[^\n]/;
+ var peg$r12 = /^[ \t\n\r]/;
+
+ var peg$e0 = peg$literalExpectation("attribute", false);
+ var peg$e1 = peg$literalExpectation("varying", false);
+ var peg$e2 = peg$literalExpectation("const", false);
+ var peg$e3 = peg$literalExpectation("bool", false);
+ var peg$e4 = peg$literalExpectation("float", false);
+ var peg$e5 = peg$literalExpectation("double", false);
+ var peg$e6 = peg$literalExpectation("int", false);
+ var peg$e7 = peg$literalExpectation("uint", false);
+ var peg$e8 = peg$literalExpectation("break", false);
+ var peg$e9 = peg$literalExpectation("continue", false);
+ var peg$e10 = peg$literalExpectation("do", false);
+ var peg$e11 = peg$literalExpectation("else", false);
+ var peg$e12 = peg$literalExpectation("for", false);
+ var peg$e13 = peg$literalExpectation("if", false);
+ var peg$e14 = peg$literalExpectation("discard", false);
+ var peg$e15 = peg$literalExpectation("return", false);
+ var peg$e16 = peg$literalExpectation("switch", false);
+ var peg$e17 = peg$literalExpectation("case", false);
+ var peg$e18 = peg$literalExpectation("default", false);
+ var peg$e19 = peg$literalExpectation("subroutine", false);
+ var peg$e20 = peg$literalExpectation("bvec2", false);
+ var peg$e21 = peg$literalExpectation("bvec3", false);
+ var peg$e22 = peg$literalExpectation("bvec4", false);
+ var peg$e23 = peg$literalExpectation("ivec2", false);
+ var peg$e24 = peg$literalExpectation("ivec3", false);
+ var peg$e25 = peg$literalExpectation("ivec4", false);
+ var peg$e26 = peg$literalExpectation("uvec2", false);
+ var peg$e27 = peg$literalExpectation("uvec3", false);
+ var peg$e28 = peg$literalExpectation("uvec4", false);
+ var peg$e29 = peg$literalExpectation("vec2", false);
+ var peg$e30 = peg$literalExpectation("vec3", false);
+ var peg$e31 = peg$literalExpectation("vec4", false);
+ var peg$e32 = peg$literalExpectation("mat2", false);
+ var peg$e33 = peg$literalExpectation("mat3", false);
+ var peg$e34 = peg$literalExpectation("mat4", false);
+ var peg$e35 = peg$literalExpectation("centroid", false);
+ var peg$e36 = peg$literalExpectation("in", false);
+ var peg$e37 = peg$literalExpectation("out", false);
+ var peg$e38 = peg$literalExpectation("inout", false);
+ var peg$e39 = peg$literalExpectation("uniform", false);
+ var peg$e40 = peg$literalExpectation("patch", false);
+ var peg$e41 = peg$literalExpectation("sample", false);
+ var peg$e42 = peg$literalExpectation("buffer", false);
+ var peg$e43 = peg$literalExpectation("shared", false);
+ var peg$e44 = peg$literalExpectation("coherent", false);
+ var peg$e45 = peg$literalExpectation("volatile", false);
+ var peg$e46 = peg$literalExpectation("restrict", false);
+ var peg$e47 = peg$literalExpectation("readonly", false);
+ var peg$e48 = peg$literalExpectation("writeonly", false);
+ var peg$e49 = peg$literalExpectation("dvec2", false);
+ var peg$e50 = peg$literalExpectation("dvec3", false);
+ var peg$e51 = peg$literalExpectation("dvec4", false);
+ var peg$e52 = peg$literalExpectation("dmat2", false);
+ var peg$e53 = peg$literalExpectation("dmat3", false);
+ var peg$e54 = peg$literalExpectation("dmat4", false);
+ var peg$e55 = peg$literalExpectation("noperspective", false);
+ var peg$e56 = peg$literalExpectation("flat", false);
+ var peg$e57 = peg$literalExpectation("smooth", false);
+ var peg$e58 = peg$literalExpectation("layout", false);
+ var peg$e59 = peg$literalExpectation("mat2x2", false);
+ var peg$e60 = peg$literalExpectation("mat2x3", false);
+ var peg$e61 = peg$literalExpectation("mat2x4", false);
+ var peg$e62 = peg$literalExpectation("mat3x2", false);
+ var peg$e63 = peg$literalExpectation("mat3x3", false);
+ var peg$e64 = peg$literalExpectation("mat3x4", false);
+ var peg$e65 = peg$literalExpectation("mat4x2", false);
+ var peg$e66 = peg$literalExpectation("mat4x3", false);
+ var peg$e67 = peg$literalExpectation("mat4x4", false);
+ var peg$e68 = peg$literalExpectation("dmat2x2", false);
+ var peg$e69 = peg$literalExpectation("dmat2x3", false);
+ var peg$e70 = peg$literalExpectation("dmat2x4", false);
+ var peg$e71 = peg$literalExpectation("dmat3x2", false);
+ var peg$e72 = peg$literalExpectation("dmat3x3", false);
+ var peg$e73 = peg$literalExpectation("dmat3x4", false);
+ var peg$e74 = peg$literalExpectation("dmat4x2", false);
+ var peg$e75 = peg$literalExpectation("dmat4x3", false);
+ var peg$e76 = peg$literalExpectation("dmat4x4", false);
+ var peg$e77 = peg$literalExpectation("atomic_uint", false);
+ var peg$e78 = peg$literalExpectation("sampler1D", false);
+ var peg$e79 = peg$literalExpectation("sampler2D", false);
+ var peg$e80 = peg$literalExpectation("sampler3D", false);
+ var peg$e81 = peg$literalExpectation("samplerCube", false);
+ var peg$e82 = peg$literalExpectation("sampler1DShadow", false);
+ var peg$e83 = peg$literalExpectation("sampler2DShadow", false);
+ var peg$e84 = peg$literalExpectation("samplerCubeShadow", false);
+ var peg$e85 = peg$literalExpectation("sampler1DArray", false);
+ var peg$e86 = peg$literalExpectation("sampler2DArray", false);
+ var peg$e87 = peg$literalExpectation("sampler1DArrayShadow", false);
+ var peg$e88 = peg$literalExpectation("sampler2DArrayshadow", false);
+ var peg$e89 = peg$literalExpectation("isampler1D", false);
+ var peg$e90 = peg$literalExpectation("isampler2D", false);
+ var peg$e91 = peg$literalExpectation("isampler3D", false);
+ var peg$e92 = peg$literalExpectation("isamplerCube", false);
+ var peg$e93 = peg$literalExpectation("isampler1Darray", false);
+ var peg$e94 = peg$literalExpectation("isampler2DArray", false);
+ var peg$e95 = peg$literalExpectation("usampler1D", false);
+ var peg$e96 = peg$literalExpectation("usampler2D", false);
+ var peg$e97 = peg$literalExpectation("usampler3D", false);
+ var peg$e98 = peg$literalExpectation("usamplerCube", false);
+ var peg$e99 = peg$literalExpectation("usampler1DArray", false);
+ var peg$e100 = peg$literalExpectation("usampler2DArray", false);
+ var peg$e101 = peg$literalExpectation("sampler2DRect", false);
+ var peg$e102 = peg$literalExpectation("sampler2DRectshadow", false);
+ var peg$e103 = peg$literalExpectation("isampler2DRect", false);
+ var peg$e104 = peg$literalExpectation("usampler2DRect", false);
+ var peg$e105 = peg$literalExpectation("samplerBuffer", false);
+ var peg$e106 = peg$literalExpectation("isamplerBuffer", false);
+ var peg$e107 = peg$literalExpectation("usamplerBuffer", false);
+ var peg$e108 = peg$literalExpectation("samplerCubeArray", false);
+ var peg$e109 = peg$literalExpectation("samplerCubeArrayShadow", false);
+ var peg$e110 = peg$literalExpectation("isamplerCubeArray", false);
+ var peg$e111 = peg$literalExpectation("usamplerCubeArray", false);
+ var peg$e112 = peg$literalExpectation("sampler2DMS", false);
+ var peg$e113 = peg$literalExpectation("isampler2DMS", false);
+ var peg$e114 = peg$literalExpectation("usampler2DMS", false);
+ var peg$e115 = peg$literalExpectation("sampler2DMSArray", false);
+ var peg$e116 = peg$literalExpectation("isampler2DMSArray", false);
+ var peg$e117 = peg$literalExpectation("usampler2DMSArray", false);
+ var peg$e118 = peg$literalExpectation("image1D", false);
+ var peg$e119 = peg$literalExpectation("iimage1D", false);
+ var peg$e120 = peg$literalExpectation("uimage1D", false);
+ var peg$e121 = peg$literalExpectation("image2D", false);
+ var peg$e122 = peg$literalExpectation("iimage2D", false);
+ var peg$e123 = peg$literalExpectation("uimage2D", false);
+ var peg$e124 = peg$literalExpectation("image3D", false);
+ var peg$e125 = peg$literalExpectation("iimage3D", false);
+ var peg$e126 = peg$literalExpectation("uimage3D", false);
+ var peg$e127 = peg$literalExpectation("image2DRect", false);
+ var peg$e128 = peg$literalExpectation("iimage2DRect", false);
+ var peg$e129 = peg$literalExpectation("uimage2DRect", false);
+ var peg$e130 = peg$literalExpectation("imageCube", false);
+ var peg$e131 = peg$literalExpectation("iimageCube", false);
+ var peg$e132 = peg$literalExpectation("uimageCube", false);
+ var peg$e133 = peg$literalExpectation("imageBuffer", false);
+ var peg$e134 = peg$literalExpectation("iimageBuffer", false);
+ var peg$e135 = peg$literalExpectation("uimageBuffer", false);
+ var peg$e136 = peg$literalExpectation("image1DArray", false);
+ var peg$e137 = peg$literalExpectation("iimage1DArray", false);
+ var peg$e138 = peg$literalExpectation("uimage1DArray", false);
+ var peg$e139 = peg$literalExpectation("image2DArray", false);
+ var peg$e140 = peg$literalExpectation("iimage2DArray", false);
+ var peg$e141 = peg$literalExpectation("uimage2DArray", false);
+ var peg$e142 = peg$literalExpectation("imageCubeArray", false);
+ var peg$e143 = peg$literalExpectation("iimageCubeArray", false);
+ var peg$e144 = peg$literalExpectation("uimageCubeArray", false);
+ var peg$e145 = peg$literalExpectation("image2DMS", false);
+ var peg$e146 = peg$literalExpectation("iimage2DMS", false);
+ var peg$e147 = peg$literalExpectation("uimage2DMS", false);
+ var peg$e148 = peg$literalExpectation("image2DMArray", false);
+ var peg$e149 = peg$literalExpectation("iimage2DMSArray", false);
+ var peg$e150 = peg$literalExpectation("uimage2DMSArray", false);
+ var peg$e151 = peg$literalExpectation("struct", false);
+ var peg$e152 = peg$literalExpectation("void", false);
+ var peg$e153 = peg$literalExpectation("while", false);
+ var peg$e154 = peg$literalExpectation("invariant", false);
+ var peg$e155 = peg$literalExpectation("precise", false);
+ var peg$e156 = peg$literalExpectation("highp", false);
+ var peg$e157 = peg$literalExpectation("mediump", false);
+ var peg$e158 = peg$literalExpectation("lowp", false);
+ var peg$e159 = peg$literalExpectation("precision", false);
+ var peg$e160 = peg$literalExpectation("true", false);
+ var peg$e161 = peg$literalExpectation("false", false);
+ var peg$e162 = peg$otherExpectation("keyword");
+ var peg$e163 = peg$literalExpectation("<<", false);
+ var peg$e164 = peg$literalExpectation(">>", false);
+ var peg$e165 = peg$literalExpectation("++", false);
+ var peg$e166 = peg$literalExpectation("--", false);
+ var peg$e167 = peg$literalExpectation("<=", false);
+ var peg$e168 = peg$literalExpectation(">=", false);
+ var peg$e169 = peg$literalExpectation("==", false);
+ var peg$e170 = peg$literalExpectation("!=", false);
+ var peg$e171 = peg$literalExpectation("&&", false);
+ var peg$e172 = peg$literalExpectation("||", false);
+ var peg$e173 = peg$literalExpectation("^^", false);
+ var peg$e174 = peg$literalExpectation("*=", false);
+ var peg$e175 = peg$literalExpectation("/=", false);
+ var peg$e176 = peg$literalExpectation("+=", false);
+ var peg$e177 = peg$literalExpectation("%=", false);
+ var peg$e178 = peg$literalExpectation("<<=", false);
+ var peg$e179 = peg$literalExpectation(">>=", false);
+ var peg$e180 = peg$literalExpectation("&=", false);
+ var peg$e181 = peg$literalExpectation("^=", false);
+ var peg$e182 = peg$literalExpectation("|=", false);
+ var peg$e183 = peg$literalExpectation("-=", false);
+ var peg$e184 = peg$literalExpectation("(", false);
+ var peg$e185 = peg$literalExpectation(")", false);
+ var peg$e186 = peg$literalExpectation("[", false);
+ var peg$e187 = peg$literalExpectation("]", false);
+ var peg$e188 = peg$literalExpectation("{", false);
+ var peg$e189 = peg$literalExpectation("}", false);
+ var peg$e190 = peg$literalExpectation(".", false);
+ var peg$e191 = peg$literalExpectation(",", false);
+ var peg$e192 = peg$literalExpectation(":", false);
+ var peg$e193 = peg$literalExpectation("=", false);
+ var peg$e194 = peg$literalExpectation(";", false);
+ var peg$e195 = peg$literalExpectation("!", false);
+ var peg$e196 = peg$literalExpectation("-", false);
+ var peg$e197 = peg$literalExpectation("~", false);
+ var peg$e198 = peg$literalExpectation("+", false);
+ var peg$e199 = peg$literalExpectation("*", false);
+ var peg$e200 = peg$literalExpectation("/", false);
+ var peg$e201 = peg$literalExpectation("%", false);
+ var peg$e202 = peg$literalExpectation("<", false);
+ var peg$e203 = peg$literalExpectation(">", false);
+ var peg$e204 = peg$literalExpectation("|", false);
+ var peg$e205 = peg$literalExpectation("^", false);
+ var peg$e206 = peg$literalExpectation("&", false);
+ var peg$e207 = peg$literalExpectation("?", false);
+ var peg$e208 = peg$classExpectation([["A", "Z"], ["a", "z"], "_"], false, false);
+ var peg$e209 = peg$classExpectation([["A", "Z"], ["a", "z"], "_", ["0", "9"]], false, false);
+ var peg$e210 = peg$classExpectation(["u", "U"], false, false);
+ var peg$e211 = peg$classExpectation([["1", "9"]], false, false);
+ var peg$e212 = peg$literalExpectation("0", false);
+ var peg$e213 = peg$classExpectation([["0", "7"]], false, false);
+ var peg$e214 = peg$classExpectation(["x", "X"], false, false);
+ var peg$e215 = peg$classExpectation([["0", "9"], ["a", "f"], ["A", "F"]], false, false);
+ var peg$e216 = peg$classExpectation([["0", "9"]], false, false);
+ var peg$e217 = peg$otherExpectation("exponent");
+ var peg$e218 = peg$classExpectation(["e", "E"], false, false);
+ var peg$e219 = peg$classExpectation(["+", "-"], false, false);
+ var peg$e220 = peg$classExpectation(["f", "F"], false, false);
+ var peg$e221 = peg$literalExpectation("lf", false);
+ var peg$e222 = peg$literalExpectation("LF", false);
+ var peg$e223 = peg$otherExpectation("primary expression");
+ var peg$e224 = peg$otherExpectation("unary expression");
+ var peg$e225 = peg$otherExpectation("equality expression");
+ var peg$e226 = peg$otherExpectation("and expression");
+ var peg$e227 = peg$otherExpectation("asignment");
+ var peg$e228 = peg$otherExpectation("expression");
+ var peg$e229 = peg$otherExpectation("precision statement");
+ var peg$e230 = peg$otherExpectation("function prototype");
+ var peg$e231 = peg$otherExpectation("function header");
+ var peg$e232 = peg$otherExpectation("function parameters");
+ var peg$e233 = peg$otherExpectation("parameter declaration");
+ var peg$e234 = peg$otherExpectation("parameter declarator");
+ var peg$e235 = peg$otherExpectation("single type qualifier");
+ var peg$e236 = peg$otherExpectation("interpolation qualifier");
+ var peg$e237 = peg$otherExpectation("storage qualifier");
+ var peg$e238 = peg$otherExpectation("type specifier");
+ var peg$e239 = peg$otherExpectation("array specifier");
+ var peg$e240 = peg$otherExpectation("precision qualifier");
+ var peg$e241 = peg$otherExpectation("struct specifier");
+ var peg$e242 = peg$otherExpectation("iteration statement");
+ var peg$e243 = peg$otherExpectation("jump statement");
+ var peg$e244 = peg$otherExpectation("prepocessor");
+ var peg$e245 = peg$literalExpectation("#", false);
+ var peg$e246 = peg$classExpectation(["\n"], true, false);
+ var peg$e247 = peg$otherExpectation("whitespace");
+ var peg$e248 = peg$literalExpectation("//", false);
+ var peg$e249 = peg$literalExpectation("/*", false);
+ var peg$e250 = peg$literalExpectation("*/", false);
+ var peg$e251 = peg$anyExpectation();
+ var peg$e252 = peg$classExpectation([" ", "\t", "\n", "\r"], false, false);
+
+ var peg$f0 = function(ws, program) {
+ return { type: 'program', ws, program, scopes };
+ };
+ var peg$f1 = function(token, t) { return node('keyword', { token, whitespace: t }); };
+ var peg$f2 = function(token, _) { return node('float_constant', { token, whitespace: _ }); };
+ var peg$f3 = function(token, _) { return node('double_constant', { token, whitespace: _ }); };
+ var peg$f4 = function(token, _) { return node('int_constant', { token, whitespace: _ }); };
+ var peg$f5 = function(token, _) { return node('uint_constant', { token, whitespace: _ }); };
+ var peg$f6 = function(token, _) { return node('bool_constant', { token, whitespace:_ }); };
+ var peg$f7 = function(token, _) { return node('literal', { literal: token, whitespace: _ }); };
+ var peg$f8 = function(identifier, _) { return node('identifier', { identifier, whitespace: _ }); };
+ var peg$f9 = function(ident) {
+ const { identifier } = ident;
+
+ // We do scope checking and parsing all in one pass. In the case of calling an
+ // undefined function, here, we don't know that we're in a function, so we
+ // can't warn appropriately. If we return false for the missing typename, the
+ // program won't parse, since the function call node won't match since it uses
+ // type_name for the function_identifier. So all we can do here is go on our
+ // merry way if the type isn't known.
+
+ // This only applies to structs. I'm not sure if it's right. Because TYPE_NAME
+ // is used in lots of places, it's easier to put this check here.
+ let found;
+ if(found = findTypeScope(scope, identifier)) {
+ addTypeReference(found, identifier, ident);
+ // I removed this because a type name reference here can't be renamed because
+ // it's just a string and we don't know the parent node. This might apply
+ // to the type reference above as well
+ // } else if(found = findFunctionScope(scope, identifier)) {
+ // addFunctionReference(found, identifier, identifier);
+ }
+
+ return ident;
+ };
+ var peg$f10 = function(lp, expression, rp) {
+ return node('group', { lp, expression, rp });
+ };
+ var peg$f11 = function(ident) {
+ const { identifier } = ident;
+ addBindingReference(scope, identifier, ident);
+ return ident;
+ };
+ var peg$f12 = function(body) {
+ // Postfix becomes a left associative tree
+ return body.flat().reduceRight((postfix, expr) =>
+ postfix ?
+ node('postfix', { expr, postfix }) :
+ expr
+ );
+ };
+ var peg$f13 = function(lb, expr, rb) {
+ return node('quantifier', { lb, expr, rb });
+ };
+ var peg$f14 = function(dot, selection) {
+ return node('field_selection', { dot, selection });
+ };
+ var peg$f15 = function(identifier, args, rp) {
+ // Warning: This may be brittle. The langauge spec says that a
+ // function_call name is a "type_specifier" which can be "float[3](...)"
+ // or a TYPE_NAME. If it's a TYPE_NAME, it will have an identifier, so
+ // add it to the referenced scope. If it's a constructor (the "float"
+ // case) it won't, so don't add a reference ot it
+ const fnName = (identifier.identifier.type === 'postfix') ?
+ identifier.identifier.expr.identifier.specifier.identifier :
+ identifier.identifier.specifier.identifier;
+
+ const n = node('function_call', { ...identifier, args, rp });
+
+ // struct constructors are stored in scope types, not scope functions,
+ // skip them (the isDeclaredType check)
+ if(fnName && !isDeclaredType(scope, fnName) && !builtIns.has(fnName)) {
+ if(!isDeclaredFunction(scope, fnName)) {
+ warn(`Warning: Function "${fnName}" has not been declared`);
+ }
+ addFunctionReference(scope, fnName, n);
+ }
+
+ return n;
+ };
+ var peg$f16 = function(v) {
+ return [v];
+ };
+ var peg$f17 = function(head, tail) {
+ // For convenience, we don't store commas as trees, but rather flatten
+ // into an array
+ return [head, ...tail.flat()];
+ };
+ var peg$f18 = function(head, suffix, lp) {
+ return { head: [head, suffix], lp };
+ };
+ var peg$f19 = function(identifier) {
+ return {
+ lp: identifier.lp,
+ identifier: [identifier.head].flat().reduceRight((postfix, expr) =>
+ postfix ?
+ node('postfix', { expr, postfix }) :
+ expr
+ )
+ };
+ };
+ var peg$f20 = function(identifier, lp, args, rp) {
+ return node('function_call', { identifier, lp, args, rp });
+ };
+ var peg$f21 = function(operator, expression) {
+ return node('unary', { operator, expression });
+ };
+ var peg$f22 = function(head, tail) {
+ return leftAssociate(head, tail);
+ };
+ var peg$f23 = function(expr, question, left, colon, right) {
+ return { question, left, right, colon };
+ };
+ var peg$f24 = function(expr, suffix) {
+ // ? and : operators are right associative, which happens automatically
+ // in pegjs grammar
+ return suffix ?
+ node('ternary', { expr, ...suffix }) :
+ expr
+ };
+ var peg$f25 = function(left, operator, right) {
+ return node('assignment', { left, operator, right });
+ };
+ var peg$f26 = function(declaration) {
+ return node(
+ 'declaration_statement',
+ {
+ declaration: declaration[0],
+ semi: declaration[1],
+ }
+ );
+ };
+ var peg$f27 = function(qualifiers, head, tail) {
+ return node(
+ 'qualifier_declarator',
+ {
+ qualifiers,
+ // Head is optional, so remove falsey
+ declarations: xnil([head, ...tail.map(t => t[1])]),
+ commas: tail.map(t => t[0])
+ }
+ );
+ };
+ var peg$f28 = function(qualifiers, interface_type, lp, declarations, rp, identifier) {
+ const n = node(
+ 'interface_declarator',
+ { qualifiers, interface_type, lp, declarations, rp, identifier }
+ );
+ createBindings(scope, [interface_type.identifier, n]);
+ return n;
+ };
+ var peg$f29 = function(prefix, qualifier, specifier) {
+ return node('precision', { prefix, qualifier, specifier });
+ };
+ var peg$f30 = function(header, params, rp) {
+ const bindings = (params?.parameters || [])
+ // Ignore any param without an identifier, aka main(void)
+ .filter(p => !!p.declaration.identifier)
+ .map(p => [p.declaration.identifier.identifier, p]);
+ createBindings(scope, ...bindings);
+ return node('function_prototype', { header, ...params, rp });
+ };
+ var peg$f31 = function(returnType, name, lp) {
+ const n = node(
+ 'function_header',
+ { returnType, name, lp }
+ );
+ addFunctionReference(scope, name.identifier, n);
+ scope = pushScope(makeScope(name.identifier, scope));
+ return n;
+ };
+ var peg$f32 = function(head, tail) {
+ return {
+ parameters: [head, ...tail.map(t => t[1])],
+ commas: tail.map(t => t[0])
+ }
+ };
+ var peg$f33 = function(qualifier, declaration) {
+ return node(
+ 'parameter_declaration',
+ { qualifier, declaration }
+ );
+ };
+ var peg$f34 = function(specifier, identifier, quantifier) {
+ return node(
+ 'parameter_declarator',
+ { specifier, identifier, quantifier }
+ );
+ };
+ var peg$f35 = function(head, tail) {
+ const declarations = [
+ head.declaration, ...tail.map(t => t[1])
+ ].filter(decl => !!decl.identifier);
+
+ createBindings(scope, ...declarations.map(decl => [decl.identifier.identifier, decl]));
+
+ // TODO: I might need to start storing node parents for easy traversal
+ return node(
+ 'declarator_list',
+ {
+ specified_type: head.specified_type,
+ declarations,
+ commas: tail.map(t => t[0])
+ }
+ );
+ };
+ var peg$f36 = function(identifier, quantifier, suffix) {
+ const [operator, initializer] = suffix || [];
+ return node(
+ 'declaration',
+ { identifier, quantifier, operator, initializer }
+ );
+ };
+ var peg$f37 = function(specified_type, suffix) {
+ // No gaurantee of a suffix because fully_specified_type contains a
+ // type_specifier which includes structs and type_names (IDENTIFIERs)
+ const [identifier, quantifier, suffix_tail] = suffix || [];
+ const [operator, initializer] = suffix_tail || [];
+
+ // Break out the specified type so it can be grouped into the
+ // declarator_list
+ return {
+ declaration: node(
+ 'declaration',
+ { identifier, quantifier, operator, initializer }
+ ),
+ specified_type
+ };
+ };
+ var peg$f38 = function(qualifiers, specifier) {
+ return node(
+ 'fully_specified_type',
+ { qualifiers, specifier }
+ );
+ };
+ var peg$f39 = function(layout, lp, head, tail) {
+ return {
+ qualifiers: [head, ...tail.map(t => t[1])],
+ commas: tail.map(t => t[0])
+ };
+ };
+ var peg$f40 = function(layout, lp, qualifiers, rp) {
+ return node(
+ 'layout_qualifier',
+ { layout, lp, ...qualifiers, rp }
+ );
+ };
+ var peg$f41 = function(identifier, tail) {
+ const [operator, expression] = tail || [];
+ return node('layout_qualifier_id', { identifier, operator, expression });
+ };
+ var peg$f42 = function(subroutine, lp, head, tail, rp) {
+ return {
+ lp,
+ type_names: [head, ...tail.map(t => t[1])],
+ commas: tail.map(t => t[0]),
+ rp,
+ };
+ };
+ var peg$f43 = function(subroutine, type_names) {
+ return node(
+ 'subroutine_qualifier',
+ {
+ subroutine,
+ ...type_names,
+ }
+ );
+ };
+ var peg$f44 = function(specifier, quantifier) {
+ return node('type_specifier', { specifier, quantifier });
+ };
+ var peg$f45 = function(lb, expression, rb) {
+ return node('array_specifier', { lb, expression, rb });
+ };
+ var peg$f46 = function(specifiers) {
+ return node('array_specifiers', { specifiers });
+ };
+ var peg$f47 = function(struct, typeName, lb, declarations, rb) {
+ const n = node('struct', { lb, declarations, rb, struct, typeName });
+ // Anonymous structs don't get a type name
+ if(typeName) {
+ addTypes(scope, [typeName.identifier, n]);
+
+ // Struct names also become constructors for functions. Needing to track
+ // this as both a type and a function makes me think my scope data model
+ // is probably wrong
+ // addFunctionReference(scope, typeName.identifier, n);
+ }
+ return n;
+ };
+ var peg$f48 = function(declaration, semi) {
+ return node('struct_declaration', { declaration, semi });
+ };
+ var peg$f49 = function(specified_type, head, tail) {
+ return node(
+ 'struct_declarator',
+ {
+ specified_type,
+ declarations: [head, ...tail.map(t => t[1])],
+ commas: tail.map(t => t[0])
+ }
+ );
+ };
+ var peg$f50 = function(identifier, quantifier) {
+ return node('quantified_identifier', { identifier, quantifier });
+ };
+ var peg$f51 = function(lb, head, tail, trailing, rb) {
+ // TODO: Scope
+ return node(
+ 'initializer_list',
+ {
+ lb,
+ initializers: [head, ...tail.map(t => t[1])],
+ commas: xnil(tail.map(t => t[0]), trailing),
+ rb
+ }
+ );
+ };
+ var peg$f52 = function(sym) {
+ // Apparently peggy can't handle an open curly brace in a string
+ scope = pushScope(makeScope(OPEN_CURLY, scope));
+ return sym;
+ };
+ var peg$f53 = function(lb, statements, rb) {
+ scope = popScope(scope);
+ return node(
+ 'compound_statement',
+ { lb, statements: (statements || []).flat(), rb }
+ );
+ };
+ var peg$f54 = function(lb, statements, rb) {
+ return node(
+ 'compound_statement',
+ { lb, statements: (statements || []).flat(), rb }
+ );
+ };
+ var peg$f55 = function(expression, semi) {
+ return node('expression_statement', { expression, semi });
+ };
+ var peg$f56 = function(ifSymbol, lp, condition, rp, tail) {
+ const [body, elseBranch] = tail;
+ return node(
+ 'if_statement',
+ {
+ 'if': ifSymbol,
+ body,
+ lp,
+ condition,
+ rp,
+ ...elseBranch && { 'else': elseBranch.flat() },
+ });
+ };
+ var peg$f57 = function(switchSymbol, lp, expression, rp, lb, statements, rb) {
+ // TODO: Scope?
+ return node(
+ 'switch_statement',
+ {
+ switch: switchSymbol,
+ lp,
+ expression,
+ rp,
+ lb,
+ cases: groupCases(statements),
+ rb
+ }
+ );
+ };
+ var peg$f58 = function(caseSymbol, test, colon) {
+ return node('case_label', { 'case': caseSymbol, test, colon });
+ };
+ var peg$f59 = function(defaultSymbol, colon) {
+ return node('default_label', { default: defaultSymbol, colon });
+ };
+ var peg$f60 = function(sym) {
+ scope = pushScope(makeScope('while', scope));
+ return sym;
+ };
+ var peg$f61 = function(whileSymbol, lp, condition, rp, body) {
+ scope = popScope(scope);
+ return node(
+ 'while_statement',
+ {
+ while: whileSymbol,
+ lp,
+ condition,
+ rp,
+ body
+ }
+ );
+ };
+ var peg$f62 = function(doSymbol, body, whileSymbol, lp, expression, rp, semi) {
+ return node(
+ 'do_statement',
+ {
+ do: doSymbol,
+ body,
+ while: whileSymbol,
+ lp,
+ expression,
+ rp,
+ semi
+ }
+ );
+ };
+ var peg$f63 = function(sym) {
+ scope = pushScope(makeScope('for', scope));
+ return sym;
+ };
+ var peg$f64 = function(forSymbol, lp, init, condition, conditionSemi, operation, rp, body) {
+ scope = popScope(scope);
+ return node(
+ 'for_statement',
+ {
+ 'for': forSymbol,
+ body,
+ lp,
+ init: init.expression || init.declaration,
+ initSemi: init.semi,
+ condition,
+ conditionSemi,
+ operation,
+ rp,
+ body
+ }
+ );
+ };
+ var peg$f65 = function(specified_type, identifier, op, initializer) {
+ const n = node(
+ 'condition_expression',
+ { specified_type, identifier, op, initializer }
+ );
+ createBindings(scope, [identifier.identifier, n]);
+ return n;
+ };
+ var peg$f66 = function(jump, semi) {
+ return node('continue_statement', { continue: jump, semi });
+ };
+ var peg$f67 = function(jump, semi) {
+ return node('break_statement', { break: jump, semi });
+ };
+ var peg$f68 = function(jump, expression, semi) {
+ return node('return_statement', { return: jump, expression, semi });
+ };
+ var peg$f69 = function(jump, semi) { // Fragment shader only.
+ return node('discard_statement', { discard: jump, semi });
+ };
+ var peg$f70 = function(line, _) { return node('preprocessor', { line, _ }); };
+ var peg$f71 = function(prototype, body) {
+ const n = node('function', { prototype, body });
+ scope = popScope(scope);
+ // addFunctionReference(scope, prototype.header.name.identifier, n);
+ return n;
+ };
+ var peg$f72 = function(w, rest) {
+ return collapse(w, rest);
+ };
+ var peg$f73 = function(a, x, cc) { return xnil(x, cc); };
+ var peg$f74 = function(a, d) { return xnil(a, d.flat()); };
+ var peg$f75 = function(i) { return i; };
+ var peg$f76 = function(_) { return _; };
+
+ var peg$currPos = 0;
+ var peg$savedPos = 0;
+ var peg$posDetailsCache = [{ line: 1, column: 1 }];
+ var peg$maxFailPos = 0;
+ var peg$maxFailExpected = [];
+ var peg$silentFails = 0;
+
+ var peg$resultsCache = {};
+
+ var peg$result;
+
+ if ("startRule" in options) {
+ if (!(options.startRule in peg$startRuleFunctions)) {
+ throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
+ }
+
+ peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
+ }
+
+ function text() {
+ return input.substring(peg$savedPos, peg$currPos);
+ }
+
+ function offset() {
+ return peg$savedPos;
+ }
+
+ function range() {
+ return {
+ source: peg$source,
+ start: peg$savedPos,
+ end: peg$currPos
+ };
+ }
+
+ function location() {
+ return peg$computeLocation(peg$savedPos, peg$currPos);
+ }
+
+ function expected(description, location) {
+ location = location !== undefined
+ ? location
+ : peg$computeLocation(peg$savedPos, peg$currPos);
+
+ throw peg$buildStructuredError(
+ [peg$otherExpectation(description)],
+ input.substring(peg$savedPos, peg$currPos),
+ location
+ );
+ }
+
+ function error(message, location) {
+ location = location !== undefined
+ ? location
+ : peg$computeLocation(peg$savedPos, peg$currPos);
+
+ throw peg$buildSimpleError(message, location);
+ }
+
+ function peg$literalExpectation(text, ignoreCase) {
+ return { type: "literal", text: text, ignoreCase: ignoreCase };
+ }
+
+ function peg$classExpectation(parts, inverted, ignoreCase) {
+ return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
+ }
+
+ function peg$anyExpectation() {
+ return { type: "any" };
+ }
+
+ function peg$endExpectation() {
+ return { type: "end" };
+ }
+
+ function peg$otherExpectation(description) {
+ return { type: "other", description: description };
+ }
+
+ function peg$computePosDetails(pos) {
+ var details = peg$posDetailsCache[pos];
+ var p;
+
+ if (details) {
+ return details;
+ } else {
+ p = pos - 1;
+ while (!peg$posDetailsCache[p]) {
+ p--;
+ }
+
+ details = peg$posDetailsCache[p];
+ details = {
+ line: details.line,
+ column: details.column
+ };
+
+ while (p < pos) {
+ if (input.charCodeAt(p) === 10) {
+ details.line++;
+ details.column = 1;
+ } else {
+ details.column++;
+ }
+
+ p++;
+ }
+
+ peg$posDetailsCache[pos] = details;
+
+ return details;
+ }
+ }
+
+ function peg$computeLocation(startPos, endPos) {
+ var startPosDetails = peg$computePosDetails(startPos);
+ var endPosDetails = peg$computePosDetails(endPos);
+
+ return {
+ source: peg$source,
+ start: {
+ offset: startPos,
+ line: startPosDetails.line,
+ column: startPosDetails.column
+ },
+ end: {
+ offset: endPos,
+ line: endPosDetails.line,
+ column: endPosDetails.column
+ }
+ };
+ }
+
+ function peg$fail(expected) {
+ if (peg$currPos < peg$maxFailPos) { return; }
+
+ if (peg$currPos > peg$maxFailPos) {
+ peg$maxFailPos = peg$currPos;
+ peg$maxFailExpected = [];
+ }
+
+ peg$maxFailExpected.push(expected);
+ }
+
+ function peg$buildSimpleError(message, location) {
+ return new peg$SyntaxError(message, null, null, location);
+ }
+
+ function peg$buildStructuredError(expected, found, location) {
+ return new peg$SyntaxError(
+ peg$SyntaxError.buildMessage(expected, found),
+ expected,
+ found,
+ location
+ );
+ }
+
+ function peg$parsestart() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 0;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parse_();
+ s2 = peg$parsetranslation_unit();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f0(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseATTRIBUTE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 1;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c0) {
+ s1 = peg$c0;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e0); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVARYING() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 2;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c1) {
+ s1 = peg$c1;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e1); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCONST() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 3;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c2) {
+ s1 = peg$c2;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e2); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBOOL() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 4;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c3) {
+ s1 = peg$c3;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e3); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseFLOAT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 5;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c4) {
+ s1 = peg$c4;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e4); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDOUBLE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 6;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c5) {
+ s1 = peg$c5;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e5); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 7;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c6) {
+ s1 = peg$c6;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e6); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUINT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 8;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c7) {
+ s1 = peg$c7;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e7); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBREAK() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 9;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c8) {
+ s1 = peg$c8;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e8); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCONTINUE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 10;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c9) {
+ s1 = peg$c9;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e9); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDO() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 11;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c10) {
+ s1 = peg$c10;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e10); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseELSE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 12;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c11) {
+ s1 = peg$c11;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e11); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseFOR() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 13;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c12) {
+ s1 = peg$c12;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e12); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIF() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 14;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c13) {
+ s1 = peg$c13;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e13); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDISCARD() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 15;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c14) {
+ s1 = peg$c14;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e14); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRETURN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 16;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c15) {
+ s1 = peg$c15;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e15); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSWITCH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 17;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c16) {
+ s1 = peg$c16;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e16); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCASE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 18;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c17) {
+ s1 = peg$c17;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e17); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDEFAULT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 19;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c18) {
+ s1 = peg$c18;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e18); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSUBROUTINE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 20;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c19) {
+ s1 = peg$c19;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e19); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 21;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c20) {
+ s1 = peg$c20;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e20); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 22;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c21) {
+ s1 = peg$c21;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e21); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 23;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c22) {
+ s1 = peg$c22;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e22); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 24;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c23) {
+ s1 = peg$c23;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e23); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 25;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c24) {
+ s1 = peg$c24;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e24); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 26;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c25) {
+ s1 = peg$c25;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e25); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 27;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c26) {
+ s1 = peg$c26;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e26); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 28;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c27) {
+ s1 = peg$c27;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e27); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 29;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c28) {
+ s1 = peg$c28;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e28); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 30;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c29) {
+ s1 = peg$c29;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e29); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 31;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c30) {
+ s1 = peg$c30;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e30); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 32;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c31) {
+ s1 = peg$c31;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e31); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 33;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c32) {
+ s1 = peg$c32;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e32); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 34;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c33) {
+ s1 = peg$c33;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e33); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 35;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c34) {
+ s1 = peg$c34;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e34); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCENTROID() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 36;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c35) {
+ s1 = peg$c35;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e35); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 37;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c36) {
+ s1 = peg$c36;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e36); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseOUT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 38;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c37) {
+ s1 = peg$c37;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e37); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINOUT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 39;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c38) {
+ s1 = peg$c38;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e38); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUNIFORM() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 40;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c39) {
+ s1 = peg$c39;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e39); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePATCH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 41;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c40) {
+ s1 = peg$c40;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e40); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 42;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c41) {
+ s1 = peg$c41;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e41); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 43;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c42) {
+ s1 = peg$c42;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e42); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSHARED() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 44;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c43) {
+ s1 = peg$c43;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e43); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCOHERENT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 45;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c44) {
+ s1 = peg$c44;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e44); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVOLATILE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 46;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c45) {
+ s1 = peg$c45;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e45); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRESTRICT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 47;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c46) {
+ s1 = peg$c46;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e46); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseREADONLY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 48;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c47) {
+ s1 = peg$c47;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e47); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseWRITEONLY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 49;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c48) {
+ s1 = peg$c48;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e48); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 50;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c49) {
+ s1 = peg$c49;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e49); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 51;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c50) {
+ s1 = peg$c50;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e50); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 52;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c51) {
+ s1 = peg$c51;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e51); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 53;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c52) {
+ s1 = peg$c52;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e52); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 54;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c53) {
+ s1 = peg$c53;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e53); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 55;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c54) {
+ s1 = peg$c54;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e54); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseNOPERSPECTIVE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 56;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c55) {
+ s1 = peg$c55;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e55); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseFLAT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 57;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c56) {
+ s1 = peg$c56;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e56); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSMOOTH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 58;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c57) {
+ s1 = peg$c57;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e57); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLAYOUT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 59;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c58) {
+ s1 = peg$c58;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e58); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT2X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 60;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c59) {
+ s1 = peg$c59;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e59); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT2X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 61;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c60) {
+ s1 = peg$c60;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e60); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT2X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 62;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c61) {
+ s1 = peg$c61;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e61); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT3X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 63;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c62) {
+ s1 = peg$c62;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e62); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT3X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 64;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c63) {
+ s1 = peg$c63;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e63); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT3X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 65;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c64) {
+ s1 = peg$c64;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e64); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT4X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 66;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c65) {
+ s1 = peg$c65;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e65); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT4X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 67;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c66) {
+ s1 = peg$c66;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e66); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT4X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 68;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c67) {
+ s1 = peg$c67;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e67); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT2X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 69;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c68) {
+ s1 = peg$c68;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e68); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT2X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 70;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c69) {
+ s1 = peg$c69;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e69); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT2X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 71;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c70) {
+ s1 = peg$c70;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e70); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT3X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 72;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c71) {
+ s1 = peg$c71;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e71); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT3X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 73;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c72) {
+ s1 = peg$c72;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e72); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT3X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 74;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c73) {
+ s1 = peg$c73;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e73); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT4X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 75;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c74) {
+ s1 = peg$c74;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e74); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT4X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 76;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c75) {
+ s1 = peg$c75;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e75); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT4X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 77;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c76) {
+ s1 = peg$c76;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e76); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseATOMIC_UINT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 78;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c77) {
+ s1 = peg$c77;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e77); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 79;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c78) {
+ s1 = peg$c78;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e78); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 80;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c79) {
+ s1 = peg$c79;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e79); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 81;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c80) {
+ s1 = peg$c80;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e80); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERCUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 82;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c81) {
+ s1 = peg$c81;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e81); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER1DSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 83;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c82) {
+ s1 = peg$c82;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e82); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 84;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c83) {
+ s1 = peg$c83;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e83); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERCUBESHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 85;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c84) {
+ s1 = peg$c84;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e84); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 86;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c85) {
+ s1 = peg$c85;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e85); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 87;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c86) {
+ s1 = peg$c86;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e86); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER1DARRAYSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 88;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 20) === peg$c87) {
+ s1 = peg$c87;
+ peg$currPos += 20;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e87); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DARRAYSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 89;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 20) === peg$c88) {
+ s1 = peg$c88;
+ peg$currPos += 20;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e88); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 90;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c89) {
+ s1 = peg$c89;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e89); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 91;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c90) {
+ s1 = peg$c90;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e90); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 92;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c91) {
+ s1 = peg$c91;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e91); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLERCUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 93;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c92) {
+ s1 = peg$c92;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e92); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 94;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c93) {
+ s1 = peg$c93;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e93); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 95;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c94) {
+ s1 = peg$c94;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e94); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 96;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c95) {
+ s1 = peg$c95;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e95); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 97;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c96) {
+ s1 = peg$c96;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e96); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 98;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c97) {
+ s1 = peg$c97;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e97); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLERCUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 99;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c98) {
+ s1 = peg$c98;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e98); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 100;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c99) {
+ s1 = peg$c99;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e99); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 101;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c100) {
+ s1 = peg$c100;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e100); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 102;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c101) {
+ s1 = peg$c101;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e101); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DRECTSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 103;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 19) === peg$c102) {
+ s1 = peg$c102;
+ peg$currPos += 19;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e102); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 104;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c103) {
+ s1 = peg$c103;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e103); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 105;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c104) {
+ s1 = peg$c104;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e104); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 106;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c105) {
+ s1 = peg$c105;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e105); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLERBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 107;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c106) {
+ s1 = peg$c106;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e106); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLERBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 108;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c107) {
+ s1 = peg$c107;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e107); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERCUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 109;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 16) === peg$c108) {
+ s1 = peg$c108;
+ peg$currPos += 16;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e108); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERCUBEARRAYSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 110;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 22) === peg$c109) {
+ s1 = peg$c109;
+ peg$currPos += 22;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e109); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLERCUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 111;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c110) {
+ s1 = peg$c110;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e110); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLERCUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 112;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c111) {
+ s1 = peg$c111;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e111); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 113;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c112) {
+ s1 = peg$c112;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e112); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 114;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c113) {
+ s1 = peg$c113;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e113); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 115;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c114) {
+ s1 = peg$c114;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e114); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 116;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 16) === peg$c115) {
+ s1 = peg$c115;
+ peg$currPos += 16;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e115); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 117;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c116) {
+ s1 = peg$c116;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e116); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 118;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c117) {
+ s1 = peg$c117;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e117); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 119;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c118) {
+ s1 = peg$c118;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e118); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 120;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c119) {
+ s1 = peg$c119;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e119); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 121;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c120) {
+ s1 = peg$c120;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e120); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 122;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c121) {
+ s1 = peg$c121;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e121); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 123;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c122) {
+ s1 = peg$c122;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e122); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 124;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c123) {
+ s1 = peg$c123;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e123); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 125;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c124) {
+ s1 = peg$c124;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e124); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 126;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c125) {
+ s1 = peg$c125;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e125); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 127;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c126) {
+ s1 = peg$c126;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e126); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 128;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c127) {
+ s1 = peg$c127;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e127); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 129;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c128) {
+ s1 = peg$c128;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e128); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 130;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c129) {
+ s1 = peg$c129;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e129); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGECUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 131;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c130) {
+ s1 = peg$c130;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e130); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGECUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 132;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c131) {
+ s1 = peg$c131;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e131); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGECUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 133;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c132) {
+ s1 = peg$c132;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e132); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGEBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 134;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c133) {
+ s1 = peg$c133;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e133); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGEBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 135;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c134) {
+ s1 = peg$c134;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e134); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGEBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 136;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c135) {
+ s1 = peg$c135;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e135); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 137;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c136) {
+ s1 = peg$c136;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e136); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 138;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c137) {
+ s1 = peg$c137;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e137); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 139;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c138) {
+ s1 = peg$c138;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e138); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 140;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c139) {
+ s1 = peg$c139;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e139); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 141;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c140) {
+ s1 = peg$c140;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e140); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 142;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c141) {
+ s1 = peg$c141;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e141); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGECUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 143;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c142) {
+ s1 = peg$c142;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e142); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGECUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 144;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c143) {
+ s1 = peg$c143;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e143); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGECUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 145;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c144) {
+ s1 = peg$c144;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e144); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 146;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c145) {
+ s1 = peg$c145;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e145); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 147;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c146) {
+ s1 = peg$c146;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e146); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 148;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c147) {
+ s1 = peg$c147;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e147); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 149;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c148) {
+ s1 = peg$c148;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e148); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 150;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c149) {
+ s1 = peg$c149;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e149); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 151;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c150) {
+ s1 = peg$c150;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e150); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSTRUCT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 152;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c151) {
+ s1 = peg$c151;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e151); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVOID() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 153;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c152) {
+ s1 = peg$c152;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e152); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseWHILE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 154;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c153) {
+ s1 = peg$c153;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e153); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINVARIANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 155;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c154) {
+ s1 = peg$c154;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e154); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePRECISE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 156;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c155) {
+ s1 = peg$c155;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e155); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseHIGH_PRECISION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 157;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c156) {
+ s1 = peg$c156;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e156); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMEDIUM_PRECISION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 158;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c157) {
+ s1 = peg$c157;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e157); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLOW_PRECISION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 159;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c158) {
+ s1 = peg$c158;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e158); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePRECISION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 160;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c159) {
+ s1 = peg$c159;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e159); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseFLOATCONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 161;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefloating_constant();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f2(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDOUBLECONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 162;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefloating_constant();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f3(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINTCONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 163;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseinteger_constant();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f4(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUINTCONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 164;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseinteger_constant();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f5(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBOOLCONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 165;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c160) {
+ s1 = peg$c160;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e160); }
+ }
+ if (s1 === peg$FAILED) {
+ if (input.substr(peg$currPos, 5) === peg$c161) {
+ s1 = peg$c161;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e161); }
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f6(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsekeyword() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 166;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseATTRIBUTE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVARYING();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCONST();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBOOL();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFLOAT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDOUBLE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBREAK();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCONTINUE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDO();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseELSE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFOR();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIF();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDISCARD();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRETURN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSWITCH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCASE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDEFAULT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSUBROUTINE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCENTROID();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUNIFORM();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePATCH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSHARED();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCOHERENT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVOLATILE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRESTRICT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseREADONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseWRITEONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseNOPERSPECTIVE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFLAT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSMOOTH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseLAYOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseATOMIC_UINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBESHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DRECTSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBEARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSTRUCT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVOID();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseWHILE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINVARIANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePRECISE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseHIGH_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMEDIUM_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseLOW_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePRECISION();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e162); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 167;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c162) {
+ s1 = peg$c162;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e163); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 168;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c163) {
+ s1 = peg$c163;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e164); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINC_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 169;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c164) {
+ s1 = peg$c164;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e165); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDEC_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 170;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c165) {
+ s1 = peg$c165;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e166); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLE_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 171;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c166) {
+ s1 = peg$c166;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e167); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseGE_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 172;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c167) {
+ s1 = peg$c167;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e168); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseEQ_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 173;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c168) {
+ s1 = peg$c168;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e169); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseNE_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 174;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c169) {
+ s1 = peg$c169;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e170); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseAND_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 175;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c170) {
+ s1 = peg$c170;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e171); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseOR_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 176;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c171) {
+ s1 = peg$c171;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e172); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseXOR_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 177;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c172) {
+ s1 = peg$c172;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e173); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMUL_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 178;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c173) {
+ s1 = peg$c173;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e174); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDIV_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 179;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c174) {
+ s1 = peg$c174;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e175); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseADD_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 180;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c175) {
+ s1 = peg$c175;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e176); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMOD_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 181;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c176) {
+ s1 = peg$c176;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e177); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 182;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c177) {
+ s1 = peg$c177;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e178); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 183;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c178) {
+ s1 = peg$c178;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e179); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseAND_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 184;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c179) {
+ s1 = peg$c179;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e180); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseXOR_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 185;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c180) {
+ s1 = peg$c180;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e181); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseOR_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 186;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c181) {
+ s1 = peg$c181;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e182); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSUB_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 187;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c182) {
+ s1 = peg$c182;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e183); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_PAREN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 188;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 40) {
+ s1 = peg$c183;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e184); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_PAREN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 189;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 41) {
+ s1 = peg$c184;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e185); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_BRACKET() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 190;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 91) {
+ s1 = peg$c185;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e186); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_BRACKET() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 191;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 93) {
+ s1 = peg$c186;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e187); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_BRACE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 192;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 123) {
+ s1 = peg$c187;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e188); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_BRACE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 193;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 125) {
+ s1 = peg$c188;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e189); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDOT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 194;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 46) {
+ s1 = peg$c189;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e190); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCOMMA() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 195;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 44) {
+ s1 = peg$c190;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e191); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCOLON() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 196;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 58) {
+ s1 = peg$c191;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e192); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseEQUAL() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 197;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 61) {
+ s1 = peg$c192;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e193); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSEMICOLON() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 198;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 59) {
+ s1 = peg$c193;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e194); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBANG() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 199;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 33) {
+ s1 = peg$c194;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e195); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDASH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 200;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 45) {
+ s1 = peg$c195;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e196); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseTILDE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 201;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 126) {
+ s1 = peg$c196;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e197); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePLUS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 202;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 43) {
+ s1 = peg$c197;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e198); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSTAR() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 203;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 42) {
+ s1 = peg$c198;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e199); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSLASH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 204;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 47) {
+ s1 = peg$c199;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e200); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePERCENT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 205;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 37) {
+ s1 = peg$c200;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e201); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_ANGLE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 206;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 60) {
+ s1 = peg$c201;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e202); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_ANGLE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 207;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 62) {
+ s1 = peg$c202;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e203); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVERTICAL_BAR() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 208;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 124) {
+ s1 = peg$c203;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e204); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCARET() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 209;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 94) {
+ s1 = peg$c204;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e205); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseAMPERSAND() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 210;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 38) {
+ s1 = peg$c205;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e206); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseQUESTION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 211;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 63) {
+ s1 = peg$c206;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e207); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIDENTIFIER() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 212;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ peg$silentFails++;
+ s2 = peg$parsekeyword();
+ peg$silentFails--;
+ if (s2 === peg$FAILED) {
+ s1 = undefined;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$currPos;
+ if (peg$r0.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e208); }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = [];
+ if (peg$r1.test(input.charAt(peg$currPos))) {
+ s6 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e209); }
+ }
+ while (s6 !== peg$FAILED) {
+ s5.push(s6);
+ if (peg$r1.test(input.charAt(peg$currPos))) {
+ s6 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e209); }
+ }
+ }
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ if (s3 !== peg$FAILED) {
+ s2 = input.substring(s2, peg$currPos);
+ } else {
+ s2 = s3;
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f8(s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseTYPE_NAME() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 213;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ peg$silentFails++;
+ s2 = peg$parsekeyword();
+ peg$silentFails--;
+ if (s2 === peg$FAILED) {
+ s1 = undefined;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f9(s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinteger_constant() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 214;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsedecimal_constant();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseinteger_suffix();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parseoctal_constant();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseinteger_suffix();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsehexadecimal_constant();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseinteger_suffix();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinteger_suffix() {
+ var s0;
+
+ var key = peg$currPos * 305 + 215;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ if (peg$r2.test(input.charAt(peg$currPos))) {
+ s0 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e210); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedecimal_constant() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 216;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ if (peg$r3.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e211); }
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$parsedigit();
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$parsedigit();
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseoctal_constant() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 217;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 48) {
+ s1 = peg$c207;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e212); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ if (peg$r4.test(input.charAt(peg$currPos))) {
+ s3 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e213); }
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ if (peg$r4.test(input.charAt(peg$currPos))) {
+ s3 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e213); }
+ }
+ }
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsehexadecimal_constant() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 218;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 48) {
+ s1 = peg$c207;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e212); }
+ }
+ if (s1 !== peg$FAILED) {
+ if (peg$r5.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e214); }
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ if (peg$r6.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e215); }
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ if (peg$r6.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e215); }
+ }
+ }
+ s1 = [s1, s2, s3];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedigit() {
+ var s0;
+
+ var key = peg$currPos * 305 + 219;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ if (peg$r7.test(input.charAt(peg$currPos))) {
+ s0 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e216); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefloating_constant() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 220;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsefractional_constant();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexponent_part();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parsefloating_suffix();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsedigit_sequence();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexponent_part();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsefloating_suffix();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefractional_constant() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 221;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsedigit_sequence();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ if (input.charCodeAt(peg$currPos) === 46) {
+ s3 = peg$c189;
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e190); }
+ }
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsedigit_sequence();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexponent_part() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 222;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ if (peg$r8.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e218); }
+ }
+ if (s2 !== peg$FAILED) {
+ if (peg$r9.test(input.charAt(peg$currPos))) {
+ s3 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e219); }
+ }
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parsedigit_sequence();
+ if (s4 !== peg$FAILED) {
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e217); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedigit_sequence() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 223;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = [];
+ s2 = peg$parsedigit();
+ if (s2 !== peg$FAILED) {
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ s2 = peg$parsedigit();
+ }
+ } else {
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefloating_suffix() {
+ var s0;
+
+ var key = peg$currPos * 305 + 224;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ if (peg$r10.test(input.charAt(peg$currPos))) {
+ s0 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e220); }
+ }
+ if (s0 === peg$FAILED) {
+ if (input.substr(peg$currPos, 2) === peg$c208) {
+ s0 = peg$c208;
+ peg$currPos += 2;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e221); }
+ }
+ if (s0 === peg$FAILED) {
+ if (input.substr(peg$currPos, 2) === peg$c209) {
+ s0 = peg$c209;
+ peg$currPos += 2;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e222); }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseprimary_expression() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 225;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseFLOATCONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINTCONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUINTCONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBOOLCONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDOUBLECONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseLEFT_PAREN();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseexpression();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseRIGHT_PAREN();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f10(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseIDENTIFIER();
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f11(s1);
+ }
+ s0 = s1;
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e223); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsepostfix_expression() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 226;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsefunction_call();
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$parsepostfix_expression_suffix();
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$parsepostfix_expression_suffix();
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 === peg$FAILED) {
+ s1 = peg$currPos;
+ s2 = peg$parseprimary_expression();
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$parsepostfix_expression_suffix();
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$parsepostfix_expression_suffix();
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f12(s1);
+ }
+ s0 = s1;
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsepostfix_expression_suffix() {
+ var s0;
+
+ var key = peg$currPos * 305 + 227;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseinteger_index();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsefield_selection();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINC_OP();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDEC_OP();
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinteger_index() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 228;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseLEFT_BRACKET();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseexpression();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseRIGHT_BRACKET();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f13(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefield_selection() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 229;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseDOT();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f14(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_call() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 230;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefunction_identifier();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsefunction_arguments();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseRIGHT_PAREN();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f15(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_arguments() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 231;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseVOID();
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f16(s1);
+ }
+ s0 = s1;
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseassignment_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseassignment_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseassignment_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f17(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_identifier() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 232;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsechained_function_call();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsefunction_suffix();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseLEFT_PAREN();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s1 = peg$f18(s2, s3, s4);
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 === peg$FAILED) {
+ s1 = peg$currPos;
+ s2 = peg$parsetype_specifier();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsefunction_suffix();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parseLEFT_PAREN();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s1 = peg$f18(s2, s3, s4);
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f19(s1);
+ }
+ s0 = s1;
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_suffix() {
+ var s0;
+
+ var key = peg$currPos * 305 + 233;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseinteger_index();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsefield_selection();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsechained_function_call() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 234;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsetype_specifier();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsefunction_arguments();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f20(s1, s2, s3, s4);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseunary_expression() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 235;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parsepostfix_expression();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseINC_OP();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parseDEC_OP();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsePLUS();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parseDASH();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parseBANG();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parseTILDE();
+ }
+ }
+ }
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseunary_expression();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f21(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e224); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsemultiplicative_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 236;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseunary_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseSTAR();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseSLASH();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parsePERCENT();
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseunary_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseSTAR();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseSLASH();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parsePERCENT();
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseunary_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseadditive_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 237;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsemultiplicative_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parsePLUS();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseDASH();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsemultiplicative_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parsePLUS();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseDASH();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsemultiplicative_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseshift_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 238;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseadditive_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseRIGHT_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseLEFT_OP();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseadditive_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseRIGHT_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseLEFT_OP();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseadditive_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parserelational_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 239;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseshift_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseLE_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseGE_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseLEFT_ANGLE();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseRIGHT_ANGLE();
+ }
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseshift_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseLE_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseGE_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseLEFT_ANGLE();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseRIGHT_ANGLE();
+ }
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseshift_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseequality_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 240;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parserelational_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseEQ_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseNE_OP();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parserelational_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseEQ_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseNE_OP();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parserelational_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e225); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseand_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 241;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseequality_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseAMPERSAND();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseequality_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseAMPERSAND();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseequality_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e226); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexclusive_or_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 242;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseand_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCARET();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseand_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCARET();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseand_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinclusive_or_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 243;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseexclusive_or_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseVERTICAL_BAR();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseexclusive_or_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseVERTICAL_BAR();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseexclusive_or_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselogical_and_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 244;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseinclusive_or_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseAND_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseinclusive_or_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseAND_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseinclusive_or_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselogical_xor_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 245;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parselogical_and_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseXOR_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parselogical_and_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseXOR_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parselogical_and_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselogical_or_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 246;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parselogical_xor_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseOR_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parselogical_xor_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseOR_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parselogical_xor_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseternary_expression() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 247;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parselogical_or_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$parseQUESTION();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseexpression();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseCOLON();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseassignment_expression();
+ if (s6 !== peg$FAILED) {
+ peg$savedPos = s2;
+ s2 = peg$f23(s1, s3, s4, s5, s6);
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f24(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseassignment_expression() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 248;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseunary_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseassignment_operator();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseassignment_expression();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f25(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseternary_expression();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseassignment_operator() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 249;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseEQUAL();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMUL_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDIV_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMOD_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseADD_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSUB_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseLEFT_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRIGHT_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseAND_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseXOR_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseOR_ASSIGN();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e227); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexpression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 250;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseassignment_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseassignment_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseassignment_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e228); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedeclaration_statement() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 251;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsedeclaration();
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f26(s1);
+ }
+ s0 = s1;
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedeclaration() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 252;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefunction_prototype();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseprecision_declarator();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseinterface_declarator();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parsequalifier_declarator();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseinit_declarator_list();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsequalifier_declarator() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 253;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsetype_qualifiers();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = [];
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseIDENTIFIER();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseIDENTIFIER();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f27(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinterface_declarator() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 254;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsetype_qualifiers();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseLEFT_BRACE();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsestruct_declaration_list();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseRIGHT_BRACE();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsequantified_identifier();
+ if (s6 === peg$FAILED) {
+ s6 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f28(s1, s2, s3, s4, s5, s6);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseprecision_declarator() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 255;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsePRECISION();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseprecision_qualifier();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsetype_specifier();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f29(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e229); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_prototype() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 256;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsefunction_header();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsefunction_parameters();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseRIGHT_PAREN();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f30(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e230); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_header() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 257;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsefully_specified_type();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseLEFT_PAREN();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f31(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e231); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_parameters() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 258;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseparameter_declaration();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseparameter_declaration();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseparameter_declaration();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f32(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e232); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseparameter_declaration() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 259;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = [];
+ s2 = peg$parseparameter_qualifier();
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ s2 = peg$parseparameter_qualifier();
+ }
+ s2 = peg$parseparameter_declarator();
+ if (s2 === peg$FAILED) {
+ s2 = peg$parsetype_specifier();
+ }
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f33(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e233); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseparameter_declarator() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 260;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsetype_specifier();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsearray_specifier();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f34(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e234); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseparameter_qualifier() {
+ var s0;
+
+ var key = peg$currPos * 305 + 261;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseCONST();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsememory_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseprecision_qualifier();
+ }
+ }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsememory_qualifier() {
+ var s0;
+
+ var key = peg$currPos * 305 + 262;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseCOHERENT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVOLATILE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRESTRICT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseREADONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseWRITEONLY();
+ }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinit_declarator_list() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 263;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseinitial_declaration();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsesubsequent_declaration();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsesubsequent_declaration();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f35(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsesubsequent_declaration() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 264;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseIDENTIFIER();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsearray_specifier();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$currPos;
+ s4 = peg$parseEQUAL();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseinitializer();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f36(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinitial_declaration() {
+ var s0, s1, s2, s3, s4, s5, s6, s7;
+
+ var key = peg$currPos * 305 + 265;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefully_specified_type();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$parseIDENTIFIER();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsearray_specifier();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$currPos;
+ s6 = peg$parseEQUAL();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$parseinitializer();
+ if (s7 !== peg$FAILED) {
+ s6 = [s6, s7];
+ s5 = s6;
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ if (s5 === peg$FAILED) {
+ s5 = null;
+ }
+ s3 = [s3, s4, s5];
+ s2 = s3;
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f37(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefully_specified_type() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 266;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsetype_qualifiers();
+ if (s1 === peg$FAILED) {
+ s1 = null;
+ }
+ s2 = peg$parsetype_specifier();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f38(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselayout_qualifier() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8;
+
+ var key = peg$currPos * 305 + 267;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseLAYOUT();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$currPos;
+ s4 = peg$parselayout_qualifier_id();
+ if (s4 !== peg$FAILED) {
+ s5 = [];
+ s6 = peg$currPos;
+ s7 = peg$parseCOMMA();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parselayout_qualifier_id();
+ if (s8 !== peg$FAILED) {
+ s7 = [s7, s8];
+ s6 = s7;
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ while (s6 !== peg$FAILED) {
+ s5.push(s6);
+ s6 = peg$currPos;
+ s7 = peg$parseCOMMA();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parselayout_qualifier_id();
+ if (s8 !== peg$FAILED) {
+ s7 = [s7, s8];
+ s6 = s7;
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s3;
+ s3 = peg$f39(s1, s2, s4, s5);
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f40(s1, s2, s3, s4);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselayout_qualifier_id() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 268;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseIDENTIFIER();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$parseEQUAL();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseternary_expression();
+ if (s4 !== peg$FAILED) {
+ s3 = [s3, s4];
+ s2 = s3;
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f41(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSHARED();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsetype_qualifiers() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 269;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = [];
+ s1 = peg$parsesingle_type_qualifier();
+ if (s1 !== peg$FAILED) {
+ while (s1 !== peg$FAILED) {
+ s0.push(s1);
+ s1 = peg$parsesingle_type_qualifier();
+ }
+ } else {
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsesingle_type_qualifier() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 270;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parsestorage_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parselayout_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseprecision_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseinterpolation_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINVARIANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePRECISE();
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e235); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinterpolation_qualifier() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 271;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseSMOOTH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFLAT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseNOPERSPECTIVE();
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e236); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestorage_qualifier() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8;
+
+ var key = peg$currPos * 305 + 272;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseCONST();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCENTROID();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePATCH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUNIFORM();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSHARED();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCOHERENT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVOLATILE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRESTRICT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseREADONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseWRITEONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVARYING();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseATTRIBUTE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseSUBROUTINE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$parseLEFT_PAREN();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseTYPE_NAME();
+ if (s4 !== peg$FAILED) {
+ s5 = [];
+ s6 = peg$currPos;
+ s7 = peg$parseCOMMA();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parseTYPE_NAME();
+ if (s8 !== peg$FAILED) {
+ s7 = [s7, s8];
+ s6 = s7;
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ while (s6 !== peg$FAILED) {
+ s5.push(s6);
+ s6 = peg$currPos;
+ s7 = peg$parseCOMMA();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parseTYPE_NAME();
+ if (s8 !== peg$FAILED) {
+ s7 = [s7, s8];
+ s6 = s7;
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ }
+ s6 = peg$parseRIGHT_PAREN();
+ if (s6 !== peg$FAILED) {
+ peg$savedPos = s2;
+ s2 = peg$f42(s1, s3, s4, s5, s6);
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f43(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e237); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsetype_specifier() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 273;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsetype_specifier_nonarray();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsearray_specifier();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f44(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e238); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsetype_specifier_nonarray() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 274;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseVOID();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFLOAT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDOUBLE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBOOL();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseATOMIC_UINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBESHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBEARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DRECTSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsestruct_specifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseTYPE_NAME();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e238); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsearray_specifier() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 275;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = [];
+ s2 = peg$currPos;
+ s3 = peg$parseLEFT_BRACKET();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseternary_expression();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$parseRIGHT_BRACKET();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s2;
+ s2 = peg$f45(s3, s4, s5);
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 !== peg$FAILED) {
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ s2 = peg$currPos;
+ s3 = peg$parseLEFT_BRACKET();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseternary_expression();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$parseRIGHT_BRACKET();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s2;
+ s2 = peg$f45(s3, s4, s5);
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ }
+ } else {
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f46(s1);
+ }
+ s0 = s1;
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e239); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseprecision_qualifier() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 276;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseHIGH_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMEDIUM_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseLOW_PRECISION();
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e240); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestruct_specifier() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 277;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseSTRUCT();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseLEFT_BRACE();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsestruct_declaration_list();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseRIGHT_BRACE();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f47(s1, s2, s3, s4, s5);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e241); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestruct_declaration_list() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 278;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = [];
+ s1 = peg$currPos;
+ s2 = peg$parsestruct_declaration();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseSEMICOLON();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s1 = peg$f48(s2, s3);
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ while (s1 !== peg$FAILED) {
+ s0.push(s1);
+ s1 = peg$currPos;
+ s2 = peg$parsestruct_declaration();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseSEMICOLON();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s1 = peg$f48(s2, s3);
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ }
+ } else {
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestruct_declaration() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 279;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefully_specified_type();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsequantified_identifier();
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsequantified_identifier();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsequantified_identifier();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f49(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsequantified_identifier() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 280;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseIDENTIFIER();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsearray_specifier();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f50(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinitializer() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 281;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseassignment_expression();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseLEFT_BRACE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseinitializer();
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseinitializer();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseinitializer();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ }
+ s4 = peg$parseCOMMA();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$parseRIGHT_BRACE();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f51(s1, s2, s3, s4, s5);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestatement() {
+ var s0;
+
+ var key = peg$currPos * 305 + 282;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsecompound_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsesimple_statement();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsesimple_statement() {
+ var s0;
+
+ var key = peg$currPos * 305 + 283;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsejump_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsedeclaration_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseexpression_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseif_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseswitch_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsecase_label();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseiteration_statement();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecompound_statement() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 284;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parseLEFT_BRACE();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s2 = peg$f52(s2);
+ }
+ s1 = s2;
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsestatement_list();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseRIGHT_BRACE();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f53(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecompound_statement_no_new_scope() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 285;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseLEFT_BRACE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsestatement_list();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseRIGHT_BRACE();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f54(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestatement_no_new_scope() {
+ var s0;
+
+ var key = peg$currPos * 305 + 286;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsecompound_statement_no_new_scope();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsesimple_statement();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestatement_list() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 287;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = [];
+ s1 = peg$parsestatement();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsepreprocessor();
+ }
+ if (s1 !== peg$FAILED) {
+ while (s1 !== peg$FAILED) {
+ s0.push(s1);
+ s1 = peg$parsestatement();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsepreprocessor();
+ }
+ }
+ } else {
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexpression_statement() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 288;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseexpression();
+ if (s1 === peg$FAILED) {
+ s1 = null;
+ }
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f55(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseif_statement() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
+
+ var key = peg$currPos * 305 + 289;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseIF();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexpression();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$currPos;
+ s6 = peg$parsestatement();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$currPos;
+ s8 = peg$parseELSE();
+ if (s8 !== peg$FAILED) {
+ s9 = peg$parsestatement();
+ if (s9 !== peg$FAILED) {
+ s8 = [s8, s9];
+ s7 = s8;
+ } else {
+ peg$currPos = s7;
+ s7 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s7;
+ s7 = peg$FAILED;
+ }
+ if (s7 === peg$FAILED) {
+ s7 = null;
+ }
+ s6 = [s6, s7];
+ s5 = s6;
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f56(s1, s2, s3, s4, s5);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseswitch_statement() {
+ var s0, s1, s2, s3, s4, s5, s6, s7;
+
+ var key = peg$currPos * 305 + 290;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseSWITCH();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexpression();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseLEFT_BRACE();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsestatement_list();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$parseRIGHT_BRACE();
+ if (s7 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f57(s1, s2, s3, s4, s5, s6, s7);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecase_label() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 291;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseCASE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseexpression();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseCOLON();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f58(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseDEFAULT();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseCOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f59(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseiteration_statement() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8;
+
+ var key = peg$currPos * 305 + 292;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parseWHILE();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s2 = peg$f60(s2);
+ }
+ s1 = s2;
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsecondition();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsestatement_no_new_scope();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f61(s1, s2, s3, s4, s5);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseDO();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsestatement();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseWHILE();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseLEFT_PAREN();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseexpression();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseRIGHT_PAREN();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$parseSEMICOLON();
+ if (s7 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f62(s1, s2, s3, s4, s5, s6, s7);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parseFOR();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s2 = peg$f63(s2);
+ }
+ s1 = s2;
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexpression_statement();
+ if (s3 === peg$FAILED) {
+ s3 = peg$parsedeclaration_statement();
+ }
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parsecondition();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$parseSEMICOLON();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseexpression();
+ if (s6 === peg$FAILED) {
+ s6 = null;
+ }
+ s7 = peg$parseRIGHT_PAREN();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parsestatement_no_new_scope();
+ if (s8 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f64(s1, s2, s3, s4, s5, s6, s7, s8);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e242); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecondition() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 293;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefully_specified_type();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseEQUAL();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseinitializer();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f65(s1, s2, s3, s4);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseexpression();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsejump_statement() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 294;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseCONTINUE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f66(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseBREAK();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f67(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseRETURN();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseexpression();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseSEMICOLON();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f68(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseDISCARD();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f69(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e243); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsepreprocessor() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 295;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 35) {
+ s3 = peg$c210;
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e245); }
+ }
+ if (s3 !== peg$FAILED) {
+ s4 = [];
+ if (peg$r11.test(input.charAt(peg$currPos))) {
+ s5 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s5 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e246); }
+ }
+ while (s5 !== peg$FAILED) {
+ s4.push(s5);
+ if (peg$r11.test(input.charAt(peg$currPos))) {
+ s5 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s5 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e246); }
+ }
+ }
+ s3 = [s3, s4];
+ s2 = s3;
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 !== peg$FAILED) {
+ s1 = input.substring(s1, peg$currPos);
+ } else {
+ s1 = s2;
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f70(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e244); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsetranslation_unit() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 296;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = [];
+ s1 = peg$parseexternal_declaration();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsepreprocessor();
+ }
+ if (s1 !== peg$FAILED) {
+ while (s1 !== peg$FAILED) {
+ s0.push(s1);
+ s1 = peg$parseexternal_declaration();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsepreprocessor();
+ }
+ }
+ } else {
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexternal_declaration() {
+ var s0;
+
+ var key = peg$currPos * 305 + 297;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsefunction_definition();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsedeclaration_statement();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_definition() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 298;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefunction_prototype();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsecompound_statement_no_new_scope();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f71(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parse_() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 299;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsewhitespace();
+ if (s1 === peg$FAILED) {
+ s1 = null;
+ }
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parsecomment();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsewhitespace();
+ if (s5 === peg$FAILED) {
+ s5 = null;
+ }
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parsecomment();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsewhitespace();
+ if (s5 === peg$FAILED) {
+ s5 = null;
+ }
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f72(s1, s2);
+ peg$silentFails--;
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e247); }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecomment() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 300;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsesingle_comment();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parsemultiline_comment();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parsewhitespace();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsecomment();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s3;
+ s3 = peg$f73(s1, s4, s5);
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parsewhitespace();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsecomment();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s3;
+ s3 = peg$f73(s1, s4, s5);
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f74(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsesingle_comment() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 301;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c211) {
+ s2 = peg$c211;
+ peg$currPos += 2;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e248); }
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ if (peg$r11.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e246); }
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ if (peg$r11.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e246); }
+ }
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsemultiline_comment() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 302;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c212) {
+ s2 = peg$c212;
+ peg$currPos += 2;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e249); }
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$currPos;
+ s5 = peg$currPos;
+ peg$silentFails++;
+ if (input.substr(peg$currPos, 2) === peg$c213) {
+ s6 = peg$c213;
+ peg$currPos += 2;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e250); }
+ }
+ peg$silentFails--;
+ if (s6 === peg$FAILED) {
+ s5 = undefined;
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ if (s5 !== peg$FAILED) {
+ if (input.length > peg$currPos) {
+ s6 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e251); }
+ }
+ if (s6 !== peg$FAILED) {
+ peg$savedPos = s4;
+ s4 = peg$f75(s6);
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$currPos;
+ s5 = peg$currPos;
+ peg$silentFails++;
+ if (input.substr(peg$currPos, 2) === peg$c213) {
+ s6 = peg$c213;
+ peg$currPos += 2;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e250); }
+ }
+ peg$silentFails--;
+ if (s6 === peg$FAILED) {
+ s5 = undefined;
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ if (s5 !== peg$FAILED) {
+ if (input.length > peg$currPos) {
+ s6 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e251); }
+ }
+ if (s6 !== peg$FAILED) {
+ peg$savedPos = s4;
+ s4 = peg$f75(s6);
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ }
+ if (input.substr(peg$currPos, 2) === peg$c213) {
+ s4 = peg$c213;
+ peg$currPos += 2;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e250); }
+ }
+ if (s4 !== peg$FAILED) {
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsewhitespace() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 303;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = [];
+ if (peg$r12.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e252); }
+ }
+ if (s2 !== peg$FAILED) {
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ if (peg$r12.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e252); }
+ }
+ }
+ } else {
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseterminal() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 304;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ peg$silentFails++;
+ if (peg$r1.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e209); }
+ }
+ peg$silentFails--;
+ if (s2 === peg$FAILED) {
+ s1 = undefined;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f76(s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+
+ const OPEN_CURLY = String.fromCharCode(123);
+
+ const makeScope = (name, parent) => ({
+ name,
+ parent,
+ bindings: {},
+ types: {},
+ functions: {},
+ });
+ const pushScope = scope => {
+ // console.log('pushing scope at ',text());
+ scopes.push(scope);
+ return scope;
+ };
+ const popScope = scope => {
+ // console.log('popping scope at ',text());
+ if(!scope.parent) {
+ throw new Error('popped bad scope', scope, 'at', text());
+ }
+ return scope.parent;
+ };
+
+ const warn = (...args) => !options.quiet && console.warn(...args);
+
+ // Types (aka struct) scope
+ const addTypes = (scope, ...types) => {
+ types.forEach(([identifier, type]) => {
+ scope.types[identifier] = {
+ references: [type]
+ };
+ });
+ };
+ const addTypeReference = (scope, name, reference) => {
+ scope.types[name].references.push(reference);
+ };
+ const findTypeScope = (scope, typeName) => {
+ if(!scope) {
+ return null;
+ }
+ if(typeName in scope.types) {
+ return scope;
+ }
+ return findTypeScope(scope.parent, typeName);
+ };
+ const isDeclaredType = (scope, typeName) => findTypeScope(scope, typeName) !== null;
+
+ // Bindings (aka variables, parameters) scope
+ const createBindings = (scope, ...bindings) => {
+ bindings.forEach(([identifier, binding]) => {
+ const newBinding = scope.bindings[identifier] || { references: [] };
+ newBinding.initializer = binding;
+ newBinding.references.unshift(binding);
+ scope.bindings[identifier] = newBinding;
+ });
+ };
+ const addBindingReference = (scope, name, reference) => {
+ // In the case of "float a = 1, b = a;" we parse the final "a" before the
+ // parent declarator list is parsed. So we might need to add the final "a"
+ // to the scope first.
+ const foundScope = findBindingScope(scope, name);
+ if(foundScope) {
+ foundScope.bindings[name].references.push(reference);
+ } else {
+ createBindings(scope, [name, reference]);
+ }
+ };
+ const findBindingScope = (scope, name) => {
+ if(!scope) {
+ return null;
+ }
+ if(name in scope.bindings) {
+ return scope;
+ }
+ return findBindingScope(scope.parent, name);
+ };
+
+ // Function scope
+ const createFunction = (scope, name, declaration) => {
+ scope.functions[name] = { references: [declaration] };
+ };
+ const addFunctionReference = (scope, name, reference) => {
+ const global = findGlobalScope(scope);
+ if(name in global.functions) {
+ global.functions[name].references.push(reference);
+ } else {
+ createFunction(scope, name, reference);
+ }
+ };
+ const findGlobalScope = scope => scope.parent ? findGlobalScope(scope.parent) : scope;
+ const isDeclaredFunction = (scope, fnName) => fnName in findGlobalScope(scope).functions;
+
+ let scopes = [makeScope('global')];
+ let scope = scopes[0];
+
+ const node = (type, attrs) => ({
+ type,
+ ...attrs
+ });
+
+ // Filter out "empty" elements from an array
+ const xnil = (...args) => args.flat().filter(e =>
+ e !== undefined && e !== null && e !== '' && e.length !== 0
+ );
+
+ // Given an array of nodes with potential null empty values, convert to text.
+ // Kind of like $(rule) but filters out empty rules
+ const toText = (...args) => xnil(args).join('');
+
+ const ifOnly = arr => arr.length > 1 ? arr : arr[0];
+
+ // Remove empty elements and return value if only 1 element remains
+ const collapse = (...args) => ifOnly(xnil(args));
+
+ // Create a left associative tree of nodes
+ const leftAssociate = (...nodes) =>
+ nodes.flat().reduce((current, [operator, expr]) => ({
+ type: "binary",
+ operator: operator,
+ left: current,
+ right: expr
+ }));
+
+ // No longer needed?
+ // const without = (obj, ...keys) => Object.entries(obj).reduce((acc, [key, value]) => ({
+ // ...acc,
+ // ...(!keys.includes(key) && { [key]: value })
+ // }), {});
+
+ // Group the statements in a switch statement into cases / default arrays
+ const groupCases = (statements) => statements.reduce((cases, stmt) => {
+ if(stmt.type === 'case_label') {
+ return [
+ ...cases,
+ node(
+ 'switch_case',
+ {
+ statements: [],
+ case: stmt.case,
+ test: stmt.test,
+ colon: stmt.colon,
+ }
+ )
+ ];
+ } else if(stmt.type === 'default_label') {
+ return [
+ ...cases,
+ node(
+ 'default_case',
+ {
+ statements: [],
+ default: stmt.default,
+ colon: stmt.colon,
+ }
+ )
+ ];
+ // It would be nice to encode this in the grammar instead of a manual check
+ } else if(!cases.length) {
+ throw new Error('A switch statement body must start with a case or default label');
+ } else {
+ const tail = cases.slice(-1)[0];
+ return [...cases.slice(0, -1), {
+ ...tail,
+ statements: [
+ ...tail.statements,
+ stmt
+ ]
+ }];
+ }
+ }, []);
+
+
+ // From https://www.khronos.org/registry/OpenGL-Refpages/gl4/index.php
+ // excluding gl_ prefixed builtins, which don't appear to be functions
+ const builtIns = new Set([
+ 'abs',
+ 'acos',
+ 'acosh',
+ 'all',
+ 'any',
+ 'asin',
+ 'asinh',
+ 'atan',
+ 'atanh',
+ 'atomicAdd',
+ 'atomicAnd',
+ 'atomicCompSwap',
+ 'atomicCounter',
+ 'atomicCounterDecrement',
+ 'atomicCounterIncrement',
+ 'atomicExchange',
+ 'atomicMax',
+ 'atomicMin',
+ 'atomicOr',
+ 'atomicXor',
+ 'barrier',
+ 'bitCount',
+ 'bitfieldExtract',
+ 'bitfieldInsert',
+ 'bitfieldReverse',
+ 'ceil',
+ 'clamp',
+ 'cos',
+ 'cosh',
+ 'cross',
+ 'degrees',
+ 'determinant',
+ 'dFdx',
+ 'dFdxCoarse',
+ 'dFdxFine',
+ 'dFdy',
+ 'dFdyCoarse',
+ 'dFdyFine',
+ 'distance',
+ 'dot',
+ 'EmitStreamVertex',
+ 'EmitVertex',
+ 'EndPrimitive',
+ 'EndStreamPrimitive',
+ 'equal',
+ 'exp',
+ 'exp2',
+ 'faceforward',
+ 'findLSB',
+ 'findMSB',
+ 'floatBitsToInt',
+ 'floatBitsToUint',
+ 'floor',
+ 'fma',
+ 'fract',
+ 'frexp',
+ 'fwidth',
+ 'fwidthCoarse',
+ 'fwidthFine',
+ 'greaterThan',
+ 'greaterThanEqual',
+ 'groupMemoryBarrier',
+ 'imageAtomicAdd',
+ 'imageAtomicAnd',
+ 'imageAtomicCompSwap',
+ 'imageAtomicExchange',
+ 'imageAtomicMax',
+ 'imageAtomicMin',
+ 'imageAtomicOr',
+ 'imageAtomicXor',
+ 'imageLoad',
+ 'imageSamples',
+ 'imageSize',
+ 'imageStore',
+ 'imulExtended',
+ 'intBitsToFloat',
+ 'interpolateAtCentroid',
+ 'interpolateAtOffset',
+ 'interpolateAtSample',
+ 'inverse',
+ 'inversesqrt',
+ 'isinf',
+ 'isnan',
+ 'ldexp',
+ 'length',
+ 'lessThan',
+ 'lessThanEqual',
+ 'log',
+ 'log2',
+ 'matrixCompMult',
+ 'max',
+ 'memoryBarrier',
+ 'memoryBarrierAtomicCounter',
+ 'memoryBarrierBuffer',
+ 'memoryBarrierImage',
+ 'memoryBarrierShared',
+ 'min',
+ 'mix',
+ 'mod',
+ 'modf',
+ 'noise',
+ 'noise1',
+ 'noise2',
+ 'noise3',
+ 'noise4',
+ 'normalize',
+ 'not',
+ 'notEqual',
+ 'outerProduct',
+ 'packDouble2x32',
+ 'packHalf2x16',
+ 'packSnorm2x16',
+ 'packSnorm4x8',
+ 'packUnorm',
+ 'packUnorm2x16',
+ 'packUnorm4x8',
+ 'pow',
+ 'radians',
+ 'reflect',
+ 'refract',
+ 'round',
+ 'roundEven',
+ 'sign',
+ 'sin',
+ 'sinh',
+ 'smoothstep',
+ 'sqrt',
+ 'step',
+ 'tan',
+ 'tanh',
+ 'texelFetch',
+ 'texelFetchOffset',
+ 'texture',
+ 'textureGather',
+ 'textureGatherOffset',
+ 'textureGatherOffsets',
+ 'textureGrad',
+ 'textureGradOffset',
+ 'textureLod',
+ 'textureLodOffset',
+ 'textureOffset',
+ 'textureProj',
+ 'textureProjGrad',
+ 'textureProjGradOffset',
+ 'textureProjLod',
+ 'textureProjLodOffset',
+ 'textureProjOffset',
+ 'textureQueryLevels',
+ 'textureQueryLod',
+ 'textureSamples',
+ 'textureSize',
+ 'transpose',
+ 'trunc',
+ 'uaddCarry',
+ 'uintBitsToFloat',
+ 'umulExtended',
+ 'unpackDouble2x32',
+ 'unpackHalf2x16',
+ 'unpackSnorm2x16',
+ 'unpackSnorm4x8',
+ 'unpackUnorm',
+ 'unpackUnorm2x16',
+ 'unpackUnorm4x8',
+ 'usubBorrow',
+ // GLSL ES 1.00
+ 'texture2D', 'textureCube'
+ ]);
+
+
+ peg$result = peg$startRuleFunction();
+
+ if (peg$result !== peg$FAILED && peg$currPos === input.length) {
+ return peg$result;
+ } else {
+ if (peg$result !== peg$FAILED && peg$currPos < input.length) {
+ peg$fail(peg$endExpectation());
+ }
+
+ throw peg$buildStructuredError(
+ peg$maxFailExpected,
+ peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
+ peg$maxFailPos < input.length
+ ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
+ : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
+ );
+ }
+}
+
+var parser = {
+ SyntaxError: peg$SyntaxError,
+ parse: peg$parse
+};
+
+"use strict";
+var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var generator_1 = __importDefault(generator);
+var parser_1 = __importDefault(parser);
+var dist = { generate: generator_1.default, parser: parser_1.default };
+
+// Format is Key (Javascript function name), Value: GLSL Source
+// SDFs from
+// https://iquilezles.org/www/articles/distfunctions/distfunctions.htm
+// Make sure to destruct the name in sculpt.js (search for DESTRUCT SDFs)
+var sdfs = {
+ boxFrame: "float sdBoxFrame( vec3 p, vec3 b, float e )\n{\n p = abs(p )-b;\nvec3 q = abs(p+e)-e;\nreturn min(min(\n length(max(vec3(p.x,q.y,q.z),0.0))+min(max(p.x,max(q.y,q.z)),0.0),\n length(max(vec3(q.x,p.y,q.z),0.0))+min(max(q.x,max(p.y,q.z)),0.0)),\n length(max(vec3(q.x,q.y,p.z),0.0))+min(max(q.x,max(q.y,p.z)),0.0));\n}",
+ link: "float sdLink( vec3 p, float le, float r1, float r2 )\n{\n vec3 q = vec3( p.x, max(abs(p.y)-le,0.0), p.z );\n return length(vec2(length(q.xy)-r1,q.z)) - r2;\n}",
+ cappedTorus: "\nfloat sdCappedTorus(in vec3 p, in vec2 sc, in float ra, in float rb)\n{\n p.x = abs(p.x);\n float k = (sc.y*p.x>sc.x*p.y) ? dot(p.xy,sc) : length(p.xy);\n return sqrt( dot(p,p) + ra*ra - 2.0*ra*k ) - rb;\n}\n"
+};
+
+const name$1="estraverse";const description$1="ECMAScript JS AST traversal functions";const homepage$1="https://github.com/estools/estraverse";const main$1="estraverse.js";const version$1="4.3.0";const engines$1={node:">=4.0"};const maintainers$1=[{name:"Yusuke Suzuki",email:"utatane.tea@gmail.com",web:"http://github.com/Constellation"}];const repository$1={type:"git",url:"http://github.com/estools/estraverse.git"};const devDependencies$1={"babel-preset-env":"^1.6.1","babel-register":"^6.3.13",chai:"^2.1.1",espree:"^1.11.0",gulp:"^3.8.10","gulp-bump":"^0.2.2","gulp-filter":"^2.0.0","gulp-git":"^1.0.1","gulp-tag-version":"^1.3.0",jshint:"^2.5.6",mocha:"^2.1.0"};const license$1="BSD-2-Clause";const scripts$1={test:"npm run-script lint && npm run-script unit-test",lint:"jshint estraverse.js","unit-test":"mocha --compilers js:babel-register"};var require$$0 = {name:name$1,description:description$1,homepage:homepage$1,main:main$1,version:version$1,engines:engines$1,maintainers:maintainers$1,repository:repository$1,devDependencies:devDependencies$1,license:license$1,scripts:scripts$1};
+
+/*
+ Copyright (C) 2012-2013 Yusuke Suzuki
+ Copyright (C) 2012 Ariya Hidayat
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var estraverse = createCommonjsModule(function (module, exports) {
+/*jslint vars:false, bitwise:true*/
+/*jshint indent:4*/
+/*global exports:true*/
+(function clone(exports) {
+ 'use strict';
+
+ var Syntax,
+ VisitorOption,
+ VisitorKeys,
+ BREAK,
+ SKIP,
+ REMOVE;
+
+ function deepCopy(obj) {
+ var ret = {}, key, val;
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ val = obj[key];
+ if (typeof val === 'object' && val !== null) {
+ ret[key] = deepCopy(val);
+ } else {
+ ret[key] = val;
+ }
+ }
+ }
+ return ret;
+ }
+
+ // based on LLVM libc++ upper_bound / lower_bound
+ // MIT License
+
+ function upperBound(array, func) {
+ var diff, len, i, current;
+
+ len = array.length;
+ i = 0;
+
+ while (len) {
+ diff = len >>> 1;
+ current = i + diff;
+ if (func(array[current])) {
+ len = diff;
+ } else {
+ i = current + 1;
+ len -= diff + 1;
+ }
+ }
+ return i;
+ }
+
+ Syntax = {
+ AssignmentExpression: 'AssignmentExpression',
+ AssignmentPattern: 'AssignmentPattern',
+ ArrayExpression: 'ArrayExpression',
+ ArrayPattern: 'ArrayPattern',
+ ArrowFunctionExpression: 'ArrowFunctionExpression',
+ AwaitExpression: 'AwaitExpression', // CAUTION: It's deferred to ES7.
+ BlockStatement: 'BlockStatement',
+ BinaryExpression: 'BinaryExpression',
+ BreakStatement: 'BreakStatement',
+ CallExpression: 'CallExpression',
+ CatchClause: 'CatchClause',
+ ClassBody: 'ClassBody',
+ ClassDeclaration: 'ClassDeclaration',
+ ClassExpression: 'ClassExpression',
+ ComprehensionBlock: 'ComprehensionBlock', // CAUTION: It's deferred to ES7.
+ ComprehensionExpression: 'ComprehensionExpression', // CAUTION: It's deferred to ES7.
+ ConditionalExpression: 'ConditionalExpression',
+ ContinueStatement: 'ContinueStatement',
+ DebuggerStatement: 'DebuggerStatement',
+ DirectiveStatement: 'DirectiveStatement',
+ DoWhileStatement: 'DoWhileStatement',
+ EmptyStatement: 'EmptyStatement',
+ ExportAllDeclaration: 'ExportAllDeclaration',
+ ExportDefaultDeclaration: 'ExportDefaultDeclaration',
+ ExportNamedDeclaration: 'ExportNamedDeclaration',
+ ExportSpecifier: 'ExportSpecifier',
+ ExpressionStatement: 'ExpressionStatement',
+ ForStatement: 'ForStatement',
+ ForInStatement: 'ForInStatement',
+ ForOfStatement: 'ForOfStatement',
+ FunctionDeclaration: 'FunctionDeclaration',
+ FunctionExpression: 'FunctionExpression',
+ GeneratorExpression: 'GeneratorExpression', // CAUTION: It's deferred to ES7.
+ Identifier: 'Identifier',
+ IfStatement: 'IfStatement',
+ ImportExpression: 'ImportExpression',
+ ImportDeclaration: 'ImportDeclaration',
+ ImportDefaultSpecifier: 'ImportDefaultSpecifier',
+ ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
+ ImportSpecifier: 'ImportSpecifier',
+ Literal: 'Literal',
+ LabeledStatement: 'LabeledStatement',
+ LogicalExpression: 'LogicalExpression',
+ MemberExpression: 'MemberExpression',
+ MetaProperty: 'MetaProperty',
+ MethodDefinition: 'MethodDefinition',
+ ModuleSpecifier: 'ModuleSpecifier',
+ NewExpression: 'NewExpression',
+ ObjectExpression: 'ObjectExpression',
+ ObjectPattern: 'ObjectPattern',
+ Program: 'Program',
+ Property: 'Property',
+ RestElement: 'RestElement',
+ ReturnStatement: 'ReturnStatement',
+ SequenceExpression: 'SequenceExpression',
+ SpreadElement: 'SpreadElement',
+ Super: 'Super',
+ SwitchStatement: 'SwitchStatement',
+ SwitchCase: 'SwitchCase',
+ TaggedTemplateExpression: 'TaggedTemplateExpression',
+ TemplateElement: 'TemplateElement',
+ TemplateLiteral: 'TemplateLiteral',
+ ThisExpression: 'ThisExpression',
+ ThrowStatement: 'ThrowStatement',
+ TryStatement: 'TryStatement',
+ UnaryExpression: 'UnaryExpression',
+ UpdateExpression: 'UpdateExpression',
+ VariableDeclaration: 'VariableDeclaration',
+ VariableDeclarator: 'VariableDeclarator',
+ WhileStatement: 'WhileStatement',
+ WithStatement: 'WithStatement',
+ YieldExpression: 'YieldExpression'
+ };
+
+ VisitorKeys = {
+ AssignmentExpression: ['left', 'right'],
+ AssignmentPattern: ['left', 'right'],
+ ArrayExpression: ['elements'],
+ ArrayPattern: ['elements'],
+ ArrowFunctionExpression: ['params', 'body'],
+ AwaitExpression: ['argument'], // CAUTION: It's deferred to ES7.
+ BlockStatement: ['body'],
+ BinaryExpression: ['left', 'right'],
+ BreakStatement: ['label'],
+ CallExpression: ['callee', 'arguments'],
+ CatchClause: ['param', 'body'],
+ ClassBody: ['body'],
+ ClassDeclaration: ['id', 'superClass', 'body'],
+ ClassExpression: ['id', 'superClass', 'body'],
+ ComprehensionBlock: ['left', 'right'], // CAUTION: It's deferred to ES7.
+ ComprehensionExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.
+ ConditionalExpression: ['test', 'consequent', 'alternate'],
+ ContinueStatement: ['label'],
+ DebuggerStatement: [],
+ DirectiveStatement: [],
+ DoWhileStatement: ['body', 'test'],
+ EmptyStatement: [],
+ ExportAllDeclaration: ['source'],
+ ExportDefaultDeclaration: ['declaration'],
+ ExportNamedDeclaration: ['declaration', 'specifiers', 'source'],
+ ExportSpecifier: ['exported', 'local'],
+ ExpressionStatement: ['expression'],
+ ForStatement: ['init', 'test', 'update', 'body'],
+ ForInStatement: ['left', 'right', 'body'],
+ ForOfStatement: ['left', 'right', 'body'],
+ FunctionDeclaration: ['id', 'params', 'body'],
+ FunctionExpression: ['id', 'params', 'body'],
+ GeneratorExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.
+ Identifier: [],
+ IfStatement: ['test', 'consequent', 'alternate'],
+ ImportExpression: ['source'],
+ ImportDeclaration: ['specifiers', 'source'],
+ ImportDefaultSpecifier: ['local'],
+ ImportNamespaceSpecifier: ['local'],
+ ImportSpecifier: ['imported', 'local'],
+ Literal: [],
+ LabeledStatement: ['label', 'body'],
+ LogicalExpression: ['left', 'right'],
+ MemberExpression: ['object', 'property'],
+ MetaProperty: ['meta', 'property'],
+ MethodDefinition: ['key', 'value'],
+ ModuleSpecifier: [],
+ NewExpression: ['callee', 'arguments'],
+ ObjectExpression: ['properties'],
+ ObjectPattern: ['properties'],
+ Program: ['body'],
+ Property: ['key', 'value'],
+ RestElement: [ 'argument' ],
+ ReturnStatement: ['argument'],
+ SequenceExpression: ['expressions'],
+ SpreadElement: ['argument'],
+ Super: [],
+ SwitchStatement: ['discriminant', 'cases'],
+ SwitchCase: ['test', 'consequent'],
+ TaggedTemplateExpression: ['tag', 'quasi'],
+ TemplateElement: [],
+ TemplateLiteral: ['quasis', 'expressions'],
+ ThisExpression: [],
+ ThrowStatement: ['argument'],
+ TryStatement: ['block', 'handler', 'finalizer'],
+ UnaryExpression: ['argument'],
+ UpdateExpression: ['argument'],
+ VariableDeclaration: ['declarations'],
+ VariableDeclarator: ['id', 'init'],
+ WhileStatement: ['test', 'body'],
+ WithStatement: ['object', 'body'],
+ YieldExpression: ['argument']
+ };
+
+ // unique id
+ BREAK = {};
+ SKIP = {};
+ REMOVE = {};
+
+ VisitorOption = {
+ Break: BREAK,
+ Skip: SKIP,
+ Remove: REMOVE
+ };
+
+ function Reference(parent, key) {
+ this.parent = parent;
+ this.key = key;
+ }
+
+ Reference.prototype.replace = function replace(node) {
+ this.parent[this.key] = node;
+ };
+
+ Reference.prototype.remove = function remove() {
+ if (Array.isArray(this.parent)) {
+ this.parent.splice(this.key, 1);
+ return true;
+ } else {
+ this.replace(null);
+ return false;
+ }
+ };
+
+ function Element(node, path, wrap, ref) {
+ this.node = node;
+ this.path = path;
+ this.wrap = wrap;
+ this.ref = ref;
+ }
+
+ function Controller() { }
+
+ // API:
+ // return property path array from root to current node
+ Controller.prototype.path = function path() {
+ var i, iz, j, jz, result, element;
+
+ function addToPath(result, path) {
+ if (Array.isArray(path)) {
+ for (j = 0, jz = path.length; j < jz; ++j) {
+ result.push(path[j]);
+ }
+ } else {
+ result.push(path);
+ }
+ }
+
+ // root node
+ if (!this.__current.path) {
+ return null;
+ }
+
+ // first node is sentinel, second node is root element
+ result = [];
+ for (i = 2, iz = this.__leavelist.length; i < iz; ++i) {
+ element = this.__leavelist[i];
+ addToPath(result, element.path);
+ }
+ addToPath(result, this.__current.path);
+ return result;
+ };
+
+ // API:
+ // return type of current node
+ Controller.prototype.type = function () {
+ var node = this.current();
+ return node.type || this.__current.wrap;
+ };
+
+ // API:
+ // return array of parent elements
+ Controller.prototype.parents = function parents() {
+ var i, iz, result;
+
+ // first node is sentinel
+ result = [];
+ for (i = 1, iz = this.__leavelist.length; i < iz; ++i) {
+ result.push(this.__leavelist[i].node);
+ }
+
+ return result;
+ };
+
+ // API:
+ // return current node
+ Controller.prototype.current = function current() {
+ return this.__current.node;
+ };
+
+ Controller.prototype.__execute = function __execute(callback, element) {
+ var previous, result;
+
+ result = undefined;
+
+ previous = this.__current;
+ this.__current = element;
+ this.__state = null;
+ if (callback) {
+ result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node);
+ }
+ this.__current = previous;
+
+ return result;
+ };
+
+ // API:
+ // notify control skip / break
+ Controller.prototype.notify = function notify(flag) {
+ this.__state = flag;
+ };
+
+ // API:
+ // skip child nodes of current node
+ Controller.prototype.skip = function () {
+ this.notify(SKIP);
+ };
+
+ // API:
+ // break traversals
+ Controller.prototype['break'] = function () {
+ this.notify(BREAK);
+ };
+
+ // API:
+ // remove node
+ Controller.prototype.remove = function () {
+ this.notify(REMOVE);
+ };
+
+ Controller.prototype.__initialize = function(root, visitor) {
+ this.visitor = visitor;
+ this.root = root;
+ this.__worklist = [];
+ this.__leavelist = [];
+ this.__current = null;
+ this.__state = null;
+ this.__fallback = null;
+ if (visitor.fallback === 'iteration') {
+ this.__fallback = Object.keys;
+ } else if (typeof visitor.fallback === 'function') {
+ this.__fallback = visitor.fallback;
+ }
+
+ this.__keys = VisitorKeys;
+ if (visitor.keys) {
+ this.__keys = Object.assign(Object.create(this.__keys), visitor.keys);
+ }
+ };
+
+ function isNode(node) {
+ if (node == null) {
+ return false;
+ }
+ return typeof node === 'object' && typeof node.type === 'string';
+ }
+
+ function isProperty(nodeType, key) {
+ return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key;
+ }
+
+ Controller.prototype.traverse = function traverse(root, visitor) {
+ var worklist,
+ leavelist,
+ element,
+ node,
+ nodeType,
+ ret,
+ key,
+ current,
+ current2,
+ candidates,
+ candidate,
+ sentinel;
+
+ this.__initialize(root, visitor);
+
+ sentinel = {};
+
+ // reference
+ worklist = this.__worklist;
+ leavelist = this.__leavelist;
+
+ // initialize
+ worklist.push(new Element(root, null, null, null));
+ leavelist.push(new Element(null, null, null, null));
+
+ while (worklist.length) {
+ element = worklist.pop();
+
+ if (element === sentinel) {
+ element = leavelist.pop();
+
+ ret = this.__execute(visitor.leave, element);
+
+ if (this.__state === BREAK || ret === BREAK) {
+ return;
+ }
+ continue;
+ }
+
+ if (element.node) {
+
+ ret = this.__execute(visitor.enter, element);
+
+ if (this.__state === BREAK || ret === BREAK) {
+ return;
+ }
+
+ worklist.push(sentinel);
+ leavelist.push(element);
+
+ if (this.__state === SKIP || ret === SKIP) {
+ continue;
+ }
+
+ node = element.node;
+ nodeType = node.type || element.wrap;
+ candidates = this.__keys[nodeType];
+ if (!candidates) {
+ if (this.__fallback) {
+ candidates = this.__fallback(node);
+ } else {
+ throw new Error('Unknown node type ' + nodeType + '.');
+ }
+ }
+
+ current = candidates.length;
+ while ((current -= 1) >= 0) {
+ key = candidates[current];
+ candidate = node[key];
+ if (!candidate) {
+ continue;
+ }
+
+ if (Array.isArray(candidate)) {
+ current2 = candidate.length;
+ while ((current2 -= 1) >= 0) {
+ if (!candidate[current2]) {
+ continue;
+ }
+ if (isProperty(nodeType, candidates[current])) {
+ element = new Element(candidate[current2], [key, current2], 'Property', null);
+ } else if (isNode(candidate[current2])) {
+ element = new Element(candidate[current2], [key, current2], null, null);
+ } else {
+ continue;
+ }
+ worklist.push(element);
+ }
+ } else if (isNode(candidate)) {
+ worklist.push(new Element(candidate, key, null, null));
+ }
+ }
+ }
+ }
+ };
+
+ Controller.prototype.replace = function replace(root, visitor) {
+ var worklist,
+ leavelist,
+ node,
+ nodeType,
+ target,
+ element,
+ current,
+ current2,
+ candidates,
+ candidate,
+ sentinel,
+ outer,
+ key;
+
+ function removeElem(element) {
+ var i,
+ key,
+ nextElem,
+ parent;
+
+ if (element.ref.remove()) {
+ // When the reference is an element of an array.
+ key = element.ref.key;
+ parent = element.ref.parent;
+
+ // If removed from array, then decrease following items' keys.
+ i = worklist.length;
+ while (i--) {
+ nextElem = worklist[i];
+ if (nextElem.ref && nextElem.ref.parent === parent) {
+ if (nextElem.ref.key < key) {
+ break;
+ }
+ --nextElem.ref.key;
+ }
+ }
+ }
+ }
+
+ this.__initialize(root, visitor);
+
+ sentinel = {};
+
+ // reference
+ worklist = this.__worklist;
+ leavelist = this.__leavelist;
+
+ // initialize
+ outer = {
+ root: root
+ };
+ element = new Element(root, null, null, new Reference(outer, 'root'));
+ worklist.push(element);
+ leavelist.push(element);
+
+ while (worklist.length) {
+ element = worklist.pop();
+
+ if (element === sentinel) {
+ element = leavelist.pop();
+
+ target = this.__execute(visitor.leave, element);
+
+ // node may be replaced with null,
+ // so distinguish between undefined and null in this place
+ if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
+ // replace
+ element.ref.replace(target);
+ }
+
+ if (this.__state === REMOVE || target === REMOVE) {
+ removeElem(element);
+ }
+
+ if (this.__state === BREAK || target === BREAK) {
+ return outer.root;
+ }
+ continue;
+ }
+
+ target = this.__execute(visitor.enter, element);
+
+ // node may be replaced with null,
+ // so distinguish between undefined and null in this place
+ if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
+ // replace
+ element.ref.replace(target);
+ element.node = target;
+ }
+
+ if (this.__state === REMOVE || target === REMOVE) {
+ removeElem(element);
+ element.node = null;
+ }
+
+ if (this.__state === BREAK || target === BREAK) {
+ return outer.root;
+ }
+
+ // node may be null
+ node = element.node;
+ if (!node) {
+ continue;
+ }
+
+ worklist.push(sentinel);
+ leavelist.push(element);
+
+ if (this.__state === SKIP || target === SKIP) {
+ continue;
+ }
+
+ nodeType = node.type || element.wrap;
+ candidates = this.__keys[nodeType];
+ if (!candidates) {
+ if (this.__fallback) {
+ candidates = this.__fallback(node);
+ } else {
+ throw new Error('Unknown node type ' + nodeType + '.');
+ }
+ }
+
+ current = candidates.length;
+ while ((current -= 1) >= 0) {
+ key = candidates[current];
+ candidate = node[key];
+ if (!candidate) {
+ continue;
+ }
+
+ if (Array.isArray(candidate)) {
+ current2 = candidate.length;
+ while ((current2 -= 1) >= 0) {
+ if (!candidate[current2]) {
+ continue;
+ }
+ if (isProperty(nodeType, candidates[current])) {
+ element = new Element(candidate[current2], [key, current2], 'Property', new Reference(candidate, current2));
+ } else if (isNode(candidate[current2])) {
+ element = new Element(candidate[current2], [key, current2], null, new Reference(candidate, current2));
+ } else {
+ continue;
+ }
+ worklist.push(element);
+ }
+ } else if (isNode(candidate)) {
+ worklist.push(new Element(candidate, key, null, new Reference(node, key)));
+ }
+ }
+ }
+
+ return outer.root;
+ };
+
+ function traverse(root, visitor) {
+ var controller = new Controller();
+ return controller.traverse(root, visitor);
+ }
+
+ function replace(root, visitor) {
+ var controller = new Controller();
+ return controller.replace(root, visitor);
+ }
+
+ function extendCommentRange(comment, tokens) {
+ var target;
+
+ target = upperBound(tokens, function search(token) {
+ return token.range[0] > comment.range[0];
+ });
+
+ comment.extendedRange = [comment.range[0], comment.range[1]];
+
+ if (target !== tokens.length) {
+ comment.extendedRange[1] = tokens[target].range[0];
+ }
+
+ target -= 1;
+ if (target >= 0) {
+ comment.extendedRange[0] = tokens[target].range[1];
+ }
+
+ return comment;
+ }
+
+ function attachComments(tree, providedComments, tokens) {
+ // At first, we should calculate extended comment ranges.
+ var comments = [], comment, len, i, cursor;
+
+ if (!tree.range) {
+ throw new Error('attachComments needs range information');
+ }
+
+ // tokens array is empty, we attach comments to tree as 'leadingComments'
+ if (!tokens.length) {
+ if (providedComments.length) {
+ for (i = 0, len = providedComments.length; i < len; i += 1) {
+ comment = deepCopy(providedComments[i]);
+ comment.extendedRange = [0, tree.range[0]];
+ comments.push(comment);
+ }
+ tree.leadingComments = comments;
+ }
+ return tree;
+ }
+
+ for (i = 0, len = providedComments.length; i < len; i += 1) {
+ comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens));
+ }
+
+ // This is based on John Freeman's implementation.
+ cursor = 0;
+ traverse(tree, {
+ enter: function (node) {
+ var comment;
+
+ while (cursor < comments.length) {
+ comment = comments[cursor];
+ if (comment.extendedRange[1] > node.range[0]) {
+ break;
+ }
+
+ if (comment.extendedRange[1] === node.range[0]) {
+ if (!node.leadingComments) {
+ node.leadingComments = [];
+ }
+ node.leadingComments.push(comment);
+ comments.splice(cursor, 1);
+ } else {
+ cursor += 1;
+ }
+ }
+
+ // already out of owned node
+ if (cursor === comments.length) {
+ return VisitorOption.Break;
+ }
+
+ if (comments[cursor].extendedRange[0] > node.range[1]) {
+ return VisitorOption.Skip;
+ }
+ }
+ });
+
+ cursor = 0;
+ traverse(tree, {
+ leave: function (node) {
+ var comment;
+
+ while (cursor < comments.length) {
+ comment = comments[cursor];
+ if (node.range[1] < comment.extendedRange[0]) {
+ break;
+ }
+
+ if (node.range[1] === comment.extendedRange[0]) {
+ if (!node.trailingComments) {
+ node.trailingComments = [];
+ }
+ node.trailingComments.push(comment);
+ comments.splice(cursor, 1);
+ } else {
+ cursor += 1;
+ }
+ }
+
+ // already out of owned node
+ if (cursor === comments.length) {
+ return VisitorOption.Break;
+ }
+
+ if (comments[cursor].extendedRange[0] > node.range[1]) {
+ return VisitorOption.Skip;
+ }
+ }
+ });
+
+ return tree;
+ }
+
+ exports.version = require$$0.version;
+ exports.Syntax = Syntax;
+ exports.traverse = traverse;
+ exports.replace = replace;
+ exports.attachComments = attachComments;
+ exports.VisitorKeys = VisitorKeys;
+ exports.VisitorOption = VisitorOption;
+ exports.Controller = Controller;
+ exports.cloneEnvironment = function () { return clone({}); };
+
+ return exports;
+}(exports));
+/* vim: set sw=4 ts=4 et tw=80 : */
+});
+
+/*
+ Copyright (C) 2013 Yusuke Suzuki
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var ast = createCommonjsModule(function (module) {
+(function () {
+ 'use strict';
+
+ function isExpression(node) {
+ if (node == null) { return false; }
+ switch (node.type) {
+ case 'ArrayExpression':
+ case 'AssignmentExpression':
+ case 'BinaryExpression':
+ case 'CallExpression':
+ case 'ConditionalExpression':
+ case 'FunctionExpression':
+ case 'Identifier':
+ case 'Literal':
+ case 'LogicalExpression':
+ case 'MemberExpression':
+ case 'NewExpression':
+ case 'ObjectExpression':
+ case 'SequenceExpression':
+ case 'ThisExpression':
+ case 'UnaryExpression':
+ case 'UpdateExpression':
+ return true;
+ }
+ return false;
+ }
+
+ function isIterationStatement(node) {
+ if (node == null) { return false; }
+ switch (node.type) {
+ case 'DoWhileStatement':
+ case 'ForInStatement':
+ case 'ForStatement':
+ case 'WhileStatement':
+ return true;
+ }
+ return false;
+ }
+
+ function isStatement(node) {
+ if (node == null) { return false; }
+ switch (node.type) {
+ case 'BlockStatement':
+ case 'BreakStatement':
+ case 'ContinueStatement':
+ case 'DebuggerStatement':
+ case 'DoWhileStatement':
+ case 'EmptyStatement':
+ case 'ExpressionStatement':
+ case 'ForInStatement':
+ case 'ForStatement':
+ case 'IfStatement':
+ case 'LabeledStatement':
+ case 'ReturnStatement':
+ case 'SwitchStatement':
+ case 'ThrowStatement':
+ case 'TryStatement':
+ case 'VariableDeclaration':
+ case 'WhileStatement':
+ case 'WithStatement':
+ return true;
+ }
+ return false;
+ }
+
+ function isSourceElement(node) {
+ return isStatement(node) || node != null && node.type === 'FunctionDeclaration';
+ }
+
+ function trailingStatement(node) {
+ switch (node.type) {
+ case 'IfStatement':
+ if (node.alternate != null) {
+ return node.alternate;
+ }
+ return node.consequent;
+
+ case 'LabeledStatement':
+ case 'ForStatement':
+ case 'ForInStatement':
+ case 'WhileStatement':
+ case 'WithStatement':
+ return node.body;
+ }
+ return null;
+ }
+
+ function isProblematicIfStatement(node) {
+ var current;
+
+ if (node.type !== 'IfStatement') {
+ return false;
+ }
+ if (node.alternate == null) {
+ return false;
+ }
+ current = node.consequent;
+ do {
+ if (current.type === 'IfStatement') {
+ if (current.alternate == null) {
+ return true;
+ }
+ }
+ current = trailingStatement(current);
+ } while (current);
+
+ return false;
+ }
+
+ module.exports = {
+ isExpression: isExpression,
+ isStatement: isStatement,
+ isIterationStatement: isIterationStatement,
+ isSourceElement: isSourceElement,
+ isProblematicIfStatement: isProblematicIfStatement,
+
+ trailingStatement: trailingStatement
+ };
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
+});
+
+/*
+ Copyright (C) 2013-2014 Yusuke Suzuki
+ Copyright (C) 2014 Ivan Nikulin
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var code = createCommonjsModule(function (module) {
+(function () {
+ 'use strict';
+
+ var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch;
+
+ // See `tools/generate-identifier-regex.js`.
+ ES5Regex = {
+ // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierStart:
+ NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,
+ // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierPart:
+ NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/
+ };
+
+ ES6Regex = {
+ // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierStart:
+ NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
+ // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierPart:
+ NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
+ };
+
+ function isDecimalDigit(ch) {
+ return 0x30 <= ch && ch <= 0x39; // 0..9
+ }
+
+ function isHexDigit(ch) {
+ return 0x30 <= ch && ch <= 0x39 || // 0..9
+ 0x61 <= ch && ch <= 0x66 || // a..f
+ 0x41 <= ch && ch <= 0x46; // A..F
+ }
+
+ function isOctalDigit(ch) {
+ return ch >= 0x30 && ch <= 0x37; // 0..7
+ }
+
+ // 7.2 White Space
+
+ NON_ASCII_WHITESPACES = [
+ 0x1680,
+ 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A,
+ 0x202F, 0x205F,
+ 0x3000,
+ 0xFEFF
+ ];
+
+ function isWhiteSpace(ch) {
+ return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 ||
+ ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0;
+ }
+
+ // 7.3 Line Terminators
+
+ function isLineTerminator(ch) {
+ return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;
+ }
+
+ // 7.6 Identifier Names and Identifiers
+
+ function fromCodePoint(cp) {
+ if (cp <= 0xFFFF) { return String.fromCharCode(cp); }
+ var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800);
+ var cu2 = String.fromCharCode(((cp - 0x10000) % 0x400) + 0xDC00);
+ return cu1 + cu2;
+ }
+
+ IDENTIFIER_START = new Array(0x80);
+ for(ch = 0; ch < 0x80; ++ch) {
+ IDENTIFIER_START[ch] =
+ ch >= 0x61 && ch <= 0x7A || // a..z
+ ch >= 0x41 && ch <= 0x5A || // A..Z
+ ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore)
+ }
+
+ IDENTIFIER_PART = new Array(0x80);
+ for(ch = 0; ch < 0x80; ++ch) {
+ IDENTIFIER_PART[ch] =
+ ch >= 0x61 && ch <= 0x7A || // a..z
+ ch >= 0x41 && ch <= 0x5A || // A..Z
+ ch >= 0x30 && ch <= 0x39 || // 0..9
+ ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore)
+ }
+
+ function isIdentifierStartES5(ch) {
+ return ch < 0x80 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
+ }
+
+ function isIdentifierPartES5(ch) {
+ return ch < 0x80 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
+ }
+
+ function isIdentifierStartES6(ch) {
+ return ch < 0x80 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
+ }
+
+ function isIdentifierPartES6(ch) {
+ return ch < 0x80 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
+ }
+
+ module.exports = {
+ isDecimalDigit: isDecimalDigit,
+ isHexDigit: isHexDigit,
+ isOctalDigit: isOctalDigit,
+ isWhiteSpace: isWhiteSpace,
+ isLineTerminator: isLineTerminator,
+ isIdentifierStartES5: isIdentifierStartES5,
+ isIdentifierPartES5: isIdentifierPartES5,
+ isIdentifierStartES6: isIdentifierStartES6,
+ isIdentifierPartES6: isIdentifierPartES6
+ };
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
+});
+
+/*
+ Copyright (C) 2013 Yusuke Suzuki
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var keyword = createCommonjsModule(function (module) {
+(function () {
+ 'use strict';
+
+ var code$1 = code;
+
+ function isStrictModeReservedWordES6(id) {
+ switch (id) {
+ case 'implements':
+ case 'interface':
+ case 'package':
+ case 'private':
+ case 'protected':
+ case 'public':
+ case 'static':
+ case 'let':
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ function isKeywordES5(id, strict) {
+ // yield should not be treated as keyword under non-strict mode.
+ if (!strict && id === 'yield') {
+ return false;
+ }
+ return isKeywordES6(id, strict);
+ }
+
+ function isKeywordES6(id, strict) {
+ if (strict && isStrictModeReservedWordES6(id)) {
+ return true;
+ }
+
+ switch (id.length) {
+ case 2:
+ return (id === 'if') || (id === 'in') || (id === 'do');
+ case 3:
+ return (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try');
+ case 4:
+ return (id === 'this') || (id === 'else') || (id === 'case') ||
+ (id === 'void') || (id === 'with') || (id === 'enum');
+ case 5:
+ return (id === 'while') || (id === 'break') || (id === 'catch') ||
+ (id === 'throw') || (id === 'const') || (id === 'yield') ||
+ (id === 'class') || (id === 'super');
+ case 6:
+ return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
+ (id === 'switch') || (id === 'export') || (id === 'import');
+ case 7:
+ return (id === 'default') || (id === 'finally') || (id === 'extends');
+ case 8:
+ return (id === 'function') || (id === 'continue') || (id === 'debugger');
+ case 10:
+ return (id === 'instanceof');
+ default:
+ return false;
+ }
+ }
+
+ function isReservedWordES5(id, strict) {
+ return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict);
+ }
+
+ function isReservedWordES6(id, strict) {
+ return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict);
+ }
+
+ function isRestrictedWord(id) {
+ return id === 'eval' || id === 'arguments';
+ }
+
+ function isIdentifierNameES5(id) {
+ var i, iz, ch;
+
+ if (id.length === 0) { return false; }
+
+ ch = id.charCodeAt(0);
+ if (!code$1.isIdentifierStartES5(ch)) {
+ return false;
+ }
+
+ for (i = 1, iz = id.length; i < iz; ++i) {
+ ch = id.charCodeAt(i);
+ if (!code$1.isIdentifierPartES5(ch)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function decodeUtf16(lead, trail) {
+ return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
+ }
+
+ function isIdentifierNameES6(id) {
+ var i, iz, ch, lowCh, check;
+
+ if (id.length === 0) { return false; }
+
+ check = code$1.isIdentifierStartES6;
+ for (i = 0, iz = id.length; i < iz; ++i) {
+ ch = id.charCodeAt(i);
+ if (0xD800 <= ch && ch <= 0xDBFF) {
+ ++i;
+ if (i >= iz) { return false; }
+ lowCh = id.charCodeAt(i);
+ if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) {
+ return false;
+ }
+ ch = decodeUtf16(ch, lowCh);
+ }
+ if (!check(ch)) {
+ return false;
+ }
+ check = code$1.isIdentifierPartES6;
+ }
+ return true;
+ }
+
+ function isIdentifierES5(id, strict) {
+ return isIdentifierNameES5(id) && !isReservedWordES5(id, strict);
+ }
+
+ function isIdentifierES6(id, strict) {
+ return isIdentifierNameES6(id) && !isReservedWordES6(id, strict);
+ }
+
+ module.exports = {
+ isKeywordES5: isKeywordES5,
+ isKeywordES6: isKeywordES6,
+ isReservedWordES5: isReservedWordES5,
+ isReservedWordES6: isReservedWordES6,
+ isRestrictedWord: isRestrictedWord,
+ isIdentifierNameES5: isIdentifierNameES5,
+ isIdentifierNameES6: isIdentifierNameES6,
+ isIdentifierES5: isIdentifierES5,
+ isIdentifierES6: isIdentifierES6
+ };
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
+});
+
+/*
+ Copyright (C) 2013 Yusuke Suzuki
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var utils = createCommonjsModule(function (module, exports) {
+(function () {
+ 'use strict';
+
+ exports.ast = ast;
+ exports.code = code;
+ exports.keyword = keyword;
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
+});
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
+
+/**
+ * Encode an integer in the range of 0 to 63 to a single base 64 digit.
+ */
+var encode$1 = function (number) {
+ if (0 <= number && number < intToCharMap.length) {
+ return intToCharMap[number];
+ }
+ throw new TypeError("Must be between 0 and 63: " + number);
+};
+
+/**
+ * Decode a single base 64 character code digit to an integer. Returns -1 on
+ * failure.
+ */
+var decode$1 = function (charCode) {
+ var bigA = 65; // 'A'
+ var bigZ = 90; // 'Z'
+
+ var littleA = 97; // 'a'
+ var littleZ = 122; // 'z'
+
+ var zero = 48; // '0'
+ var nine = 57; // '9'
+
+ var plus = 43; // '+'
+ var slash = 47; // '/'
+
+ var littleOffset = 26;
+ var numberOffset = 52;
+
+ // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ if (bigA <= charCode && charCode <= bigZ) {
+ return (charCode - bigA);
+ }
+
+ // 26 - 51: abcdefghijklmnopqrstuvwxyz
+ if (littleA <= charCode && charCode <= littleZ) {
+ return (charCode - littleA + littleOffset);
+ }
+
+ // 52 - 61: 0123456789
+ if (zero <= charCode && charCode <= nine) {
+ return (charCode - zero + numberOffset);
+ }
+
+ // 62: +
+ if (charCode == plus) {
+ return 62;
+ }
+
+ // 63: /
+ if (charCode == slash) {
+ return 63;
+ }
+
+ // Invalid base64 digit.
+ return -1;
+};
+
+var base64 = {
+ encode: encode$1,
+ decode: decode$1
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ *
+ * Based on the Base 64 VLQ implementation in Closure Compiler:
+ * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
+ *
+ * Copyright 2011 The Closure Compiler Authors. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+
+// A single base 64 digit can contain 6 bits of data. For the base 64 variable
+// length quantities we use in the source map spec, the first bit is the sign,
+// the next four bits are the actual value, and the 6th bit is the
+// continuation bit. The continuation bit tells us whether there are more
+// digits in this value following this digit.
+//
+// Continuation
+// | Sign
+// | |
+// V V
+// 101011
+
+var VLQ_BASE_SHIFT = 5;
+
+// binary: 100000
+var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+
+// binary: 011111
+var VLQ_BASE_MASK = VLQ_BASE - 1;
+
+// binary: 100000
+var VLQ_CONTINUATION_BIT = VLQ_BASE;
+
+/**
+ * Converts from a two-complement value to a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+ * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+ */
+function toVLQSigned(aValue) {
+ return aValue < 0
+ ? ((-aValue) << 1) + 1
+ : (aValue << 1) + 0;
+}
+
+/**
+ * Converts to a two-complement value from a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
+ * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
+ */
+function fromVLQSigned(aValue) {
+ var isNegative = (aValue & 1) === 1;
+ var shifted = aValue >> 1;
+ return isNegative
+ ? -shifted
+ : shifted;
+}
+
+/**
+ * Returns the base 64 VLQ encoded value.
+ */
+var encode = function base64VLQ_encode(aValue) {
+ var encoded = "";
+ var digit;
+
+ var vlq = toVLQSigned(aValue);
+
+ do {
+ digit = vlq & VLQ_BASE_MASK;
+ vlq >>>= VLQ_BASE_SHIFT;
+ if (vlq > 0) {
+ // There are still more digits in this value, so we must make sure the
+ // continuation bit is marked.
+ digit |= VLQ_CONTINUATION_BIT;
+ }
+ encoded += base64.encode(digit);
+ } while (vlq > 0);
+
+ return encoded;
+};
+
+/**
+ * Decodes the next base 64 VLQ value from the given string and returns the
+ * value and the rest of the string via the out parameter.
+ */
+var decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
+ var strLen = aStr.length;
+ var result = 0;
+ var shift = 0;
+ var continuation, digit;
+
+ do {
+ if (aIndex >= strLen) {
+ throw new Error("Expected more digits in base 64 VLQ value.");
+ }
+
+ digit = base64.decode(aStr.charCodeAt(aIndex++));
+ if (digit === -1) {
+ throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
+ }
+
+ continuation = !!(digit & VLQ_CONTINUATION_BIT);
+ digit &= VLQ_BASE_MASK;
+ result = result + (digit << shift);
+ shift += VLQ_BASE_SHIFT;
+ } while (continuation);
+
+ aOutParam.value = fromVLQSigned(result);
+ aOutParam.rest = aIndex;
+};
+
+var base64Vlq = {
+ encode: encode,
+ decode: decode
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+var util = createCommonjsModule(function (module, exports) {
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+/**
+ * This is a helper function for getting values from parameter/options
+ * objects.
+ *
+ * @param args The object we are extracting values from
+ * @param name The name of the property we are getting.
+ * @param defaultValue An optional value to return if the property is missing
+ * from the object. If this is not specified and the property is missing, an
+ * error will be thrown.
+ */
+function getArg(aArgs, aName, aDefaultValue) {
+ if (aName in aArgs) {
+ return aArgs[aName];
+ } else if (arguments.length === 3) {
+ return aDefaultValue;
+ } else {
+ throw new Error('"' + aName + '" is a required argument.');
+ }
+}
+exports.getArg = getArg;
+
+var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
+var dataUrlRegexp = /^data:.+\,.+$/;
+
+function urlParse(aUrl) {
+ var match = aUrl.match(urlRegexp);
+ if (!match) {
+ return null;
+ }
+ return {
+ scheme: match[1],
+ auth: match[2],
+ host: match[3],
+ port: match[4],
+ path: match[5]
+ };
+}
+exports.urlParse = urlParse;
+
+function urlGenerate(aParsedUrl) {
+ var url = '';
+ if (aParsedUrl.scheme) {
+ url += aParsedUrl.scheme + ':';
+ }
+ url += '//';
+ if (aParsedUrl.auth) {
+ url += aParsedUrl.auth + '@';
+ }
+ if (aParsedUrl.host) {
+ url += aParsedUrl.host;
+ }
+ if (aParsedUrl.port) {
+ url += ":" + aParsedUrl.port;
+ }
+ if (aParsedUrl.path) {
+ url += aParsedUrl.path;
+ }
+ return url;
+}
+exports.urlGenerate = urlGenerate;
+
+/**
+ * Normalizes a path, or the path portion of a URL:
+ *
+ * - Replaces consecutive slashes with one slash.
+ * - Removes unnecessary '.' parts.
+ * - Removes unnecessary '/..' parts.
+ *
+ * Based on code in the Node.js 'path' core module.
+ *
+ * @param aPath The path or url to normalize.
+ */
+function normalize(aPath) {
+ var path = aPath;
+ var url = urlParse(aPath);
+ if (url) {
+ if (!url.path) {
+ return aPath;
+ }
+ path = url.path;
+ }
+ var isAbsolute = exports.isAbsolute(path);
+
+ var parts = path.split(/\/+/);
+ for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
+ part = parts[i];
+ if (part === '.') {
+ parts.splice(i, 1);
+ } else if (part === '..') {
+ up++;
+ } else if (up > 0) {
+ if (part === '') {
+ // The first part is blank if the path is absolute. Trying to go
+ // above the root is a no-op. Therefore we can remove all '..' parts
+ // directly after the root.
+ parts.splice(i + 1, up);
+ up = 0;
+ } else {
+ parts.splice(i, 2);
+ up--;
+ }
+ }
+ }
+ path = parts.join('/');
+
+ if (path === '') {
+ path = isAbsolute ? '/' : '.';
+ }
+
+ if (url) {
+ url.path = path;
+ return urlGenerate(url);
+ }
+ return path;
+}
+exports.normalize = normalize;
+
+/**
+ * Joins two paths/URLs.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be joined with the root.
+ *
+ * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
+ * scheme-relative URL: Then the scheme of aRoot, if any, is prepended
+ * first.
+ * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
+ * is updated with the result and aRoot is returned. Otherwise the result
+ * is returned.
+ * - If aPath is absolute, the result is aPath.
+ * - Otherwise the two paths are joined with a slash.
+ * - Joining for example 'http://' and 'www.example.com' is also supported.
+ */
+function join(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+ if (aPath === "") {
+ aPath = ".";
+ }
+ var aPathUrl = urlParse(aPath);
+ var aRootUrl = urlParse(aRoot);
+ if (aRootUrl) {
+ aRoot = aRootUrl.path || '/';
+ }
+
+ // `join(foo, '//www.example.org')`
+ if (aPathUrl && !aPathUrl.scheme) {
+ if (aRootUrl) {
+ aPathUrl.scheme = aRootUrl.scheme;
+ }
+ return urlGenerate(aPathUrl);
+ }
+
+ if (aPathUrl || aPath.match(dataUrlRegexp)) {
+ return aPath;
+ }
+
+ // `join('http://', 'www.example.com')`
+ if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
+ aRootUrl.host = aPath;
+ return urlGenerate(aRootUrl);
+ }
+
+ var joined = aPath.charAt(0) === '/'
+ ? aPath
+ : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
+
+ if (aRootUrl) {
+ aRootUrl.path = joined;
+ return urlGenerate(aRootUrl);
+ }
+ return joined;
+}
+exports.join = join;
+
+exports.isAbsolute = function (aPath) {
+ return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
+};
+
+/**
+ * Make a path relative to a URL or another path.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be made relative to aRoot.
+ */
+function relative(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+
+ aRoot = aRoot.replace(/\/$/, '');
+
+ // It is possible for the path to be above the root. In this case, simply
+ // checking whether the root is a prefix of the path won't work. Instead, we
+ // need to remove components from the root one by one, until either we find
+ // a prefix that fits, or we run out of components to remove.
+ var level = 0;
+ while (aPath.indexOf(aRoot + '/') !== 0) {
+ var index = aRoot.lastIndexOf("/");
+ if (index < 0) {
+ return aPath;
+ }
+
+ // If the only part of the root that is left is the scheme (i.e. http://,
+ // file:///, etc.), one or more slashes (/), or simply nothing at all, we
+ // have exhausted all components, so the path is not relative to the root.
+ aRoot = aRoot.slice(0, index);
+ if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
+ return aPath;
+ }
+
+ ++level;
+ }
+
+ // Make sure we add a "../" for each component we removed from the root.
+ return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
+}
+exports.relative = relative;
+
+var supportsNullProto = (function () {
+ var obj = Object.create(null);
+ return !('__proto__' in obj);
+}());
+
+function identity (s) {
+ return s;
+}
+
+/**
+ * Because behavior goes wacky when you set `__proto__` on objects, we
+ * have to prefix all the strings in our set with an arbitrary character.
+ *
+ * See https://github.com/mozilla/source-map/pull/31 and
+ * https://github.com/mozilla/source-map/issues/30
+ *
+ * @param String aStr
+ */
+function toSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return '$' + aStr;
+ }
+
+ return aStr;
+}
+exports.toSetString = supportsNullProto ? identity : toSetString;
+
+function fromSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return aStr.slice(1);
+ }
+
+ return aStr;
+}
+exports.fromSetString = supportsNullProto ? identity : fromSetString;
+
+function isProtoString(s) {
+ if (!s) {
+ return false;
+ }
+
+ var length = s.length;
+
+ if (length < 9 /* "__proto__".length */) {
+ return false;
+ }
+
+ if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 2) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 4) !== 116 /* 't' */ ||
+ s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
+ s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
+ s.charCodeAt(length - 8) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 9) !== 95 /* '_' */) {
+ return false;
+ }
+
+ for (var i = length - 10; i >= 0; i--) {
+ if (s.charCodeAt(i) !== 36 /* '$' */) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Comparator between two mappings where the original positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same original source/line/column, but different generated
+ * line and column the same. Useful when searching for a mapping with a
+ * stubbed out mapping.
+ */
+function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
+ var cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByOriginalPositions = compareByOriginalPositions;
+
+/**
+ * Comparator between two mappings with deflated source and name indices where
+ * the generated positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same generated line and column, but different
+ * source/name/original line and column the same. Useful when searching for a
+ * mapping with a stubbed out mapping.
+ */
+function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0 || onlyCompareGenerated) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 === null) {
+ return 1; // aStr2 !== null
+ }
+
+ if (aStr2 === null) {
+ return -1; // aStr1 !== null
+ }
+
+ if (aStr1 > aStr2) {
+ return 1;
+ }
+
+ return -1;
+}
+
+/**
+ * Comparator between two mappings with inflated source and name strings where
+ * the generated positions are compared.
+ */
+function compareByGeneratedPositionsInflated(mappingA, mappingB) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
+
+/**
+ * Strip any JSON XSSI avoidance prefix from the string (as documented
+ * in the source maps specification), and then parse the string as
+ * JSON.
+ */
+function parseSourceMapInput(str) {
+ return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
+}
+exports.parseSourceMapInput = parseSourceMapInput;
+
+/**
+ * Compute the URL of a source given the the source root, the source's
+ * URL, and the source map's URL.
+ */
+function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+ sourceURL = sourceURL || '';
+
+ if (sourceRoot) {
+ // This follows what Chrome does.
+ if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
+ sourceRoot += '/';
+ }
+ // The spec says:
+ // Line 4: An optional source root, useful for relocating source
+ // files on a server or removing repeated values in the
+ // “sources” entry. This value is prepended to the individual
+ // entries in the “source” field.
+ sourceURL = sourceRoot + sourceURL;
+ }
+
+ // Historically, SourceMapConsumer did not take the sourceMapURL as
+ // a parameter. This mode is still somewhat supported, which is why
+ // this code block is conditional. However, it's preferable to pass
+ // the source map URL to SourceMapConsumer, so that this function
+ // can implement the source URL resolution algorithm as outlined in
+ // the spec. This block is basically the equivalent of:
+ // new URL(sourceURL, sourceMapURL).toString()
+ // ... except it avoids using URL, which wasn't available in the
+ // older releases of node still supported by this library.
+ //
+ // The spec says:
+ // If the sources are not absolute URLs after prepending of the
+ // “sourceRoot”, the sources are resolved relative to the
+ // SourceMap (like resolving script src in a html document).
+ if (sourceMapURL) {
+ var parsed = urlParse(sourceMapURL);
+ if (!parsed) {
+ throw new Error("sourceMapURL could not be parsed");
+ }
+ if (parsed.path) {
+ // Strip the last path component, but keep the "/".
+ var index = parsed.path.lastIndexOf('/');
+ if (index >= 0) {
+ parsed.path = parsed.path.substring(0, index + 1);
+ }
+ }
+ sourceURL = join(urlGenerate(parsed), sourceURL);
+ }
+
+ return normalize(sourceURL);
+}
+exports.computeSourceURL = computeSourceURL;
+});
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+var has = Object.prototype.hasOwnProperty;
+var hasNativeMap = typeof Map !== "undefined";
+
+/**
+ * A data structure which is a combination of an array and a set. Adding a new
+ * member is O(1), testing for membership is O(1), and finding the index of an
+ * element is O(1). Removing elements from the set is not supported. Only
+ * strings are supported for membership.
+ */
+function ArraySet$2() {
+ this._array = [];
+ this._set = hasNativeMap ? new Map() : Object.create(null);
+}
+
+/**
+ * Static method for creating ArraySet instances from an existing array.
+ */
+ArraySet$2.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
+ var set = new ArraySet$2();
+ for (var i = 0, len = aArray.length; i < len; i++) {
+ set.add(aArray[i], aAllowDuplicates);
+ }
+ return set;
+};
+
+/**
+ * Return how many unique items are in this ArraySet. If duplicates have been
+ * added, than those do not count towards the size.
+ *
+ * @returns Number
+ */
+ArraySet$2.prototype.size = function ArraySet_size() {
+ return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
+};
+
+/**
+ * Add the given string to this set.
+ *
+ * @param String aStr
+ */
+ArraySet$2.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
+ var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
+ var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
+ var idx = this._array.length;
+ if (!isDuplicate || aAllowDuplicates) {
+ this._array.push(aStr);
+ }
+ if (!isDuplicate) {
+ if (hasNativeMap) {
+ this._set.set(aStr, idx);
+ } else {
+ this._set[sStr] = idx;
+ }
+ }
+};
+
+/**
+ * Is the given string a member of this set?
+ *
+ * @param String aStr
+ */
+ArraySet$2.prototype.has = function ArraySet_has(aStr) {
+ if (hasNativeMap) {
+ return this._set.has(aStr);
+ } else {
+ var sStr = util.toSetString(aStr);
+ return has.call(this._set, sStr);
+ }
+};
+
+/**
+ * What is the index of the given string in the array?
+ *
+ * @param String aStr
+ */
+ArraySet$2.prototype.indexOf = function ArraySet_indexOf(aStr) {
+ if (hasNativeMap) {
+ var idx = this._set.get(aStr);
+ if (idx >= 0) {
+ return idx;
+ }
+ } else {
+ var sStr = util.toSetString(aStr);
+ if (has.call(this._set, sStr)) {
+ return this._set[sStr];
+ }
+ }
+
+ throw new Error('"' + aStr + '" is not in the set.');
+};
+
+/**
+ * What is the element at the given index?
+ *
+ * @param Number aIdx
+ */
+ArraySet$2.prototype.at = function ArraySet_at(aIdx) {
+ if (aIdx >= 0 && aIdx < this._array.length) {
+ return this._array[aIdx];
+ }
+ throw new Error('No element indexed by ' + aIdx);
+};
+
+/**
+ * Returns the array representation of this set (which has the proper indices
+ * indicated by indexOf). Note that this is a copy of the internal array used
+ * for storing the members so that no one can mess with internal state.
+ */
+ArraySet$2.prototype.toArray = function ArraySet_toArray() {
+ return this._array.slice();
+};
+
+var ArraySet_1 = ArraySet$2;
+
+var arraySet = {
+ ArraySet: ArraySet_1
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+/*
+ * Copyright 2014 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+
+/**
+ * Determine whether mappingB is after mappingA with respect to generated
+ * position.
+ */
+function generatedPositionAfter(mappingA, mappingB) {
+ // Optimized for most common case
+ var lineA = mappingA.generatedLine;
+ var lineB = mappingB.generatedLine;
+ var columnA = mappingA.generatedColumn;
+ var columnB = mappingB.generatedColumn;
+ return lineB > lineA || lineB == lineA && columnB >= columnA ||
+ util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
+}
+
+/**
+ * A data structure to provide a sorted view of accumulated mappings in a
+ * performance conscious manner. It trades a neglibable overhead in general
+ * case for a large speedup in case of mappings being added in order.
+ */
+function MappingList$1() {
+ this._array = [];
+ this._sorted = true;
+ // Serves as infimum
+ this._last = {generatedLine: -1, generatedColumn: 0};
+}
+
+/**
+ * Iterate through internal items. This method takes the same arguments that
+ * `Array.prototype.forEach` takes.
+ *
+ * NOTE: The order of the mappings is NOT guaranteed.
+ */
+MappingList$1.prototype.unsortedForEach =
+ function MappingList_forEach(aCallback, aThisArg) {
+ this._array.forEach(aCallback, aThisArg);
+ };
+
+/**
+ * Add the given source mapping.
+ *
+ * @param Object aMapping
+ */
+MappingList$1.prototype.add = function MappingList_add(aMapping) {
+ if (generatedPositionAfter(this._last, aMapping)) {
+ this._last = aMapping;
+ this._array.push(aMapping);
+ } else {
+ this._sorted = false;
+ this._array.push(aMapping);
+ }
+};
+
+/**
+ * Returns the flat, sorted array of mappings. The mappings are sorted by
+ * generated position.
+ *
+ * WARNING: This method returns internal data without copying, for
+ * performance. The return value must NOT be mutated, and should be treated as
+ * an immutable borrow. If you want to take ownership, you must make your own
+ * copy.
+ */
+MappingList$1.prototype.toArray = function MappingList_toArray() {
+ if (!this._sorted) {
+ this._array.sort(util.compareByGeneratedPositionsInflated);
+ this._sorted = true;
+ }
+ return this._array;
+};
+
+var MappingList_1 = MappingList$1;
+
+var mappingList = {
+ MappingList: MappingList_1
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+
+var ArraySet$1 = arraySet.ArraySet;
+var MappingList = mappingList.MappingList;
+
+/**
+ * An instance of the SourceMapGenerator represents a source map which is
+ * being built incrementally. You may pass an object with the following
+ * properties:
+ *
+ * - file: The filename of the generated source.
+ * - sourceRoot: A root for all relative URLs in this source map.
+ */
+function SourceMapGenerator$2(aArgs) {
+ if (!aArgs) {
+ aArgs = {};
+ }
+ this._file = util.getArg(aArgs, 'file', null);
+ this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
+ this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
+ this._sources = new ArraySet$1();
+ this._names = new ArraySet$1();
+ this._mappings = new MappingList();
+ this._sourcesContents = null;
+}
+
+SourceMapGenerator$2.prototype._version = 3;
+
+/**
+ * Creates a new SourceMapGenerator based on a SourceMapConsumer
+ *
+ * @param aSourceMapConsumer The SourceMap.
+ */
+SourceMapGenerator$2.fromSourceMap =
+ function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
+ var sourceRoot = aSourceMapConsumer.sourceRoot;
+ var generator = new SourceMapGenerator$2({
+ file: aSourceMapConsumer.file,
+ sourceRoot: sourceRoot
+ });
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ var newMapping = {
+ generated: {
+ line: mapping.generatedLine,
+ column: mapping.generatedColumn
+ }
+ };
+
+ if (mapping.source != null) {
+ newMapping.source = mapping.source;
+ if (sourceRoot != null) {
+ newMapping.source = util.relative(sourceRoot, newMapping.source);
+ }
+
+ newMapping.original = {
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ };
+
+ if (mapping.name != null) {
+ newMapping.name = mapping.name;
+ }
+ }
+
+ generator.addMapping(newMapping);
+ });
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var sourceRelative = sourceFile;
+ if (sourceRoot !== null) {
+ sourceRelative = util.relative(sourceRoot, sourceFile);
+ }
+
+ if (!generator._sources.has(sourceRelative)) {
+ generator._sources.add(sourceRelative);
+ }
+
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ generator.setSourceContent(sourceFile, content);
+ }
+ });
+ return generator;
+ };
+
+/**
+ * Add a single mapping from original source line and column to the generated
+ * source's line and column for this source map being created. The mapping
+ * object should have the following properties:
+ *
+ * - generated: An object with the generated line and column positions.
+ * - original: An object with the original line and column positions.
+ * - source: The original source file (relative to the sourceRoot).
+ * - name: An optional original token name for this mapping.
+ */
+SourceMapGenerator$2.prototype.addMapping =
+ function SourceMapGenerator_addMapping(aArgs) {
+ var generated = util.getArg(aArgs, 'generated');
+ var original = util.getArg(aArgs, 'original', null);
+ var source = util.getArg(aArgs, 'source', null);
+ var name = util.getArg(aArgs, 'name', null);
+
+ if (!this._skipValidation) {
+ this._validateMapping(generated, original, source, name);
+ }
+
+ if (source != null) {
+ source = String(source);
+ if (!this._sources.has(source)) {
+ this._sources.add(source);
+ }
+ }
+
+ if (name != null) {
+ name = String(name);
+ if (!this._names.has(name)) {
+ this._names.add(name);
+ }
+ }
+
+ this._mappings.add({
+ generatedLine: generated.line,
+ generatedColumn: generated.column,
+ originalLine: original != null && original.line,
+ originalColumn: original != null && original.column,
+ source: source,
+ name: name
+ });
+ };
+
+/**
+ * Set the source content for a source file.
+ */
+SourceMapGenerator$2.prototype.setSourceContent =
+ function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
+ var source = aSourceFile;
+ if (this._sourceRoot != null) {
+ source = util.relative(this._sourceRoot, source);
+ }
+
+ if (aSourceContent != null) {
+ // Add the source content to the _sourcesContents map.
+ // Create a new _sourcesContents map if the property is null.
+ if (!this._sourcesContents) {
+ this._sourcesContents = Object.create(null);
+ }
+ this._sourcesContents[util.toSetString(source)] = aSourceContent;
+ } else if (this._sourcesContents) {
+ // Remove the source file from the _sourcesContents map.
+ // If the _sourcesContents map is empty, set the property to null.
+ delete this._sourcesContents[util.toSetString(source)];
+ if (Object.keys(this._sourcesContents).length === 0) {
+ this._sourcesContents = null;
+ }
+ }
+ };
+
+/**
+ * Applies the mappings of a sub-source-map for a specific source file to the
+ * source map being generated. Each mapping to the supplied source file is
+ * rewritten using the supplied source map. Note: The resolution for the
+ * resulting mappings is the minimium of this map and the supplied map.
+ *
+ * @param aSourceMapConsumer The source map to be applied.
+ * @param aSourceFile Optional. The filename of the source file.
+ * If omitted, SourceMapConsumer's file property will be used.
+ * @param aSourceMapPath Optional. The dirname of the path to the source map
+ * to be applied. If relative, it is relative to the SourceMapConsumer.
+ * This parameter is needed when the two source maps aren't in the same
+ * directory, and the source map to be applied contains relative source
+ * paths. If so, those relative source paths need to be rewritten
+ * relative to the SourceMapGenerator.
+ */
+SourceMapGenerator$2.prototype.applySourceMap =
+ function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
+ var sourceFile = aSourceFile;
+ // If aSourceFile is omitted, we will use the file property of the SourceMap
+ if (aSourceFile == null) {
+ if (aSourceMapConsumer.file == null) {
+ throw new Error(
+ 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
+ 'or the source map\'s "file" property. Both were omitted.'
+ );
+ }
+ sourceFile = aSourceMapConsumer.file;
+ }
+ var sourceRoot = this._sourceRoot;
+ // Make "sourceFile" relative if an absolute Url is passed.
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ // Applying the SourceMap can add and remove items from the sources and
+ // the names array.
+ var newSources = new ArraySet$1();
+ var newNames = new ArraySet$1();
+
+ // Find mappings for the "sourceFile"
+ this._mappings.unsortedForEach(function (mapping) {
+ if (mapping.source === sourceFile && mapping.originalLine != null) {
+ // Check if it can be mapped by the source map, then update the mapping.
+ var original = aSourceMapConsumer.originalPositionFor({
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ });
+ if (original.source != null) {
+ // Copy mapping
+ mapping.source = original.source;
+ if (aSourceMapPath != null) {
+ mapping.source = util.join(aSourceMapPath, mapping.source);
+ }
+ if (sourceRoot != null) {
+ mapping.source = util.relative(sourceRoot, mapping.source);
+ }
+ mapping.originalLine = original.line;
+ mapping.originalColumn = original.column;
+ if (original.name != null) {
+ mapping.name = original.name;
+ }
+ }
+ }
+
+ var source = mapping.source;
+ if (source != null && !newSources.has(source)) {
+ newSources.add(source);
+ }
+
+ var name = mapping.name;
+ if (name != null && !newNames.has(name)) {
+ newNames.add(name);
+ }
+
+ }, this);
+ this._sources = newSources;
+ this._names = newNames;
+
+ // Copy sourcesContents of applied map.
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aSourceMapPath != null) {
+ sourceFile = util.join(aSourceMapPath, sourceFile);
+ }
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ this.setSourceContent(sourceFile, content);
+ }
+ }, this);
+ };
+
+/**
+ * A mapping can have one of the three levels of data:
+ *
+ * 1. Just the generated position.
+ * 2. The Generated position, original position, and original source.
+ * 3. Generated and original position, original source, as well as a name
+ * token.
+ *
+ * To maintain consistency, we validate that any new mapping being added falls
+ * in to one of these categories.
+ */
+SourceMapGenerator$2.prototype._validateMapping =
+ function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
+ aName) {
+ // When aOriginal is truthy but has empty values for .line and .column,
+ // it is most likely a programmer error. In this case we throw a very
+ // specific error message to try to guide them the right way.
+ // For example: https://github.com/Polymer/polymer-bundler/pull/519
+ if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
+ throw new Error(
+ 'original.line and original.column are not numbers -- you probably meant to omit ' +
+ 'the original mapping entirely and only map the generated position. If so, pass ' +
+ 'null for the original mapping instead of an object with empty or null values.'
+ );
+ }
+
+ if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && !aOriginal && !aSource && !aName) {
+ // Case 1.
+ return;
+ }
+ else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aOriginal && 'line' in aOriginal && 'column' in aOriginal
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && aOriginal.line > 0 && aOriginal.column >= 0
+ && aSource) {
+ // Cases 2 and 3.
+ return;
+ }
+ else {
+ throw new Error('Invalid mapping: ' + JSON.stringify({
+ generated: aGenerated,
+ source: aSource,
+ original: aOriginal,
+ name: aName
+ }));
+ }
+ };
+
+/**
+ * Serialize the accumulated mappings in to the stream of base 64 VLQs
+ * specified by the source map format.
+ */
+SourceMapGenerator$2.prototype._serializeMappings =
+ function SourceMapGenerator_serializeMappings() {
+ var previousGeneratedColumn = 0;
+ var previousGeneratedLine = 1;
+ var previousOriginalColumn = 0;
+ var previousOriginalLine = 0;
+ var previousName = 0;
+ var previousSource = 0;
+ var result = '';
+ var next;
+ var mapping;
+ var nameIdx;
+ var sourceIdx;
+
+ var mappings = this._mappings.toArray();
+ for (var i = 0, len = mappings.length; i < len; i++) {
+ mapping = mappings[i];
+ next = '';
+
+ if (mapping.generatedLine !== previousGeneratedLine) {
+ previousGeneratedColumn = 0;
+ while (mapping.generatedLine !== previousGeneratedLine) {
+ next += ';';
+ previousGeneratedLine++;
+ }
+ }
+ else {
+ if (i > 0) {
+ if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
+ continue;
+ }
+ next += ',';
+ }
+ }
+
+ next += base64Vlq.encode(mapping.generatedColumn
+ - previousGeneratedColumn);
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (mapping.source != null) {
+ sourceIdx = this._sources.indexOf(mapping.source);
+ next += base64Vlq.encode(sourceIdx - previousSource);
+ previousSource = sourceIdx;
+
+ // lines are stored 0-based in SourceMap spec version 3
+ next += base64Vlq.encode(mapping.originalLine - 1
+ - previousOriginalLine);
+ previousOriginalLine = mapping.originalLine - 1;
+
+ next += base64Vlq.encode(mapping.originalColumn
+ - previousOriginalColumn);
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (mapping.name != null) {
+ nameIdx = this._names.indexOf(mapping.name);
+ next += base64Vlq.encode(nameIdx - previousName);
+ previousName = nameIdx;
+ }
+ }
+
+ result += next;
+ }
+
+ return result;
+ };
+
+SourceMapGenerator$2.prototype._generateSourcesContent =
+ function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
+ return aSources.map(function (source) {
+ if (!this._sourcesContents) {
+ return null;
+ }
+ if (aSourceRoot != null) {
+ source = util.relative(aSourceRoot, source);
+ }
+ var key = util.toSetString(source);
+ return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
+ ? this._sourcesContents[key]
+ : null;
+ }, this);
+ };
+
+/**
+ * Externalize the source map.
+ */
+SourceMapGenerator$2.prototype.toJSON =
+ function SourceMapGenerator_toJSON() {
+ var map = {
+ version: this._version,
+ sources: this._sources.toArray(),
+ names: this._names.toArray(),
+ mappings: this._serializeMappings()
+ };
+ if (this._file != null) {
+ map.file = this._file;
+ }
+ if (this._sourceRoot != null) {
+ map.sourceRoot = this._sourceRoot;
+ }
+ if (this._sourcesContents) {
+ map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
+ }
+
+ return map;
+ };
+
+/**
+ * Render the source map being generated to a string.
+ */
+SourceMapGenerator$2.prototype.toString =
+ function SourceMapGenerator_toString() {
+ return JSON.stringify(this.toJSON());
+ };
+
+var SourceMapGenerator_1 = SourceMapGenerator$2;
+
+var sourceMapGenerator = {
+ SourceMapGenerator: SourceMapGenerator_1
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+var binarySearch = createCommonjsModule(function (module, exports) {
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+exports.GREATEST_LOWER_BOUND = 1;
+exports.LEAST_UPPER_BOUND = 2;
+
+/**
+ * Recursive implementation of binary search.
+ *
+ * @param aLow Indices here and lower do not contain the needle.
+ * @param aHigh Indices here and higher do not contain the needle.
+ * @param aNeedle The element being searched for.
+ * @param aHaystack The non-empty array being searched.
+ * @param aCompare Function which takes two elements and returns -1, 0, or 1.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ */
+function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
+ // This function terminates when one of the following is true:
+ //
+ // 1. We find the exact element we are looking for.
+ //
+ // 2. We did not find the exact element, but we can return the index of
+ // the next-closest element.
+ //
+ // 3. We did not find the exact element, and there is no next-closest
+ // element than the one we are searching for, so we return -1.
+ var mid = Math.floor((aHigh - aLow) / 2) + aLow;
+ var cmp = aCompare(aNeedle, aHaystack[mid], true);
+ if (cmp === 0) {
+ // Found the element we are looking for.
+ return mid;
+ }
+ else if (cmp > 0) {
+ // Our needle is greater than aHaystack[mid].
+ if (aHigh - mid > 1) {
+ // The element is in the upper half.
+ return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // The exact needle element was not found in this haystack. Determine if
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return aHigh < aHaystack.length ? aHigh : -1;
+ } else {
+ return mid;
+ }
+ }
+ else {
+ // Our needle is less than aHaystack[mid].
+ if (mid - aLow > 1) {
+ // The element is in the lower half.
+ return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return mid;
+ } else {
+ return aLow < 0 ? -1 : aLow;
+ }
+ }
+}
+
+/**
+ * This is an implementation of binary search which will always try and return
+ * the index of the closest element if there is no exact hit. This is because
+ * mappings between original and generated line/col pairs are single points,
+ * and there is an implicit region between each of them, so a miss just means
+ * that you aren't on the very start of a region.
+ *
+ * @param aNeedle The element you are looking for.
+ * @param aHaystack The array that is being searched.
+ * @param aCompare A function which takes the needle and an element in the
+ * array and returns -1, 0, or 1 depending on whether the needle is less
+ * than, equal to, or greater than the element, respectively.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
+ */
+exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
+ if (aHaystack.length === 0) {
+ return -1;
+ }
+
+ var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
+ aCompare, aBias || exports.GREATEST_LOWER_BOUND);
+ if (index < 0) {
+ return -1;
+ }
+
+ // We have found either the exact element, or the next-closest element than
+ // the one we are searching for. However, there may be more than one such
+ // element. Make sure we always return the smallest of these.
+ while (index - 1 >= 0) {
+ if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
+ break;
+ }
+ --index;
+ }
+
+ return index;
+};
+});
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+// It turns out that some (most?) JavaScript engines don't self-host
+// `Array.prototype.sort`. This makes sense because C++ will likely remain
+// faster than JS when doing raw CPU-intensive sorting. However, when using a
+// custom comparator function, calling back and forth between the VM's C++ and
+// JIT'd JS is rather slow *and* loses JIT type information, resulting in
+// worse generated code for the comparator function than would be optimal. In
+// fact, when sorting with a comparator, these costs outweigh the benefits of
+// sorting in C++. By using our own JS-implemented Quick Sort (below), we get
+// a ~3500ms mean speed-up in `bench/bench.html`.
+
+/**
+ * Swap the elements indexed by `x` and `y` in the array `ary`.
+ *
+ * @param {Array} ary
+ * The array.
+ * @param {Number} x
+ * The index of the first item.
+ * @param {Number} y
+ * The index of the second item.
+ */
+function swap(ary, x, y) {
+ var temp = ary[x];
+ ary[x] = ary[y];
+ ary[y] = temp;
+}
+
+/**
+ * Returns a random integer within the range `low .. high` inclusive.
+ *
+ * @param {Number} low
+ * The lower bound on the range.
+ * @param {Number} high
+ * The upper bound on the range.
+ */
+function randomIntInRange(low, high) {
+ return Math.round(low + (Math.random() * (high - low)));
+}
+
+/**
+ * The Quick Sort algorithm.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ * @param {Number} p
+ * Start index of the array
+ * @param {Number} r
+ * End index of the array
+ */
+function doQuickSort(ary, comparator, p, r) {
+ // If our lower bound is less than our upper bound, we (1) partition the
+ // array into two pieces and (2) recurse on each half. If it is not, this is
+ // the empty array and our base case.
+
+ if (p < r) {
+ // (1) Partitioning.
+ //
+ // The partitioning chooses a pivot between `p` and `r` and moves all
+ // elements that are less than or equal to the pivot to the before it, and
+ // all the elements that are greater than it after it. The effect is that
+ // once partition is done, the pivot is in the exact place it will be when
+ // the array is put in sorted order, and it will not need to be moved
+ // again. This runs in O(n) time.
+
+ // Always choose a random pivot so that an input array which is reverse
+ // sorted does not cause O(n^2) running time.
+ var pivotIndex = randomIntInRange(p, r);
+ var i = p - 1;
+
+ swap(ary, pivotIndex, r);
+ var pivot = ary[r];
+
+ // Immediately after `j` is incremented in this loop, the following hold
+ // true:
+ //
+ // * Every element in `ary[p .. i]` is less than or equal to the pivot.
+ //
+ // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
+ for (var j = p; j < r; j++) {
+ if (comparator(ary[j], pivot) <= 0) {
+ i += 1;
+ swap(ary, i, j);
+ }
+ }
+
+ swap(ary, i + 1, j);
+ var q = i + 1;
+
+ // (2) Recurse on each half.
+
+ doQuickSort(ary, comparator, p, q - 1);
+ doQuickSort(ary, comparator, q + 1, r);
+ }
+}
+
+/**
+ * Sort the given array in-place with the given comparator function.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ */
+var quickSort_1 = function (ary, comparator) {
+ doQuickSort(ary, comparator, 0, ary.length - 1);
+};
+
+var quickSort$1 = {
+ quickSort: quickSort_1
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+
+var ArraySet = arraySet.ArraySet;
+
+var quickSort = quickSort$1.quickSort;
+
+function SourceMapConsumer$1(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ return sourceMap.sections != null
+ ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
+ : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
+}
+
+SourceMapConsumer$1.fromSourceMap = function(aSourceMap, aSourceMapURL) {
+ return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
+};
+
+/**
+ * The version of the source mapping spec that we are consuming.
+ */
+SourceMapConsumer$1.prototype._version = 3;
+
+// `__generatedMappings` and `__originalMappings` are arrays that hold the
+// parsed mapping coordinates from the source map's "mappings" attribute. They
+// are lazily instantiated, accessed via the `_generatedMappings` and
+// `_originalMappings` getters respectively, and we only parse the mappings
+// and create these arrays once queried for a source location. We jump through
+// these hoops because there can be many thousands of mappings, and parsing
+// them is expensive, so we only want to do it if we must.
+//
+// Each object in the arrays is of the form:
+//
+// {
+// generatedLine: The line number in the generated code,
+// generatedColumn: The column number in the generated code,
+// source: The path to the original source file that generated this
+// chunk of code,
+// originalLine: The line number in the original source that
+// corresponds to this chunk of generated code,
+// originalColumn: The column number in the original source that
+// corresponds to this chunk of generated code,
+// name: The name of the original symbol which generated this chunk of
+// code.
+// }
+//
+// All properties except for `generatedLine` and `generatedColumn` can be
+// `null`.
+//
+// `_generatedMappings` is ordered by the generated positions.
+//
+// `_originalMappings` is ordered by the original positions.
+
+SourceMapConsumer$1.prototype.__generatedMappings = null;
+Object.defineProperty(SourceMapConsumer$1.prototype, '_generatedMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__generatedMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappings;
+ }
+});
+
+SourceMapConsumer$1.prototype.__originalMappings = null;
+Object.defineProperty(SourceMapConsumer$1.prototype, '_originalMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__originalMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__originalMappings;
+ }
+});
+
+SourceMapConsumer$1.prototype._charIsMappingSeparator =
+ function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
+ var c = aStr.charAt(index);
+ return c === ";" || c === ",";
+ };
+
+/**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+SourceMapConsumer$1.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ throw new Error("Subclasses must implement _parseMappings");
+ };
+
+SourceMapConsumer$1.GENERATED_ORDER = 1;
+SourceMapConsumer$1.ORIGINAL_ORDER = 2;
+
+SourceMapConsumer$1.GREATEST_LOWER_BOUND = 1;
+SourceMapConsumer$1.LEAST_UPPER_BOUND = 2;
+
+/**
+ * Iterate over each mapping between an original source/line/column and a
+ * generated line/column in this source map.
+ *
+ * @param Function aCallback
+ * The function that is called with each mapping.
+ * @param Object aContext
+ * Optional. If specified, this object will be the value of `this` every
+ * time that `aCallback` is called.
+ * @param aOrder
+ * Either `SourceMapConsumer.GENERATED_ORDER` or
+ * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
+ * iterate over the mappings sorted by the generated file's line/column
+ * order or the original's source/line/column order, respectively. Defaults to
+ * `SourceMapConsumer.GENERATED_ORDER`.
+ */
+SourceMapConsumer$1.prototype.eachMapping =
+ function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
+ var context = aContext || null;
+ var order = aOrder || SourceMapConsumer$1.GENERATED_ORDER;
+
+ var mappings;
+ switch (order) {
+ case SourceMapConsumer$1.GENERATED_ORDER:
+ mappings = this._generatedMappings;
+ break;
+ case SourceMapConsumer$1.ORIGINAL_ORDER:
+ mappings = this._originalMappings;
+ break;
+ default:
+ throw new Error("Unknown order of iteration.");
+ }
+
+ var sourceRoot = this.sourceRoot;
+ mappings.map(function (mapping) {
+ var source = mapping.source === null ? null : this._sources.at(mapping.source);
+ source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
+ return {
+ source: source,
+ generatedLine: mapping.generatedLine,
+ generatedColumn: mapping.generatedColumn,
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: mapping.name === null ? null : this._names.at(mapping.name)
+ };
+ }, this).forEach(aCallback, context);
+ };
+
+/**
+ * Returns all generated line and column information for the original source,
+ * line, and column provided. If no column is provided, returns all mappings
+ * corresponding to a either the line we are searching for or the next
+ * closest line that has any mappings. Otherwise, returns all mappings
+ * corresponding to the given line and either the column we are searching for
+ * or the next closest column that has any offsets.
+ *
+ * The only argument is an object with the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number is 1-based.
+ * - column: Optional. the column number in the original source.
+ * The column number is 0-based.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+SourceMapConsumer$1.prototype.allGeneratedPositionsFor =
+ function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
+ var line = util.getArg(aArgs, 'line');
+
+ // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
+ // returns the index of the closest mapping less than the needle. By
+ // setting needle.originalColumn to 0, we thus find the last mapping for
+ // the given line, provided such a mapping exists.
+ var needle = {
+ source: util.getArg(aArgs, 'source'),
+ originalLine: line,
+ originalColumn: util.getArg(aArgs, 'column', 0)
+ };
+
+ needle.source = this._findSourceIndex(needle.source);
+ if (needle.source < 0) {
+ return [];
+ }
+
+ var mappings = [];
+
+ var index = this._findMapping(needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ binarySearch.LEAST_UPPER_BOUND);
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (aArgs.column === undefined) {
+ var originalLine = mapping.originalLine;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we found. Since
+ // mappings are sorted, this is guaranteed to find all mappings for
+ // the line we found.
+ while (mapping && mapping.originalLine === originalLine) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ } else {
+ var originalColumn = mapping.originalColumn;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we were searching for.
+ // Since mappings are sorted, this is guaranteed to find all mappings for
+ // the line we are searching for.
+ while (mapping &&
+ mapping.originalLine === line &&
+ mapping.originalColumn == originalColumn) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ }
+ }
+
+ return mappings;
+ };
+
+var SourceMapConsumer_1 = SourceMapConsumer$1;
+
+/**
+ * A BasicSourceMapConsumer instance represents a parsed source map which we can
+ * query for information about the original file positions by giving it a file
+ * position in the generated source.
+ *
+ * The first parameter is the raw source map (either as a JSON string, or
+ * already parsed to an object). According to the spec, source maps have the
+ * following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - sources: An array of URLs to the original source files.
+ * - names: An array of identifiers which can be referrenced by individual mappings.
+ * - sourceRoot: Optional. The URL root from which all sources are relative.
+ * - sourcesContent: Optional. An array of contents of the original source files.
+ * - mappings: A string of base64 VLQs which contain the actual mappings.
+ * - file: Optional. The generated file this source map is associated with.
+ *
+ * Here is an example source map, taken from the source map spec[0]:
+ *
+ * {
+ * version : 3,
+ * file: "out.js",
+ * sourceRoot : "",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AA,AB;;ABCDE;"
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sources = util.getArg(sourceMap, 'sources');
+ // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
+ // requires the array) to play nice here.
+ var names = util.getArg(sourceMap, 'names', []);
+ var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
+ var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
+ var mappings = util.getArg(sourceMap, 'mappings');
+ var file = util.getArg(sourceMap, 'file', null);
+
+ // Once again, Sass deviates from the spec and supplies the version as a
+ // string rather than a number, so we use loose equality checking here.
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ if (sourceRoot) {
+ sourceRoot = util.normalize(sourceRoot);
+ }
+
+ sources = sources
+ .map(String)
+ // Some source maps produce relative source paths like "./foo.js" instead of
+ // "foo.js". Normalize these first so that future comparisons will succeed.
+ // See bugzil.la/1090768.
+ .map(util.normalize)
+ // Always ensure that absolute sources are internally stored relative to
+ // the source root, if the source root is absolute. Not doing this would
+ // be particularly problematic when the source root is a prefix of the
+ // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
+ .map(function (source) {
+ return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
+ ? util.relative(sourceRoot, source)
+ : source;
+ });
+
+ // Pass `true` below to allow duplicate names and sources. While source maps
+ // are intended to be compressed and deduplicated, the TypeScript compiler
+ // sometimes generates source maps with duplicates in them. See Github issue
+ // #72 and bugzil.la/889492.
+ this._names = ArraySet.fromArray(names.map(String), true);
+ this._sources = ArraySet.fromArray(sources, true);
+
+ this._absoluteSources = this._sources.toArray().map(function (s) {
+ return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
+ });
+
+ this.sourceRoot = sourceRoot;
+ this.sourcesContent = sourcesContent;
+ this._mappings = mappings;
+ this._sourceMapURL = aSourceMapURL;
+ this.file = file;
+}
+
+BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer$1.prototype);
+BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer$1;
+
+/**
+ * Utility function to find the index of a source. Returns -1 if not
+ * found.
+ */
+BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ if (this._sources.has(relativeSource)) {
+ return this._sources.indexOf(relativeSource);
+ }
+
+ // Maybe aSource is an absolute URL as returned by |sources|. In
+ // this case we can't simply undo the transform.
+ var i;
+ for (i = 0; i < this._absoluteSources.length; ++i) {
+ if (this._absoluteSources[i] == aSource) {
+ return i;
+ }
+ }
+
+ return -1;
+};
+
+/**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @param String aSourceMapURL
+ * The URL at which the source map can be found (optional)
+ * @returns BasicSourceMapConsumer
+ */
+BasicSourceMapConsumer.fromSourceMap =
+ function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
+ var smc = Object.create(BasicSourceMapConsumer.prototype);
+
+ var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
+ var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
+ smc.sourceRoot = aSourceMap._sourceRoot;
+ smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
+ smc.sourceRoot);
+ smc.file = aSourceMap._file;
+ smc._sourceMapURL = aSourceMapURL;
+ smc._absoluteSources = smc._sources.toArray().map(function (s) {
+ return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
+ });
+
+ // Because we are modifying the entries (by converting string sources and
+ // names to indices into the sources and names ArraySets), we have to make
+ // a copy of the entry or else bad things happen. Shared mutable state
+ // strikes again! See github issue #191.
+
+ var generatedMappings = aSourceMap._mappings.toArray().slice();
+ var destGeneratedMappings = smc.__generatedMappings = [];
+ var destOriginalMappings = smc.__originalMappings = [];
+
+ for (var i = 0, length = generatedMappings.length; i < length; i++) {
+ var srcMapping = generatedMappings[i];
+ var destMapping = new Mapping;
+ destMapping.generatedLine = srcMapping.generatedLine;
+ destMapping.generatedColumn = srcMapping.generatedColumn;
+
+ if (srcMapping.source) {
+ destMapping.source = sources.indexOf(srcMapping.source);
+ destMapping.originalLine = srcMapping.originalLine;
+ destMapping.originalColumn = srcMapping.originalColumn;
+
+ if (srcMapping.name) {
+ destMapping.name = names.indexOf(srcMapping.name);
+ }
+
+ destOriginalMappings.push(destMapping);
+ }
+
+ destGeneratedMappings.push(destMapping);
+ }
+
+ quickSort(smc.__originalMappings, util.compareByOriginalPositions);
+
+ return smc;
+ };
+
+/**
+ * The version of the source mapping spec that we are consuming.
+ */
+BasicSourceMapConsumer.prototype._version = 3;
+
+/**
+ * The list of original sources.
+ */
+Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ return this._absoluteSources.slice();
+ }
+});
+
+/**
+ * Provide the JIT with a nice shape / hidden class.
+ */
+function Mapping() {
+ this.generatedLine = 0;
+ this.generatedColumn = 0;
+ this.source = null;
+ this.originalLine = null;
+ this.originalColumn = null;
+ this.name = null;
+}
+
+/**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+BasicSourceMapConsumer.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ var generatedLine = 1;
+ var previousGeneratedColumn = 0;
+ var previousOriginalLine = 0;
+ var previousOriginalColumn = 0;
+ var previousSource = 0;
+ var previousName = 0;
+ var length = aStr.length;
+ var index = 0;
+ var cachedSegments = {};
+ var temp = {};
+ var originalMappings = [];
+ var generatedMappings = [];
+ var mapping, str, segment, end, value;
+
+ while (index < length) {
+ if (aStr.charAt(index) === ';') {
+ generatedLine++;
+ index++;
+ previousGeneratedColumn = 0;
+ }
+ else if (aStr.charAt(index) === ',') {
+ index++;
+ }
+ else {
+ mapping = new Mapping();
+ mapping.generatedLine = generatedLine;
+
+ // Because each offset is encoded relative to the previous one,
+ // many segments often have the same encoding. We can exploit this
+ // fact by caching the parsed variable length fields of each segment,
+ // allowing us to avoid a second parse if we encounter the same
+ // segment again.
+ for (end = index; end < length; end++) {
+ if (this._charIsMappingSeparator(aStr, end)) {
+ break;
+ }
+ }
+ str = aStr.slice(index, end);
+
+ segment = cachedSegments[str];
+ if (segment) {
+ index += str.length;
+ } else {
+ segment = [];
+ while (index < end) {
+ base64Vlq.decode(aStr, index, temp);
+ value = temp.value;
+ index = temp.rest;
+ segment.push(value);
+ }
+
+ if (segment.length === 2) {
+ throw new Error('Found a source, but no line and column');
+ }
+
+ if (segment.length === 3) {
+ throw new Error('Found a source and line, but no column');
+ }
+
+ cachedSegments[str] = segment;
+ }
+
+ // Generated column.
+ mapping.generatedColumn = previousGeneratedColumn + segment[0];
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (segment.length > 1) {
+ // Original source.
+ mapping.source = previousSource + segment[1];
+ previousSource += segment[1];
+
+ // Original line.
+ mapping.originalLine = previousOriginalLine + segment[2];
+ previousOriginalLine = mapping.originalLine;
+ // Lines are stored 0-based
+ mapping.originalLine += 1;
+
+ // Original column.
+ mapping.originalColumn = previousOriginalColumn + segment[3];
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (segment.length > 4) {
+ // Original name.
+ mapping.name = previousName + segment[4];
+ previousName += segment[4];
+ }
+ }
+
+ generatedMappings.push(mapping);
+ if (typeof mapping.originalLine === 'number') {
+ originalMappings.push(mapping);
+ }
+ }
+ }
+
+ quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
+ this.__generatedMappings = generatedMappings;
+
+ quickSort(originalMappings, util.compareByOriginalPositions);
+ this.__originalMappings = originalMappings;
+ };
+
+/**
+ * Find the mapping that best matches the hypothetical "needle" mapping that
+ * we are searching for in the given "haystack" of mappings.
+ */
+BasicSourceMapConsumer.prototype._findMapping =
+ function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
+ aColumnName, aComparator, aBias) {
+ // To return the position we are searching for, we must first find the
+ // mapping for the given position and then return the opposite position it
+ // points to. Because the mappings are sorted, we can use binary search to
+ // find the best mapping.
+
+ if (aNeedle[aLineName] <= 0) {
+ throw new TypeError('Line must be greater than or equal to 1, got '
+ + aNeedle[aLineName]);
+ }
+ if (aNeedle[aColumnName] < 0) {
+ throw new TypeError('Column must be greater than or equal to 0, got '
+ + aNeedle[aColumnName]);
+ }
+
+ return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
+ };
+
+/**
+ * Compute the last column for each generated mapping. The last column is
+ * inclusive.
+ */
+BasicSourceMapConsumer.prototype.computeColumnSpans =
+ function SourceMapConsumer_computeColumnSpans() {
+ for (var index = 0; index < this._generatedMappings.length; ++index) {
+ var mapping = this._generatedMappings[index];
+
+ // Mappings do not contain a field for the last generated columnt. We
+ // can come up with an optimistic estimate, however, by assuming that
+ // mappings are contiguous (i.e. given two consecutive mappings, the
+ // first mapping ends where the second one starts).
+ if (index + 1 < this._generatedMappings.length) {
+ var nextMapping = this._generatedMappings[index + 1];
+
+ if (mapping.generatedLine === nextMapping.generatedLine) {
+ mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
+ continue;
+ }
+ }
+
+ // The last mapping for each line spans the entire line.
+ mapping.lastGeneratedColumn = Infinity;
+ }
+ };
+
+/**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+BasicSourceMapConsumer.prototype.originalPositionFor =
+ function SourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._generatedMappings,
+ "generatedLine",
+ "generatedColumn",
+ util.compareByGeneratedPositionsDeflated,
+ util.getArg(aArgs, 'bias', SourceMapConsumer$1.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._generatedMappings[index];
+
+ if (mapping.generatedLine === needle.generatedLine) {
+ var source = util.getArg(mapping, 'source', null);
+ if (source !== null) {
+ source = this._sources.at(source);
+ source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
+ }
+ var name = util.getArg(mapping, 'name', null);
+ if (name !== null) {
+ name = this._names.at(name);
+ }
+ return {
+ source: source,
+ line: util.getArg(mapping, 'originalLine', null),
+ column: util.getArg(mapping, 'originalColumn', null),
+ name: name
+ };
+ }
+ }
+
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ };
+
+/**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function BasicSourceMapConsumer_hasContentsOfAllSources() {
+ if (!this.sourcesContent) {
+ return false;
+ }
+ return this.sourcesContent.length >= this._sources.size() &&
+ !this.sourcesContent.some(function (sc) { return sc == null; });
+ };
+
+/**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+BasicSourceMapConsumer.prototype.sourceContentFor =
+ function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ if (!this.sourcesContent) {
+ return null;
+ }
+
+ var index = this._findSourceIndex(aSource);
+ if (index >= 0) {
+ return this.sourcesContent[index];
+ }
+
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ var url;
+ if (this.sourceRoot != null
+ && (url = util.urlParse(this.sourceRoot))) {
+ // XXX: file:// URIs and absolute paths lead to unexpected behavior for
+ // many users. We can help them out when they expect file:// URIs to
+ // behave like it would if they were running a local HTTP server. See
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
+ var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
+ if (url.scheme == "file"
+ && this._sources.has(fileUriAbsPath)) {
+ return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
+ }
+
+ if ((!url.path || url.path == "/")
+ && this._sources.has("/" + relativeSource)) {
+ return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
+ }
+ }
+
+ // This function is used recursively from
+ // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
+ // don't want to throw if we can't find the source - we just want to
+ // return null, so we provide a flag to exit gracefully.
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + relativeSource + '" is not in the SourceMap.');
+ }
+ };
+
+/**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+BasicSourceMapConsumer.prototype.generatedPositionFor =
+ function SourceMapConsumer_generatedPositionFor(aArgs) {
+ var source = util.getArg(aArgs, 'source');
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+
+ var needle = {
+ source: source,
+ originalLine: util.getArg(aArgs, 'line'),
+ originalColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ util.getArg(aArgs, 'bias', SourceMapConsumer$1.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (mapping.source === needle.source) {
+ return {
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ };
+ }
+ }
+
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ };
+
+var BasicSourceMapConsumer_1 = BasicSourceMapConsumer;
+
+/**
+ * An IndexedSourceMapConsumer instance represents a parsed source map which
+ * we can query for information. It differs from BasicSourceMapConsumer in
+ * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
+ * input.
+ *
+ * The first parameter is a raw source map (either as a JSON string, or already
+ * parsed to an object). According to the spec for indexed source maps, they
+ * have the following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - file: Optional. The generated file this source map is associated with.
+ * - sections: A list of section definitions.
+ *
+ * Each value under the "sections" field has two fields:
+ * - offset: The offset into the original specified at which this section
+ * begins to apply, defined as an object with a "line" and "column"
+ * field.
+ * - map: A source map definition. This source map could also be indexed,
+ * but doesn't have to be.
+ *
+ * Instead of the "map" field, it's also possible to have a "url" field
+ * specifying a URL to retrieve a source map from, but that's currently
+ * unsupported.
+ *
+ * Here's an example source map, taken from the source map spec[0], but
+ * modified to omit a section which uses the "url" field.
+ *
+ * {
+ * version : 3,
+ * file: "app.js",
+ * sections: [{
+ * offset: {line:100, column:10},
+ * map: {
+ * version : 3,
+ * file: "section.js",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AAAA,E;;ABCDE;"
+ * }
+ * }],
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
+ */
+function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sections = util.getArg(sourceMap, 'sections');
+
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+
+ var lastOffset = {
+ line: -1,
+ column: 0
+ };
+ this._sections = sections.map(function (s) {
+ if (s.url) {
+ // The url field will require support for asynchronicity.
+ // See https://github.com/mozilla/source-map/issues/16
+ throw new Error('Support for url field in sections not implemented.');
+ }
+ var offset = util.getArg(s, 'offset');
+ var offsetLine = util.getArg(offset, 'line');
+ var offsetColumn = util.getArg(offset, 'column');
+
+ if (offsetLine < lastOffset.line ||
+ (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
+ throw new Error('Section offsets must be ordered and non-overlapping.');
+ }
+ lastOffset = offset;
+
+ return {
+ generatedOffset: {
+ // The offset fields are 0-based, but we use 1-based indices when
+ // encoding/decoding from VLQ.
+ generatedLine: offsetLine + 1,
+ generatedColumn: offsetColumn + 1
+ },
+ consumer: new SourceMapConsumer$1(util.getArg(s, 'map'), aSourceMapURL)
+ }
+ });
+}
+
+IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer$1.prototype);
+IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer$1;
+
+/**
+ * The version of the source mapping spec that we are consuming.
+ */
+IndexedSourceMapConsumer.prototype._version = 3;
+
+/**
+ * The list of original sources.
+ */
+Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ var sources = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
+ sources.push(this._sections[i].consumer.sources[j]);
+ }
+ }
+ return sources;
+ }
+});
+
+/**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+IndexedSourceMapConsumer.prototype.originalPositionFor =
+ function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ // Find the section containing the generated position we're trying to map
+ // to an original position.
+ var sectionIndex = binarySearch.search(needle, this._sections,
+ function(needle, section) {
+ var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ return (needle.generatedColumn -
+ section.generatedOffset.generatedColumn);
+ });
+ var section = this._sections[sectionIndex];
+
+ if (!section) {
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ }
+
+ return section.consumer.originalPositionFor({
+ line: needle.generatedLine -
+ (section.generatedOffset.generatedLine - 1),
+ column: needle.generatedColumn -
+ (section.generatedOffset.generatedLine === needle.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ bias: aArgs.bias
+ });
+ };
+
+/**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function IndexedSourceMapConsumer_hasContentsOfAllSources() {
+ return this._sections.every(function (s) {
+ return s.consumer.hasContentsOfAllSources();
+ });
+ };
+
+/**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+IndexedSourceMapConsumer.prototype.sourceContentFor =
+ function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ var content = section.consumer.sourceContentFor(aSource, true);
+ if (content) {
+ return content;
+ }
+ }
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + aSource + '" is not in the SourceMap.');
+ }
+ };
+
+/**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+IndexedSourceMapConsumer.prototype.generatedPositionFor =
+ function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ // Only consider this section if the requested source is in the list of
+ // sources of the consumer.
+ if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
+ continue;
+ }
+ var generatedPosition = section.consumer.generatedPositionFor(aArgs);
+ if (generatedPosition) {
+ var ret = {
+ line: generatedPosition.line +
+ (section.generatedOffset.generatedLine - 1),
+ column: generatedPosition.column +
+ (section.generatedOffset.generatedLine === generatedPosition.line
+ ? section.generatedOffset.generatedColumn - 1
+ : 0)
+ };
+ return ret;
+ }
+ }
+
+ return {
+ line: null,
+ column: null
+ };
+ };
+
+/**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+IndexedSourceMapConsumer.prototype._parseMappings =
+ function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ this.__generatedMappings = [];
+ this.__originalMappings = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+ var sectionMappings = section.consumer._generatedMappings;
+ for (var j = 0; j < sectionMappings.length; j++) {
+ var mapping = sectionMappings[j];
+
+ var source = section.consumer._sources.at(mapping.source);
+ source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
+ this._sources.add(source);
+ source = this._sources.indexOf(source);
+
+ var name = null;
+ if (mapping.name) {
+ name = section.consumer._names.at(mapping.name);
+ this._names.add(name);
+ name = this._names.indexOf(name);
+ }
+
+ // The mappings coming from the consumer for the section have
+ // generated positions relative to the start of the section, so we
+ // need to offset them to be relative to the start of the concatenated
+ // generated file.
+ var adjustedMapping = {
+ source: source,
+ generatedLine: mapping.generatedLine +
+ (section.generatedOffset.generatedLine - 1),
+ generatedColumn: mapping.generatedColumn +
+ (section.generatedOffset.generatedLine === mapping.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: name
+ };
+
+ this.__generatedMappings.push(adjustedMapping);
+ if (typeof adjustedMapping.originalLine === 'number') {
+ this.__originalMappings.push(adjustedMapping);
+ }
+ }
+ }
+
+ quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
+ quickSort(this.__originalMappings, util.compareByOriginalPositions);
+ };
+
+var IndexedSourceMapConsumer_1 = IndexedSourceMapConsumer;
+
+var sourceMapConsumer = {
+ SourceMapConsumer: SourceMapConsumer_1,
+ BasicSourceMapConsumer: BasicSourceMapConsumer_1,
+ IndexedSourceMapConsumer: IndexedSourceMapConsumer_1
+};
+
+/* -*- Mode: js; js-indent-level: 2; -*- */
+
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var SourceMapGenerator$1 = sourceMapGenerator.SourceMapGenerator;
+
+
+// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
+// operating systems these days (capturing the result).
+var REGEX_NEWLINE = /(\r?\n)/;
+
+// Newline character code for charCodeAt() comparisons
+var NEWLINE_CODE = 10;
+
+// Private symbol for identifying `SourceNode`s when multiple versions of
+// the source-map library are loaded. This MUST NOT CHANGE across
+// versions!
+var isSourceNode = "$$$isSourceNode$$$";
+
+/**
+ * SourceNodes provide a way to abstract over interpolating/concatenating
+ * snippets of generated JavaScript source code while maintaining the line and
+ * column information associated with the original source code.
+ *
+ * @param aLine The original line number.
+ * @param aColumn The original column number.
+ * @param aSource The original source's filename.
+ * @param aChunks Optional. An array of strings which are snippets of
+ * generated JS, or other SourceNodes.
+ * @param aName The original identifier.
+ */
+function SourceNode$1(aLine, aColumn, aSource, aChunks, aName) {
+ this.children = [];
+ this.sourceContents = {};
+ this.line = aLine == null ? null : aLine;
+ this.column = aColumn == null ? null : aColumn;
+ this.source = aSource == null ? null : aSource;
+ this.name = aName == null ? null : aName;
+ this[isSourceNode] = true;
+ if (aChunks != null) this.add(aChunks);
+}
+
+/**
+ * Creates a SourceNode from generated code and a SourceMapConsumer.
+ *
+ * @param aGeneratedCode The generated code
+ * @param aSourceMapConsumer The SourceMap for the generated code
+ * @param aRelativePath Optional. The path that relative sources in the
+ * SourceMapConsumer should be relative to.
+ */
+SourceNode$1.fromStringWithSourceMap =
+ function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
+ // The SourceNode we want to fill with the generated code
+ // and the SourceMap
+ var node = new SourceNode$1();
+
+ // All even indices of this array are one line of the generated code,
+ // while all odd indices are the newlines between two adjacent lines
+ // (since `REGEX_NEWLINE` captures its match).
+ // Processed fragments are accessed by calling `shiftNextLine`.
+ var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
+ var remainingLinesIndex = 0;
+ var shiftNextLine = function() {
+ var lineContents = getNextLine();
+ // The last line of a file might not have a newline.
+ var newLine = getNextLine() || "";
+ return lineContents + newLine;
+
+ function getNextLine() {
+ return remainingLinesIndex < remainingLines.length ?
+ remainingLines[remainingLinesIndex++] : undefined;
+ }
+ };
+
+ // We need to remember the position of "remainingLines"
+ var lastGeneratedLine = 1, lastGeneratedColumn = 0;
+
+ // The generate SourceNodes we need a code range.
+ // To extract it current and last mapping is used.
+ // Here we store the last mapping.
+ var lastMapping = null;
+
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ if (lastMapping !== null) {
+ // We add the code from "lastMapping" to "mapping":
+ // First check if there is a new line in between.
+ if (lastGeneratedLine < mapping.generatedLine) {
+ // Associate first line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ lastGeneratedLine++;
+ lastGeneratedColumn = 0;
+ // The remaining code is added without mapping
+ } else {
+ // There is no new line in between.
+ // Associate the code between "lastGeneratedColumn" and
+ // "mapping.generatedColumn" with "lastMapping"
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ var code = nextLine.substr(0, mapping.generatedColumn -
+ lastGeneratedColumn);
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
+ lastGeneratedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ addMappingWithCode(lastMapping, code);
+ // No more remaining code, continue
+ lastMapping = mapping;
+ return;
+ }
+ }
+ // We add the generated code until the first mapping
+ // to the SourceNode without any mapping.
+ // Each line is added as separate string.
+ while (lastGeneratedLine < mapping.generatedLine) {
+ node.add(shiftNextLine());
+ lastGeneratedLine++;
+ }
+ if (lastGeneratedColumn < mapping.generatedColumn) {
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ node.add(nextLine.substr(0, mapping.generatedColumn));
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ }
+ lastMapping = mapping;
+ }, this);
+ // We have processed all mappings.
+ if (remainingLinesIndex < remainingLines.length) {
+ if (lastMapping) {
+ // Associate the remaining code in the current line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ }
+ // and add the remaining lines without any mapping
+ node.add(remainingLines.splice(remainingLinesIndex).join(""));
+ }
+
+ // Copy sourcesContent into SourceNode
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aRelativePath != null) {
+ sourceFile = util.join(aRelativePath, sourceFile);
+ }
+ node.setSourceContent(sourceFile, content);
+ }
+ });
+
+ return node;
+
+ function addMappingWithCode(mapping, code) {
+ if (mapping === null || mapping.source === undefined) {
+ node.add(code);
+ } else {
+ var source = aRelativePath
+ ? util.join(aRelativePath, mapping.source)
+ : mapping.source;
+ node.add(new SourceNode$1(mapping.originalLine,
+ mapping.originalColumn,
+ source,
+ code,
+ mapping.name));
+ }
+ }
+ };
+
+/**
+ * Add a chunk of generated JS to this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+SourceNode$1.prototype.add = function SourceNode_add(aChunk) {
+ if (Array.isArray(aChunk)) {
+ aChunk.forEach(function (chunk) {
+ this.add(chunk);
+ }, this);
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ if (aChunk) {
+ this.children.push(aChunk);
+ }
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+};
+
+/**
+ * Add a chunk of generated JS to the beginning of this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+SourceNode$1.prototype.prepend = function SourceNode_prepend(aChunk) {
+ if (Array.isArray(aChunk)) {
+ for (var i = aChunk.length-1; i >= 0; i--) {
+ this.prepend(aChunk[i]);
+ }
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ this.children.unshift(aChunk);
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+};
+
+/**
+ * Walk over the tree of JS snippets in this node and its children. The
+ * walking function is called once for each snippet of JS and is passed that
+ * snippet and the its original associated source's line/column location.
+ *
+ * @param aFn The traversal function.
+ */
+SourceNode$1.prototype.walk = function SourceNode_walk(aFn) {
+ var chunk;
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ chunk = this.children[i];
+ if (chunk[isSourceNode]) {
+ chunk.walk(aFn);
+ }
+ else {
+ if (chunk !== '') {
+ aFn(chunk, { source: this.source,
+ line: this.line,
+ column: this.column,
+ name: this.name });
+ }
+ }
+ }
+};
+
+/**
+ * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
+ * each of `this.children`.
+ *
+ * @param aSep The separator.
+ */
+SourceNode$1.prototype.join = function SourceNode_join(aSep) {
+ var newChildren;
+ var i;
+ var len = this.children.length;
+ if (len > 0) {
+ newChildren = [];
+ for (i = 0; i < len-1; i++) {
+ newChildren.push(this.children[i]);
+ newChildren.push(aSep);
+ }
+ newChildren.push(this.children[i]);
+ this.children = newChildren;
+ }
+ return this;
+};
+
+/**
+ * Call String.prototype.replace on the very right-most source snippet. Useful
+ * for trimming whitespace from the end of a source node, etc.
+ *
+ * @param aPattern The pattern to replace.
+ * @param aReplacement The thing to replace the pattern with.
+ */
+SourceNode$1.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
+ var lastChild = this.children[this.children.length - 1];
+ if (lastChild[isSourceNode]) {
+ lastChild.replaceRight(aPattern, aReplacement);
+ }
+ else if (typeof lastChild === 'string') {
+ this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
+ }
+ else {
+ this.children.push(''.replace(aPattern, aReplacement));
+ }
+ return this;
+};
+
+/**
+ * Set the source content for a source file. This will be added to the SourceMapGenerator
+ * in the sourcesContent field.
+ *
+ * @param aSourceFile The filename of the source file
+ * @param aSourceContent The content of the source file
+ */
+SourceNode$1.prototype.setSourceContent =
+ function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
+ this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
+ };
+
+/**
+ * Walk over the tree of SourceNodes. The walking function is called for each
+ * source file content and is passed the filename and source content.
+ *
+ * @param aFn The traversal function.
+ */
+SourceNode$1.prototype.walkSourceContents =
+ function SourceNode_walkSourceContents(aFn) {
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ if (this.children[i][isSourceNode]) {
+ this.children[i].walkSourceContents(aFn);
+ }
+ }
+
+ var sources = Object.keys(this.sourceContents);
+ for (var i = 0, len = sources.length; i < len; i++) {
+ aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
+ }
+ };
+
+/**
+ * Return the string representation of this source node. Walks over the tree
+ * and concatenates all the various snippets together to one string.
+ */
+SourceNode$1.prototype.toString = function SourceNode_toString() {
+ var str = "";
+ this.walk(function (chunk) {
+ str += chunk;
+ });
+ return str;
+};
+
+/**
+ * Returns the string representation of this source node along with a source
+ * map.
+ */
+SourceNode$1.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
+ var generated = {
+ code: "",
+ line: 1,
+ column: 0
+ };
+ var map = new SourceMapGenerator$1(aArgs);
+ var sourceMappingActive = false;
+ var lastOriginalSource = null;
+ var lastOriginalLine = null;
+ var lastOriginalColumn = null;
+ var lastOriginalName = null;
+ this.walk(function (chunk, original) {
+ generated.code += chunk;
+ if (original.source !== null
+ && original.line !== null
+ && original.column !== null) {
+ if(lastOriginalSource !== original.source
+ || lastOriginalLine !== original.line
+ || lastOriginalColumn !== original.column
+ || lastOriginalName !== original.name) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ lastOriginalSource = original.source;
+ lastOriginalLine = original.line;
+ lastOriginalColumn = original.column;
+ lastOriginalName = original.name;
+ sourceMappingActive = true;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ generated: {
+ line: generated.line,
+ column: generated.column
+ }
+ });
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ }
+ for (var idx = 0, length = chunk.length; idx < length; idx++) {
+ if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
+ generated.line++;
+ generated.column = 0;
+ // Mappings end at eol
+ if (idx + 1 === length) {
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ } else {
+ generated.column++;
+ }
+ }
+ });
+ this.walkSourceContents(function (sourceFile, sourceContent) {
+ map.setSourceContent(sourceFile, sourceContent);
+ });
+
+ return { code: generated.code, map: map };
+};
+
+var SourceNode_1 = SourceNode$1;
+
+var sourceNode = {
+ SourceNode: SourceNode_1
+};
+
+/*
+ * Copyright 2009-2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE.txt or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var SourceMapGenerator = sourceMapGenerator.SourceMapGenerator;
+var SourceMapConsumer = sourceMapConsumer.SourceMapConsumer;
+var SourceNode = sourceNode.SourceNode;
+
+var sourceMap = {
+ SourceMapGenerator: SourceMapGenerator,
+ SourceMapConsumer: SourceMapConsumer,
+ SourceNode: SourceNode
+};
+
+const name="escodegen";const description="ECMAScript code generator";const homepage="http://github.com/estools/escodegen";const main="escodegen.js";const bin={esgenerate:"./bin/esgenerate.js",escodegen:"./bin/escodegen.js"};const files=["LICENSE.BSD","README.md","bin","escodegen.js","package.json"];const version="1.14.1";const engines={node:">=4.0"};const maintainers=[{name:"Yusuke Suzuki",email:"utatane.tea@gmail.com",web:"http://github.com/Constellation"}];const repository={type:"git",url:"http://github.com/estools/escodegen.git"};const dependencies={estraverse:"^4.2.0",esutils:"^2.0.2",esprima:"^4.0.1",optionator:"^0.8.1"};const optionalDependencies={"source-map":"~0.6.1"};const devDependencies={acorn:"^7.1.0",bluebird:"^3.4.7","bower-registry-client":"^1.0.0",chai:"^3.5.0","commonjs-everywhere":"^0.9.7",gulp:"^3.8.10","gulp-eslint":"^3.0.1","gulp-mocha":"^3.0.1",semver:"^5.1.0"};const license="BSD-2-Clause";const scripts={test:"gulp travis","unit-test":"gulp test",lint:"gulp lint",release:"node tools/release.js","build-min":"./node_modules/.bin/cjsify -ma path: tools/entry-point.js > escodegen.browser.min.js",build:"./node_modules/.bin/cjsify -a path: tools/entry-point.js > escodegen.browser.js"};var require$$3 = {name:name,description:description,homepage:homepage,main:main,bin:bin,files:files,version:version,engines:engines,maintainers:maintainers,repository:repository,dependencies:dependencies,optionalDependencies:optionalDependencies,devDependencies:devDependencies,license:license,scripts:scripts};
+
+/*
+ Copyright (C) 2012-2014 Yusuke Suzuki
+ Copyright (C) 2015 Ingvar Stepanyan
+ Copyright (C) 2014 Ivan Nikulin
+ Copyright (C) 2012-2013 Michael Ficarra
+ Copyright (C) 2012-2013 Mathias Bynens
+ Copyright (C) 2013 Irakli Gozalishvili
+ Copyright (C) 2012 Robert Gust-Bardon
+ Copyright (C) 2012 John Freeman
+ Copyright (C) 2011-2012 Ariya Hidayat
+ Copyright (C) 2012 Joost-Wim Boekesteijn
+ Copyright (C) 2012 Kris Kowal
+ Copyright (C) 2012 Arpad Borsos
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var escodegen = createCommonjsModule(function (module, exports) {
+/*global exports:true, require:true, global:true*/
+(function () {
+ 'use strict';
+
+ var Syntax,
+ Precedence,
+ BinaryPrecedence,
+ SourceNode,
+ estraverse$1,
+ esutils,
+ base,
+ indent,
+ json,
+ renumber,
+ hexadecimal,
+ quotes,
+ escapeless,
+ newline,
+ space,
+ parentheses,
+ semicolons,
+ safeConcatenation,
+ directive,
+ extra,
+ parse,
+ sourceMap$1,
+ sourceCode,
+ preserveBlankLines,
+ FORMAT_MINIFY,
+ FORMAT_DEFAULTS;
+
+ estraverse$1 = estraverse;
+ esutils = utils;
+
+ Syntax = estraverse$1.Syntax;
+
+ // Generation is done by generateExpression.
+ function isExpression(node) {
+ return CodeGenerator.Expression.hasOwnProperty(node.type);
+ }
+
+ // Generation is done by generateStatement.
+ function isStatement(node) {
+ return CodeGenerator.Statement.hasOwnProperty(node.type);
+ }
+
+ Precedence = {
+ Sequence: 0,
+ Yield: 1,
+ Assignment: 1,
+ Conditional: 2,
+ ArrowFunction: 2,
+ LogicalOR: 3,
+ LogicalAND: 4,
+ BitwiseOR: 5,
+ BitwiseXOR: 6,
+ BitwiseAND: 7,
+ Equality: 8,
+ Relational: 9,
+ BitwiseSHIFT: 10,
+ Additive: 11,
+ Multiplicative: 12,
+ Exponentiation: 13,
+ Await: 14,
+ Unary: 14,
+ Postfix: 15,
+ Call: 16,
+ New: 17,
+ TaggedTemplate: 18,
+ Member: 19,
+ Primary: 20
+ };
+
+ BinaryPrecedence = {
+ '||': Precedence.LogicalOR,
+ '&&': Precedence.LogicalAND,
+ '|': Precedence.BitwiseOR,
+ '^': Precedence.BitwiseXOR,
+ '&': Precedence.BitwiseAND,
+ '==': Precedence.Equality,
+ '!=': Precedence.Equality,
+ '===': Precedence.Equality,
+ '!==': Precedence.Equality,
+ 'is': Precedence.Equality,
+ 'isnt': Precedence.Equality,
+ '<': Precedence.Relational,
+ '>': Precedence.Relational,
+ '<=': Precedence.Relational,
+ '>=': Precedence.Relational,
+ 'in': Precedence.Relational,
+ 'instanceof': Precedence.Relational,
+ '<<': Precedence.BitwiseSHIFT,
+ '>>': Precedence.BitwiseSHIFT,
+ '>>>': Precedence.BitwiseSHIFT,
+ '+': Precedence.Additive,
+ '-': Precedence.Additive,
+ '*': Precedence.Multiplicative,
+ '%': Precedence.Multiplicative,
+ '/': Precedence.Multiplicative,
+ '**': Precedence.Exponentiation
+ };
+
+ //Flags
+ var F_ALLOW_IN = 1,
+ F_ALLOW_CALL = 1 << 1,
+ F_ALLOW_UNPARATH_NEW = 1 << 2,
+ F_FUNC_BODY = 1 << 3,
+ F_DIRECTIVE_CTX = 1 << 4,
+ F_SEMICOLON_OPT = 1 << 5;
+
+ //Expression flag sets
+ //NOTE: Flag order:
+ // F_ALLOW_IN
+ // F_ALLOW_CALL
+ // F_ALLOW_UNPARATH_NEW
+ var E_FTT = F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,
+ E_TTF = F_ALLOW_IN | F_ALLOW_CALL,
+ E_TTT = F_ALLOW_IN | F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,
+ E_TFF = F_ALLOW_IN,
+ E_FFT = F_ALLOW_UNPARATH_NEW,
+ E_TFT = F_ALLOW_IN | F_ALLOW_UNPARATH_NEW;
+
+ //Statement flag sets
+ //NOTE: Flag order:
+ // F_ALLOW_IN
+ // F_FUNC_BODY
+ // F_DIRECTIVE_CTX
+ // F_SEMICOLON_OPT
+ var S_TFFF = F_ALLOW_IN,
+ S_TFFT = F_ALLOW_IN | F_SEMICOLON_OPT,
+ S_FFFF = 0x00,
+ S_TFTF = F_ALLOW_IN | F_DIRECTIVE_CTX,
+ S_TTFF = F_ALLOW_IN | F_FUNC_BODY;
+
+ function getDefaultOptions() {
+ // default options
+ return {
+ indent: null,
+ base: null,
+ parse: null,
+ comment: false,
+ format: {
+ indent: {
+ style: ' ',
+ base: 0,
+ adjustMultilineComment: false
+ },
+ newline: '\n',
+ space: ' ',
+ json: false,
+ renumber: false,
+ hexadecimal: false,
+ quotes: 'single',
+ escapeless: false,
+ compact: false,
+ parentheses: true,
+ semicolons: true,
+ safeConcatenation: false,
+ preserveBlankLines: false
+ },
+ moz: {
+ comprehensionExpressionStartsWithAssignment: false,
+ starlessGenerator: false
+ },
+ sourceMap: null,
+ sourceMapRoot: null,
+ sourceMapWithCode: false,
+ directive: false,
+ raw: true,
+ verbatim: null,
+ sourceCode: null
+ };
+ }
+
+ function stringRepeat(str, num) {
+ var result = '';
+
+ for (num |= 0; num > 0; num >>>= 1, str += str) {
+ if (num & 1) {
+ result += str;
+ }
+ }
+
+ return result;
+ }
+
+ function hasLineTerminator(str) {
+ return (/[\r\n]/g).test(str);
+ }
+
+ function endsWithLineTerminator(str) {
+ var len = str.length;
+ return len && esutils.code.isLineTerminator(str.charCodeAt(len - 1));
+ }
+
+ function merge(target, override) {
+ var key;
+ for (key in override) {
+ if (override.hasOwnProperty(key)) {
+ target[key] = override[key];
+ }
+ }
+ return target;
+ }
+
+ function updateDeeply(target, override) {
+ var key, val;
+
+ function isHashObject(target) {
+ return typeof target === 'object' && target instanceof Object && !(target instanceof RegExp);
+ }
+
+ for (key in override) {
+ if (override.hasOwnProperty(key)) {
+ val = override[key];
+ if (isHashObject(val)) {
+ if (isHashObject(target[key])) {
+ updateDeeply(target[key], val);
+ } else {
+ target[key] = updateDeeply({}, val);
+ }
+ } else {
+ target[key] = val;
+ }
+ }
+ }
+ return target;
+ }
+
+ function generateNumber(value) {
+ var result, point, temp, exponent, pos;
+
+ if (value !== value) {
+ throw new Error('Numeric literal whose value is NaN');
+ }
+ if (value < 0 || (value === 0 && 1 / value < 0)) {
+ throw new Error('Numeric literal whose value is negative');
+ }
+
+ if (value === 1 / 0) {
+ return json ? 'null' : renumber ? '1e400' : '1e+400';
+ }
+
+ result = '' + value;
+ if (!renumber || result.length < 3) {
+ return result;
+ }
+
+ point = result.indexOf('.');
+ if (!json && result.charCodeAt(0) === 0x30 /* 0 */ && point === 1) {
+ point = 0;
+ result = result.slice(1);
+ }
+ temp = result;
+ result = result.replace('e+', 'e');
+ exponent = 0;
+ if ((pos = temp.indexOf('e')) > 0) {
+ exponent = +temp.slice(pos + 1);
+ temp = temp.slice(0, pos);
+ }
+ if (point >= 0) {
+ exponent -= temp.length - point - 1;
+ temp = +(temp.slice(0, point) + temp.slice(point + 1)) + '';
+ }
+ pos = 0;
+ while (temp.charCodeAt(temp.length + pos - 1) === 0x30 /* 0 */) {
+ --pos;
+ }
+ if (pos !== 0) {
+ exponent -= pos;
+ temp = temp.slice(0, pos);
+ }
+ if (exponent !== 0) {
+ temp += 'e' + exponent;
+ }
+ if ((temp.length < result.length ||
+ (hexadecimal && value > 1e12 && Math.floor(value) === value && (temp = '0x' + value.toString(16)).length < result.length)) &&
+ +temp === value) {
+ result = temp;
+ }
+
+ return result;
+ }
+
+ // Generate valid RegExp expression.
+ // This function is based on https://github.com/Constellation/iv Engine
+
+ function escapeRegExpCharacter(ch, previousIsBackslash) {
+ // not handling '\' and handling \u2028 or \u2029 to unicode escape sequence
+ if ((ch & ~1) === 0x2028) {
+ return (previousIsBackslash ? 'u' : '\\u') + ((ch === 0x2028) ? '2028' : '2029');
+ } else if (ch === 10 || ch === 13) { // \n, \r
+ return (previousIsBackslash ? '' : '\\') + ((ch === 10) ? 'n' : 'r');
+ }
+ return String.fromCharCode(ch);
+ }
+
+ function generateRegExp(reg) {
+ var match, result, flags, i, iz, ch, characterInBrack, previousIsBackslash;
+
+ result = reg.toString();
+
+ if (reg.source) {
+ // extract flag from toString result
+ match = result.match(/\/([^/]*)$/);
+ if (!match) {
+ return result;
+ }
+
+ flags = match[1];
+ result = '';
+
+ characterInBrack = false;
+ previousIsBackslash = false;
+ for (i = 0, iz = reg.source.length; i < iz; ++i) {
+ ch = reg.source.charCodeAt(i);
+
+ if (!previousIsBackslash) {
+ if (characterInBrack) {
+ if (ch === 93) { // ]
+ characterInBrack = false;
+ }
+ } else {
+ if (ch === 47) { // /
+ result += '\\';
+ } else if (ch === 91) { // [
+ characterInBrack = true;
+ }
+ }
+ result += escapeRegExpCharacter(ch, previousIsBackslash);
+ previousIsBackslash = ch === 92; // \
+ } else {
+ // if new RegExp("\\\n') is provided, create /\n/
+ result += escapeRegExpCharacter(ch, previousIsBackslash);
+ // prevent like /\\[/]/
+ previousIsBackslash = false;
+ }
+ }
+
+ return '/' + result + '/' + flags;
+ }
+
+ return result;
+ }
+
+ function escapeAllowedCharacter(code, next) {
+ var hex;
+
+ if (code === 0x08 /* \b */) {
+ return '\\b';
+ }
+
+ if (code === 0x0C /* \f */) {
+ return '\\f';
+ }
+
+ if (code === 0x09 /* \t */) {
+ return '\\t';
+ }
+
+ hex = code.toString(16).toUpperCase();
+ if (json || code > 0xFF) {
+ return '\\u' + '0000'.slice(hex.length) + hex;
+ } else if (code === 0x0000 && !esutils.code.isDecimalDigit(next)) {
+ return '\\0';
+ } else if (code === 0x000B /* \v */) { // '\v'
+ return '\\x0B';
+ } else {
+ return '\\x' + '00'.slice(hex.length) + hex;
+ }
+ }
+
+ function escapeDisallowedCharacter(code) {
+ if (code === 0x5C /* \ */) {
+ return '\\\\';
+ }
+
+ if (code === 0x0A /* \n */) {
+ return '\\n';
+ }
+
+ if (code === 0x0D /* \r */) {
+ return '\\r';
+ }
+
+ if (code === 0x2028) {
+ return '\\u2028';
+ }
+
+ if (code === 0x2029) {
+ return '\\u2029';
+ }
+
+ throw new Error('Incorrectly classified character');
+ }
+
+ function escapeDirective(str) {
+ var i, iz, code, quote;
+
+ quote = quotes === 'double' ? '"' : '\'';
+ for (i = 0, iz = str.length; i < iz; ++i) {
+ code = str.charCodeAt(i);
+ if (code === 0x27 /* ' */) {
+ quote = '"';
+ break;
+ } else if (code === 0x22 /* " */) {
+ quote = '\'';
+ break;
+ } else if (code === 0x5C /* \ */) {
+ ++i;
+ }
+ }
+
+ return quote + str + quote;
+ }
+
+ function escapeString(str) {
+ var result = '', i, len, code, singleQuotes = 0, doubleQuotes = 0, single, quote;
+
+ for (i = 0, len = str.length; i < len; ++i) {
+ code = str.charCodeAt(i);
+ if (code === 0x27 /* ' */) {
+ ++singleQuotes;
+ } else if (code === 0x22 /* " */) {
+ ++doubleQuotes;
+ } else if (code === 0x2F /* / */ && json) {
+ result += '\\';
+ } else if (esutils.code.isLineTerminator(code) || code === 0x5C /* \ */) {
+ result += escapeDisallowedCharacter(code);
+ continue;
+ } else if (!esutils.code.isIdentifierPartES5(code) && (json && code < 0x20 /* SP */ || !json && !escapeless && (code < 0x20 /* SP */ || code > 0x7E /* ~ */))) {
+ result += escapeAllowedCharacter(code, str.charCodeAt(i + 1));
+ continue;
+ }
+ result += String.fromCharCode(code);
+ }
+
+ single = !(quotes === 'double' || (quotes === 'auto' && doubleQuotes < singleQuotes));
+ quote = single ? '\'' : '"';
+
+ if (!(single ? singleQuotes : doubleQuotes)) {
+ return quote + result + quote;
+ }
+
+ str = result;
+ result = quote;
+
+ for (i = 0, len = str.length; i < len; ++i) {
+ code = str.charCodeAt(i);
+ if ((code === 0x27 /* ' */ && single) || (code === 0x22 /* " */ && !single)) {
+ result += '\\';
+ }
+ result += String.fromCharCode(code);
+ }
+
+ return result + quote;
+ }
+
+ /**
+ * flatten an array to a string, where the array can contain
+ * either strings or nested arrays
+ */
+ function flattenToString(arr) {
+ var i, iz, elem, result = '';
+ for (i = 0, iz = arr.length; i < iz; ++i) {
+ elem = arr[i];
+ result += Array.isArray(elem) ? flattenToString(elem) : elem;
+ }
+ return result;
+ }
+
+ /**
+ * convert generated to a SourceNode when source maps are enabled.
+ */
+ function toSourceNodeWhenNeeded(generated, node) {
+ if (!sourceMap$1) {
+ // with no source maps, generated is either an
+ // array or a string. if an array, flatten it.
+ // if a string, just return it
+ if (Array.isArray(generated)) {
+ return flattenToString(generated);
+ } else {
+ return generated;
+ }
+ }
+ if (node == null) {
+ if (generated instanceof SourceNode) {
+ return generated;
+ } else {
+ node = {};
+ }
+ }
+ if (node.loc == null) {
+ return new SourceNode(null, null, sourceMap$1, generated, node.name || null);
+ }
+ return new SourceNode(node.loc.start.line, node.loc.start.column, (sourceMap$1 === true ? node.loc.source || null : sourceMap$1), generated, node.name || null);
+ }
+
+ function noEmptySpace() {
+ return (space) ? space : ' ';
+ }
+
+ function join(left, right) {
+ var leftSource,
+ rightSource,
+ leftCharCode,
+ rightCharCode;
+
+ leftSource = toSourceNodeWhenNeeded(left).toString();
+ if (leftSource.length === 0) {
+ return [right];
+ }
+
+ rightSource = toSourceNodeWhenNeeded(right).toString();
+ if (rightSource.length === 0) {
+ return [left];
+ }
+
+ leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
+ rightCharCode = rightSource.charCodeAt(0);
+
+ if ((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode ||
+ esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode) ||
+ leftCharCode === 0x2F /* / */ && rightCharCode === 0x69 /* i */) { // infix word operators all start with `i`
+ return [left, noEmptySpace(), right];
+ } else if (esutils.code.isWhiteSpace(leftCharCode) || esutils.code.isLineTerminator(leftCharCode) ||
+ esutils.code.isWhiteSpace(rightCharCode) || esutils.code.isLineTerminator(rightCharCode)) {
+ return [left, right];
+ }
+ return [left, space, right];
+ }
+
+ function addIndent(stmt) {
+ return [base, stmt];
+ }
+
+ function withIndent(fn) {
+ var previousBase;
+ previousBase = base;
+ base += indent;
+ fn(base);
+ base = previousBase;
+ }
+
+ function calculateSpaces(str) {
+ var i;
+ for (i = str.length - 1; i >= 0; --i) {
+ if (esutils.code.isLineTerminator(str.charCodeAt(i))) {
+ break;
+ }
+ }
+ return (str.length - 1) - i;
+ }
+
+ function adjustMultilineComment(value, specialBase) {
+ var array, i, len, line, j, spaces, previousBase, sn;
+
+ array = value.split(/\r\n|[\r\n]/);
+ spaces = Number.MAX_VALUE;
+
+ // first line doesn't have indentation
+ for (i = 1, len = array.length; i < len; ++i) {
+ line = array[i];
+ j = 0;
+ while (j < line.length && esutils.code.isWhiteSpace(line.charCodeAt(j))) {
+ ++j;
+ }
+ if (spaces > j) {
+ spaces = j;
+ }
+ }
+
+ if (typeof specialBase !== 'undefined') {
+ // pattern like
+ // {
+ // var t = 20; /*
+ // * this is comment
+ // */
+ // }
+ previousBase = base;
+ if (array[1][spaces] === '*') {
+ specialBase += ' ';
+ }
+ base = specialBase;
+ } else {
+ if (spaces & 1) {
+ // /*
+ // *
+ // */
+ // If spaces are odd number, above pattern is considered.
+ // We waste 1 space.
+ --spaces;
+ }
+ previousBase = base;
+ }
+
+ for (i = 1, len = array.length; i < len; ++i) {
+ sn = toSourceNodeWhenNeeded(addIndent(array[i].slice(spaces)));
+ array[i] = sourceMap$1 ? sn.join('') : sn;
+ }
+
+ base = previousBase;
+
+ return array.join('\n');
+ }
+
+ function generateComment(comment, specialBase) {
+ if (comment.type === 'Line') {
+ if (endsWithLineTerminator(comment.value)) {
+ return '//' + comment.value;
+ } else {
+ // Always use LineTerminator
+ var result = '//' + comment.value;
+ if (!preserveBlankLines) {
+ result += '\n';
+ }
+ return result;
+ }
+ }
+ if (extra.format.indent.adjustMultilineComment && /[\n\r]/.test(comment.value)) {
+ return adjustMultilineComment('/*' + comment.value + '*/', specialBase);
+ }
+ return '/*' + comment.value + '*/';
+ }
+
+ function addComments(stmt, result) {
+ var i, len, comment, save, tailingToStatement, specialBase, fragment,
+ extRange, range, prevRange, prefix, infix, suffix, count;
+
+ if (stmt.leadingComments && stmt.leadingComments.length > 0) {
+ save = result;
+
+ if (preserveBlankLines) {
+ comment = stmt.leadingComments[0];
+ result = [];
+
+ extRange = comment.extendedRange;
+ range = comment.range;
+
+ prefix = sourceCode.substring(extRange[0], range[0]);
+ count = (prefix.match(/\n/g) || []).length;
+ if (count > 0) {
+ result.push(stringRepeat('\n', count));
+ result.push(addIndent(generateComment(comment)));
+ } else {
+ result.push(prefix);
+ result.push(generateComment(comment));
+ }
+
+ prevRange = range;
+
+ for (i = 1, len = stmt.leadingComments.length; i < len; i++) {
+ comment = stmt.leadingComments[i];
+ range = comment.range;
+
+ infix = sourceCode.substring(prevRange[1], range[0]);
+ count = (infix.match(/\n/g) || []).length;
+ result.push(stringRepeat('\n', count));
+ result.push(addIndent(generateComment(comment)));
+
+ prevRange = range;
+ }
+
+ suffix = sourceCode.substring(range[1], extRange[1]);
+ count = (suffix.match(/\n/g) || []).length;
+ result.push(stringRepeat('\n', count));
+ } else {
+ comment = stmt.leadingComments[0];
+ result = [];
+ if (safeConcatenation && stmt.type === Syntax.Program && stmt.body.length === 0) {
+ result.push('\n');
+ }
+ result.push(generateComment(comment));
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push('\n');
+ }
+
+ for (i = 1, len = stmt.leadingComments.length; i < len; ++i) {
+ comment = stmt.leadingComments[i];
+ fragment = [generateComment(comment)];
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ fragment.push('\n');
+ }
+ result.push(addIndent(fragment));
+ }
+ }
+
+ result.push(addIndent(save));
+ }
+
+ if (stmt.trailingComments) {
+
+ if (preserveBlankLines) {
+ comment = stmt.trailingComments[0];
+ extRange = comment.extendedRange;
+ range = comment.range;
+
+ prefix = sourceCode.substring(extRange[0], range[0]);
+ count = (prefix.match(/\n/g) || []).length;
+
+ if (count > 0) {
+ result.push(stringRepeat('\n', count));
+ result.push(addIndent(generateComment(comment)));
+ } else {
+ result.push(prefix);
+ result.push(generateComment(comment));
+ }
+ } else {
+ tailingToStatement = !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());
+ specialBase = stringRepeat(' ', calculateSpaces(toSourceNodeWhenNeeded([base, result, indent]).toString()));
+ for (i = 0, len = stmt.trailingComments.length; i < len; ++i) {
+ comment = stmt.trailingComments[i];
+ if (tailingToStatement) {
+ // We assume target like following script
+ //
+ // var t = 20; /**
+ // * This is comment of t
+ // */
+ if (i === 0) {
+ // first case
+ result = [result, indent];
+ } else {
+ result = [result, specialBase];
+ }
+ result.push(generateComment(comment, specialBase));
+ } else {
+ result = [result, addIndent(generateComment(comment))];
+ }
+ if (i !== len - 1 && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result = [result, '\n'];
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+
+ function generateBlankLines(start, end, result) {
+ var j, newlineCount = 0;
+
+ for (j = start; j < end; j++) {
+ if (sourceCode[j] === '\n') {
+ newlineCount++;
+ }
+ }
+
+ for (j = 1; j < newlineCount; j++) {
+ result.push(newline);
+ }
+ }
+
+ function parenthesize(text, current, should) {
+ if (current < should) {
+ return ['(', text, ')'];
+ }
+ return text;
+ }
+
+ function generateVerbatimString(string) {
+ var i, iz, result;
+ result = string.split(/\r\n|\n/);
+ for (i = 1, iz = result.length; i < iz; i++) {
+ result[i] = newline + base + result[i];
+ }
+ return result;
+ }
+
+ function generateVerbatim(expr, precedence) {
+ var verbatim, result, prec;
+ verbatim = expr[extra.verbatim];
+
+ if (typeof verbatim === 'string') {
+ result = parenthesize(generateVerbatimString(verbatim), Precedence.Sequence, precedence);
+ } else {
+ // verbatim is object
+ result = generateVerbatimString(verbatim.content);
+ prec = (verbatim.precedence != null) ? verbatim.precedence : Precedence.Sequence;
+ result = parenthesize(result, prec, precedence);
+ }
+
+ return toSourceNodeWhenNeeded(result, expr);
+ }
+
+ function CodeGenerator() {
+ }
+
+ // Helpers.
+
+ CodeGenerator.prototype.maybeBlock = function(stmt, flags) {
+ var result, noLeadingComment, that = this;
+
+ noLeadingComment = !extra.comment || !stmt.leadingComments;
+
+ if (stmt.type === Syntax.BlockStatement && noLeadingComment) {
+ return [space, this.generateStatement(stmt, flags)];
+ }
+
+ if (stmt.type === Syntax.EmptyStatement && noLeadingComment) {
+ return ';';
+ }
+
+ withIndent(function () {
+ result = [
+ newline,
+ addIndent(that.generateStatement(stmt, flags))
+ ];
+ });
+
+ return result;
+ };
+
+ CodeGenerator.prototype.maybeBlockSuffix = function (stmt, result) {
+ var ends = endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());
+ if (stmt.type === Syntax.BlockStatement && (!extra.comment || !stmt.leadingComments) && !ends) {
+ return [result, space];
+ }
+ if (ends) {
+ return [result, base];
+ }
+ return [result, newline, base];
+ };
+
+ function generateIdentifier(node) {
+ return toSourceNodeWhenNeeded(node.name, node);
+ }
+
+ function generateAsyncPrefix(node, spaceRequired) {
+ return node.async ? 'async' + (spaceRequired ? noEmptySpace() : space) : '';
+ }
+
+ function generateStarSuffix(node) {
+ var isGenerator = node.generator && !extra.moz.starlessGenerator;
+ return isGenerator ? '*' + space : '';
+ }
+
+ function generateMethodPrefix(prop) {
+ var func = prop.value, prefix = '';
+ if (func.async) {
+ prefix += generateAsyncPrefix(func, !prop.computed);
+ }
+ if (func.generator) {
+ // avoid space before method name
+ prefix += generateStarSuffix(func) ? '*' : '';
+ }
+ return prefix;
+ }
+
+ CodeGenerator.prototype.generatePattern = function (node, precedence, flags) {
+ if (node.type === Syntax.Identifier) {
+ return generateIdentifier(node);
+ }
+ return this.generateExpression(node, precedence, flags);
+ };
+
+ CodeGenerator.prototype.generateFunctionParams = function (node) {
+ var i, iz, result, hasDefault;
+
+ hasDefault = false;
+
+ if (node.type === Syntax.ArrowFunctionExpression &&
+ !node.rest && (!node.defaults || node.defaults.length === 0) &&
+ node.params.length === 1 && node.params[0].type === Syntax.Identifier) {
+ // arg => { } case
+ result = [generateAsyncPrefix(node, true), generateIdentifier(node.params[0])];
+ } else {
+ result = node.type === Syntax.ArrowFunctionExpression ? [generateAsyncPrefix(node, false)] : [];
+ result.push('(');
+ if (node.defaults) {
+ hasDefault = true;
+ }
+ for (i = 0, iz = node.params.length; i < iz; ++i) {
+ if (hasDefault && node.defaults[i]) {
+ // Handle default values.
+ result.push(this.generateAssignment(node.params[i], node.defaults[i], '=', Precedence.Assignment, E_TTT));
+ } else {
+ result.push(this.generatePattern(node.params[i], Precedence.Assignment, E_TTT));
+ }
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+
+ if (node.rest) {
+ if (node.params.length) {
+ result.push(',' + space);
+ }
+ result.push('...');
+ result.push(generateIdentifier(node.rest));
+ }
+
+ result.push(')');
+ }
+
+ return result;
+ };
+
+ CodeGenerator.prototype.generateFunctionBody = function (node) {
+ var result, expr;
+
+ result = this.generateFunctionParams(node);
+
+ if (node.type === Syntax.ArrowFunctionExpression) {
+ result.push(space);
+ result.push('=>');
+ }
+
+ if (node.expression) {
+ result.push(space);
+ expr = this.generateExpression(node.body, Precedence.Assignment, E_TTT);
+ if (expr.toString().charAt(0) === '{') {
+ expr = ['(', expr, ')'];
+ }
+ result.push(expr);
+ } else {
+ result.push(this.maybeBlock(node.body, S_TTFF));
+ }
+
+ return result;
+ };
+
+ CodeGenerator.prototype.generateIterationForStatement = function (operator, stmt, flags) {
+ var result = ['for' + (stmt.await ? noEmptySpace() + 'await' : '') + space + '('], that = this;
+ withIndent(function () {
+ if (stmt.left.type === Syntax.VariableDeclaration) {
+ withIndent(function () {
+ result.push(stmt.left.kind + noEmptySpace());
+ result.push(that.generateStatement(stmt.left.declarations[0], S_FFFF));
+ });
+ } else {
+ result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT));
+ }
+
+ result = join(result, operator);
+ result = [join(
+ result,
+ that.generateExpression(stmt.right, Precedence.Assignment, E_TTT)
+ ), ')'];
+ });
+ result.push(this.maybeBlock(stmt.body, flags));
+ return result;
+ };
+
+ CodeGenerator.prototype.generatePropertyKey = function (expr, computed) {
+ var result = [];
+
+ if (computed) {
+ result.push('[');
+ }
+
+ result.push(this.generateExpression(expr, Precedence.Sequence, E_TTT));
+
+ if (computed) {
+ result.push(']');
+ }
+
+ return result;
+ };
+
+ CodeGenerator.prototype.generateAssignment = function (left, right, operator, precedence, flags) {
+ if (Precedence.Assignment < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+
+ return parenthesize(
+ [
+ this.generateExpression(left, Precedence.Call, flags),
+ space + operator + space,
+ this.generateExpression(right, Precedence.Assignment, flags)
+ ],
+ Precedence.Assignment,
+ precedence
+ );
+ };
+
+ CodeGenerator.prototype.semicolon = function (flags) {
+ if (!semicolons && flags & F_SEMICOLON_OPT) {
+ return '';
+ }
+ return ';';
+ };
+
+ // Statements.
+
+ CodeGenerator.Statement = {
+
+ BlockStatement: function (stmt, flags) {
+ var range, content, result = ['{', newline], that = this;
+
+ withIndent(function () {
+ // handle functions without any code
+ if (stmt.body.length === 0 && preserveBlankLines) {
+ range = stmt.range;
+ if (range[1] - range[0] > 2) {
+ content = sourceCode.substring(range[0] + 1, range[1] - 1);
+ if (content[0] === '\n') {
+ result = ['{'];
+ }
+ result.push(content);
+ }
+ }
+
+ var i, iz, fragment, bodyFlags;
+ bodyFlags = S_TFFF;
+ if (flags & F_FUNC_BODY) {
+ bodyFlags |= F_DIRECTIVE_CTX;
+ }
+
+ for (i = 0, iz = stmt.body.length; i < iz; ++i) {
+ if (preserveBlankLines) {
+ // handle spaces before the first line
+ if (i === 0) {
+ if (stmt.body[0].leadingComments) {
+ range = stmt.body[0].leadingComments[0].extendedRange;
+ content = sourceCode.substring(range[0], range[1]);
+ if (content[0] === '\n') {
+ result = ['{'];
+ }
+ }
+ if (!stmt.body[0].leadingComments) {
+ generateBlankLines(stmt.range[0], stmt.body[0].range[0], result);
+ }
+ }
+
+ // handle spaces between lines
+ if (i > 0) {
+ if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) {
+ generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);
+ }
+ }
+ }
+
+ if (i === iz - 1) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+
+ if (stmt.body[i].leadingComments && preserveBlankLines) {
+ fragment = that.generateStatement(stmt.body[i], bodyFlags);
+ } else {
+ fragment = addIndent(that.generateStatement(stmt.body[i], bodyFlags));
+ }
+
+ result.push(fragment);
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ if (preserveBlankLines && i < iz - 1) {
+ // don't add a new line if there are leading coments
+ // in the next statement
+ if (!stmt.body[i + 1].leadingComments) {
+ result.push(newline);
+ }
+ } else {
+ result.push(newline);
+ }
+ }
+
+ if (preserveBlankLines) {
+ // handle spaces after the last line
+ if (i === iz - 1) {
+ if (!stmt.body[i].trailingComments) {
+ generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);
+ }
+ }
+ }
+ }
+ });
+
+ result.push(addIndent('}'));
+ return result;
+ },
+
+ BreakStatement: function (stmt, flags) {
+ if (stmt.label) {
+ return 'break ' + stmt.label.name + this.semicolon(flags);
+ }
+ return 'break' + this.semicolon(flags);
+ },
+
+ ContinueStatement: function (stmt, flags) {
+ if (stmt.label) {
+ return 'continue ' + stmt.label.name + this.semicolon(flags);
+ }
+ return 'continue' + this.semicolon(flags);
+ },
+
+ ClassBody: function (stmt, flags) {
+ var result = [ '{', newline], that = this;
+
+ withIndent(function (indent) {
+ var i, iz;
+
+ for (i = 0, iz = stmt.body.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(stmt.body[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(newline);
+ }
+ }
+ });
+
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base);
+ result.push('}');
+ return result;
+ },
+
+ ClassDeclaration: function (stmt, flags) {
+ var result, fragment;
+ result = ['class'];
+ if (stmt.id) {
+ result = join(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT));
+ }
+ if (stmt.superClass) {
+ fragment = join('extends', this.generateExpression(stmt.superClass, Precedence.Unary, E_TTT));
+ result = join(result, fragment);
+ }
+ result.push(space);
+ result.push(this.generateStatement(stmt.body, S_TFFT));
+ return result;
+ },
+
+ DirectiveStatement: function (stmt, flags) {
+ if (extra.raw && stmt.raw) {
+ return stmt.raw + this.semicolon(flags);
+ }
+ return escapeDirective(stmt.directive) + this.semicolon(flags);
+ },
+
+ DoWhileStatement: function (stmt, flags) {
+ // Because `do 42 while (cond)` is Syntax Error. We need semicolon.
+ var result = join('do', this.maybeBlock(stmt.body, S_TFFF));
+ result = this.maybeBlockSuffix(stmt.body, result);
+ return join(result, [
+ 'while' + space + '(',
+ this.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
+ ')' + this.semicolon(flags)
+ ]);
+ },
+
+ CatchClause: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ var guard;
+
+ if (stmt.param) {
+ result = [
+ 'catch' + space + '(',
+ that.generateExpression(stmt.param, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+
+ if (stmt.guard) {
+ guard = that.generateExpression(stmt.guard, Precedence.Sequence, E_TTT);
+ result.splice(2, 0, ' if ', guard);
+ }
+ } else {
+ result = ['catch'];
+ }
+ });
+ result.push(this.maybeBlock(stmt.body, S_TFFF));
+ return result;
+ },
+
+ DebuggerStatement: function (stmt, flags) {
+ return 'debugger' + this.semicolon(flags);
+ },
+
+ EmptyStatement: function (stmt, flags) {
+ return ';';
+ },
+
+ ExportDefaultDeclaration: function (stmt, flags) {
+ var result = [ 'export' ], bodyFlags;
+
+ bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF;
+
+ // export default HoistableDeclaration[Default]
+ // export default AssignmentExpression[In] ;
+ result = join(result, 'default');
+ if (isStatement(stmt.declaration)) {
+ result = join(result, this.generateStatement(stmt.declaration, bodyFlags));
+ } else {
+ result = join(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags));
+ }
+ return result;
+ },
+
+ ExportNamedDeclaration: function (stmt, flags) {
+ var result = [ 'export' ], bodyFlags, that = this;
+
+ bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF;
+
+ // export VariableStatement
+ // export Declaration[Default]
+ if (stmt.declaration) {
+ return join(result, this.generateStatement(stmt.declaration, bodyFlags));
+ }
+
+ // export ExportClause[NoReference] FromClause ;
+ // export ExportClause ;
+ if (stmt.specifiers) {
+ if (stmt.specifiers.length === 0) {
+ result = join(result, '{' + space + '}');
+ } else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) {
+ result = join(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT));
+ } else {
+ result = join(result, '{');
+ withIndent(function (indent) {
+ var i, iz;
+ result.push(newline);
+ for (i = 0, iz = stmt.specifiers.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + newline);
+ }
+ }
+ });
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base + '}');
+ }
+
+ if (stmt.source) {
+ result = join(result, [
+ 'from' + space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ]);
+ } else {
+ result.push(this.semicolon(flags));
+ }
+ }
+ return result;
+ },
+
+ ExportAllDeclaration: function (stmt, flags) {
+ // export * FromClause ;
+ return [
+ 'export' + space,
+ '*' + space,
+ 'from' + space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ];
+ },
+
+ ExpressionStatement: function (stmt, flags) {
+ var result, fragment;
+
+ function isClassPrefixed(fragment) {
+ var code;
+ if (fragment.slice(0, 5) !== 'class') {
+ return false;
+ }
+ code = fragment.charCodeAt(5);
+ return code === 0x7B /* '{' */ || esutils.code.isWhiteSpace(code) || esutils.code.isLineTerminator(code);
+ }
+
+ function isFunctionPrefixed(fragment) {
+ var code;
+ if (fragment.slice(0, 8) !== 'function') {
+ return false;
+ }
+ code = fragment.charCodeAt(8);
+ return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code);
+ }
+
+ function isAsyncPrefixed(fragment) {
+ var code, i, iz;
+ if (fragment.slice(0, 5) !== 'async') {
+ return false;
+ }
+ if (!esutils.code.isWhiteSpace(fragment.charCodeAt(5))) {
+ return false;
+ }
+ for (i = 6, iz = fragment.length; i < iz; ++i) {
+ if (!esutils.code.isWhiteSpace(fragment.charCodeAt(i))) {
+ break;
+ }
+ }
+ if (i === iz) {
+ return false;
+ }
+ if (fragment.slice(i, i + 8) !== 'function') {
+ return false;
+ }
+ code = fragment.charCodeAt(i + 8);
+ return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code);
+ }
+
+ result = [this.generateExpression(stmt.expression, Precedence.Sequence, E_TTT)];
+ // 12.4 '{', 'function', 'class' is not allowed in this position.
+ // wrap expression with parentheses
+ fragment = toSourceNodeWhenNeeded(result).toString();
+ if (fragment.charCodeAt(0) === 0x7B /* '{' */ || // ObjectExpression
+ isClassPrefixed(fragment) ||
+ isFunctionPrefixed(fragment) ||
+ isAsyncPrefixed(fragment) ||
+ (directive && (flags & F_DIRECTIVE_CTX) && stmt.expression.type === Syntax.Literal && typeof stmt.expression.value === 'string')) {
+ result = ['(', result, ')' + this.semicolon(flags)];
+ } else {
+ result.push(this.semicolon(flags));
+ }
+ return result;
+ },
+
+ ImportDeclaration: function (stmt, flags) {
+ // ES6: 15.2.1 valid import declarations:
+ // - import ImportClause FromClause ;
+ // - import ModuleSpecifier ;
+ var result, cursor, that = this;
+
+ // If no ImportClause is present,
+ // this should be `import ModuleSpecifier` so skip `from`
+ // ModuleSpecifier is StringLiteral.
+ if (stmt.specifiers.length === 0) {
+ // import ModuleSpecifier ;
+ return [
+ 'import',
+ space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ];
+ }
+
+ // import ImportClause FromClause ;
+ result = [
+ 'import'
+ ];
+ cursor = 0;
+
+ // ImportedBinding
+ if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) {
+ result = join(result, [
+ this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
+ ]);
+ ++cursor;
+ }
+
+ if (stmt.specifiers[cursor]) {
+ if (cursor !== 0) {
+ result.push(',');
+ }
+
+ if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) {
+ // NameSpaceImport
+ result = join(result, [
+ space,
+ this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
+ ]);
+ } else {
+ // NamedImports
+ result.push(space + '{');
+
+ if ((stmt.specifiers.length - cursor) === 1) {
+ // import { ... } from "...";
+ result.push(space);
+ result.push(this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT));
+ result.push(space + '}' + space);
+ } else {
+ // import {
+ // ...,
+ // ...,
+ // } from "...";
+ withIndent(function (indent) {
+ var i, iz;
+ result.push(newline);
+ for (i = cursor, iz = stmt.specifiers.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + newline);
+ }
+ }
+ });
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base + '}' + space);
+ }
+ }
+ }
+
+ result = join(result, [
+ 'from' + space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ]);
+ return result;
+ },
+
+ VariableDeclarator: function (stmt, flags) {
+ var itemFlags = (flags & F_ALLOW_IN) ? E_TTT : E_FTT;
+ if (stmt.init) {
+ return [
+ this.generateExpression(stmt.id, Precedence.Assignment, itemFlags),
+ space,
+ '=',
+ space,
+ this.generateExpression(stmt.init, Precedence.Assignment, itemFlags)
+ ];
+ }
+ return this.generatePattern(stmt.id, Precedence.Assignment, itemFlags);
+ },
+
+ VariableDeclaration: function (stmt, flags) {
+ // VariableDeclarator is typed as Statement,
+ // but joined with comma (not LineTerminator).
+ // So if comment is attached to target node, we should specialize.
+ var result, i, iz, node, bodyFlags, that = this;
+
+ result = [ stmt.kind ];
+
+ bodyFlags = (flags & F_ALLOW_IN) ? S_TFFF : S_FFFF;
+
+ function block() {
+ node = stmt.declarations[0];
+ if (extra.comment && node.leadingComments) {
+ result.push('\n');
+ result.push(addIndent(that.generateStatement(node, bodyFlags)));
+ } else {
+ result.push(noEmptySpace());
+ result.push(that.generateStatement(node, bodyFlags));
+ }
+
+ for (i = 1, iz = stmt.declarations.length; i < iz; ++i) {
+ node = stmt.declarations[i];
+ if (extra.comment && node.leadingComments) {
+ result.push(',' + newline);
+ result.push(addIndent(that.generateStatement(node, bodyFlags)));
+ } else {
+ result.push(',' + space);
+ result.push(that.generateStatement(node, bodyFlags));
+ }
+ }
+ }
+
+ if (stmt.declarations.length > 1) {
+ withIndent(block);
+ } else {
+ block();
+ }
+
+ result.push(this.semicolon(flags));
+
+ return result;
+ },
+
+ ThrowStatement: function (stmt, flags) {
+ return [join(
+ 'throw',
+ this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
+ ), this.semicolon(flags)];
+ },
+
+ TryStatement: function (stmt, flags) {
+ var result, i, iz, guardedHandlers;
+
+ result = ['try', this.maybeBlock(stmt.block, S_TFFF)];
+ result = this.maybeBlockSuffix(stmt.block, result);
+
+ if (stmt.handlers) {
+ // old interface
+ for (i = 0, iz = stmt.handlers.length; i < iz; ++i) {
+ result = join(result, this.generateStatement(stmt.handlers[i], S_TFFF));
+ if (stmt.finalizer || i + 1 !== iz) {
+ result = this.maybeBlockSuffix(stmt.handlers[i].body, result);
+ }
+ }
+ } else {
+ guardedHandlers = stmt.guardedHandlers || [];
+
+ for (i = 0, iz = guardedHandlers.length; i < iz; ++i) {
+ result = join(result, this.generateStatement(guardedHandlers[i], S_TFFF));
+ if (stmt.finalizer || i + 1 !== iz) {
+ result = this.maybeBlockSuffix(guardedHandlers[i].body, result);
+ }
+ }
+
+ // new interface
+ if (stmt.handler) {
+ if (Array.isArray(stmt.handler)) {
+ for (i = 0, iz = stmt.handler.length; i < iz; ++i) {
+ result = join(result, this.generateStatement(stmt.handler[i], S_TFFF));
+ if (stmt.finalizer || i + 1 !== iz) {
+ result = this.maybeBlockSuffix(stmt.handler[i].body, result);
+ }
+ }
+ } else {
+ result = join(result, this.generateStatement(stmt.handler, S_TFFF));
+ if (stmt.finalizer) {
+ result = this.maybeBlockSuffix(stmt.handler.body, result);
+ }
+ }
+ }
+ }
+ if (stmt.finalizer) {
+ result = join(result, ['finally', this.maybeBlock(stmt.finalizer, S_TFFF)]);
+ }
+ return result;
+ },
+
+ SwitchStatement: function (stmt, flags) {
+ var result, fragment, i, iz, bodyFlags, that = this;
+ withIndent(function () {
+ result = [
+ 'switch' + space + '(',
+ that.generateExpression(stmt.discriminant, Precedence.Sequence, E_TTT),
+ ')' + space + '{' + newline
+ ];
+ });
+ if (stmt.cases) {
+ bodyFlags = S_TFFF;
+ for (i = 0, iz = stmt.cases.length; i < iz; ++i) {
+ if (i === iz - 1) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+ fragment = addIndent(this.generateStatement(stmt.cases[i], bodyFlags));
+ result.push(fragment);
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ result.push(newline);
+ }
+ }
+ }
+ result.push(addIndent('}'));
+ return result;
+ },
+
+ SwitchCase: function (stmt, flags) {
+ var result, fragment, i, iz, bodyFlags, that = this;
+ withIndent(function () {
+ if (stmt.test) {
+ result = [
+ join('case', that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)),
+ ':'
+ ];
+ } else {
+ result = ['default:'];
+ }
+
+ i = 0;
+ iz = stmt.consequent.length;
+ if (iz && stmt.consequent[0].type === Syntax.BlockStatement) {
+ fragment = that.maybeBlock(stmt.consequent[0], S_TFFF);
+ result.push(fragment);
+ i = 1;
+ }
+
+ if (i !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+
+ bodyFlags = S_TFFF;
+ for (; i < iz; ++i) {
+ if (i === iz - 1 && flags & F_SEMICOLON_OPT) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+ fragment = addIndent(that.generateStatement(stmt.consequent[i], bodyFlags));
+ result.push(fragment);
+ if (i + 1 !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ result.push(newline);
+ }
+ }
+ });
+ return result;
+ },
+
+ IfStatement: function (stmt, flags) {
+ var result, bodyFlags, semicolonOptional, that = this;
+ withIndent(function () {
+ result = [
+ 'if' + space + '(',
+ that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+ });
+ semicolonOptional = flags & F_SEMICOLON_OPT;
+ bodyFlags = S_TFFF;
+ if (semicolonOptional) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+ if (stmt.alternate) {
+ result.push(this.maybeBlock(stmt.consequent, S_TFFF));
+ result = this.maybeBlockSuffix(stmt.consequent, result);
+ if (stmt.alternate.type === Syntax.IfStatement) {
+ result = join(result, ['else ', this.generateStatement(stmt.alternate, bodyFlags)]);
+ } else {
+ result = join(result, join('else', this.maybeBlock(stmt.alternate, bodyFlags)));
+ }
+ } else {
+ result.push(this.maybeBlock(stmt.consequent, bodyFlags));
+ }
+ return result;
+ },
+
+ ForStatement: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ result = ['for' + space + '('];
+ if (stmt.init) {
+ if (stmt.init.type === Syntax.VariableDeclaration) {
+ result.push(that.generateStatement(stmt.init, S_FFFF));
+ } else {
+ // F_ALLOW_IN becomes false.
+ result.push(that.generateExpression(stmt.init, Precedence.Sequence, E_FTT));
+ result.push(';');
+ }
+ } else {
+ result.push(';');
+ }
+
+ if (stmt.test) {
+ result.push(space);
+ result.push(that.generateExpression(stmt.test, Precedence.Sequence, E_TTT));
+ result.push(';');
+ } else {
+ result.push(';');
+ }
+
+ if (stmt.update) {
+ result.push(space);
+ result.push(that.generateExpression(stmt.update, Precedence.Sequence, E_TTT));
+ result.push(')');
+ } else {
+ result.push(')');
+ }
+ });
+
+ result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
+ return result;
+ },
+
+ ForInStatement: function (stmt, flags) {
+ return this.generateIterationForStatement('in', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);
+ },
+
+ ForOfStatement: function (stmt, flags) {
+ return this.generateIterationForStatement('of', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);
+ },
+
+ LabeledStatement: function (stmt, flags) {
+ return [stmt.label.name + ':', this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)];
+ },
+
+ Program: function (stmt, flags) {
+ var result, fragment, i, iz, bodyFlags;
+ iz = stmt.body.length;
+ result = [safeConcatenation && iz > 0 ? '\n' : ''];
+ bodyFlags = S_TFTF;
+ for (i = 0; i < iz; ++i) {
+ if (!safeConcatenation && i === iz - 1) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+
+ if (preserveBlankLines) {
+ // handle spaces before the first line
+ if (i === 0) {
+ if (!stmt.body[0].leadingComments) {
+ generateBlankLines(stmt.range[0], stmt.body[i].range[0], result);
+ }
+ }
+
+ // handle spaces between lines
+ if (i > 0) {
+ if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) {
+ generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);
+ }
+ }
+ }
+
+ fragment = addIndent(this.generateStatement(stmt.body[i], bodyFlags));
+ result.push(fragment);
+ if (i + 1 < iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ if (preserveBlankLines) {
+ if (!stmt.body[i + 1].leadingComments) {
+ result.push(newline);
+ }
+ } else {
+ result.push(newline);
+ }
+ }
+
+ if (preserveBlankLines) {
+ // handle spaces after the last line
+ if (i === iz - 1) {
+ if (!stmt.body[i].trailingComments) {
+ generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);
+ }
+ }
+ }
+ }
+ return result;
+ },
+
+ FunctionDeclaration: function (stmt, flags) {
+ return [
+ generateAsyncPrefix(stmt, true),
+ 'function',
+ generateStarSuffix(stmt) || noEmptySpace(),
+ stmt.id ? generateIdentifier(stmt.id) : '',
+ this.generateFunctionBody(stmt)
+ ];
+ },
+
+ ReturnStatement: function (stmt, flags) {
+ if (stmt.argument) {
+ return [join(
+ 'return',
+ this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
+ ), this.semicolon(flags)];
+ }
+ return ['return' + this.semicolon(flags)];
+ },
+
+ WhileStatement: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ result = [
+ 'while' + space + '(',
+ that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+ });
+ result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
+ return result;
+ },
+
+ WithStatement: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ result = [
+ 'with' + space + '(',
+ that.generateExpression(stmt.object, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+ });
+ result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
+ return result;
+ }
+
+ };
+
+ merge(CodeGenerator.prototype, CodeGenerator.Statement);
+
+ // Expressions.
+
+ CodeGenerator.Expression = {
+
+ SequenceExpression: function (expr, precedence, flags) {
+ var result, i, iz;
+ if (Precedence.Sequence < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+ result = [];
+ for (i = 0, iz = expr.expressions.length; i < iz; ++i) {
+ result.push(this.generateExpression(expr.expressions[i], Precedence.Assignment, flags));
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+ return parenthesize(result, Precedence.Sequence, precedence);
+ },
+
+ AssignmentExpression: function (expr, precedence, flags) {
+ return this.generateAssignment(expr.left, expr.right, expr.operator, precedence, flags);
+ },
+
+ ArrowFunctionExpression: function (expr, precedence, flags) {
+ return parenthesize(this.generateFunctionBody(expr), Precedence.ArrowFunction, precedence);
+ },
+
+ ConditionalExpression: function (expr, precedence, flags) {
+ if (Precedence.Conditional < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+ return parenthesize(
+ [
+ this.generateExpression(expr.test, Precedence.LogicalOR, flags),
+ space + '?' + space,
+ this.generateExpression(expr.consequent, Precedence.Assignment, flags),
+ space + ':' + space,
+ this.generateExpression(expr.alternate, Precedence.Assignment, flags)
+ ],
+ Precedence.Conditional,
+ precedence
+ );
+ },
+
+ LogicalExpression: function (expr, precedence, flags) {
+ return this.BinaryExpression(expr, precedence, flags);
+ },
+
+ BinaryExpression: function (expr, precedence, flags) {
+ var result, leftPrecedence, rightPrecedence, currentPrecedence, fragment, leftSource;
+ currentPrecedence = BinaryPrecedence[expr.operator];
+ leftPrecedence = expr.operator === '**' ? Precedence.Postfix : currentPrecedence;
+ rightPrecedence = expr.operator === '**' ? currentPrecedence : currentPrecedence + 1;
+
+ if (currentPrecedence < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+
+ fragment = this.generateExpression(expr.left, leftPrecedence, flags);
+
+ leftSource = fragment.toString();
+
+ if (leftSource.charCodeAt(leftSource.length - 1) === 0x2F /* / */ && esutils.code.isIdentifierPartES5(expr.operator.charCodeAt(0))) {
+ result = [fragment, noEmptySpace(), expr.operator];
+ } else {
+ result = join(fragment, expr.operator);
+ }
+
+ fragment = this.generateExpression(expr.right, rightPrecedence, flags);
+
+ if (expr.operator === '/' && fragment.toString().charAt(0) === '/' ||
+ expr.operator.slice(-1) === '<' && fragment.toString().slice(0, 3) === '!--') {
+ // If '/' concats with '/' or `<` concats with `!--`, it is interpreted as comment start
+ result.push(noEmptySpace());
+ result.push(fragment);
+ } else {
+ result = join(result, fragment);
+ }
+
+ if (expr.operator === 'in' && !(flags & F_ALLOW_IN)) {
+ return ['(', result, ')'];
+ }
+ return parenthesize(result, currentPrecedence, precedence);
+ },
+
+ CallExpression: function (expr, precedence, flags) {
+ var result, i, iz;
+ // F_ALLOW_UNPARATH_NEW becomes false.
+ result = [this.generateExpression(expr.callee, Precedence.Call, E_TTF)];
+ result.push('(');
+ for (i = 0, iz = expr['arguments'].length; i < iz; ++i) {
+ result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+ result.push(')');
+
+ if (!(flags & F_ALLOW_CALL)) {
+ return ['(', result, ')'];
+ }
+ return parenthesize(result, Precedence.Call, precedence);
+ },
+
+ NewExpression: function (expr, precedence, flags) {
+ var result, length, i, iz, itemFlags;
+ length = expr['arguments'].length;
+
+ // F_ALLOW_CALL becomes false.
+ // F_ALLOW_UNPARATH_NEW may become false.
+ itemFlags = (flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0) ? E_TFT : E_TFF;
+
+ result = join(
+ 'new',
+ this.generateExpression(expr.callee, Precedence.New, itemFlags)
+ );
+
+ if (!(flags & F_ALLOW_UNPARATH_NEW) || parentheses || length > 0) {
+ result.push('(');
+ for (i = 0, iz = length; i < iz; ++i) {
+ result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+ result.push(')');
+ }
+
+ return parenthesize(result, Precedence.New, precedence);
+ },
+
+ MemberExpression: function (expr, precedence, flags) {
+ var result, fragment;
+
+ // F_ALLOW_UNPARATH_NEW becomes false.
+ result = [this.generateExpression(expr.object, Precedence.Call, (flags & F_ALLOW_CALL) ? E_TTF : E_TFF)];
+
+ if (expr.computed) {
+ result.push('[');
+ result.push(this.generateExpression(expr.property, Precedence.Sequence, flags & F_ALLOW_CALL ? E_TTT : E_TFT));
+ result.push(']');
+ } else {
+ if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') {
+ fragment = toSourceNodeWhenNeeded(result).toString();
+ // When the following conditions are all true,
+ // 1. No floating point
+ // 2. Don't have exponents
+ // 3. The last character is a decimal digit
+ // 4. Not hexadecimal OR octal number literal
+ // we should add a floating point.
+ if (
+ fragment.indexOf('.') < 0 &&
+ !/[eExX]/.test(fragment) &&
+ esutils.code.isDecimalDigit(fragment.charCodeAt(fragment.length - 1)) &&
+ !(fragment.length >= 2 && fragment.charCodeAt(0) === 48) // '0'
+ ) {
+ result.push(' ');
+ }
+ }
+ result.push('.');
+ result.push(generateIdentifier(expr.property));
+ }
+
+ return parenthesize(result, Precedence.Member, precedence);
+ },
+
+ MetaProperty: function (expr, precedence, flags) {
+ var result;
+ result = [];
+ result.push(typeof expr.meta === "string" ? expr.meta : generateIdentifier(expr.meta));
+ result.push('.');
+ result.push(typeof expr.property === "string" ? expr.property : generateIdentifier(expr.property));
+ return parenthesize(result, Precedence.Member, precedence);
+ },
+
+ UnaryExpression: function (expr, precedence, flags) {
+ var result, fragment, rightCharCode, leftSource, leftCharCode;
+ fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT);
+
+ if (space === '') {
+ result = join(expr.operator, fragment);
+ } else {
+ result = [expr.operator];
+ if (expr.operator.length > 2) {
+ // delete, void, typeof
+ // get `typeof []`, not `typeof[]`
+ result = join(result, fragment);
+ } else {
+ // Prevent inserting spaces between operator and argument if it is unnecessary
+ // like, `!cond`
+ leftSource = toSourceNodeWhenNeeded(result).toString();
+ leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
+ rightCharCode = fragment.toString().charCodeAt(0);
+
+ if (((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode) ||
+ (esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode))) {
+ result.push(noEmptySpace());
+ result.push(fragment);
+ } else {
+ result.push(fragment);
+ }
+ }
+ }
+ return parenthesize(result, Precedence.Unary, precedence);
+ },
+
+ YieldExpression: function (expr, precedence, flags) {
+ var result;
+ if (expr.delegate) {
+ result = 'yield*';
+ } else {
+ result = 'yield';
+ }
+ if (expr.argument) {
+ result = join(
+ result,
+ this.generateExpression(expr.argument, Precedence.Yield, E_TTT)
+ );
+ }
+ return parenthesize(result, Precedence.Yield, precedence);
+ },
+
+ AwaitExpression: function (expr, precedence, flags) {
+ var result = join(
+ expr.all ? 'await*' : 'await',
+ this.generateExpression(expr.argument, Precedence.Await, E_TTT)
+ );
+ return parenthesize(result, Precedence.Await, precedence);
+ },
+
+ UpdateExpression: function (expr, precedence, flags) {
+ if (expr.prefix) {
+ return parenthesize(
+ [
+ expr.operator,
+ this.generateExpression(expr.argument, Precedence.Unary, E_TTT)
+ ],
+ Precedence.Unary,
+ precedence
+ );
+ }
+ return parenthesize(
+ [
+ this.generateExpression(expr.argument, Precedence.Postfix, E_TTT),
+ expr.operator
+ ],
+ Precedence.Postfix,
+ precedence
+ );
+ },
+
+ FunctionExpression: function (expr, precedence, flags) {
+ var result = [
+ generateAsyncPrefix(expr, true),
+ 'function'
+ ];
+ if (expr.id) {
+ result.push(generateStarSuffix(expr) || noEmptySpace());
+ result.push(generateIdentifier(expr.id));
+ } else {
+ result.push(generateStarSuffix(expr) || space);
+ }
+ result.push(this.generateFunctionBody(expr));
+ return result;
+ },
+
+ ArrayPattern: function (expr, precedence, flags) {
+ return this.ArrayExpression(expr, precedence, flags, true);
+ },
+
+ ArrayExpression: function (expr, precedence, flags, isPattern) {
+ var result, multiline, that = this;
+ if (!expr.elements.length) {
+ return '[]';
+ }
+ multiline = isPattern ? false : expr.elements.length > 1;
+ result = ['[', multiline ? newline : ''];
+ withIndent(function (indent) {
+ var i, iz;
+ for (i = 0, iz = expr.elements.length; i < iz; ++i) {
+ if (!expr.elements[i]) {
+ if (multiline) {
+ result.push(indent);
+ }
+ if (i + 1 === iz) {
+ result.push(',');
+ }
+ } else {
+ result.push(multiline ? indent : '');
+ result.push(that.generateExpression(expr.elements[i], Precedence.Assignment, E_TTT));
+ }
+ if (i + 1 < iz) {
+ result.push(',' + (multiline ? newline : space));
+ }
+ }
+ });
+ if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(multiline ? base : '');
+ result.push(']');
+ return result;
+ },
+
+ RestElement: function(expr, precedence, flags) {
+ return '...' + this.generatePattern(expr.argument);
+ },
+
+ ClassExpression: function (expr, precedence, flags) {
+ var result, fragment;
+ result = ['class'];
+ if (expr.id) {
+ result = join(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT));
+ }
+ if (expr.superClass) {
+ fragment = join('extends', this.generateExpression(expr.superClass, Precedence.Unary, E_TTT));
+ result = join(result, fragment);
+ }
+ result.push(space);
+ result.push(this.generateStatement(expr.body, S_TFFT));
+ return result;
+ },
+
+ MethodDefinition: function (expr, precedence, flags) {
+ var result, fragment;
+ if (expr['static']) {
+ result = ['static' + space];
+ } else {
+ result = [];
+ }
+ if (expr.kind === 'get' || expr.kind === 'set') {
+ fragment = [
+ join(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),
+ this.generateFunctionBody(expr.value)
+ ];
+ } else {
+ fragment = [
+ generateMethodPrefix(expr),
+ this.generatePropertyKey(expr.key, expr.computed),
+ this.generateFunctionBody(expr.value)
+ ];
+ }
+ return join(result, fragment);
+ },
+
+ Property: function (expr, precedence, flags) {
+ if (expr.kind === 'get' || expr.kind === 'set') {
+ return [
+ expr.kind, noEmptySpace(),
+ this.generatePropertyKey(expr.key, expr.computed),
+ this.generateFunctionBody(expr.value)
+ ];
+ }
+
+ if (expr.shorthand) {
+ if (expr.value.type === "AssignmentPattern") {
+ return this.AssignmentPattern(expr.value, Precedence.Sequence, E_TTT);
+ }
+ return this.generatePropertyKey(expr.key, expr.computed);
+ }
+
+ if (expr.method) {
+ return [
+ generateMethodPrefix(expr),
+ this.generatePropertyKey(expr.key, expr.computed),
+ this.generateFunctionBody(expr.value)
+ ];
+ }
+
+ return [
+ this.generatePropertyKey(expr.key, expr.computed),
+ ':' + space,
+ this.generateExpression(expr.value, Precedence.Assignment, E_TTT)
+ ];
+ },
+
+ ObjectExpression: function (expr, precedence, flags) {
+ var multiline, result, fragment, that = this;
+
+ if (!expr.properties.length) {
+ return '{}';
+ }
+ multiline = expr.properties.length > 1;
+
+ withIndent(function () {
+ fragment = that.generateExpression(expr.properties[0], Precedence.Sequence, E_TTT);
+ });
+
+ if (!multiline) {
+ // issues 4
+ // Do not transform from
+ // dejavu.Class.declare({
+ // method2: function () {}
+ // });
+ // to
+ // dejavu.Class.declare({method2: function () {
+ // }});
+ if (!hasLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ return [ '{', space, fragment, space, '}' ];
+ }
+ }
+
+ withIndent(function (indent) {
+ var i, iz;
+ result = [ '{', newline, indent, fragment ];
+
+ if (multiline) {
+ result.push(',' + newline);
+ for (i = 1, iz = expr.properties.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + newline);
+ }
+ }
+ }
+ });
+
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base);
+ result.push('}');
+ return result;
+ },
+
+ AssignmentPattern: function(expr, precedence, flags) {
+ return this.generateAssignment(expr.left, expr.right, '=', precedence, flags);
+ },
+
+ ObjectPattern: function (expr, precedence, flags) {
+ var result, i, iz, multiline, property, that = this;
+ if (!expr.properties.length) {
+ return '{}';
+ }
+
+ multiline = false;
+ if (expr.properties.length === 1) {
+ property = expr.properties[0];
+ if (property.value.type !== Syntax.Identifier) {
+ multiline = true;
+ }
+ } else {
+ for (i = 0, iz = expr.properties.length; i < iz; ++i) {
+ property = expr.properties[i];
+ if (!property.shorthand) {
+ multiline = true;
+ break;
+ }
+ }
+ }
+ result = ['{', multiline ? newline : '' ];
+
+ withIndent(function (indent) {
+ var i, iz;
+ for (i = 0, iz = expr.properties.length; i < iz; ++i) {
+ result.push(multiline ? indent : '');
+ result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + (multiline ? newline : space));
+ }
+ }
+ });
+
+ if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(multiline ? base : '');
+ result.push('}');
+ return result;
+ },
+
+ ThisExpression: function (expr, precedence, flags) {
+ return 'this';
+ },
+
+ Super: function (expr, precedence, flags) {
+ return 'super';
+ },
+
+ Identifier: function (expr, precedence, flags) {
+ return generateIdentifier(expr);
+ },
+
+ ImportDefaultSpecifier: function (expr, precedence, flags) {
+ return generateIdentifier(expr.id || expr.local);
+ },
+
+ ImportNamespaceSpecifier: function (expr, precedence, flags) {
+ var result = ['*'];
+ var id = expr.id || expr.local;
+ if (id) {
+ result.push(space + 'as' + noEmptySpace() + generateIdentifier(id));
+ }
+ return result;
+ },
+
+ ImportSpecifier: function (expr, precedence, flags) {
+ var imported = expr.imported;
+ var result = [ imported.name ];
+ var local = expr.local;
+ if (local && local.name !== imported.name) {
+ result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(local));
+ }
+ return result;
+ },
+
+ ExportSpecifier: function (expr, precedence, flags) {
+ var local = expr.local;
+ var result = [ local.name ];
+ var exported = expr.exported;
+ if (exported && exported.name !== local.name) {
+ result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(exported));
+ }
+ return result;
+ },
+
+ Literal: function (expr, precedence, flags) {
+ var raw;
+ if (expr.hasOwnProperty('raw') && parse && extra.raw) {
+ try {
+ raw = parse(expr.raw).body[0].expression;
+ if (raw.type === Syntax.Literal) {
+ if (raw.value === expr.value) {
+ return expr.raw;
+ }
+ }
+ } catch (e) {
+ // not use raw property
+ }
+ }
+
+ if (expr.regex) {
+ return '/' + expr.regex.pattern + '/' + expr.regex.flags;
+ }
+
+ if (expr.value === null) {
+ return 'null';
+ }
+
+ if (typeof expr.value === 'string') {
+ return escapeString(expr.value);
+ }
+
+ if (typeof expr.value === 'number') {
+ return generateNumber(expr.value);
+ }
+
+ if (typeof expr.value === 'boolean') {
+ return expr.value ? 'true' : 'false';
+ }
+
+ return generateRegExp(expr.value);
+ },
+
+ GeneratorExpression: function (expr, precedence, flags) {
+ return this.ComprehensionExpression(expr, precedence, flags);
+ },
+
+ ComprehensionExpression: function (expr, precedence, flags) {
+ // GeneratorExpression should be parenthesized with (...), ComprehensionExpression with [...]
+ // Due to https://bugzilla.mozilla.org/show_bug.cgi?id=883468 position of expr.body can differ in Spidermonkey and ES6
+
+ var result, i, iz, fragment, that = this;
+ result = (expr.type === Syntax.GeneratorExpression) ? ['('] : ['['];
+
+ if (extra.moz.comprehensionExpressionStartsWithAssignment) {
+ fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
+ result.push(fragment);
+ }
+
+ if (expr.blocks) {
+ withIndent(function () {
+ for (i = 0, iz = expr.blocks.length; i < iz; ++i) {
+ fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT);
+ if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) {
+ result = join(result, fragment);
+ } else {
+ result.push(fragment);
+ }
+ }
+ });
+ }
+
+ if (expr.filter) {
+ result = join(result, 'if' + space);
+ fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT);
+ result = join(result, [ '(', fragment, ')' ]);
+ }
+
+ if (!extra.moz.comprehensionExpressionStartsWithAssignment) {
+ fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
+
+ result = join(result, fragment);
+ }
+
+ result.push((expr.type === Syntax.GeneratorExpression) ? ')' : ']');
+ return result;
+ },
+
+ ComprehensionBlock: function (expr, precedence, flags) {
+ var fragment;
+ if (expr.left.type === Syntax.VariableDeclaration) {
+ fragment = [
+ expr.left.kind, noEmptySpace(),
+ this.generateStatement(expr.left.declarations[0], S_FFFF)
+ ];
+ } else {
+ fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT);
+ }
+
+ fragment = join(fragment, expr.of ? 'of' : 'in');
+ fragment = join(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT));
+
+ return [ 'for' + space + '(', fragment, ')' ];
+ },
+
+ SpreadElement: function (expr, precedence, flags) {
+ return [
+ '...',
+ this.generateExpression(expr.argument, Precedence.Assignment, E_TTT)
+ ];
+ },
+
+ TaggedTemplateExpression: function (expr, precedence, flags) {
+ var itemFlags = E_TTF;
+ if (!(flags & F_ALLOW_CALL)) {
+ itemFlags = E_TFF;
+ }
+ var result = [
+ this.generateExpression(expr.tag, Precedence.Call, itemFlags),
+ this.generateExpression(expr.quasi, Precedence.Primary, E_FFT)
+ ];
+ return parenthesize(result, Precedence.TaggedTemplate, precedence);
+ },
+
+ TemplateElement: function (expr, precedence, flags) {
+ // Don't use "cooked". Since tagged template can use raw template
+ // representation. So if we do so, it breaks the script semantics.
+ return expr.value.raw;
+ },
+
+ TemplateLiteral: function (expr, precedence, flags) {
+ var result, i, iz;
+ result = [ '`' ];
+ for (i = 0, iz = expr.quasis.length; i < iz; ++i) {
+ result.push(this.generateExpression(expr.quasis[i], Precedence.Primary, E_TTT));
+ if (i + 1 < iz) {
+ result.push('${' + space);
+ result.push(this.generateExpression(expr.expressions[i], Precedence.Sequence, E_TTT));
+ result.push(space + '}');
+ }
+ }
+ result.push('`');
+ return result;
+ },
+
+ ModuleSpecifier: function (expr, precedence, flags) {
+ return this.Literal(expr, precedence, flags);
+ },
+
+ ImportExpression: function(expr, precedence, flag) {
+ return parenthesize([
+ 'import(',
+ this.generateExpression(expr.source, Precedence.Assignment, E_TTT),
+ ')'
+ ], Precedence.Call, precedence);
+ },
+
+ };
+
+ merge(CodeGenerator.prototype, CodeGenerator.Expression);
+
+ CodeGenerator.prototype.generateExpression = function (expr, precedence, flags) {
+ var result, type;
+
+ type = expr.type || Syntax.Property;
+
+ if (extra.verbatim && expr.hasOwnProperty(extra.verbatim)) {
+ return generateVerbatim(expr, precedence);
+ }
+
+ result = this[type](expr, precedence, flags);
+
+
+ if (extra.comment) {
+ result = addComments(expr, result);
+ }
+ return toSourceNodeWhenNeeded(result, expr);
+ };
+
+ CodeGenerator.prototype.generateStatement = function (stmt, flags) {
+ var result,
+ fragment;
+
+ result = this[stmt.type](stmt, flags);
+
+ // Attach comments
+
+ if (extra.comment) {
+ result = addComments(stmt, result);
+ }
+
+ fragment = toSourceNodeWhenNeeded(result).toString();
+ if (stmt.type === Syntax.Program && !safeConcatenation && newline === '' && fragment.charAt(fragment.length - 1) === '\n') {
+ result = sourceMap$1 ? toSourceNodeWhenNeeded(result).replaceRight(/\s+$/, '') : fragment.replace(/\s+$/, '');
+ }
+
+ return toSourceNodeWhenNeeded(result, stmt);
+ };
+
+ function generateInternal(node) {
+ var codegen;
+
+ codegen = new CodeGenerator();
+ if (isStatement(node)) {
+ return codegen.generateStatement(node, S_TFFF);
+ }
+
+ if (isExpression(node)) {
+ return codegen.generateExpression(node, Precedence.Sequence, E_TTT);
+ }
+
+ throw new Error('Unknown node type: ' + node.type);
+ }
+
+ function generate(node, options) {
+ var defaultOptions = getDefaultOptions(), result, pair;
+
+ if (options != null) {
+ // Obsolete options
+ //
+ // `options.indent`
+ // `options.base`
+ //
+ // Instead of them, we can use `option.format.indent`.
+ if (typeof options.indent === 'string') {
+ defaultOptions.format.indent.style = options.indent;
+ }
+ if (typeof options.base === 'number') {
+ defaultOptions.format.indent.base = options.base;
+ }
+ options = updateDeeply(defaultOptions, options);
+ indent = options.format.indent.style;
+ if (typeof options.base === 'string') {
+ base = options.base;
+ } else {
+ base = stringRepeat(indent, options.format.indent.base);
+ }
+ } else {
+ options = defaultOptions;
+ indent = options.format.indent.style;
+ base = stringRepeat(indent, options.format.indent.base);
+ }
+ json = options.format.json;
+ renumber = options.format.renumber;
+ hexadecimal = json ? false : options.format.hexadecimal;
+ quotes = json ? 'double' : options.format.quotes;
+ escapeless = options.format.escapeless;
+ newline = options.format.newline;
+ space = options.format.space;
+ if (options.format.compact) {
+ newline = space = indent = base = '';
+ }
+ parentheses = options.format.parentheses;
+ semicolons = options.format.semicolons;
+ safeConcatenation = options.format.safeConcatenation;
+ directive = options.directive;
+ parse = json ? null : options.parse;
+ sourceMap$1 = options.sourceMap;
+ sourceCode = options.sourceCode;
+ preserveBlankLines = options.format.preserveBlankLines && sourceCode !== null;
+ extra = options;
+
+ if (sourceMap$1) {
+ if (!exports.browser) {
+ // We assume environment is node.js
+ // And prevent from including source-map by browserify
+ SourceNode = sourceMap.SourceNode;
+ } else {
+ SourceNode = commonjsGlobal.sourceMap.SourceNode;
+ }
+ }
+
+ result = generateInternal(node);
+
+ if (!sourceMap$1) {
+ pair = {code: result.toString(), map: null};
+ return options.sourceMapWithCode ? pair : pair.code;
+ }
+
+
+ pair = result.toStringWithSourceMap({
+ file: options.file,
+ sourceRoot: options.sourceMapRoot
+ });
+
+ if (options.sourceContent) {
+ pair.map.setSourceContent(options.sourceMap,
+ options.sourceContent);
+ }
+
+ if (options.sourceMapWithCode) {
+ return pair;
+ }
+
+ return pair.map.toString();
+ }
+
+ FORMAT_MINIFY = {
+ indent: {
+ style: '',
+ base: 0
+ },
+ renumber: true,
+ hexadecimal: true,
+ quotes: 'auto',
+ escapeless: true,
+ compact: true,
+ parentheses: false,
+ semicolons: false
+ };
+
+ FORMAT_DEFAULTS = getDefaultOptions().format;
+
+ exports.version = require$$3.version;
+ exports.generate = generate;
+ exports.attachComments = estraverse$1.attachComments;
+ exports.Precedence = updateDeeply({}, Precedence);
+ exports.browser = false;
+ exports.FORMAT_MINIFY = FORMAT_MINIFY;
+ exports.FORMAT_DEFAULTS = FORMAT_DEFAULTS;
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */
+});
+
+var esprima = createCommonjsModule(function (module, exports) {
+(function webpackUniversalModuleDefinition(root, factory) {
+/* istanbul ignore next */
+ if('object' === 'object' && 'object' === 'object')
+ module.exports = factory();
+ else if(typeof undefined === 'function' && undefined.amd)
+ undefined([], factory);
+/* istanbul ignore next */
+ else if('object' === 'object')
+ exports["esprima"] = factory();
+ else
+ root["esprima"] = factory();
+})(commonjsGlobal, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+
+/******/ // Check if module is in cache
+/* istanbul ignore if */
+/******/ if(installedModules[moduleId])
+/******/ return installedModules[moduleId].exports;
+
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ exports: {},
+/******/ id: moduleId,
+/******/ loaded: false
+/******/ };
+
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+/******/ // Flag the module as loaded
+/******/ module.loaded = true;
+
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+
+
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ /*
+ Copyright JS Foundation and other contributors, https://js.foundation/
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var comment_handler_1 = __webpack_require__(1);
+ var jsx_parser_1 = __webpack_require__(3);
+ var parser_1 = __webpack_require__(8);
+ var tokenizer_1 = __webpack_require__(15);
+ function parse(code, options, delegate) {
+ var commentHandler = null;
+ var proxyDelegate = function (node, metadata) {
+ if (delegate) {
+ delegate(node, metadata);
+ }
+ if (commentHandler) {
+ commentHandler.visit(node, metadata);
+ }
+ };
+ var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null;
+ var collectComment = false;
+ if (options) {
+ collectComment = (typeof options.comment === 'boolean' && options.comment);
+ var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment);
+ if (collectComment || attachComment) {
+ commentHandler = new comment_handler_1.CommentHandler();
+ commentHandler.attach = attachComment;
+ options.comment = true;
+ parserDelegate = proxyDelegate;
+ }
+ }
+ var isModule = false;
+ if (options && typeof options.sourceType === 'string') {
+ isModule = (options.sourceType === 'module');
+ }
+ var parser;
+ if (options && typeof options.jsx === 'boolean' && options.jsx) {
+ parser = new jsx_parser_1.JSXParser(code, options, parserDelegate);
+ }
+ else {
+ parser = new parser_1.Parser(code, options, parserDelegate);
+ }
+ var program = isModule ? parser.parseModule() : parser.parseScript();
+ var ast = program;
+ if (collectComment && commentHandler) {
+ ast.comments = commentHandler.comments;
+ }
+ if (parser.config.tokens) {
+ ast.tokens = parser.tokens;
+ }
+ if (parser.config.tolerant) {
+ ast.errors = parser.errorHandler.errors;
+ }
+ return ast;
+ }
+ exports.parse = parse;
+ function parseModule(code, options, delegate) {
+ var parsingOptions = options || {};
+ parsingOptions.sourceType = 'module';
+ return parse(code, parsingOptions, delegate);
+ }
+ exports.parseModule = parseModule;
+ function parseScript(code, options, delegate) {
+ var parsingOptions = options || {};
+ parsingOptions.sourceType = 'script';
+ return parse(code, parsingOptions, delegate);
+ }
+ exports.parseScript = parseScript;
+ function tokenize(code, options, delegate) {
+ var tokenizer = new tokenizer_1.Tokenizer(code, options);
+ var tokens;
+ tokens = [];
+ try {
+ while (true) {
+ var token = tokenizer.getNextToken();
+ if (!token) {
+ break;
+ }
+ if (delegate) {
+ token = delegate(token);
+ }
+ tokens.push(token);
+ }
+ }
+ catch (e) {
+ tokenizer.errorHandler.tolerate(e);
+ }
+ if (tokenizer.errorHandler.tolerant) {
+ tokens.errors = tokenizer.errors();
+ }
+ return tokens;
+ }
+ exports.tokenize = tokenize;
+ var syntax_1 = __webpack_require__(2);
+ exports.Syntax = syntax_1.Syntax;
+ // Sync with *.json manifests.
+ exports.version = '4.0.1';
+
+
+/***/ },
+/* 1 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var syntax_1 = __webpack_require__(2);
+ var CommentHandler = (function () {
+ function CommentHandler() {
+ this.attach = false;
+ this.comments = [];
+ this.stack = [];
+ this.leading = [];
+ this.trailing = [];
+ }
+ CommentHandler.prototype.insertInnerComments = function (node, metadata) {
+ // innnerComments for properties empty block
+ // `function a() {/** comments **\/}`
+ if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) {
+ var innerComments = [];
+ for (var i = this.leading.length - 1; i >= 0; --i) {
+ var entry = this.leading[i];
+ if (metadata.end.offset >= entry.start) {
+ innerComments.unshift(entry.comment);
+ this.leading.splice(i, 1);
+ this.trailing.splice(i, 1);
+ }
+ }
+ if (innerComments.length) {
+ node.innerComments = innerComments;
+ }
+ }
+ };
+ CommentHandler.prototype.findTrailingComments = function (metadata) {
+ var trailingComments = [];
+ if (this.trailing.length > 0) {
+ for (var i = this.trailing.length - 1; i >= 0; --i) {
+ var entry_1 = this.trailing[i];
+ if (entry_1.start >= metadata.end.offset) {
+ trailingComments.unshift(entry_1.comment);
+ }
+ }
+ this.trailing.length = 0;
+ return trailingComments;
+ }
+ var entry = this.stack[this.stack.length - 1];
+ if (entry && entry.node.trailingComments) {
+ var firstComment = entry.node.trailingComments[0];
+ if (firstComment && firstComment.range[0] >= metadata.end.offset) {
+ trailingComments = entry.node.trailingComments;
+ delete entry.node.trailingComments;
+ }
+ }
+ return trailingComments;
+ };
+ CommentHandler.prototype.findLeadingComments = function (metadata) {
+ var leadingComments = [];
+ var target;
+ while (this.stack.length > 0) {
+ var entry = this.stack[this.stack.length - 1];
+ if (entry && entry.start >= metadata.start.offset) {
+ target = entry.node;
+ this.stack.pop();
+ }
+ else {
+ break;
+ }
+ }
+ if (target) {
+ var count = target.leadingComments ? target.leadingComments.length : 0;
+ for (var i = count - 1; i >= 0; --i) {
+ var comment = target.leadingComments[i];
+ if (comment.range[1] <= metadata.start.offset) {
+ leadingComments.unshift(comment);
+ target.leadingComments.splice(i, 1);
+ }
+ }
+ if (target.leadingComments && target.leadingComments.length === 0) {
+ delete target.leadingComments;
+ }
+ return leadingComments;
+ }
+ for (var i = this.leading.length - 1; i >= 0; --i) {
+ var entry = this.leading[i];
+ if (entry.start <= metadata.start.offset) {
+ leadingComments.unshift(entry.comment);
+ this.leading.splice(i, 1);
+ }
+ }
+ return leadingComments;
+ };
+ CommentHandler.prototype.visitNode = function (node, metadata) {
+ if (node.type === syntax_1.Syntax.Program && node.body.length > 0) {
+ return;
+ }
+ this.insertInnerComments(node, metadata);
+ var trailingComments = this.findTrailingComments(metadata);
+ var leadingComments = this.findLeadingComments(metadata);
+ if (leadingComments.length > 0) {
+ node.leadingComments = leadingComments;
+ }
+ if (trailingComments.length > 0) {
+ node.trailingComments = trailingComments;
+ }
+ this.stack.push({
+ node: node,
+ start: metadata.start.offset
+ });
+ };
+ CommentHandler.prototype.visitComment = function (node, metadata) {
+ var type = (node.type[0] === 'L') ? 'Line' : 'Block';
+ var comment = {
+ type: type,
+ value: node.value
+ };
+ if (node.range) {
+ comment.range = node.range;
+ }
+ if (node.loc) {
+ comment.loc = node.loc;
+ }
+ this.comments.push(comment);
+ if (this.attach) {
+ var entry = {
+ comment: {
+ type: type,
+ value: node.value,
+ range: [metadata.start.offset, metadata.end.offset]
+ },
+ start: metadata.start.offset
+ };
+ if (node.loc) {
+ entry.comment.loc = node.loc;
+ }
+ node.type = type;
+ this.leading.push(entry);
+ this.trailing.push(entry);
+ }
+ };
+ CommentHandler.prototype.visit = function (node, metadata) {
+ if (node.type === 'LineComment') {
+ this.visitComment(node, metadata);
+ }
+ else if (node.type === 'BlockComment') {
+ this.visitComment(node, metadata);
+ }
+ else if (this.attach) {
+ this.visitNode(node, metadata);
+ }
+ };
+ return CommentHandler;
+ }());
+ exports.CommentHandler = CommentHandler;
+
+
+/***/ },
+/* 2 */
+/***/ function(module, exports) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.Syntax = {
+ AssignmentExpression: 'AssignmentExpression',
+ AssignmentPattern: 'AssignmentPattern',
+ ArrayExpression: 'ArrayExpression',
+ ArrayPattern: 'ArrayPattern',
+ ArrowFunctionExpression: 'ArrowFunctionExpression',
+ AwaitExpression: 'AwaitExpression',
+ BlockStatement: 'BlockStatement',
+ BinaryExpression: 'BinaryExpression',
+ BreakStatement: 'BreakStatement',
+ CallExpression: 'CallExpression',
+ CatchClause: 'CatchClause',
+ ClassBody: 'ClassBody',
+ ClassDeclaration: 'ClassDeclaration',
+ ClassExpression: 'ClassExpression',
+ ConditionalExpression: 'ConditionalExpression',
+ ContinueStatement: 'ContinueStatement',
+ DoWhileStatement: 'DoWhileStatement',
+ DebuggerStatement: 'DebuggerStatement',
+ EmptyStatement: 'EmptyStatement',
+ ExportAllDeclaration: 'ExportAllDeclaration',
+ ExportDefaultDeclaration: 'ExportDefaultDeclaration',
+ ExportNamedDeclaration: 'ExportNamedDeclaration',
+ ExportSpecifier: 'ExportSpecifier',
+ ExpressionStatement: 'ExpressionStatement',
+ ForStatement: 'ForStatement',
+ ForOfStatement: 'ForOfStatement',
+ ForInStatement: 'ForInStatement',
+ FunctionDeclaration: 'FunctionDeclaration',
+ FunctionExpression: 'FunctionExpression',
+ Identifier: 'Identifier',
+ IfStatement: 'IfStatement',
+ ImportDeclaration: 'ImportDeclaration',
+ ImportDefaultSpecifier: 'ImportDefaultSpecifier',
+ ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
+ ImportSpecifier: 'ImportSpecifier',
+ Literal: 'Literal',
+ LabeledStatement: 'LabeledStatement',
+ LogicalExpression: 'LogicalExpression',
+ MemberExpression: 'MemberExpression',
+ MetaProperty: 'MetaProperty',
+ MethodDefinition: 'MethodDefinition',
+ NewExpression: 'NewExpression',
+ ObjectExpression: 'ObjectExpression',
+ ObjectPattern: 'ObjectPattern',
+ Program: 'Program',
+ Property: 'Property',
+ RestElement: 'RestElement',
+ ReturnStatement: 'ReturnStatement',
+ SequenceExpression: 'SequenceExpression',
+ SpreadElement: 'SpreadElement',
+ Super: 'Super',
+ SwitchCase: 'SwitchCase',
+ SwitchStatement: 'SwitchStatement',
+ TaggedTemplateExpression: 'TaggedTemplateExpression',
+ TemplateElement: 'TemplateElement',
+ TemplateLiteral: 'TemplateLiteral',
+ ThisExpression: 'ThisExpression',
+ ThrowStatement: 'ThrowStatement',
+ TryStatement: 'TryStatement',
+ UnaryExpression: 'UnaryExpression',
+ UpdateExpression: 'UpdateExpression',
+ VariableDeclaration: 'VariableDeclaration',
+ VariableDeclarator: 'VariableDeclarator',
+ WhileStatement: 'WhileStatement',
+ WithStatement: 'WithStatement',
+ YieldExpression: 'YieldExpression'
+ };
+
+
+/***/ },
+/* 3 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+/* istanbul ignore next */
+ var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+ })();
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var character_1 = __webpack_require__(4);
+ var JSXNode = __webpack_require__(5);
+ var jsx_syntax_1 = __webpack_require__(6);
+ var Node = __webpack_require__(7);
+ var parser_1 = __webpack_require__(8);
+ var token_1 = __webpack_require__(13);
+ var xhtml_entities_1 = __webpack_require__(14);
+ token_1.TokenName[100 /* Identifier */] = 'JSXIdentifier';
+ token_1.TokenName[101 /* Text */] = 'JSXText';
+ // Fully qualified element name, e.g. returns "svg:path"
+ function getQualifiedElementName(elementName) {
+ var qualifiedName;
+ switch (elementName.type) {
+ case jsx_syntax_1.JSXSyntax.JSXIdentifier:
+ var id = elementName;
+ qualifiedName = id.name;
+ break;
+ case jsx_syntax_1.JSXSyntax.JSXNamespacedName:
+ var ns = elementName;
+ qualifiedName = getQualifiedElementName(ns.namespace) + ':' +
+ getQualifiedElementName(ns.name);
+ break;
+ case jsx_syntax_1.JSXSyntax.JSXMemberExpression:
+ var expr = elementName;
+ qualifiedName = getQualifiedElementName(expr.object) + '.' +
+ getQualifiedElementName(expr.property);
+ break;
+ /* istanbul ignore next */
+ default:
+ break;
+ }
+ return qualifiedName;
+ }
+ var JSXParser = (function (_super) {
+ __extends(JSXParser, _super);
+ function JSXParser(code, options, delegate) {
+ return _super.call(this, code, options, delegate) || this;
+ }
+ JSXParser.prototype.parsePrimaryExpression = function () {
+ return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this);
+ };
+ JSXParser.prototype.startJSX = function () {
+ // Unwind the scanner before the lookahead token.
+ this.scanner.index = this.startMarker.index;
+ this.scanner.lineNumber = this.startMarker.line;
+ this.scanner.lineStart = this.startMarker.index - this.startMarker.column;
+ };
+ JSXParser.prototype.finishJSX = function () {
+ // Prime the next lookahead.
+ this.nextToken();
+ };
+ JSXParser.prototype.reenterJSX = function () {
+ this.startJSX();
+ this.expectJSX('}');
+ // Pop the closing '}' added from the lookahead.
+ if (this.config.tokens) {
+ this.tokens.pop();
+ }
+ };
+ JSXParser.prototype.createJSXNode = function () {
+ this.collectComments();
+ return {
+ index: this.scanner.index,
+ line: this.scanner.lineNumber,
+ column: this.scanner.index - this.scanner.lineStart
+ };
+ };
+ JSXParser.prototype.createJSXChildNode = function () {
+ return {
+ index: this.scanner.index,
+ line: this.scanner.lineNumber,
+ column: this.scanner.index - this.scanner.lineStart
+ };
+ };
+ JSXParser.prototype.scanXHTMLEntity = function (quote) {
+ var result = '&';
+ var valid = true;
+ var terminated = false;
+ var numeric = false;
+ var hex = false;
+ while (!this.scanner.eof() && valid && !terminated) {
+ var ch = this.scanner.source[this.scanner.index];
+ if (ch === quote) {
+ break;
+ }
+ terminated = (ch === ';');
+ result += ch;
+ ++this.scanner.index;
+ if (!terminated) {
+ switch (result.length) {
+ case 2:
+ // e.g. '{'
+ numeric = (ch === '#');
+ break;
+ case 3:
+ if (numeric) {
+ // e.g. 'A'
+ hex = (ch === 'x');
+ valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0));
+ numeric = numeric && !hex;
+ }
+ break;
+ default:
+ valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0)));
+ valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0)));
+ break;
+ }
+ }
+ }
+ if (valid && terminated && result.length > 2) {
+ // e.g. 'A' becomes just '#x41'
+ var str = result.substr(1, result.length - 2);
+ if (numeric && str.length > 1) {
+ result = String.fromCharCode(parseInt(str.substr(1), 10));
+ }
+ else if (hex && str.length > 2) {
+ result = String.fromCharCode(parseInt('0' + str.substr(1), 16));
+ }
+ else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) {
+ result = xhtml_entities_1.XHTMLEntities[str];
+ }
+ }
+ return result;
+ };
+ // Scan the next JSX token. This replaces Scanner#lex when in JSX mode.
+ JSXParser.prototype.lexJSX = function () {
+ var cp = this.scanner.source.charCodeAt(this.scanner.index);
+ // < > / : = { }
+ if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) {
+ var value = this.scanner.source[this.scanner.index++];
+ return {
+ type: 7 /* Punctuator */,
+ value: value,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: this.scanner.index - 1,
+ end: this.scanner.index
+ };
+ }
+ // " '
+ if (cp === 34 || cp === 39) {
+ var start = this.scanner.index;
+ var quote = this.scanner.source[this.scanner.index++];
+ var str = '';
+ while (!this.scanner.eof()) {
+ var ch = this.scanner.source[this.scanner.index++];
+ if (ch === quote) {
+ break;
+ }
+ else if (ch === '&') {
+ str += this.scanXHTMLEntity(quote);
+ }
+ else {
+ str += ch;
+ }
+ }
+ return {
+ type: 8 /* StringLiteral */,
+ value: str,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: start,
+ end: this.scanner.index
+ };
+ }
+ // ... or .
+ if (cp === 46) {
+ var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1);
+ var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2);
+ var value = (n1 === 46 && n2 === 46) ? '...' : '.';
+ var start = this.scanner.index;
+ this.scanner.index += value.length;
+ return {
+ type: 7 /* Punctuator */,
+ value: value,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: start,
+ end: this.scanner.index
+ };
+ }
+ // `
+ if (cp === 96) {
+ // Only placeholder, since it will be rescanned as a real assignment expression.
+ return {
+ type: 10 /* Template */,
+ value: '',
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: this.scanner.index,
+ end: this.scanner.index
+ };
+ }
+ // Identifer can not contain backslash (char code 92).
+ if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) {
+ var start = this.scanner.index;
+ ++this.scanner.index;
+ while (!this.scanner.eof()) {
+ var ch = this.scanner.source.charCodeAt(this.scanner.index);
+ if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) {
+ ++this.scanner.index;
+ }
+ else if (ch === 45) {
+ // Hyphen (char code 45) can be part of an identifier.
+ ++this.scanner.index;
+ }
+ else {
+ break;
+ }
+ }
+ var id = this.scanner.source.slice(start, this.scanner.index);
+ return {
+ type: 100 /* Identifier */,
+ value: id,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: start,
+ end: this.scanner.index
+ };
+ }
+ return this.scanner.lex();
+ };
+ JSXParser.prototype.nextJSXToken = function () {
+ this.collectComments();
+ this.startMarker.index = this.scanner.index;
+ this.startMarker.line = this.scanner.lineNumber;
+ this.startMarker.column = this.scanner.index - this.scanner.lineStart;
+ var token = this.lexJSX();
+ this.lastMarker.index = this.scanner.index;
+ this.lastMarker.line = this.scanner.lineNumber;
+ this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
+ if (this.config.tokens) {
+ this.tokens.push(this.convertToken(token));
+ }
+ return token;
+ };
+ JSXParser.prototype.nextJSXText = function () {
+ this.startMarker.index = this.scanner.index;
+ this.startMarker.line = this.scanner.lineNumber;
+ this.startMarker.column = this.scanner.index - this.scanner.lineStart;
+ var start = this.scanner.index;
+ var text = '';
+ while (!this.scanner.eof()) {
+ var ch = this.scanner.source[this.scanner.index];
+ if (ch === '{' || ch === '<') {
+ break;
+ }
+ ++this.scanner.index;
+ text += ch;
+ if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
+ ++this.scanner.lineNumber;
+ if (ch === '\r' && this.scanner.source[this.scanner.index] === '\n') {
+ ++this.scanner.index;
+ }
+ this.scanner.lineStart = this.scanner.index;
+ }
+ }
+ this.lastMarker.index = this.scanner.index;
+ this.lastMarker.line = this.scanner.lineNumber;
+ this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
+ var token = {
+ type: 101 /* Text */,
+ value: text,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: start,
+ end: this.scanner.index
+ };
+ if ((text.length > 0) && this.config.tokens) {
+ this.tokens.push(this.convertToken(token));
+ }
+ return token;
+ };
+ JSXParser.prototype.peekJSXToken = function () {
+ var state = this.scanner.saveState();
+ this.scanner.scanComments();
+ var next = this.lexJSX();
+ this.scanner.restoreState(state);
+ return next;
+ };
+ // Expect the next JSX token to match the specified punctuator.
+ // If not, an exception will be thrown.
+ JSXParser.prototype.expectJSX = function (value) {
+ var token = this.nextJSXToken();
+ if (token.type !== 7 /* Punctuator */ || token.value !== value) {
+ this.throwUnexpectedToken(token);
+ }
+ };
+ // Return true if the next JSX token matches the specified punctuator.
+ JSXParser.prototype.matchJSX = function (value) {
+ var next = this.peekJSXToken();
+ return next.type === 7 /* Punctuator */ && next.value === value;
+ };
+ JSXParser.prototype.parseJSXIdentifier = function () {
+ var node = this.createJSXNode();
+ var token = this.nextJSXToken();
+ if (token.type !== 100 /* Identifier */) {
+ this.throwUnexpectedToken(token);
+ }
+ return this.finalize(node, new JSXNode.JSXIdentifier(token.value));
+ };
+ JSXParser.prototype.parseJSXElementName = function () {
+ var node = this.createJSXNode();
+ var elementName = this.parseJSXIdentifier();
+ if (this.matchJSX(':')) {
+ var namespace = elementName;
+ this.expectJSX(':');
+ var name_1 = this.parseJSXIdentifier();
+ elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1));
+ }
+ else if (this.matchJSX('.')) {
+ while (this.matchJSX('.')) {
+ var object = elementName;
+ this.expectJSX('.');
+ var property = this.parseJSXIdentifier();
+ elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property));
+ }
+ }
+ return elementName;
+ };
+ JSXParser.prototype.parseJSXAttributeName = function () {
+ var node = this.createJSXNode();
+ var attributeName;
+ var identifier = this.parseJSXIdentifier();
+ if (this.matchJSX(':')) {
+ var namespace = identifier;
+ this.expectJSX(':');
+ var name_2 = this.parseJSXIdentifier();
+ attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2));
+ }
+ else {
+ attributeName = identifier;
+ }
+ return attributeName;
+ };
+ JSXParser.prototype.parseJSXStringLiteralAttribute = function () {
+ var node = this.createJSXNode();
+ var token = this.nextJSXToken();
+ if (token.type !== 8 /* StringLiteral */) {
+ this.throwUnexpectedToken(token);
+ }
+ var raw = this.getTokenRaw(token);
+ return this.finalize(node, new Node.Literal(token.value, raw));
+ };
+ JSXParser.prototype.parseJSXExpressionAttribute = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('{');
+ this.finishJSX();
+ if (this.match('}')) {
+ this.tolerateError('JSX attributes must only be assigned a non-empty expression');
+ }
+ var expression = this.parseAssignmentExpression();
+ this.reenterJSX();
+ return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
+ };
+ JSXParser.prototype.parseJSXAttributeValue = function () {
+ return this.matchJSX('{') ? this.parseJSXExpressionAttribute() :
+ this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute();
+ };
+ JSXParser.prototype.parseJSXNameValueAttribute = function () {
+ var node = this.createJSXNode();
+ var name = this.parseJSXAttributeName();
+ var value = null;
+ if (this.matchJSX('=')) {
+ this.expectJSX('=');
+ value = this.parseJSXAttributeValue();
+ }
+ return this.finalize(node, new JSXNode.JSXAttribute(name, value));
+ };
+ JSXParser.prototype.parseJSXSpreadAttribute = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('{');
+ this.expectJSX('...');
+ this.finishJSX();
+ var argument = this.parseAssignmentExpression();
+ this.reenterJSX();
+ return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument));
+ };
+ JSXParser.prototype.parseJSXAttributes = function () {
+ var attributes = [];
+ while (!this.matchJSX('/') && !this.matchJSX('>')) {
+ var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() :
+ this.parseJSXNameValueAttribute();
+ attributes.push(attribute);
+ }
+ return attributes;
+ };
+ JSXParser.prototype.parseJSXOpeningElement = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('<');
+ var name = this.parseJSXElementName();
+ var attributes = this.parseJSXAttributes();
+ var selfClosing = this.matchJSX('/');
+ if (selfClosing) {
+ this.expectJSX('/');
+ }
+ this.expectJSX('>');
+ return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
+ };
+ JSXParser.prototype.parseJSXBoundaryElement = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('<');
+ if (this.matchJSX('/')) {
+ this.expectJSX('/');
+ var name_3 = this.parseJSXElementName();
+ this.expectJSX('>');
+ return this.finalize(node, new JSXNode.JSXClosingElement(name_3));
+ }
+ var name = this.parseJSXElementName();
+ var attributes = this.parseJSXAttributes();
+ var selfClosing = this.matchJSX('/');
+ if (selfClosing) {
+ this.expectJSX('/');
+ }
+ this.expectJSX('>');
+ return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
+ };
+ JSXParser.prototype.parseJSXEmptyExpression = function () {
+ var node = this.createJSXChildNode();
+ this.collectComments();
+ this.lastMarker.index = this.scanner.index;
+ this.lastMarker.line = this.scanner.lineNumber;
+ this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
+ return this.finalize(node, new JSXNode.JSXEmptyExpression());
+ };
+ JSXParser.prototype.parseJSXExpressionContainer = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('{');
+ var expression;
+ if (this.matchJSX('}')) {
+ expression = this.parseJSXEmptyExpression();
+ this.expectJSX('}');
+ }
+ else {
+ this.finishJSX();
+ expression = this.parseAssignmentExpression();
+ this.reenterJSX();
+ }
+ return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
+ };
+ JSXParser.prototype.parseJSXChildren = function () {
+ var children = [];
+ while (!this.scanner.eof()) {
+ var node = this.createJSXChildNode();
+ var token = this.nextJSXText();
+ if (token.start < token.end) {
+ var raw = this.getTokenRaw(token);
+ var child = this.finalize(node, new JSXNode.JSXText(token.value, raw));
+ children.push(child);
+ }
+ if (this.scanner.source[this.scanner.index] === '{') {
+ var container = this.parseJSXExpressionContainer();
+ children.push(container);
+ }
+ else {
+ break;
+ }
+ }
+ return children;
+ };
+ JSXParser.prototype.parseComplexJSXElement = function (el) {
+ var stack = [];
+ while (!this.scanner.eof()) {
+ el.children = el.children.concat(this.parseJSXChildren());
+ var node = this.createJSXChildNode();
+ var element = this.parseJSXBoundaryElement();
+ if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) {
+ var opening = element;
+ if (opening.selfClosing) {
+ var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null));
+ el.children.push(child);
+ }
+ else {
+ stack.push(el);
+ el = { node: node, opening: opening, closing: null, children: [] };
+ }
+ }
+ if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) {
+ el.closing = element;
+ var open_1 = getQualifiedElementName(el.opening.name);
+ var close_1 = getQualifiedElementName(el.closing.name);
+ if (open_1 !== close_1) {
+ this.tolerateError('Expected corresponding JSX closing tag for %0', open_1);
+ }
+ if (stack.length > 0) {
+ var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing));
+ el = stack[stack.length - 1];
+ el.children.push(child);
+ stack.pop();
+ }
+ else {
+ break;
+ }
+ }
+ }
+ return el;
+ };
+ JSXParser.prototype.parseJSXElement = function () {
+ var node = this.createJSXNode();
+ var opening = this.parseJSXOpeningElement();
+ var children = [];
+ var closing = null;
+ if (!opening.selfClosing) {
+ var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children });
+ children = el.children;
+ closing = el.closing;
+ }
+ return this.finalize(node, new JSXNode.JSXElement(opening, children, closing));
+ };
+ JSXParser.prototype.parseJSXRoot = function () {
+ // Pop the opening '<' added from the lookahead.
+ if (this.config.tokens) {
+ this.tokens.pop();
+ }
+ this.startJSX();
+ var element = this.parseJSXElement();
+ this.finishJSX();
+ return element;
+ };
+ JSXParser.prototype.isStartOfExpression = function () {
+ return _super.prototype.isStartOfExpression.call(this) || this.match('<');
+ };
+ return JSXParser;
+ }(parser_1.Parser));
+ exports.JSXParser = JSXParser;
+
+
+/***/ },
+/* 4 */
+/***/ function(module, exports) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // See also tools/generate-unicode-regex.js.
+ var Regex = {
+ // Unicode v8.0.0 NonAsciiIdentifierStart:
+ NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
+ // Unicode v8.0.0 NonAsciiIdentifierPart:
+ NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
+ };
+ exports.Character = {
+ /* tslint:disable:no-bitwise */
+ fromCodePoint: function (cp) {
+ return (cp < 0x10000) ? String.fromCharCode(cp) :
+ String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) +
+ String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023));
+ },
+ // https://tc39.github.io/ecma262/#sec-white-space
+ isWhiteSpace: function (cp) {
+ return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) ||
+ (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0);
+ },
+ // https://tc39.github.io/ecma262/#sec-line-terminators
+ isLineTerminator: function (cp) {
+ return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029);
+ },
+ // https://tc39.github.io/ecma262/#sec-names-and-keywords
+ isIdentifierStart: function (cp) {
+ return (cp === 0x24) || (cp === 0x5F) ||
+ (cp >= 0x41 && cp <= 0x5A) ||
+ (cp >= 0x61 && cp <= 0x7A) ||
+ (cp === 0x5C) ||
+ ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp)));
+ },
+ isIdentifierPart: function (cp) {
+ return (cp === 0x24) || (cp === 0x5F) ||
+ (cp >= 0x41 && cp <= 0x5A) ||
+ (cp >= 0x61 && cp <= 0x7A) ||
+ (cp >= 0x30 && cp <= 0x39) ||
+ (cp === 0x5C) ||
+ ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp)));
+ },
+ // https://tc39.github.io/ecma262/#sec-literals-numeric-literals
+ isDecimalDigit: function (cp) {
+ return (cp >= 0x30 && cp <= 0x39); // 0..9
+ },
+ isHexDigit: function (cp) {
+ return (cp >= 0x30 && cp <= 0x39) ||
+ (cp >= 0x41 && cp <= 0x46) ||
+ (cp >= 0x61 && cp <= 0x66); // a..f
+ },
+ isOctalDigit: function (cp) {
+ return (cp >= 0x30 && cp <= 0x37); // 0..7
+ }
+ };
+
+
+/***/ },
+/* 5 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var jsx_syntax_1 = __webpack_require__(6);
+ /* tslint:disable:max-classes-per-file */
+ var JSXClosingElement = (function () {
+ function JSXClosingElement(name) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement;
+ this.name = name;
+ }
+ return JSXClosingElement;
+ }());
+ exports.JSXClosingElement = JSXClosingElement;
+ var JSXElement = (function () {
+ function JSXElement(openingElement, children, closingElement) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXElement;
+ this.openingElement = openingElement;
+ this.children = children;
+ this.closingElement = closingElement;
+ }
+ return JSXElement;
+ }());
+ exports.JSXElement = JSXElement;
+ var JSXEmptyExpression = (function () {
+ function JSXEmptyExpression() {
+ this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression;
+ }
+ return JSXEmptyExpression;
+ }());
+ exports.JSXEmptyExpression = JSXEmptyExpression;
+ var JSXExpressionContainer = (function () {
+ function JSXExpressionContainer(expression) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer;
+ this.expression = expression;
+ }
+ return JSXExpressionContainer;
+ }());
+ exports.JSXExpressionContainer = JSXExpressionContainer;
+ var JSXIdentifier = (function () {
+ function JSXIdentifier(name) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier;
+ this.name = name;
+ }
+ return JSXIdentifier;
+ }());
+ exports.JSXIdentifier = JSXIdentifier;
+ var JSXMemberExpression = (function () {
+ function JSXMemberExpression(object, property) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression;
+ this.object = object;
+ this.property = property;
+ }
+ return JSXMemberExpression;
+ }());
+ exports.JSXMemberExpression = JSXMemberExpression;
+ var JSXAttribute = (function () {
+ function JSXAttribute(name, value) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXAttribute;
+ this.name = name;
+ this.value = value;
+ }
+ return JSXAttribute;
+ }());
+ exports.JSXAttribute = JSXAttribute;
+ var JSXNamespacedName = (function () {
+ function JSXNamespacedName(namespace, name) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName;
+ this.namespace = namespace;
+ this.name = name;
+ }
+ return JSXNamespacedName;
+ }());
+ exports.JSXNamespacedName = JSXNamespacedName;
+ var JSXOpeningElement = (function () {
+ function JSXOpeningElement(name, selfClosing, attributes) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement;
+ this.name = name;
+ this.selfClosing = selfClosing;
+ this.attributes = attributes;
+ }
+ return JSXOpeningElement;
+ }());
+ exports.JSXOpeningElement = JSXOpeningElement;
+ var JSXSpreadAttribute = (function () {
+ function JSXSpreadAttribute(argument) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute;
+ this.argument = argument;
+ }
+ return JSXSpreadAttribute;
+ }());
+ exports.JSXSpreadAttribute = JSXSpreadAttribute;
+ var JSXText = (function () {
+ function JSXText(value, raw) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXText;
+ this.value = value;
+ this.raw = raw;
+ }
+ return JSXText;
+ }());
+ exports.JSXText = JSXText;
+
+
+/***/ },
+/* 6 */
+/***/ function(module, exports) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.JSXSyntax = {
+ JSXAttribute: 'JSXAttribute',
+ JSXClosingElement: 'JSXClosingElement',
+ JSXElement: 'JSXElement',
+ JSXEmptyExpression: 'JSXEmptyExpression',
+ JSXExpressionContainer: 'JSXExpressionContainer',
+ JSXIdentifier: 'JSXIdentifier',
+ JSXMemberExpression: 'JSXMemberExpression',
+ JSXNamespacedName: 'JSXNamespacedName',
+ JSXOpeningElement: 'JSXOpeningElement',
+ JSXSpreadAttribute: 'JSXSpreadAttribute',
+ JSXText: 'JSXText'
+ };
+
+
+/***/ },
+/* 7 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var syntax_1 = __webpack_require__(2);
+ /* tslint:disable:max-classes-per-file */
+ var ArrayExpression = (function () {
+ function ArrayExpression(elements) {
+ this.type = syntax_1.Syntax.ArrayExpression;
+ this.elements = elements;
+ }
+ return ArrayExpression;
+ }());
+ exports.ArrayExpression = ArrayExpression;
+ var ArrayPattern = (function () {
+ function ArrayPattern(elements) {
+ this.type = syntax_1.Syntax.ArrayPattern;
+ this.elements = elements;
+ }
+ return ArrayPattern;
+ }());
+ exports.ArrayPattern = ArrayPattern;
+ var ArrowFunctionExpression = (function () {
+ function ArrowFunctionExpression(params, body, expression) {
+ this.type = syntax_1.Syntax.ArrowFunctionExpression;
+ this.id = null;
+ this.params = params;
+ this.body = body;
+ this.generator = false;
+ this.expression = expression;
+ this.async = false;
+ }
+ return ArrowFunctionExpression;
+ }());
+ exports.ArrowFunctionExpression = ArrowFunctionExpression;
+ var AssignmentExpression = (function () {
+ function AssignmentExpression(operator, left, right) {
+ this.type = syntax_1.Syntax.AssignmentExpression;
+ this.operator = operator;
+ this.left = left;
+ this.right = right;
+ }
+ return AssignmentExpression;
+ }());
+ exports.AssignmentExpression = AssignmentExpression;
+ var AssignmentPattern = (function () {
+ function AssignmentPattern(left, right) {
+ this.type = syntax_1.Syntax.AssignmentPattern;
+ this.left = left;
+ this.right = right;
+ }
+ return AssignmentPattern;
+ }());
+ exports.AssignmentPattern = AssignmentPattern;
+ var AsyncArrowFunctionExpression = (function () {
+ function AsyncArrowFunctionExpression(params, body, expression) {
+ this.type = syntax_1.Syntax.ArrowFunctionExpression;
+ this.id = null;
+ this.params = params;
+ this.body = body;
+ this.generator = false;
+ this.expression = expression;
+ this.async = true;
+ }
+ return AsyncArrowFunctionExpression;
+ }());
+ exports.AsyncArrowFunctionExpression = AsyncArrowFunctionExpression;
+ var AsyncFunctionDeclaration = (function () {
+ function AsyncFunctionDeclaration(id, params, body) {
+ this.type = syntax_1.Syntax.FunctionDeclaration;
+ this.id = id;
+ this.params = params;
+ this.body = body;
+ this.generator = false;
+ this.expression = false;
+ this.async = true;
+ }
+ return AsyncFunctionDeclaration;
+ }());
+ exports.AsyncFunctionDeclaration = AsyncFunctionDeclaration;
+ var AsyncFunctionExpression = (function () {
+ function AsyncFunctionExpression(id, params, body) {
+ this.type = syntax_1.Syntax.FunctionExpression;
+ this.id = id;
+ this.params = params;
+ this.body = body;
+ this.generator = false;
+ this.expression = false;
+ this.async = true;
+ }
+ return AsyncFunctionExpression;
+ }());
+ exports.AsyncFunctionExpression = AsyncFunctionExpression;
+ var AwaitExpression = (function () {
+ function AwaitExpression(argument) {
+ this.type = syntax_1.Syntax.AwaitExpression;
+ this.argument = argument;
+ }
+ return AwaitExpression;
+ }());
+ exports.AwaitExpression = AwaitExpression;
+ var BinaryExpression = (function () {
+ function BinaryExpression(operator, left, right) {
+ var logical = (operator === '||' || operator === '&&');
+ this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression;
+ this.operator = operator;
+ this.left = left;
+ this.right = right;
+ }
+ return BinaryExpression;
+ }());
+ exports.BinaryExpression = BinaryExpression;
+ var BlockStatement = (function () {
+ function BlockStatement(body) {
+ this.type = syntax_1.Syntax.BlockStatement;
+ this.body = body;
+ }
+ return BlockStatement;
+ }());
+ exports.BlockStatement = BlockStatement;
+ var BreakStatement = (function () {
+ function BreakStatement(label) {
+ this.type = syntax_1.Syntax.BreakStatement;
+ this.label = label;
+ }
+ return BreakStatement;
+ }());
+ exports.BreakStatement = BreakStatement;
+ var CallExpression = (function () {
+ function CallExpression(callee, args) {
+ this.type = syntax_1.Syntax.CallExpression;
+ this.callee = callee;
+ this.arguments = args;
+ }
+ return CallExpression;
+ }());
+ exports.CallExpression = CallExpression;
+ var CatchClause = (function () {
+ function CatchClause(param, body) {
+ this.type = syntax_1.Syntax.CatchClause;
+ this.param = param;
+ this.body = body;
+ }
+ return CatchClause;
+ }());
+ exports.CatchClause = CatchClause;
+ var ClassBody = (function () {
+ function ClassBody(body) {
+ this.type = syntax_1.Syntax.ClassBody;
+ this.body = body;
+ }
+ return ClassBody;
+ }());
+ exports.ClassBody = ClassBody;
+ var ClassDeclaration = (function () {
+ function ClassDeclaration(id, superClass, body) {
+ this.type = syntax_1.Syntax.ClassDeclaration;
+ this.id = id;
+ this.superClass = superClass;
+ this.body = body;
+ }
+ return ClassDeclaration;
+ }());
+ exports.ClassDeclaration = ClassDeclaration;
+ var ClassExpression = (function () {
+ function ClassExpression(id, superClass, body) {
+ this.type = syntax_1.Syntax.ClassExpression;
+ this.id = id;
+ this.superClass = superClass;
+ this.body = body;
+ }
+ return ClassExpression;
+ }());
+ exports.ClassExpression = ClassExpression;
+ var ComputedMemberExpression = (function () {
+ function ComputedMemberExpression(object, property) {
+ this.type = syntax_1.Syntax.MemberExpression;
+ this.computed = true;
+ this.object = object;
+ this.property = property;
+ }
+ return ComputedMemberExpression;
+ }());
+ exports.ComputedMemberExpression = ComputedMemberExpression;
+ var ConditionalExpression = (function () {
+ function ConditionalExpression(test, consequent, alternate) {
+ this.type = syntax_1.Syntax.ConditionalExpression;
+ this.test = test;
+ this.consequent = consequent;
+ this.alternate = alternate;
+ }
+ return ConditionalExpression;
+ }());
+ exports.ConditionalExpression = ConditionalExpression;
+ var ContinueStatement = (function () {
+ function ContinueStatement(label) {
+ this.type = syntax_1.Syntax.ContinueStatement;
+ this.label = label;
+ }
+ return ContinueStatement;
+ }());
+ exports.ContinueStatement = ContinueStatement;
+ var DebuggerStatement = (function () {
+ function DebuggerStatement() {
+ this.type = syntax_1.Syntax.DebuggerStatement;
+ }
+ return DebuggerStatement;
+ }());
+ exports.DebuggerStatement = DebuggerStatement;
+ var Directive = (function () {
+ function Directive(expression, directive) {
+ this.type = syntax_1.Syntax.ExpressionStatement;
+ this.expression = expression;
+ this.directive = directive;
+ }
+ return Directive;
+ }());
+ exports.Directive = Directive;
+ var DoWhileStatement = (function () {
+ function DoWhileStatement(body, test) {
+ this.type = syntax_1.Syntax.DoWhileStatement;
+ this.body = body;
+ this.test = test;
+ }
+ return DoWhileStatement;
+ }());
+ exports.DoWhileStatement = DoWhileStatement;
+ var EmptyStatement = (function () {
+ function EmptyStatement() {
+ this.type = syntax_1.Syntax.EmptyStatement;
+ }
+ return EmptyStatement;
+ }());
+ exports.EmptyStatement = EmptyStatement;
+ var ExportAllDeclaration = (function () {
+ function ExportAllDeclaration(source) {
+ this.type = syntax_1.Syntax.ExportAllDeclaration;
+ this.source = source;
+ }
+ return ExportAllDeclaration;
+ }());
+ exports.ExportAllDeclaration = ExportAllDeclaration;
+ var ExportDefaultDeclaration = (function () {
+ function ExportDefaultDeclaration(declaration) {
+ this.type = syntax_1.Syntax.ExportDefaultDeclaration;
+ this.declaration = declaration;
+ }
+ return ExportDefaultDeclaration;
+ }());
+ exports.ExportDefaultDeclaration = ExportDefaultDeclaration;
+ var ExportNamedDeclaration = (function () {
+ function ExportNamedDeclaration(declaration, specifiers, source) {
+ this.type = syntax_1.Syntax.ExportNamedDeclaration;
+ this.declaration = declaration;
+ this.specifiers = specifiers;
+ this.source = source;
+ }
+ return ExportNamedDeclaration;
+ }());
+ exports.ExportNamedDeclaration = ExportNamedDeclaration;
+ var ExportSpecifier = (function () {
+ function ExportSpecifier(local, exported) {
+ this.type = syntax_1.Syntax.ExportSpecifier;
+ this.exported = exported;
+ this.local = local;
+ }
+ return ExportSpecifier;
+ }());
+ exports.ExportSpecifier = ExportSpecifier;
+ var ExpressionStatement = (function () {
+ function ExpressionStatement(expression) {
+ this.type = syntax_1.Syntax.ExpressionStatement;
+ this.expression = expression;
+ }
+ return ExpressionStatement;
+ }());
+ exports.ExpressionStatement = ExpressionStatement;
+ var ForInStatement = (function () {
+ function ForInStatement(left, right, body) {
+ this.type = syntax_1.Syntax.ForInStatement;
+ this.left = left;
+ this.right = right;
+ this.body = body;
+ this.each = false;
+ }
+ return ForInStatement;
+ }());
+ exports.ForInStatement = ForInStatement;
+ var ForOfStatement = (function () {
+ function ForOfStatement(left, right, body) {
+ this.type = syntax_1.Syntax.ForOfStatement;
+ this.left = left;
+ this.right = right;
+ this.body = body;
+ }
+ return ForOfStatement;
+ }());
+ exports.ForOfStatement = ForOfStatement;
+ var ForStatement = (function () {
+ function ForStatement(init, test, update, body) {
+ this.type = syntax_1.Syntax.ForStatement;
+ this.init = init;
+ this.test = test;
+ this.update = update;
+ this.body = body;
+ }
+ return ForStatement;
+ }());
+ exports.ForStatement = ForStatement;
+ var FunctionDeclaration = (function () {
+ function FunctionDeclaration(id, params, body, generator) {
+ this.type = syntax_1.Syntax.FunctionDeclaration;
+ this.id = id;
+ this.params = params;
+ this.body = body;
+ this.generator = generator;
+ this.expression = false;
+ this.async = false;
+ }
+ return FunctionDeclaration;
+ }());
+ exports.FunctionDeclaration = FunctionDeclaration;
+ var FunctionExpression = (function () {
+ function FunctionExpression(id, params, body, generator) {
+ this.type = syntax_1.Syntax.FunctionExpression;
+ this.id = id;
+ this.params = params;
+ this.body = body;
+ this.generator = generator;
+ this.expression = false;
+ this.async = false;
+ }
+ return FunctionExpression;
+ }());
+ exports.FunctionExpression = FunctionExpression;
+ var Identifier = (function () {
+ function Identifier(name) {
+ this.type = syntax_1.Syntax.Identifier;
+ this.name = name;
+ }
+ return Identifier;
+ }());
+ exports.Identifier = Identifier;
+ var IfStatement = (function () {
+ function IfStatement(test, consequent, alternate) {
+ this.type = syntax_1.Syntax.IfStatement;
+ this.test = test;
+ this.consequent = consequent;
+ this.alternate = alternate;
+ }
+ return IfStatement;
+ }());
+ exports.IfStatement = IfStatement;
+ var ImportDeclaration = (function () {
+ function ImportDeclaration(specifiers, source) {
+ this.type = syntax_1.Syntax.ImportDeclaration;
+ this.specifiers = specifiers;
+ this.source = source;
+ }
+ return ImportDeclaration;
+ }());
+ exports.ImportDeclaration = ImportDeclaration;
+ var ImportDefaultSpecifier = (function () {
+ function ImportDefaultSpecifier(local) {
+ this.type = syntax_1.Syntax.ImportDefaultSpecifier;
+ this.local = local;
+ }
+ return ImportDefaultSpecifier;
+ }());
+ exports.ImportDefaultSpecifier = ImportDefaultSpecifier;
+ var ImportNamespaceSpecifier = (function () {
+ function ImportNamespaceSpecifier(local) {
+ this.type = syntax_1.Syntax.ImportNamespaceSpecifier;
+ this.local = local;
+ }
+ return ImportNamespaceSpecifier;
+ }());
+ exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier;
+ var ImportSpecifier = (function () {
+ function ImportSpecifier(local, imported) {
+ this.type = syntax_1.Syntax.ImportSpecifier;
+ this.local = local;
+ this.imported = imported;
+ }
+ return ImportSpecifier;
+ }());
+ exports.ImportSpecifier = ImportSpecifier;
+ var LabeledStatement = (function () {
+ function LabeledStatement(label, body) {
+ this.type = syntax_1.Syntax.LabeledStatement;
+ this.label = label;
+ this.body = body;
+ }
+ return LabeledStatement;
+ }());
+ exports.LabeledStatement = LabeledStatement;
+ var Literal = (function () {
+ function Literal(value, raw) {
+ this.type = syntax_1.Syntax.Literal;
+ this.value = value;
+ this.raw = raw;
+ }
+ return Literal;
+ }());
+ exports.Literal = Literal;
+ var MetaProperty = (function () {
+ function MetaProperty(meta, property) {
+ this.type = syntax_1.Syntax.MetaProperty;
+ this.meta = meta;
+ this.property = property;
+ }
+ return MetaProperty;
+ }());
+ exports.MetaProperty = MetaProperty;
+ var MethodDefinition = (function () {
+ function MethodDefinition(key, computed, value, kind, isStatic) {
+ this.type = syntax_1.Syntax.MethodDefinition;
+ this.key = key;
+ this.computed = computed;
+ this.value = value;
+ this.kind = kind;
+ this.static = isStatic;
+ }
+ return MethodDefinition;
+ }());
+ exports.MethodDefinition = MethodDefinition;
+ var Module = (function () {
+ function Module(body) {
+ this.type = syntax_1.Syntax.Program;
+ this.body = body;
+ this.sourceType = 'module';
+ }
+ return Module;
+ }());
+ exports.Module = Module;
+ var NewExpression = (function () {
+ function NewExpression(callee, args) {
+ this.type = syntax_1.Syntax.NewExpression;
+ this.callee = callee;
+ this.arguments = args;
+ }
+ return NewExpression;
+ }());
+ exports.NewExpression = NewExpression;
+ var ObjectExpression = (function () {
+ function ObjectExpression(properties) {
+ this.type = syntax_1.Syntax.ObjectExpression;
+ this.properties = properties;
+ }
+ return ObjectExpression;
+ }());
+ exports.ObjectExpression = ObjectExpression;
+ var ObjectPattern = (function () {
+ function ObjectPattern(properties) {
+ this.type = syntax_1.Syntax.ObjectPattern;
+ this.properties = properties;
+ }
+ return ObjectPattern;
+ }());
+ exports.ObjectPattern = ObjectPattern;
+ var Property = (function () {
+ function Property(kind, key, computed, value, method, shorthand) {
+ this.type = syntax_1.Syntax.Property;
+ this.key = key;
+ this.computed = computed;
+ this.value = value;
+ this.kind = kind;
+ this.method = method;
+ this.shorthand = shorthand;
+ }
+ return Property;
+ }());
+ exports.Property = Property;
+ var RegexLiteral = (function () {
+ function RegexLiteral(value, raw, pattern, flags) {
+ this.type = syntax_1.Syntax.Literal;
+ this.value = value;
+ this.raw = raw;
+ this.regex = { pattern: pattern, flags: flags };
+ }
+ return RegexLiteral;
+ }());
+ exports.RegexLiteral = RegexLiteral;
+ var RestElement = (function () {
+ function RestElement(argument) {
+ this.type = syntax_1.Syntax.RestElement;
+ this.argument = argument;
+ }
+ return RestElement;
+ }());
+ exports.RestElement = RestElement;
+ var ReturnStatement = (function () {
+ function ReturnStatement(argument) {
+ this.type = syntax_1.Syntax.ReturnStatement;
+ this.argument = argument;
+ }
+ return ReturnStatement;
+ }());
+ exports.ReturnStatement = ReturnStatement;
+ var Script = (function () {
+ function Script(body) {
+ this.type = syntax_1.Syntax.Program;
+ this.body = body;
+ this.sourceType = 'script';
+ }
+ return Script;
+ }());
+ exports.Script = Script;
+ var SequenceExpression = (function () {
+ function SequenceExpression(expressions) {
+ this.type = syntax_1.Syntax.SequenceExpression;
+ this.expressions = expressions;
+ }
+ return SequenceExpression;
+ }());
+ exports.SequenceExpression = SequenceExpression;
+ var SpreadElement = (function () {
+ function SpreadElement(argument) {
+ this.type = syntax_1.Syntax.SpreadElement;
+ this.argument = argument;
+ }
+ return SpreadElement;
+ }());
+ exports.SpreadElement = SpreadElement;
+ var StaticMemberExpression = (function () {
+ function StaticMemberExpression(object, property) {
+ this.type = syntax_1.Syntax.MemberExpression;
+ this.computed = false;
+ this.object = object;
+ this.property = property;
+ }
+ return StaticMemberExpression;
+ }());
+ exports.StaticMemberExpression = StaticMemberExpression;
+ var Super = (function () {
+ function Super() {
+ this.type = syntax_1.Syntax.Super;
+ }
+ return Super;
+ }());
+ exports.Super = Super;
+ var SwitchCase = (function () {
+ function SwitchCase(test, consequent) {
+ this.type = syntax_1.Syntax.SwitchCase;
+ this.test = test;
+ this.consequent = consequent;
+ }
+ return SwitchCase;
+ }());
+ exports.SwitchCase = SwitchCase;
+ var SwitchStatement = (function () {
+ function SwitchStatement(discriminant, cases) {
+ this.type = syntax_1.Syntax.SwitchStatement;
+ this.discriminant = discriminant;
+ this.cases = cases;
+ }
+ return SwitchStatement;
+ }());
+ exports.SwitchStatement = SwitchStatement;
+ var TaggedTemplateExpression = (function () {
+ function TaggedTemplateExpression(tag, quasi) {
+ this.type = syntax_1.Syntax.TaggedTemplateExpression;
+ this.tag = tag;
+ this.quasi = quasi;
+ }
+ return TaggedTemplateExpression;
+ }());
+ exports.TaggedTemplateExpression = TaggedTemplateExpression;
+ var TemplateElement = (function () {
+ function TemplateElement(value, tail) {
+ this.type = syntax_1.Syntax.TemplateElement;
+ this.value = value;
+ this.tail = tail;
+ }
+ return TemplateElement;
+ }());
+ exports.TemplateElement = TemplateElement;
+ var TemplateLiteral = (function () {
+ function TemplateLiteral(quasis, expressions) {
+ this.type = syntax_1.Syntax.TemplateLiteral;
+ this.quasis = quasis;
+ this.expressions = expressions;
+ }
+ return TemplateLiteral;
+ }());
+ exports.TemplateLiteral = TemplateLiteral;
+ var ThisExpression = (function () {
+ function ThisExpression() {
+ this.type = syntax_1.Syntax.ThisExpression;
+ }
+ return ThisExpression;
+ }());
+ exports.ThisExpression = ThisExpression;
+ var ThrowStatement = (function () {
+ function ThrowStatement(argument) {
+ this.type = syntax_1.Syntax.ThrowStatement;
+ this.argument = argument;
+ }
+ return ThrowStatement;
+ }());
+ exports.ThrowStatement = ThrowStatement;
+ var TryStatement = (function () {
+ function TryStatement(block, handler, finalizer) {
+ this.type = syntax_1.Syntax.TryStatement;
+ this.block = block;
+ this.handler = handler;
+ this.finalizer = finalizer;
+ }
+ return TryStatement;
+ }());
+ exports.TryStatement = TryStatement;
+ var UnaryExpression = (function () {
+ function UnaryExpression(operator, argument) {
+ this.type = syntax_1.Syntax.UnaryExpression;
+ this.operator = operator;
+ this.argument = argument;
+ this.prefix = true;
+ }
+ return UnaryExpression;
+ }());
+ exports.UnaryExpression = UnaryExpression;
+ var UpdateExpression = (function () {
+ function UpdateExpression(operator, argument, prefix) {
+ this.type = syntax_1.Syntax.UpdateExpression;
+ this.operator = operator;
+ this.argument = argument;
+ this.prefix = prefix;
+ }
+ return UpdateExpression;
+ }());
+ exports.UpdateExpression = UpdateExpression;
+ var VariableDeclaration = (function () {
+ function VariableDeclaration(declarations, kind) {
+ this.type = syntax_1.Syntax.VariableDeclaration;
+ this.declarations = declarations;
+ this.kind = kind;
+ }
+ return VariableDeclaration;
+ }());
+ exports.VariableDeclaration = VariableDeclaration;
+ var VariableDeclarator = (function () {
+ function VariableDeclarator(id, init) {
+ this.type = syntax_1.Syntax.VariableDeclarator;
+ this.id = id;
+ this.init = init;
+ }
+ return VariableDeclarator;
+ }());
+ exports.VariableDeclarator = VariableDeclarator;
+ var WhileStatement = (function () {
+ function WhileStatement(test, body) {
+ this.type = syntax_1.Syntax.WhileStatement;
+ this.test = test;
+ this.body = body;
+ }
+ return WhileStatement;
+ }());
+ exports.WhileStatement = WhileStatement;
+ var WithStatement = (function () {
+ function WithStatement(object, body) {
+ this.type = syntax_1.Syntax.WithStatement;
+ this.object = object;
+ this.body = body;
+ }
+ return WithStatement;
+ }());
+ exports.WithStatement = WithStatement;
+ var YieldExpression = (function () {
+ function YieldExpression(argument, delegate) {
+ this.type = syntax_1.Syntax.YieldExpression;
+ this.argument = argument;
+ this.delegate = delegate;
+ }
+ return YieldExpression;
+ }());
+ exports.YieldExpression = YieldExpression;
+
+
+/***/ },
+/* 8 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var assert_1 = __webpack_require__(9);
+ var error_handler_1 = __webpack_require__(10);
+ var messages_1 = __webpack_require__(11);
+ var Node = __webpack_require__(7);
+ var scanner_1 = __webpack_require__(12);
+ var syntax_1 = __webpack_require__(2);
+ var token_1 = __webpack_require__(13);
+ var ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder';
+ var Parser = (function () {
+ function Parser(code, options, delegate) {
+ if (options === void 0) { options = {}; }
+ this.config = {
+ range: (typeof options.range === 'boolean') && options.range,
+ loc: (typeof options.loc === 'boolean') && options.loc,
+ source: null,
+ tokens: (typeof options.tokens === 'boolean') && options.tokens,
+ comment: (typeof options.comment === 'boolean') && options.comment,
+ tolerant: (typeof options.tolerant === 'boolean') && options.tolerant
+ };
+ if (this.config.loc && options.source && options.source !== null) {
+ this.config.source = String(options.source);
+ }
+ this.delegate = delegate;
+ this.errorHandler = new error_handler_1.ErrorHandler();
+ this.errorHandler.tolerant = this.config.tolerant;
+ this.scanner = new scanner_1.Scanner(code, this.errorHandler);
+ this.scanner.trackComment = this.config.comment;
+ this.operatorPrecedence = {
+ ')': 0,
+ ';': 0,
+ ',': 0,
+ '=': 0,
+ ']': 0,
+ '||': 1,
+ '&&': 2,
+ '|': 3,
+ '^': 4,
+ '&': 5,
+ '==': 6,
+ '!=': 6,
+ '===': 6,
+ '!==': 6,
+ '<': 7,
+ '>': 7,
+ '<=': 7,
+ '>=': 7,
+ '<<': 8,
+ '>>': 8,
+ '>>>': 8,
+ '+': 9,
+ '-': 9,
+ '*': 11,
+ '/': 11,
+ '%': 11
+ };
+ this.lookahead = {
+ type: 2 /* EOF */,
+ value: '',
+ lineNumber: this.scanner.lineNumber,
+ lineStart: 0,
+ start: 0,
+ end: 0
+ };
+ this.hasLineTerminator = false;
+ this.context = {
+ isModule: false,
+ await: false,
+ allowIn: true,
+ allowStrictDirective: true,
+ allowYield: true,
+ firstCoverInitializedNameError: null,
+ isAssignmentTarget: false,
+ isBindingElement: false,
+ inFunctionBody: false,
+ inIteration: false,
+ inSwitch: false,
+ labelSet: {},
+ strict: false
+ };
+ this.tokens = [];
+ this.startMarker = {
+ index: 0,
+ line: this.scanner.lineNumber,
+ column: 0
+ };
+ this.lastMarker = {
+ index: 0,
+ line: this.scanner.lineNumber,
+ column: 0
+ };
+ this.nextToken();
+ this.lastMarker = {
+ index: this.scanner.index,
+ line: this.scanner.lineNumber,
+ column: this.scanner.index - this.scanner.lineStart
+ };
+ }
+ Parser.prototype.throwError = function (messageFormat) {
+ var values = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ values[_i - 1] = arguments[_i];
+ }
+ var args = Array.prototype.slice.call(arguments, 1);
+ var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
+ assert_1.assert(idx < args.length, 'Message reference must be in range');
+ return args[idx];
+ });
+ var index = this.lastMarker.index;
+ var line = this.lastMarker.line;
+ var column = this.lastMarker.column + 1;
+ throw this.errorHandler.createError(index, line, column, msg);
+ };
+ Parser.prototype.tolerateError = function (messageFormat) {
+ var values = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ values[_i - 1] = arguments[_i];
+ }
+ var args = Array.prototype.slice.call(arguments, 1);
+ var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
+ assert_1.assert(idx < args.length, 'Message reference must be in range');
+ return args[idx];
+ });
+ var index = this.lastMarker.index;
+ var line = this.scanner.lineNumber;
+ var column = this.lastMarker.column + 1;
+ this.errorHandler.tolerateError(index, line, column, msg);
+ };
+ // Throw an exception because of the token.
+ Parser.prototype.unexpectedTokenError = function (token, message) {
+ var msg = message || messages_1.Messages.UnexpectedToken;
+ var value;
+ if (token) {
+ if (!message) {
+ msg = (token.type === 2 /* EOF */) ? messages_1.Messages.UnexpectedEOS :
+ (token.type === 3 /* Identifier */) ? messages_1.Messages.UnexpectedIdentifier :
+ (token.type === 6 /* NumericLiteral */) ? messages_1.Messages.UnexpectedNumber :
+ (token.type === 8 /* StringLiteral */) ? messages_1.Messages.UnexpectedString :
+ (token.type === 10 /* Template */) ? messages_1.Messages.UnexpectedTemplate :
+ messages_1.Messages.UnexpectedToken;
+ if (token.type === 4 /* Keyword */) {
+ if (this.scanner.isFutureReservedWord(token.value)) {
+ msg = messages_1.Messages.UnexpectedReserved;
+ }
+ else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) {
+ msg = messages_1.Messages.StrictReservedWord;
+ }
+ }
+ }
+ value = token.value;
+ }
+ else {
+ value = 'ILLEGAL';
+ }
+ msg = msg.replace('%0', value);
+ if (token && typeof token.lineNumber === 'number') {
+ var index = token.start;
+ var line = token.lineNumber;
+ var lastMarkerLineStart = this.lastMarker.index - this.lastMarker.column;
+ var column = token.start - lastMarkerLineStart + 1;
+ return this.errorHandler.createError(index, line, column, msg);
+ }
+ else {
+ var index = this.lastMarker.index;
+ var line = this.lastMarker.line;
+ var column = this.lastMarker.column + 1;
+ return this.errorHandler.createError(index, line, column, msg);
+ }
+ };
+ Parser.prototype.throwUnexpectedToken = function (token, message) {
+ throw this.unexpectedTokenError(token, message);
+ };
+ Parser.prototype.tolerateUnexpectedToken = function (token, message) {
+ this.errorHandler.tolerate(this.unexpectedTokenError(token, message));
+ };
+ Parser.prototype.collectComments = function () {
+ if (!this.config.comment) {
+ this.scanner.scanComments();
+ }
+ else {
+ var comments = this.scanner.scanComments();
+ if (comments.length > 0 && this.delegate) {
+ for (var i = 0; i < comments.length; ++i) {
+ var e = comments[i];
+ var node = void 0;
+ node = {
+ type: e.multiLine ? 'BlockComment' : 'LineComment',
+ value: this.scanner.source.slice(e.slice[0], e.slice[1])
+ };
+ if (this.config.range) {
+ node.range = e.range;
+ }
+ if (this.config.loc) {
+ node.loc = e.loc;
+ }
+ var metadata = {
+ start: {
+ line: e.loc.start.line,
+ column: e.loc.start.column,
+ offset: e.range[0]
+ },
+ end: {
+ line: e.loc.end.line,
+ column: e.loc.end.column,
+ offset: e.range[1]
+ }
+ };
+ this.delegate(node, metadata);
+ }
+ }
+ }
+ };
+ // From internal representation to an external structure
+ Parser.prototype.getTokenRaw = function (token) {
+ return this.scanner.source.slice(token.start, token.end);
+ };
+ Parser.prototype.convertToken = function (token) {
+ var t = {
+ type: token_1.TokenName[token.type],
+ value: this.getTokenRaw(token)
+ };
+ if (this.config.range) {
+ t.range = [token.start, token.end];
+ }
+ if (this.config.loc) {
+ t.loc = {
+ start: {
+ line: this.startMarker.line,
+ column: this.startMarker.column
+ },
+ end: {
+ line: this.scanner.lineNumber,
+ column: this.scanner.index - this.scanner.lineStart
+ }
+ };
+ }
+ if (token.type === 9 /* RegularExpression */) {
+ var pattern = token.pattern;
+ var flags = token.flags;
+ t.regex = { pattern: pattern, flags: flags };
+ }
+ return t;
+ };
+ Parser.prototype.nextToken = function () {
+ var token = this.lookahead;
+ this.lastMarker.index = this.scanner.index;
+ this.lastMarker.line = this.scanner.lineNumber;
+ this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
+ this.collectComments();
+ if (this.scanner.index !== this.startMarker.index) {
+ this.startMarker.index = this.scanner.index;
+ this.startMarker.line = this.scanner.lineNumber;
+ this.startMarker.column = this.scanner.index - this.scanner.lineStart;
+ }
+ var next = this.scanner.lex();
+ this.hasLineTerminator = (token.lineNumber !== next.lineNumber);
+ if (next && this.context.strict && next.type === 3 /* Identifier */) {
+ if (this.scanner.isStrictModeReservedWord(next.value)) {
+ next.type = 4 /* Keyword */;
+ }
+ }
+ this.lookahead = next;
+ if (this.config.tokens && next.type !== 2 /* EOF */) {
+ this.tokens.push(this.convertToken(next));
+ }
+ return token;
+ };
+ Parser.prototype.nextRegexToken = function () {
+ this.collectComments();
+ var token = this.scanner.scanRegExp();
+ if (this.config.tokens) {
+ // Pop the previous token, '/' or '/='
+ // This is added from the lookahead token.
+ this.tokens.pop();
+ this.tokens.push(this.convertToken(token));
+ }
+ // Prime the next lookahead.
+ this.lookahead = token;
+ this.nextToken();
+ return token;
+ };
+ Parser.prototype.createNode = function () {
+ return {
+ index: this.startMarker.index,
+ line: this.startMarker.line,
+ column: this.startMarker.column
+ };
+ };
+ Parser.prototype.startNode = function (token, lastLineStart) {
+ if (lastLineStart === void 0) { lastLineStart = 0; }
+ var column = token.start - token.lineStart;
+ var line = token.lineNumber;
+ if (column < 0) {
+ column += lastLineStart;
+ line--;
+ }
+ return {
+ index: token.start,
+ line: line,
+ column: column
+ };
+ };
+ Parser.prototype.finalize = function (marker, node) {
+ if (this.config.range) {
+ node.range = [marker.index, this.lastMarker.index];
+ }
+ if (this.config.loc) {
+ node.loc = {
+ start: {
+ line: marker.line,
+ column: marker.column,
+ },
+ end: {
+ line: this.lastMarker.line,
+ column: this.lastMarker.column
+ }
+ };
+ if (this.config.source) {
+ node.loc.source = this.config.source;
+ }
+ }
+ if (this.delegate) {
+ var metadata = {
+ start: {
+ line: marker.line,
+ column: marker.column,
+ offset: marker.index
+ },
+ end: {
+ line: this.lastMarker.line,
+ column: this.lastMarker.column,
+ offset: this.lastMarker.index
+ }
+ };
+ this.delegate(node, metadata);
+ }
+ return node;
+ };
+ // Expect the next token to match the specified punctuator.
+ // If not, an exception will be thrown.
+ Parser.prototype.expect = function (value) {
+ var token = this.nextToken();
+ if (token.type !== 7 /* Punctuator */ || token.value !== value) {
+ this.throwUnexpectedToken(token);
+ }
+ };
+ // Quietly expect a comma when in tolerant mode, otherwise delegates to expect().
+ Parser.prototype.expectCommaSeparator = function () {
+ if (this.config.tolerant) {
+ var token = this.lookahead;
+ if (token.type === 7 /* Punctuator */ && token.value === ',') {
+ this.nextToken();
+ }
+ else if (token.type === 7 /* Punctuator */ && token.value === ';') {
+ this.nextToken();
+ this.tolerateUnexpectedToken(token);
+ }
+ else {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken);
+ }
+ }
+ else {
+ this.expect(',');
+ }
+ };
+ // Expect the next token to match the specified keyword.
+ // If not, an exception will be thrown.
+ Parser.prototype.expectKeyword = function (keyword) {
+ var token = this.nextToken();
+ if (token.type !== 4 /* Keyword */ || token.value !== keyword) {
+ this.throwUnexpectedToken(token);
+ }
+ };
+ // Return true if the next token matches the specified punctuator.
+ Parser.prototype.match = function (value) {
+ return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value;
+ };
+ // Return true if the next token matches the specified keyword
+ Parser.prototype.matchKeyword = function (keyword) {
+ return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword;
+ };
+ // Return true if the next token matches the specified contextual keyword
+ // (where an identifier is sometimes a keyword depending on the context)
+ Parser.prototype.matchContextualKeyword = function (keyword) {
+ return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword;
+ };
+ // Return true if the next token is an assignment operator
+ Parser.prototype.matchAssign = function () {
+ if (this.lookahead.type !== 7 /* Punctuator */) {
+ return false;
+ }
+ var op = this.lookahead.value;
+ return op === '=' ||
+ op === '*=' ||
+ op === '**=' ||
+ op === '/=' ||
+ op === '%=' ||
+ op === '+=' ||
+ op === '-=' ||
+ op === '<<=' ||
+ op === '>>=' ||
+ op === '>>>=' ||
+ op === '&=' ||
+ op === '^=' ||
+ op === '|=';
+ };
+ // Cover grammar support.
+ //
+ // When an assignment expression position starts with an left parenthesis, the determination of the type
+ // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead)
+ // or the first comma. This situation also defers the determination of all the expressions nested in the pair.
+ //
+ // There are three productions that can be parsed in a parentheses pair that needs to be determined
+ // after the outermost pair is closed. They are:
+ //
+ // 1. AssignmentExpression
+ // 2. BindingElements
+ // 3. AssignmentTargets
+ //
+ // In order to avoid exponential backtracking, we use two flags to denote if the production can be
+ // binding element or assignment target.
+ //
+ // The three productions have the relationship:
+ //
+ // BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression
+ //
+ // with a single exception that CoverInitializedName when used directly in an Expression, generates
+ // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the
+ // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair.
+ //
+ // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not
+ // effect the current flags. This means the production the parser parses is only used as an expression. Therefore
+ // the CoverInitializedName check is conducted.
+ //
+ // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates
+ // the flags outside of the parser. This means the production the parser parses is used as a part of a potential
+ // pattern. The CoverInitializedName check is deferred.
+ Parser.prototype.isolateCoverGrammar = function (parseFunction) {
+ var previousIsBindingElement = this.context.isBindingElement;
+ var previousIsAssignmentTarget = this.context.isAssignmentTarget;
+ var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
+ this.context.isBindingElement = true;
+ this.context.isAssignmentTarget = true;
+ this.context.firstCoverInitializedNameError = null;
+ var result = parseFunction.call(this);
+ if (this.context.firstCoverInitializedNameError !== null) {
+ this.throwUnexpectedToken(this.context.firstCoverInitializedNameError);
+ }
+ this.context.isBindingElement = previousIsBindingElement;
+ this.context.isAssignmentTarget = previousIsAssignmentTarget;
+ this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError;
+ return result;
+ };
+ Parser.prototype.inheritCoverGrammar = function (parseFunction) {
+ var previousIsBindingElement = this.context.isBindingElement;
+ var previousIsAssignmentTarget = this.context.isAssignmentTarget;
+ var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
+ this.context.isBindingElement = true;
+ this.context.isAssignmentTarget = true;
+ this.context.firstCoverInitializedNameError = null;
+ var result = parseFunction.call(this);
+ this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement;
+ this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget;
+ this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError;
+ return result;
+ };
+ Parser.prototype.consumeSemicolon = function () {
+ if (this.match(';')) {
+ this.nextToken();
+ }
+ else if (!this.hasLineTerminator) {
+ if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ this.lastMarker.index = this.startMarker.index;
+ this.lastMarker.line = this.startMarker.line;
+ this.lastMarker.column = this.startMarker.column;
+ }
+ };
+ // https://tc39.github.io/ecma262/#sec-primary-expression
+ Parser.prototype.parsePrimaryExpression = function () {
+ var node = this.createNode();
+ var expr;
+ var token, raw;
+ switch (this.lookahead.type) {
+ case 3 /* Identifier */:
+ if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') {
+ this.tolerateUnexpectedToken(this.lookahead);
+ }
+ expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value));
+ break;
+ case 6 /* NumericLiteral */:
+ case 8 /* StringLiteral */:
+ if (this.context.strict && this.lookahead.octal) {
+ this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral);
+ }
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ token = this.nextToken();
+ raw = this.getTokenRaw(token);
+ expr = this.finalize(node, new Node.Literal(token.value, raw));
+ break;
+ case 1 /* BooleanLiteral */:
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ token = this.nextToken();
+ raw = this.getTokenRaw(token);
+ expr = this.finalize(node, new Node.Literal(token.value === 'true', raw));
+ break;
+ case 5 /* NullLiteral */:
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ token = this.nextToken();
+ raw = this.getTokenRaw(token);
+ expr = this.finalize(node, new Node.Literal(null, raw));
+ break;
+ case 10 /* Template */:
+ expr = this.parseTemplateLiteral();
+ break;
+ case 7 /* Punctuator */:
+ switch (this.lookahead.value) {
+ case '(':
+ this.context.isBindingElement = false;
+ expr = this.inheritCoverGrammar(this.parseGroupExpression);
+ break;
+ case '[':
+ expr = this.inheritCoverGrammar(this.parseArrayInitializer);
+ break;
+ case '{':
+ expr = this.inheritCoverGrammar(this.parseObjectInitializer);
+ break;
+ case '/':
+ case '/=':
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ this.scanner.index = this.startMarker.index;
+ token = this.nextRegexToken();
+ raw = this.getTokenRaw(token);
+ expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags));
+ break;
+ default:
+ expr = this.throwUnexpectedToken(this.nextToken());
+ }
+ break;
+ case 4 /* Keyword */:
+ if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) {
+ expr = this.parseIdentifierName();
+ }
+ else if (!this.context.strict && this.matchKeyword('let')) {
+ expr = this.finalize(node, new Node.Identifier(this.nextToken().value));
+ }
+ else {
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ if (this.matchKeyword('function')) {
+ expr = this.parseFunctionExpression();
+ }
+ else if (this.matchKeyword('this')) {
+ this.nextToken();
+ expr = this.finalize(node, new Node.ThisExpression());
+ }
+ else if (this.matchKeyword('class')) {
+ expr = this.parseClassExpression();
+ }
+ else {
+ expr = this.throwUnexpectedToken(this.nextToken());
+ }
+ }
+ break;
+ default:
+ expr = this.throwUnexpectedToken(this.nextToken());
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-array-initializer
+ Parser.prototype.parseSpreadElement = function () {
+ var node = this.createNode();
+ this.expect('...');
+ var arg = this.inheritCoverGrammar(this.parseAssignmentExpression);
+ return this.finalize(node, new Node.SpreadElement(arg));
+ };
+ Parser.prototype.parseArrayInitializer = function () {
+ var node = this.createNode();
+ var elements = [];
+ this.expect('[');
+ while (!this.match(']')) {
+ if (this.match(',')) {
+ this.nextToken();
+ elements.push(null);
+ }
+ else if (this.match('...')) {
+ var element = this.parseSpreadElement();
+ if (!this.match(']')) {
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ this.expect(',');
+ }
+ elements.push(element);
+ }
+ else {
+ elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
+ if (!this.match(']')) {
+ this.expect(',');
+ }
+ }
+ }
+ this.expect(']');
+ return this.finalize(node, new Node.ArrayExpression(elements));
+ };
+ // https://tc39.github.io/ecma262/#sec-object-initializer
+ Parser.prototype.parsePropertyMethod = function (params) {
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var previousStrict = this.context.strict;
+ var previousAllowStrictDirective = this.context.allowStrictDirective;
+ this.context.allowStrictDirective = params.simple;
+ var body = this.isolateCoverGrammar(this.parseFunctionSourceElements);
+ if (this.context.strict && params.firstRestricted) {
+ this.tolerateUnexpectedToken(params.firstRestricted, params.message);
+ }
+ if (this.context.strict && params.stricted) {
+ this.tolerateUnexpectedToken(params.stricted, params.message);
+ }
+ this.context.strict = previousStrict;
+ this.context.allowStrictDirective = previousAllowStrictDirective;
+ return body;
+ };
+ Parser.prototype.parsePropertyMethodFunction = function () {
+ var isGenerator = false;
+ var node = this.createNode();
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = true;
+ var params = this.parseFormalParameters();
+ var method = this.parsePropertyMethod(params);
+ this.context.allowYield = previousAllowYield;
+ return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
+ };
+ Parser.prototype.parsePropertyMethodAsyncFunction = function () {
+ var node = this.createNode();
+ var previousAllowYield = this.context.allowYield;
+ var previousAwait = this.context.await;
+ this.context.allowYield = false;
+ this.context.await = true;
+ var params = this.parseFormalParameters();
+ var method = this.parsePropertyMethod(params);
+ this.context.allowYield = previousAllowYield;
+ this.context.await = previousAwait;
+ return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method));
+ };
+ Parser.prototype.parseObjectPropertyKey = function () {
+ var node = this.createNode();
+ var token = this.nextToken();
+ var key;
+ switch (token.type) {
+ case 8 /* StringLiteral */:
+ case 6 /* NumericLiteral */:
+ if (this.context.strict && token.octal) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral);
+ }
+ var raw = this.getTokenRaw(token);
+ key = this.finalize(node, new Node.Literal(token.value, raw));
+ break;
+ case 3 /* Identifier */:
+ case 1 /* BooleanLiteral */:
+ case 5 /* NullLiteral */:
+ case 4 /* Keyword */:
+ key = this.finalize(node, new Node.Identifier(token.value));
+ break;
+ case 7 /* Punctuator */:
+ if (token.value === '[') {
+ key = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ this.expect(']');
+ }
+ else {
+ key = this.throwUnexpectedToken(token);
+ }
+ break;
+ default:
+ key = this.throwUnexpectedToken(token);
+ }
+ return key;
+ };
+ Parser.prototype.isPropertyKey = function (key, value) {
+ return (key.type === syntax_1.Syntax.Identifier && key.name === value) ||
+ (key.type === syntax_1.Syntax.Literal && key.value === value);
+ };
+ Parser.prototype.parseObjectProperty = function (hasProto) {
+ var node = this.createNode();
+ var token = this.lookahead;
+ var kind;
+ var key = null;
+ var value = null;
+ var computed = false;
+ var method = false;
+ var shorthand = false;
+ var isAsync = false;
+ if (token.type === 3 /* Identifier */) {
+ var id = token.value;
+ this.nextToken();
+ computed = this.match('[');
+ isAsync = !this.hasLineTerminator && (id === 'async') &&
+ !this.match(':') && !this.match('(') && !this.match('*') && !this.match(',');
+ key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id));
+ }
+ else if (this.match('*')) {
+ this.nextToken();
+ }
+ else {
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ }
+ var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
+ if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) {
+ kind = 'get';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ this.context.allowYield = false;
+ value = this.parseGetterMethod();
+ }
+ else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) {
+ kind = 'set';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ value = this.parseSetterMethod();
+ }
+ else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
+ kind = 'init';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ value = this.parseGeneratorMethod();
+ method = true;
+ }
+ else {
+ if (!key) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ kind = 'init';
+ if (this.match(':') && !isAsync) {
+ if (!computed && this.isPropertyKey(key, '__proto__')) {
+ if (hasProto.value) {
+ this.tolerateError(messages_1.Messages.DuplicateProtoProperty);
+ }
+ hasProto.value = true;
+ }
+ this.nextToken();
+ value = this.inheritCoverGrammar(this.parseAssignmentExpression);
+ }
+ else if (this.match('(')) {
+ value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
+ method = true;
+ }
+ else if (token.type === 3 /* Identifier */) {
+ var id = this.finalize(node, new Node.Identifier(token.value));
+ if (this.match('=')) {
+ this.context.firstCoverInitializedNameError = this.lookahead;
+ this.nextToken();
+ shorthand = true;
+ var init = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ value = this.finalize(node, new Node.AssignmentPattern(id, init));
+ }
+ else {
+ shorthand = true;
+ value = id;
+ }
+ }
+ else {
+ this.throwUnexpectedToken(this.nextToken());
+ }
+ }
+ return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand));
+ };
+ Parser.prototype.parseObjectInitializer = function () {
+ var node = this.createNode();
+ this.expect('{');
+ var properties = [];
+ var hasProto = { value: false };
+ while (!this.match('}')) {
+ properties.push(this.parseObjectProperty(hasProto));
+ if (!this.match('}')) {
+ this.expectCommaSeparator();
+ }
+ }
+ this.expect('}');
+ return this.finalize(node, new Node.ObjectExpression(properties));
+ };
+ // https://tc39.github.io/ecma262/#sec-template-literals
+ Parser.prototype.parseTemplateHead = function () {
+ assert_1.assert(this.lookahead.head, 'Template literal must start with a template head');
+ var node = this.createNode();
+ var token = this.nextToken();
+ var raw = token.value;
+ var cooked = token.cooked;
+ return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
+ };
+ Parser.prototype.parseTemplateElement = function () {
+ if (this.lookahead.type !== 10 /* Template */) {
+ this.throwUnexpectedToken();
+ }
+ var node = this.createNode();
+ var token = this.nextToken();
+ var raw = token.value;
+ var cooked = token.cooked;
+ return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
+ };
+ Parser.prototype.parseTemplateLiteral = function () {
+ var node = this.createNode();
+ var expressions = [];
+ var quasis = [];
+ var quasi = this.parseTemplateHead();
+ quasis.push(quasi);
+ while (!quasi.tail) {
+ expressions.push(this.parseExpression());
+ quasi = this.parseTemplateElement();
+ quasis.push(quasi);
+ }
+ return this.finalize(node, new Node.TemplateLiteral(quasis, expressions));
+ };
+ // https://tc39.github.io/ecma262/#sec-grouping-operator
+ Parser.prototype.reinterpretExpressionAsPattern = function (expr) {
+ switch (expr.type) {
+ case syntax_1.Syntax.Identifier:
+ case syntax_1.Syntax.MemberExpression:
+ case syntax_1.Syntax.RestElement:
+ case syntax_1.Syntax.AssignmentPattern:
+ break;
+ case syntax_1.Syntax.SpreadElement:
+ expr.type = syntax_1.Syntax.RestElement;
+ this.reinterpretExpressionAsPattern(expr.argument);
+ break;
+ case syntax_1.Syntax.ArrayExpression:
+ expr.type = syntax_1.Syntax.ArrayPattern;
+ for (var i = 0; i < expr.elements.length; i++) {
+ if (expr.elements[i] !== null) {
+ this.reinterpretExpressionAsPattern(expr.elements[i]);
+ }
+ }
+ break;
+ case syntax_1.Syntax.ObjectExpression:
+ expr.type = syntax_1.Syntax.ObjectPattern;
+ for (var i = 0; i < expr.properties.length; i++) {
+ this.reinterpretExpressionAsPattern(expr.properties[i].value);
+ }
+ break;
+ case syntax_1.Syntax.AssignmentExpression:
+ expr.type = syntax_1.Syntax.AssignmentPattern;
+ delete expr.operator;
+ this.reinterpretExpressionAsPattern(expr.left);
+ break;
+ default:
+ // Allow other node type for tolerant parsing.
+ break;
+ }
+ };
+ Parser.prototype.parseGroupExpression = function () {
+ var expr;
+ this.expect('(');
+ if (this.match(')')) {
+ this.nextToken();
+ if (!this.match('=>')) {
+ this.expect('=>');
+ }
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: [],
+ async: false
+ };
+ }
+ else {
+ var startToken = this.lookahead;
+ var params = [];
+ if (this.match('...')) {
+ expr = this.parseRestElement(params);
+ this.expect(')');
+ if (!this.match('=>')) {
+ this.expect('=>');
+ }
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: [expr],
+ async: false
+ };
+ }
+ else {
+ var arrow = false;
+ this.context.isBindingElement = true;
+ expr = this.inheritCoverGrammar(this.parseAssignmentExpression);
+ if (this.match(',')) {
+ var expressions = [];
+ this.context.isAssignmentTarget = false;
+ expressions.push(expr);
+ while (this.lookahead.type !== 2 /* EOF */) {
+ if (!this.match(',')) {
+ break;
+ }
+ this.nextToken();
+ if (this.match(')')) {
+ this.nextToken();
+ for (var i = 0; i < expressions.length; i++) {
+ this.reinterpretExpressionAsPattern(expressions[i]);
+ }
+ arrow = true;
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: expressions,
+ async: false
+ };
+ }
+ else if (this.match('...')) {
+ if (!this.context.isBindingElement) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ expressions.push(this.parseRestElement(params));
+ this.expect(')');
+ if (!this.match('=>')) {
+ this.expect('=>');
+ }
+ this.context.isBindingElement = false;
+ for (var i = 0; i < expressions.length; i++) {
+ this.reinterpretExpressionAsPattern(expressions[i]);
+ }
+ arrow = true;
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: expressions,
+ async: false
+ };
+ }
+ else {
+ expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
+ }
+ if (arrow) {
+ break;
+ }
+ }
+ if (!arrow) {
+ expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
+ }
+ }
+ if (!arrow) {
+ this.expect(')');
+ if (this.match('=>')) {
+ if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') {
+ arrow = true;
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: [expr],
+ async: false
+ };
+ }
+ if (!arrow) {
+ if (!this.context.isBindingElement) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ if (expr.type === syntax_1.Syntax.SequenceExpression) {
+ for (var i = 0; i < expr.expressions.length; i++) {
+ this.reinterpretExpressionAsPattern(expr.expressions[i]);
+ }
+ }
+ else {
+ this.reinterpretExpressionAsPattern(expr);
+ }
+ var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]);
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: parameters,
+ async: false
+ };
+ }
+ }
+ this.context.isBindingElement = false;
+ }
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions
+ Parser.prototype.parseArguments = function () {
+ this.expect('(');
+ var args = [];
+ if (!this.match(')')) {
+ while (true) {
+ var expr = this.match('...') ? this.parseSpreadElement() :
+ this.isolateCoverGrammar(this.parseAssignmentExpression);
+ args.push(expr);
+ if (this.match(')')) {
+ break;
+ }
+ this.expectCommaSeparator();
+ if (this.match(')')) {
+ break;
+ }
+ }
+ }
+ this.expect(')');
+ return args;
+ };
+ Parser.prototype.isIdentifierName = function (token) {
+ return token.type === 3 /* Identifier */ ||
+ token.type === 4 /* Keyword */ ||
+ token.type === 1 /* BooleanLiteral */ ||
+ token.type === 5 /* NullLiteral */;
+ };
+ Parser.prototype.parseIdentifierName = function () {
+ var node = this.createNode();
+ var token = this.nextToken();
+ if (!this.isIdentifierName(token)) {
+ this.throwUnexpectedToken(token);
+ }
+ return this.finalize(node, new Node.Identifier(token.value));
+ };
+ Parser.prototype.parseNewExpression = function () {
+ var node = this.createNode();
+ var id = this.parseIdentifierName();
+ assert_1.assert(id.name === 'new', 'New expression must start with `new`');
+ var expr;
+ if (this.match('.')) {
+ this.nextToken();
+ if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') {
+ var property = this.parseIdentifierName();
+ expr = new Node.MetaProperty(id, property);
+ }
+ else {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ }
+ else {
+ var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression);
+ var args = this.match('(') ? this.parseArguments() : [];
+ expr = new Node.NewExpression(callee, args);
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ return this.finalize(node, expr);
+ };
+ Parser.prototype.parseAsyncArgument = function () {
+ var arg = this.parseAssignmentExpression();
+ this.context.firstCoverInitializedNameError = null;
+ return arg;
+ };
+ Parser.prototype.parseAsyncArguments = function () {
+ this.expect('(');
+ var args = [];
+ if (!this.match(')')) {
+ while (true) {
+ var expr = this.match('...') ? this.parseSpreadElement() :
+ this.isolateCoverGrammar(this.parseAsyncArgument);
+ args.push(expr);
+ if (this.match(')')) {
+ break;
+ }
+ this.expectCommaSeparator();
+ if (this.match(')')) {
+ break;
+ }
+ }
+ }
+ this.expect(')');
+ return args;
+ };
+ Parser.prototype.parseLeftHandSideExpressionAllowCall = function () {
+ var startToken = this.lookahead;
+ var maybeAsync = this.matchContextualKeyword('async');
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = true;
+ var expr;
+ if (this.matchKeyword('super') && this.context.inFunctionBody) {
+ expr = this.createNode();
+ this.nextToken();
+ expr = this.finalize(expr, new Node.Super());
+ if (!this.match('(') && !this.match('.') && !this.match('[')) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ }
+ else {
+ expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
+ }
+ while (true) {
+ if (this.match('.')) {
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = true;
+ this.expect('.');
+ var property = this.parseIdentifierName();
+ expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property));
+ }
+ else if (this.match('(')) {
+ var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber);
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = false;
+ var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments();
+ expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args));
+ if (asyncArrow && this.match('=>')) {
+ for (var i = 0; i < args.length; ++i) {
+ this.reinterpretExpressionAsPattern(args[i]);
+ }
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: args,
+ async: true
+ };
+ }
+ }
+ else if (this.match('[')) {
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = true;
+ this.expect('[');
+ var property = this.isolateCoverGrammar(this.parseExpression);
+ this.expect(']');
+ expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property));
+ }
+ else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
+ var quasi = this.parseTemplateLiteral();
+ expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi));
+ }
+ else {
+ break;
+ }
+ }
+ this.context.allowIn = previousAllowIn;
+ return expr;
+ };
+ Parser.prototype.parseSuper = function () {
+ var node = this.createNode();
+ this.expectKeyword('super');
+ if (!this.match('[') && !this.match('.')) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ return this.finalize(node, new Node.Super());
+ };
+ Parser.prototype.parseLeftHandSideExpression = function () {
+ assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.');
+ var node = this.startNode(this.lookahead);
+ var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() :
+ this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
+ while (true) {
+ if (this.match('[')) {
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = true;
+ this.expect('[');
+ var property = this.isolateCoverGrammar(this.parseExpression);
+ this.expect(']');
+ expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property));
+ }
+ else if (this.match('.')) {
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = true;
+ this.expect('.');
+ var property = this.parseIdentifierName();
+ expr = this.finalize(node, new Node.StaticMemberExpression(expr, property));
+ }
+ else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
+ var quasi = this.parseTemplateLiteral();
+ expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi));
+ }
+ else {
+ break;
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-update-expressions
+ Parser.prototype.parseUpdateExpression = function () {
+ var expr;
+ var startToken = this.lookahead;
+ if (this.match('++') || this.match('--')) {
+ var node = this.startNode(startToken);
+ var token = this.nextToken();
+ expr = this.inheritCoverGrammar(this.parseUnaryExpression);
+ if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
+ this.tolerateError(messages_1.Messages.StrictLHSPrefix);
+ }
+ if (!this.context.isAssignmentTarget) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
+ }
+ var prefix = true;
+ expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix));
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ else {
+ expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
+ if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) {
+ if (this.match('++') || this.match('--')) {
+ if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
+ this.tolerateError(messages_1.Messages.StrictLHSPostfix);
+ }
+ if (!this.context.isAssignmentTarget) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
+ }
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var operator = this.nextToken().value;
+ var prefix = false;
+ expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix));
+ }
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-unary-operators
+ Parser.prototype.parseAwaitExpression = function () {
+ var node = this.createNode();
+ this.nextToken();
+ var argument = this.parseUnaryExpression();
+ return this.finalize(node, new Node.AwaitExpression(argument));
+ };
+ Parser.prototype.parseUnaryExpression = function () {
+ var expr;
+ if (this.match('+') || this.match('-') || this.match('~') || this.match('!') ||
+ this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) {
+ var node = this.startNode(this.lookahead);
+ var token = this.nextToken();
+ expr = this.inheritCoverGrammar(this.parseUnaryExpression);
+ expr = this.finalize(node, new Node.UnaryExpression(token.value, expr));
+ if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) {
+ this.tolerateError(messages_1.Messages.StrictDelete);
+ }
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ else if (this.context.await && this.matchContextualKeyword('await')) {
+ expr = this.parseAwaitExpression();
+ }
+ else {
+ expr = this.parseUpdateExpression();
+ }
+ return expr;
+ };
+ Parser.prototype.parseExponentiationExpression = function () {
+ var startToken = this.lookahead;
+ var expr = this.inheritCoverGrammar(this.parseUnaryExpression);
+ if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) {
+ this.nextToken();
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var left = expr;
+ var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
+ expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right));
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-exp-operator
+ // https://tc39.github.io/ecma262/#sec-multiplicative-operators
+ // https://tc39.github.io/ecma262/#sec-additive-operators
+ // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators
+ // https://tc39.github.io/ecma262/#sec-relational-operators
+ // https://tc39.github.io/ecma262/#sec-equality-operators
+ // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators
+ // https://tc39.github.io/ecma262/#sec-binary-logical-operators
+ Parser.prototype.binaryPrecedence = function (token) {
+ var op = token.value;
+ var precedence;
+ if (token.type === 7 /* Punctuator */) {
+ precedence = this.operatorPrecedence[op] || 0;
+ }
+ else if (token.type === 4 /* Keyword */) {
+ precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0;
+ }
+ else {
+ precedence = 0;
+ }
+ return precedence;
+ };
+ Parser.prototype.parseBinaryExpression = function () {
+ var startToken = this.lookahead;
+ var expr = this.inheritCoverGrammar(this.parseExponentiationExpression);
+ var token = this.lookahead;
+ var prec = this.binaryPrecedence(token);
+ if (prec > 0) {
+ this.nextToken();
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var markers = [startToken, this.lookahead];
+ var left = expr;
+ var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
+ var stack = [left, token.value, right];
+ var precedences = [prec];
+ while (true) {
+ prec = this.binaryPrecedence(this.lookahead);
+ if (prec <= 0) {
+ break;
+ }
+ // Reduce: make a binary expression from the three topmost entries.
+ while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) {
+ right = stack.pop();
+ var operator = stack.pop();
+ precedences.pop();
+ left = stack.pop();
+ markers.pop();
+ var node = this.startNode(markers[markers.length - 1]);
+ stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right)));
+ }
+ // Shift.
+ stack.push(this.nextToken().value);
+ precedences.push(prec);
+ markers.push(this.lookahead);
+ stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression));
+ }
+ // Final reduce to clean-up the stack.
+ var i = stack.length - 1;
+ expr = stack[i];
+ var lastMarker = markers.pop();
+ while (i > 1) {
+ var marker = markers.pop();
+ var lastLineStart = lastMarker && lastMarker.lineStart;
+ var node = this.startNode(marker, lastLineStart);
+ var operator = stack[i - 1];
+ expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr));
+ i -= 2;
+ lastMarker = marker;
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-conditional-operator
+ Parser.prototype.parseConditionalExpression = function () {
+ var startToken = this.lookahead;
+ var expr = this.inheritCoverGrammar(this.parseBinaryExpression);
+ if (this.match('?')) {
+ this.nextToken();
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = true;
+ var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ this.context.allowIn = previousAllowIn;
+ this.expect(':');
+ var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate));
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-assignment-operators
+ Parser.prototype.checkPatternParam = function (options, param) {
+ switch (param.type) {
+ case syntax_1.Syntax.Identifier:
+ this.validateParam(options, param, param.name);
+ break;
+ case syntax_1.Syntax.RestElement:
+ this.checkPatternParam(options, param.argument);
+ break;
+ case syntax_1.Syntax.AssignmentPattern:
+ this.checkPatternParam(options, param.left);
+ break;
+ case syntax_1.Syntax.ArrayPattern:
+ for (var i = 0; i < param.elements.length; i++) {
+ if (param.elements[i] !== null) {
+ this.checkPatternParam(options, param.elements[i]);
+ }
+ }
+ break;
+ case syntax_1.Syntax.ObjectPattern:
+ for (var i = 0; i < param.properties.length; i++) {
+ this.checkPatternParam(options, param.properties[i].value);
+ }
+ break;
+ default:
+ break;
+ }
+ options.simple = options.simple && (param instanceof Node.Identifier);
+ };
+ Parser.prototype.reinterpretAsCoverFormalsList = function (expr) {
+ var params = [expr];
+ var options;
+ var asyncArrow = false;
+ switch (expr.type) {
+ case syntax_1.Syntax.Identifier:
+ break;
+ case ArrowParameterPlaceHolder:
+ params = expr.params;
+ asyncArrow = expr.async;
+ break;
+ default:
+ return null;
+ }
+ options = {
+ simple: true,
+ paramSet: {}
+ };
+ for (var i = 0; i < params.length; ++i) {
+ var param = params[i];
+ if (param.type === syntax_1.Syntax.AssignmentPattern) {
+ if (param.right.type === syntax_1.Syntax.YieldExpression) {
+ if (param.right.argument) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ param.right.type = syntax_1.Syntax.Identifier;
+ param.right.name = 'yield';
+ delete param.right.argument;
+ delete param.right.delegate;
+ }
+ }
+ else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ this.checkPatternParam(options, param);
+ params[i] = param;
+ }
+ if (this.context.strict || !this.context.allowYield) {
+ for (var i = 0; i < params.length; ++i) {
+ var param = params[i];
+ if (param.type === syntax_1.Syntax.YieldExpression) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ }
+ }
+ if (options.message === messages_1.Messages.StrictParamDupe) {
+ var token = this.context.strict ? options.stricted : options.firstRestricted;
+ this.throwUnexpectedToken(token, options.message);
+ }
+ return {
+ simple: options.simple,
+ params: params,
+ stricted: options.stricted,
+ firstRestricted: options.firstRestricted,
+ message: options.message
+ };
+ };
+ Parser.prototype.parseAssignmentExpression = function () {
+ var expr;
+ if (!this.context.allowYield && this.matchKeyword('yield')) {
+ expr = this.parseYieldExpression();
+ }
+ else {
+ var startToken = this.lookahead;
+ var token = startToken;
+ expr = this.parseConditionalExpression();
+ if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') {
+ if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) {
+ var arg = this.parsePrimaryExpression();
+ this.reinterpretExpressionAsPattern(arg);
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: [arg],
+ async: true
+ };
+ }
+ }
+ if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) {
+ // https://tc39.github.io/ecma262/#sec-arrow-function-definitions
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var isAsync = expr.async;
+ var list = this.reinterpretAsCoverFormalsList(expr);
+ if (list) {
+ if (this.hasLineTerminator) {
+ this.tolerateUnexpectedToken(this.lookahead);
+ }
+ this.context.firstCoverInitializedNameError = null;
+ var previousStrict = this.context.strict;
+ var previousAllowStrictDirective = this.context.allowStrictDirective;
+ this.context.allowStrictDirective = list.simple;
+ var previousAllowYield = this.context.allowYield;
+ var previousAwait = this.context.await;
+ this.context.allowYield = true;
+ this.context.await = isAsync;
+ var node = this.startNode(startToken);
+ this.expect('=>');
+ var body = void 0;
+ if (this.match('{')) {
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = true;
+ body = this.parseFunctionSourceElements();
+ this.context.allowIn = previousAllowIn;
+ }
+ else {
+ body = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ }
+ var expression = body.type !== syntax_1.Syntax.BlockStatement;
+ if (this.context.strict && list.firstRestricted) {
+ this.throwUnexpectedToken(list.firstRestricted, list.message);
+ }
+ if (this.context.strict && list.stricted) {
+ this.tolerateUnexpectedToken(list.stricted, list.message);
+ }
+ expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) :
+ this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression));
+ this.context.strict = previousStrict;
+ this.context.allowStrictDirective = previousAllowStrictDirective;
+ this.context.allowYield = previousAllowYield;
+ this.context.await = previousAwait;
+ }
+ }
+ else {
+ if (this.matchAssign()) {
+ if (!this.context.isAssignmentTarget) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
+ }
+ if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) {
+ var id = expr;
+ if (this.scanner.isRestrictedWord(id.name)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment);
+ }
+ if (this.scanner.isStrictModeReservedWord(id.name)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
+ }
+ }
+ if (!this.match('=')) {
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ else {
+ this.reinterpretExpressionAsPattern(expr);
+ }
+ token = this.nextToken();
+ var operator = token.value;
+ var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right));
+ this.context.firstCoverInitializedNameError = null;
+ }
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-comma-operator
+ Parser.prototype.parseExpression = function () {
+ var startToken = this.lookahead;
+ var expr = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ if (this.match(',')) {
+ var expressions = [];
+ expressions.push(expr);
+ while (this.lookahead.type !== 2 /* EOF */) {
+ if (!this.match(',')) {
+ break;
+ }
+ this.nextToken();
+ expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
+ }
+ expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-block
+ Parser.prototype.parseStatementListItem = function () {
+ var statement;
+ this.context.isAssignmentTarget = true;
+ this.context.isBindingElement = true;
+ if (this.lookahead.type === 4 /* Keyword */) {
+ switch (this.lookahead.value) {
+ case 'export':
+ if (!this.context.isModule) {
+ this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration);
+ }
+ statement = this.parseExportDeclaration();
+ break;
+ case 'import':
+ if (!this.context.isModule) {
+ this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration);
+ }
+ statement = this.parseImportDeclaration();
+ break;
+ case 'const':
+ statement = this.parseLexicalDeclaration({ inFor: false });
+ break;
+ case 'function':
+ statement = this.parseFunctionDeclaration();
+ break;
+ case 'class':
+ statement = this.parseClassDeclaration();
+ break;
+ case 'let':
+ statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement();
+ break;
+ default:
+ statement = this.parseStatement();
+ break;
+ }
+ }
+ else {
+ statement = this.parseStatement();
+ }
+ return statement;
+ };
+ Parser.prototype.parseBlock = function () {
+ var node = this.createNode();
+ this.expect('{');
+ var block = [];
+ while (true) {
+ if (this.match('}')) {
+ break;
+ }
+ block.push(this.parseStatementListItem());
+ }
+ this.expect('}');
+ return this.finalize(node, new Node.BlockStatement(block));
+ };
+ // https://tc39.github.io/ecma262/#sec-let-and-const-declarations
+ Parser.prototype.parseLexicalBinding = function (kind, options) {
+ var node = this.createNode();
+ var params = [];
+ var id = this.parsePattern(params, kind);
+ if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
+ if (this.scanner.isRestrictedWord(id.name)) {
+ this.tolerateError(messages_1.Messages.StrictVarName);
+ }
+ }
+ var init = null;
+ if (kind === 'const') {
+ if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) {
+ if (this.match('=')) {
+ this.nextToken();
+ init = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ }
+ else {
+ this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const');
+ }
+ }
+ }
+ else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) {
+ this.expect('=');
+ init = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ }
+ return this.finalize(node, new Node.VariableDeclarator(id, init));
+ };
+ Parser.prototype.parseBindingList = function (kind, options) {
+ var list = [this.parseLexicalBinding(kind, options)];
+ while (this.match(',')) {
+ this.nextToken();
+ list.push(this.parseLexicalBinding(kind, options));
+ }
+ return list;
+ };
+ Parser.prototype.isLexicalDeclaration = function () {
+ var state = this.scanner.saveState();
+ this.scanner.scanComments();
+ var next = this.scanner.lex();
+ this.scanner.restoreState(state);
+ return (next.type === 3 /* Identifier */) ||
+ (next.type === 7 /* Punctuator */ && next.value === '[') ||
+ (next.type === 7 /* Punctuator */ && next.value === '{') ||
+ (next.type === 4 /* Keyword */ && next.value === 'let') ||
+ (next.type === 4 /* Keyword */ && next.value === 'yield');
+ };
+ Parser.prototype.parseLexicalDeclaration = function (options) {
+ var node = this.createNode();
+ var kind = this.nextToken().value;
+ assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const');
+ var declarations = this.parseBindingList(kind, options);
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.VariableDeclaration(declarations, kind));
+ };
+ // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns
+ Parser.prototype.parseBindingRestElement = function (params, kind) {
+ var node = this.createNode();
+ this.expect('...');
+ var arg = this.parsePattern(params, kind);
+ return this.finalize(node, new Node.RestElement(arg));
+ };
+ Parser.prototype.parseArrayPattern = function (params, kind) {
+ var node = this.createNode();
+ this.expect('[');
+ var elements = [];
+ while (!this.match(']')) {
+ if (this.match(',')) {
+ this.nextToken();
+ elements.push(null);
+ }
+ else {
+ if (this.match('...')) {
+ elements.push(this.parseBindingRestElement(params, kind));
+ break;
+ }
+ else {
+ elements.push(this.parsePatternWithDefault(params, kind));
+ }
+ if (!this.match(']')) {
+ this.expect(',');
+ }
+ }
+ }
+ this.expect(']');
+ return this.finalize(node, new Node.ArrayPattern(elements));
+ };
+ Parser.prototype.parsePropertyPattern = function (params, kind) {
+ var node = this.createNode();
+ var computed = false;
+ var shorthand = false;
+ var method = false;
+ var key;
+ var value;
+ if (this.lookahead.type === 3 /* Identifier */) {
+ var keyToken = this.lookahead;
+ key = this.parseVariableIdentifier();
+ var init = this.finalize(node, new Node.Identifier(keyToken.value));
+ if (this.match('=')) {
+ params.push(keyToken);
+ shorthand = true;
+ this.nextToken();
+ var expr = this.parseAssignmentExpression();
+ value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr));
+ }
+ else if (!this.match(':')) {
+ params.push(keyToken);
+ shorthand = true;
+ value = init;
+ }
+ else {
+ this.expect(':');
+ value = this.parsePatternWithDefault(params, kind);
+ }
+ }
+ else {
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ this.expect(':');
+ value = this.parsePatternWithDefault(params, kind);
+ }
+ return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand));
+ };
+ Parser.prototype.parseObjectPattern = function (params, kind) {
+ var node = this.createNode();
+ var properties = [];
+ this.expect('{');
+ while (!this.match('}')) {
+ properties.push(this.parsePropertyPattern(params, kind));
+ if (!this.match('}')) {
+ this.expect(',');
+ }
+ }
+ this.expect('}');
+ return this.finalize(node, new Node.ObjectPattern(properties));
+ };
+ Parser.prototype.parsePattern = function (params, kind) {
+ var pattern;
+ if (this.match('[')) {
+ pattern = this.parseArrayPattern(params, kind);
+ }
+ else if (this.match('{')) {
+ pattern = this.parseObjectPattern(params, kind);
+ }
+ else {
+ if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) {
+ this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding);
+ }
+ params.push(this.lookahead);
+ pattern = this.parseVariableIdentifier(kind);
+ }
+ return pattern;
+ };
+ Parser.prototype.parsePatternWithDefault = function (params, kind) {
+ var startToken = this.lookahead;
+ var pattern = this.parsePattern(params, kind);
+ if (this.match('=')) {
+ this.nextToken();
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = true;
+ var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ this.context.allowYield = previousAllowYield;
+ pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right));
+ }
+ return pattern;
+ };
+ // https://tc39.github.io/ecma262/#sec-variable-statement
+ Parser.prototype.parseVariableIdentifier = function (kind) {
+ var node = this.createNode();
+ var token = this.nextToken();
+ if (token.type === 4 /* Keyword */ && token.value === 'yield') {
+ if (this.context.strict) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
+ }
+ else if (!this.context.allowYield) {
+ this.throwUnexpectedToken(token);
+ }
+ }
+ else if (token.type !== 3 /* Identifier */) {
+ if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
+ }
+ else {
+ if (this.context.strict || token.value !== 'let' || kind !== 'var') {
+ this.throwUnexpectedToken(token);
+ }
+ }
+ }
+ else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') {
+ this.tolerateUnexpectedToken(token);
+ }
+ return this.finalize(node, new Node.Identifier(token.value));
+ };
+ Parser.prototype.parseVariableDeclaration = function (options) {
+ var node = this.createNode();
+ var params = [];
+ var id = this.parsePattern(params, 'var');
+ if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
+ if (this.scanner.isRestrictedWord(id.name)) {
+ this.tolerateError(messages_1.Messages.StrictVarName);
+ }
+ }
+ var init = null;
+ if (this.match('=')) {
+ this.nextToken();
+ init = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ }
+ else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) {
+ this.expect('=');
+ }
+ return this.finalize(node, new Node.VariableDeclarator(id, init));
+ };
+ Parser.prototype.parseVariableDeclarationList = function (options) {
+ var opt = { inFor: options.inFor };
+ var list = [];
+ list.push(this.parseVariableDeclaration(opt));
+ while (this.match(',')) {
+ this.nextToken();
+ list.push(this.parseVariableDeclaration(opt));
+ }
+ return list;
+ };
+ Parser.prototype.parseVariableStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('var');
+ var declarations = this.parseVariableDeclarationList({ inFor: false });
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.VariableDeclaration(declarations, 'var'));
+ };
+ // https://tc39.github.io/ecma262/#sec-empty-statement
+ Parser.prototype.parseEmptyStatement = function () {
+ var node = this.createNode();
+ this.expect(';');
+ return this.finalize(node, new Node.EmptyStatement());
+ };
+ // https://tc39.github.io/ecma262/#sec-expression-statement
+ Parser.prototype.parseExpressionStatement = function () {
+ var node = this.createNode();
+ var expr = this.parseExpression();
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.ExpressionStatement(expr));
+ };
+ // https://tc39.github.io/ecma262/#sec-if-statement
+ Parser.prototype.parseIfClause = function () {
+ if (this.context.strict && this.matchKeyword('function')) {
+ this.tolerateError(messages_1.Messages.StrictFunction);
+ }
+ return this.parseStatement();
+ };
+ Parser.prototype.parseIfStatement = function () {
+ var node = this.createNode();
+ var consequent;
+ var alternate = null;
+ this.expectKeyword('if');
+ this.expect('(');
+ var test = this.parseExpression();
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ consequent = this.finalize(this.createNode(), new Node.EmptyStatement());
+ }
+ else {
+ this.expect(')');
+ consequent = this.parseIfClause();
+ if (this.matchKeyword('else')) {
+ this.nextToken();
+ alternate = this.parseIfClause();
+ }
+ }
+ return this.finalize(node, new Node.IfStatement(test, consequent, alternate));
+ };
+ // https://tc39.github.io/ecma262/#sec-do-while-statement
+ Parser.prototype.parseDoWhileStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('do');
+ var previousInIteration = this.context.inIteration;
+ this.context.inIteration = true;
+ var body = this.parseStatement();
+ this.context.inIteration = previousInIteration;
+ this.expectKeyword('while');
+ this.expect('(');
+ var test = this.parseExpression();
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ }
+ else {
+ this.expect(')');
+ if (this.match(';')) {
+ this.nextToken();
+ }
+ }
+ return this.finalize(node, new Node.DoWhileStatement(body, test));
+ };
+ // https://tc39.github.io/ecma262/#sec-while-statement
+ Parser.prototype.parseWhileStatement = function () {
+ var node = this.createNode();
+ var body;
+ this.expectKeyword('while');
+ this.expect('(');
+ var test = this.parseExpression();
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ body = this.finalize(this.createNode(), new Node.EmptyStatement());
+ }
+ else {
+ this.expect(')');
+ var previousInIteration = this.context.inIteration;
+ this.context.inIteration = true;
+ body = this.parseStatement();
+ this.context.inIteration = previousInIteration;
+ }
+ return this.finalize(node, new Node.WhileStatement(test, body));
+ };
+ // https://tc39.github.io/ecma262/#sec-for-statement
+ // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements
+ Parser.prototype.parseForStatement = function () {
+ var init = null;
+ var test = null;
+ var update = null;
+ var forIn = true;
+ var left, right;
+ var node = this.createNode();
+ this.expectKeyword('for');
+ this.expect('(');
+ if (this.match(';')) {
+ this.nextToken();
+ }
+ else {
+ if (this.matchKeyword('var')) {
+ init = this.createNode();
+ this.nextToken();
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = false;
+ var declarations = this.parseVariableDeclarationList({ inFor: true });
+ this.context.allowIn = previousAllowIn;
+ if (declarations.length === 1 && this.matchKeyword('in')) {
+ var decl = declarations[0];
+ if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) {
+ this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in');
+ }
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
+ this.nextToken();
+ left = init;
+ right = this.parseExpression();
+ init = null;
+ }
+ else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
+ this.nextToken();
+ left = init;
+ right = this.parseAssignmentExpression();
+ init = null;
+ forIn = false;
+ }
+ else {
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
+ this.expect(';');
+ }
+ }
+ else if (this.matchKeyword('const') || this.matchKeyword('let')) {
+ init = this.createNode();
+ var kind = this.nextToken().value;
+ if (!this.context.strict && this.lookahead.value === 'in') {
+ init = this.finalize(init, new Node.Identifier(kind));
+ this.nextToken();
+ left = init;
+ right = this.parseExpression();
+ init = null;
+ }
+ else {
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = false;
+ var declarations = this.parseBindingList(kind, { inFor: true });
+ this.context.allowIn = previousAllowIn;
+ if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) {
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
+ this.nextToken();
+ left = init;
+ right = this.parseExpression();
+ init = null;
+ }
+ else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
+ this.nextToken();
+ left = init;
+ right = this.parseAssignmentExpression();
+ init = null;
+ forIn = false;
+ }
+ else {
+ this.consumeSemicolon();
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
+ }
+ }
+ }
+ else {
+ var initStartToken = this.lookahead;
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = false;
+ init = this.inheritCoverGrammar(this.parseAssignmentExpression);
+ this.context.allowIn = previousAllowIn;
+ if (this.matchKeyword('in')) {
+ if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInForIn);
+ }
+ this.nextToken();
+ this.reinterpretExpressionAsPattern(init);
+ left = init;
+ right = this.parseExpression();
+ init = null;
+ }
+ else if (this.matchContextualKeyword('of')) {
+ if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInForLoop);
+ }
+ this.nextToken();
+ this.reinterpretExpressionAsPattern(init);
+ left = init;
+ right = this.parseAssignmentExpression();
+ init = null;
+ forIn = false;
+ }
+ else {
+ if (this.match(',')) {
+ var initSeq = [init];
+ while (this.match(',')) {
+ this.nextToken();
+ initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
+ }
+ init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq));
+ }
+ this.expect(';');
+ }
+ }
+ }
+ if (typeof left === 'undefined') {
+ if (!this.match(';')) {
+ test = this.parseExpression();
+ }
+ this.expect(';');
+ if (!this.match(')')) {
+ update = this.parseExpression();
+ }
+ }
+ var body;
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ body = this.finalize(this.createNode(), new Node.EmptyStatement());
+ }
+ else {
+ this.expect(')');
+ var previousInIteration = this.context.inIteration;
+ this.context.inIteration = true;
+ body = this.isolateCoverGrammar(this.parseStatement);
+ this.context.inIteration = previousInIteration;
+ }
+ return (typeof left === 'undefined') ?
+ this.finalize(node, new Node.ForStatement(init, test, update, body)) :
+ forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) :
+ this.finalize(node, new Node.ForOfStatement(left, right, body));
+ };
+ // https://tc39.github.io/ecma262/#sec-continue-statement
+ Parser.prototype.parseContinueStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('continue');
+ var label = null;
+ if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
+ var id = this.parseVariableIdentifier();
+ label = id;
+ var key = '$' + id.name;
+ if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
+ this.throwError(messages_1.Messages.UnknownLabel, id.name);
+ }
+ }
+ this.consumeSemicolon();
+ if (label === null && !this.context.inIteration) {
+ this.throwError(messages_1.Messages.IllegalContinue);
+ }
+ return this.finalize(node, new Node.ContinueStatement(label));
+ };
+ // https://tc39.github.io/ecma262/#sec-break-statement
+ Parser.prototype.parseBreakStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('break');
+ var label = null;
+ if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
+ var id = this.parseVariableIdentifier();
+ var key = '$' + id.name;
+ if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
+ this.throwError(messages_1.Messages.UnknownLabel, id.name);
+ }
+ label = id;
+ }
+ this.consumeSemicolon();
+ if (label === null && !this.context.inIteration && !this.context.inSwitch) {
+ this.throwError(messages_1.Messages.IllegalBreak);
+ }
+ return this.finalize(node, new Node.BreakStatement(label));
+ };
+ // https://tc39.github.io/ecma262/#sec-return-statement
+ Parser.prototype.parseReturnStatement = function () {
+ if (!this.context.inFunctionBody) {
+ this.tolerateError(messages_1.Messages.IllegalReturn);
+ }
+ var node = this.createNode();
+ this.expectKeyword('return');
+ var hasArgument = (!this.match(';') && !this.match('}') &&
+ !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */) ||
+ this.lookahead.type === 8 /* StringLiteral */ ||
+ this.lookahead.type === 10 /* Template */;
+ var argument = hasArgument ? this.parseExpression() : null;
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.ReturnStatement(argument));
+ };
+ // https://tc39.github.io/ecma262/#sec-with-statement
+ Parser.prototype.parseWithStatement = function () {
+ if (this.context.strict) {
+ this.tolerateError(messages_1.Messages.StrictModeWith);
+ }
+ var node = this.createNode();
+ var body;
+ this.expectKeyword('with');
+ this.expect('(');
+ var object = this.parseExpression();
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ body = this.finalize(this.createNode(), new Node.EmptyStatement());
+ }
+ else {
+ this.expect(')');
+ body = this.parseStatement();
+ }
+ return this.finalize(node, new Node.WithStatement(object, body));
+ };
+ // https://tc39.github.io/ecma262/#sec-switch-statement
+ Parser.prototype.parseSwitchCase = function () {
+ var node = this.createNode();
+ var test;
+ if (this.matchKeyword('default')) {
+ this.nextToken();
+ test = null;
+ }
+ else {
+ this.expectKeyword('case');
+ test = this.parseExpression();
+ }
+ this.expect(':');
+ var consequent = [];
+ while (true) {
+ if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) {
+ break;
+ }
+ consequent.push(this.parseStatementListItem());
+ }
+ return this.finalize(node, new Node.SwitchCase(test, consequent));
+ };
+ Parser.prototype.parseSwitchStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('switch');
+ this.expect('(');
+ var discriminant = this.parseExpression();
+ this.expect(')');
+ var previousInSwitch = this.context.inSwitch;
+ this.context.inSwitch = true;
+ var cases = [];
+ var defaultFound = false;
+ this.expect('{');
+ while (true) {
+ if (this.match('}')) {
+ break;
+ }
+ var clause = this.parseSwitchCase();
+ if (clause.test === null) {
+ if (defaultFound) {
+ this.throwError(messages_1.Messages.MultipleDefaultsInSwitch);
+ }
+ defaultFound = true;
+ }
+ cases.push(clause);
+ }
+ this.expect('}');
+ this.context.inSwitch = previousInSwitch;
+ return this.finalize(node, new Node.SwitchStatement(discriminant, cases));
+ };
+ // https://tc39.github.io/ecma262/#sec-labelled-statements
+ Parser.prototype.parseLabelledStatement = function () {
+ var node = this.createNode();
+ var expr = this.parseExpression();
+ var statement;
+ if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) {
+ this.nextToken();
+ var id = expr;
+ var key = '$' + id.name;
+ if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
+ this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name);
+ }
+ this.context.labelSet[key] = true;
+ var body = void 0;
+ if (this.matchKeyword('class')) {
+ this.tolerateUnexpectedToken(this.lookahead);
+ body = this.parseClassDeclaration();
+ }
+ else if (this.matchKeyword('function')) {
+ var token = this.lookahead;
+ var declaration = this.parseFunctionDeclaration();
+ if (this.context.strict) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction);
+ }
+ else if (declaration.generator) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext);
+ }
+ body = declaration;
+ }
+ else {
+ body = this.parseStatement();
+ }
+ delete this.context.labelSet[key];
+ statement = new Node.LabeledStatement(id, body);
+ }
+ else {
+ this.consumeSemicolon();
+ statement = new Node.ExpressionStatement(expr);
+ }
+ return this.finalize(node, statement);
+ };
+ // https://tc39.github.io/ecma262/#sec-throw-statement
+ Parser.prototype.parseThrowStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('throw');
+ if (this.hasLineTerminator) {
+ this.throwError(messages_1.Messages.NewlineAfterThrow);
+ }
+ var argument = this.parseExpression();
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.ThrowStatement(argument));
+ };
+ // https://tc39.github.io/ecma262/#sec-try-statement
+ Parser.prototype.parseCatchClause = function () {
+ var node = this.createNode();
+ this.expectKeyword('catch');
+ this.expect('(');
+ if (this.match(')')) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ var params = [];
+ var param = this.parsePattern(params);
+ var paramMap = {};
+ for (var i = 0; i < params.length; i++) {
+ var key = '$' + params[i].value;
+ if (Object.prototype.hasOwnProperty.call(paramMap, key)) {
+ this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value);
+ }
+ paramMap[key] = true;
+ }
+ if (this.context.strict && param.type === syntax_1.Syntax.Identifier) {
+ if (this.scanner.isRestrictedWord(param.name)) {
+ this.tolerateError(messages_1.Messages.StrictCatchVariable);
+ }
+ }
+ this.expect(')');
+ var body = this.parseBlock();
+ return this.finalize(node, new Node.CatchClause(param, body));
+ };
+ Parser.prototype.parseFinallyClause = function () {
+ this.expectKeyword('finally');
+ return this.parseBlock();
+ };
+ Parser.prototype.parseTryStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('try');
+ var block = this.parseBlock();
+ var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null;
+ var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null;
+ if (!handler && !finalizer) {
+ this.throwError(messages_1.Messages.NoCatchOrFinally);
+ }
+ return this.finalize(node, new Node.TryStatement(block, handler, finalizer));
+ };
+ // https://tc39.github.io/ecma262/#sec-debugger-statement
+ Parser.prototype.parseDebuggerStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('debugger');
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.DebuggerStatement());
+ };
+ // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations
+ Parser.prototype.parseStatement = function () {
+ var statement;
+ switch (this.lookahead.type) {
+ case 1 /* BooleanLiteral */:
+ case 5 /* NullLiteral */:
+ case 6 /* NumericLiteral */:
+ case 8 /* StringLiteral */:
+ case 10 /* Template */:
+ case 9 /* RegularExpression */:
+ statement = this.parseExpressionStatement();
+ break;
+ case 7 /* Punctuator */:
+ var value = this.lookahead.value;
+ if (value === '{') {
+ statement = this.parseBlock();
+ }
+ else if (value === '(') {
+ statement = this.parseExpressionStatement();
+ }
+ else if (value === ';') {
+ statement = this.parseEmptyStatement();
+ }
+ else {
+ statement = this.parseExpressionStatement();
+ }
+ break;
+ case 3 /* Identifier */:
+ statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement();
+ break;
+ case 4 /* Keyword */:
+ switch (this.lookahead.value) {
+ case 'break':
+ statement = this.parseBreakStatement();
+ break;
+ case 'continue':
+ statement = this.parseContinueStatement();
+ break;
+ case 'debugger':
+ statement = this.parseDebuggerStatement();
+ break;
+ case 'do':
+ statement = this.parseDoWhileStatement();
+ break;
+ case 'for':
+ statement = this.parseForStatement();
+ break;
+ case 'function':
+ statement = this.parseFunctionDeclaration();
+ break;
+ case 'if':
+ statement = this.parseIfStatement();
+ break;
+ case 'return':
+ statement = this.parseReturnStatement();
+ break;
+ case 'switch':
+ statement = this.parseSwitchStatement();
+ break;
+ case 'throw':
+ statement = this.parseThrowStatement();
+ break;
+ case 'try':
+ statement = this.parseTryStatement();
+ break;
+ case 'var':
+ statement = this.parseVariableStatement();
+ break;
+ case 'while':
+ statement = this.parseWhileStatement();
+ break;
+ case 'with':
+ statement = this.parseWithStatement();
+ break;
+ default:
+ statement = this.parseExpressionStatement();
+ break;
+ }
+ break;
+ default:
+ statement = this.throwUnexpectedToken(this.lookahead);
+ }
+ return statement;
+ };
+ // https://tc39.github.io/ecma262/#sec-function-definitions
+ Parser.prototype.parseFunctionSourceElements = function () {
+ var node = this.createNode();
+ this.expect('{');
+ var body = this.parseDirectivePrologues();
+ var previousLabelSet = this.context.labelSet;
+ var previousInIteration = this.context.inIteration;
+ var previousInSwitch = this.context.inSwitch;
+ var previousInFunctionBody = this.context.inFunctionBody;
+ this.context.labelSet = {};
+ this.context.inIteration = false;
+ this.context.inSwitch = false;
+ this.context.inFunctionBody = true;
+ while (this.lookahead.type !== 2 /* EOF */) {
+ if (this.match('}')) {
+ break;
+ }
+ body.push(this.parseStatementListItem());
+ }
+ this.expect('}');
+ this.context.labelSet = previousLabelSet;
+ this.context.inIteration = previousInIteration;
+ this.context.inSwitch = previousInSwitch;
+ this.context.inFunctionBody = previousInFunctionBody;
+ return this.finalize(node, new Node.BlockStatement(body));
+ };
+ Parser.prototype.validateParam = function (options, param, name) {
+ var key = '$' + name;
+ if (this.context.strict) {
+ if (this.scanner.isRestrictedWord(name)) {
+ options.stricted = param;
+ options.message = messages_1.Messages.StrictParamName;
+ }
+ if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
+ options.stricted = param;
+ options.message = messages_1.Messages.StrictParamDupe;
+ }
+ }
+ else if (!options.firstRestricted) {
+ if (this.scanner.isRestrictedWord(name)) {
+ options.firstRestricted = param;
+ options.message = messages_1.Messages.StrictParamName;
+ }
+ else if (this.scanner.isStrictModeReservedWord(name)) {
+ options.firstRestricted = param;
+ options.message = messages_1.Messages.StrictReservedWord;
+ }
+ else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
+ options.stricted = param;
+ options.message = messages_1.Messages.StrictParamDupe;
+ }
+ }
+ /* istanbul ignore next */
+ if (typeof Object.defineProperty === 'function') {
+ Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true });
+ }
+ else {
+ options.paramSet[key] = true;
+ }
+ };
+ Parser.prototype.parseRestElement = function (params) {
+ var node = this.createNode();
+ this.expect('...');
+ var arg = this.parsePattern(params);
+ if (this.match('=')) {
+ this.throwError(messages_1.Messages.DefaultRestParameter);
+ }
+ if (!this.match(')')) {
+ this.throwError(messages_1.Messages.ParameterAfterRestParameter);
+ }
+ return this.finalize(node, new Node.RestElement(arg));
+ };
+ Parser.prototype.parseFormalParameter = function (options) {
+ var params = [];
+ var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params);
+ for (var i = 0; i < params.length; i++) {
+ this.validateParam(options, params[i], params[i].value);
+ }
+ options.simple = options.simple && (param instanceof Node.Identifier);
+ options.params.push(param);
+ };
+ Parser.prototype.parseFormalParameters = function (firstRestricted) {
+ var options;
+ options = {
+ simple: true,
+ params: [],
+ firstRestricted: firstRestricted
+ };
+ this.expect('(');
+ if (!this.match(')')) {
+ options.paramSet = {};
+ while (this.lookahead.type !== 2 /* EOF */) {
+ this.parseFormalParameter(options);
+ if (this.match(')')) {
+ break;
+ }
+ this.expect(',');
+ if (this.match(')')) {
+ break;
+ }
+ }
+ }
+ this.expect(')');
+ return {
+ simple: options.simple,
+ params: options.params,
+ stricted: options.stricted,
+ firstRestricted: options.firstRestricted,
+ message: options.message
+ };
+ };
+ Parser.prototype.matchAsyncFunction = function () {
+ var match = this.matchContextualKeyword('async');
+ if (match) {
+ var state = this.scanner.saveState();
+ this.scanner.scanComments();
+ var next = this.scanner.lex();
+ this.scanner.restoreState(state);
+ match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function');
+ }
+ return match;
+ };
+ Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) {
+ var node = this.createNode();
+ var isAsync = this.matchContextualKeyword('async');
+ if (isAsync) {
+ this.nextToken();
+ }
+ this.expectKeyword('function');
+ var isGenerator = isAsync ? false : this.match('*');
+ if (isGenerator) {
+ this.nextToken();
+ }
+ var message;
+ var id = null;
+ var firstRestricted = null;
+ if (!identifierIsOptional || !this.match('(')) {
+ var token = this.lookahead;
+ id = this.parseVariableIdentifier();
+ if (this.context.strict) {
+ if (this.scanner.isRestrictedWord(token.value)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
+ }
+ }
+ else {
+ if (this.scanner.isRestrictedWord(token.value)) {
+ firstRestricted = token;
+ message = messages_1.Messages.StrictFunctionName;
+ }
+ else if (this.scanner.isStrictModeReservedWord(token.value)) {
+ firstRestricted = token;
+ message = messages_1.Messages.StrictReservedWord;
+ }
+ }
+ }
+ var previousAllowAwait = this.context.await;
+ var previousAllowYield = this.context.allowYield;
+ this.context.await = isAsync;
+ this.context.allowYield = !isGenerator;
+ var formalParameters = this.parseFormalParameters(firstRestricted);
+ var params = formalParameters.params;
+ var stricted = formalParameters.stricted;
+ firstRestricted = formalParameters.firstRestricted;
+ if (formalParameters.message) {
+ message = formalParameters.message;
+ }
+ var previousStrict = this.context.strict;
+ var previousAllowStrictDirective = this.context.allowStrictDirective;
+ this.context.allowStrictDirective = formalParameters.simple;
+ var body = this.parseFunctionSourceElements();
+ if (this.context.strict && firstRestricted) {
+ this.throwUnexpectedToken(firstRestricted, message);
+ }
+ if (this.context.strict && stricted) {
+ this.tolerateUnexpectedToken(stricted, message);
+ }
+ this.context.strict = previousStrict;
+ this.context.allowStrictDirective = previousAllowStrictDirective;
+ this.context.await = previousAllowAwait;
+ this.context.allowYield = previousAllowYield;
+ return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) :
+ this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator));
+ };
+ Parser.prototype.parseFunctionExpression = function () {
+ var node = this.createNode();
+ var isAsync = this.matchContextualKeyword('async');
+ if (isAsync) {
+ this.nextToken();
+ }
+ this.expectKeyword('function');
+ var isGenerator = isAsync ? false : this.match('*');
+ if (isGenerator) {
+ this.nextToken();
+ }
+ var message;
+ var id = null;
+ var firstRestricted;
+ var previousAllowAwait = this.context.await;
+ var previousAllowYield = this.context.allowYield;
+ this.context.await = isAsync;
+ this.context.allowYield = !isGenerator;
+ if (!this.match('(')) {
+ var token = this.lookahead;
+ id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier();
+ if (this.context.strict) {
+ if (this.scanner.isRestrictedWord(token.value)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
+ }
+ }
+ else {
+ if (this.scanner.isRestrictedWord(token.value)) {
+ firstRestricted = token;
+ message = messages_1.Messages.StrictFunctionName;
+ }
+ else if (this.scanner.isStrictModeReservedWord(token.value)) {
+ firstRestricted = token;
+ message = messages_1.Messages.StrictReservedWord;
+ }
+ }
+ }
+ var formalParameters = this.parseFormalParameters(firstRestricted);
+ var params = formalParameters.params;
+ var stricted = formalParameters.stricted;
+ firstRestricted = formalParameters.firstRestricted;
+ if (formalParameters.message) {
+ message = formalParameters.message;
+ }
+ var previousStrict = this.context.strict;
+ var previousAllowStrictDirective = this.context.allowStrictDirective;
+ this.context.allowStrictDirective = formalParameters.simple;
+ var body = this.parseFunctionSourceElements();
+ if (this.context.strict && firstRestricted) {
+ this.throwUnexpectedToken(firstRestricted, message);
+ }
+ if (this.context.strict && stricted) {
+ this.tolerateUnexpectedToken(stricted, message);
+ }
+ this.context.strict = previousStrict;
+ this.context.allowStrictDirective = previousAllowStrictDirective;
+ this.context.await = previousAllowAwait;
+ this.context.allowYield = previousAllowYield;
+ return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) :
+ this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator));
+ };
+ // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive
+ Parser.prototype.parseDirective = function () {
+ var token = this.lookahead;
+ var node = this.createNode();
+ var expr = this.parseExpression();
+ var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null;
+ this.consumeSemicolon();
+ return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr));
+ };
+ Parser.prototype.parseDirectivePrologues = function () {
+ var firstRestricted = null;
+ var body = [];
+ while (true) {
+ var token = this.lookahead;
+ if (token.type !== 8 /* StringLiteral */) {
+ break;
+ }
+ var statement = this.parseDirective();
+ body.push(statement);
+ var directive = statement.directive;
+ if (typeof directive !== 'string') {
+ break;
+ }
+ if (directive === 'use strict') {
+ this.context.strict = true;
+ if (firstRestricted) {
+ this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral);
+ }
+ if (!this.context.allowStrictDirective) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective);
+ }
+ }
+ else {
+ if (!firstRestricted && token.octal) {
+ firstRestricted = token;
+ }
+ }
+ }
+ return body;
+ };
+ // https://tc39.github.io/ecma262/#sec-method-definitions
+ Parser.prototype.qualifiedPropertyName = function (token) {
+ switch (token.type) {
+ case 3 /* Identifier */:
+ case 8 /* StringLiteral */:
+ case 1 /* BooleanLiteral */:
+ case 5 /* NullLiteral */:
+ case 6 /* NumericLiteral */:
+ case 4 /* Keyword */:
+ return true;
+ case 7 /* Punctuator */:
+ return token.value === '[';
+ default:
+ break;
+ }
+ return false;
+ };
+ Parser.prototype.parseGetterMethod = function () {
+ var node = this.createNode();
+ var isGenerator = false;
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = !isGenerator;
+ var formalParameters = this.parseFormalParameters();
+ if (formalParameters.params.length > 0) {
+ this.tolerateError(messages_1.Messages.BadGetterArity);
+ }
+ var method = this.parsePropertyMethod(formalParameters);
+ this.context.allowYield = previousAllowYield;
+ return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
+ };
+ Parser.prototype.parseSetterMethod = function () {
+ var node = this.createNode();
+ var isGenerator = false;
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = !isGenerator;
+ var formalParameters = this.parseFormalParameters();
+ if (formalParameters.params.length !== 1) {
+ this.tolerateError(messages_1.Messages.BadSetterArity);
+ }
+ else if (formalParameters.params[0] instanceof Node.RestElement) {
+ this.tolerateError(messages_1.Messages.BadSetterRestParameter);
+ }
+ var method = this.parsePropertyMethod(formalParameters);
+ this.context.allowYield = previousAllowYield;
+ return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
+ };
+ Parser.prototype.parseGeneratorMethod = function () {
+ var node = this.createNode();
+ var isGenerator = true;
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = true;
+ var params = this.parseFormalParameters();
+ this.context.allowYield = false;
+ var method = this.parsePropertyMethod(params);
+ this.context.allowYield = previousAllowYield;
+ return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
+ };
+ // https://tc39.github.io/ecma262/#sec-generator-function-definitions
+ Parser.prototype.isStartOfExpression = function () {
+ var start = true;
+ var value = this.lookahead.value;
+ switch (this.lookahead.type) {
+ case 7 /* Punctuator */:
+ start = (value === '[') || (value === '(') || (value === '{') ||
+ (value === '+') || (value === '-') ||
+ (value === '!') || (value === '~') ||
+ (value === '++') || (value === '--') ||
+ (value === '/') || (value === '/='); // regular expression literal
+ break;
+ case 4 /* Keyword */:
+ start = (value === 'class') || (value === 'delete') ||
+ (value === 'function') || (value === 'let') || (value === 'new') ||
+ (value === 'super') || (value === 'this') || (value === 'typeof') ||
+ (value === 'void') || (value === 'yield');
+ break;
+ default:
+ break;
+ }
+ return start;
+ };
+ Parser.prototype.parseYieldExpression = function () {
+ var node = this.createNode();
+ this.expectKeyword('yield');
+ var argument = null;
+ var delegate = false;
+ if (!this.hasLineTerminator) {
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = false;
+ delegate = this.match('*');
+ if (delegate) {
+ this.nextToken();
+ argument = this.parseAssignmentExpression();
+ }
+ else if (this.isStartOfExpression()) {
+ argument = this.parseAssignmentExpression();
+ }
+ this.context.allowYield = previousAllowYield;
+ }
+ return this.finalize(node, new Node.YieldExpression(argument, delegate));
+ };
+ // https://tc39.github.io/ecma262/#sec-class-definitions
+ Parser.prototype.parseClassElement = function (hasConstructor) {
+ var token = this.lookahead;
+ var node = this.createNode();
+ var kind = '';
+ var key = null;
+ var value = null;
+ var computed = false;
+ var method = false;
+ var isStatic = false;
+ var isAsync = false;
+ if (this.match('*')) {
+ this.nextToken();
+ }
+ else {
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ var id = key;
+ if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) {
+ token = this.lookahead;
+ isStatic = true;
+ computed = this.match('[');
+ if (this.match('*')) {
+ this.nextToken();
+ }
+ else {
+ key = this.parseObjectPropertyKey();
+ }
+ }
+ if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) {
+ var punctuator = this.lookahead.value;
+ if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') {
+ isAsync = true;
+ token = this.lookahead;
+ key = this.parseObjectPropertyKey();
+ if (token.type === 3 /* Identifier */ && token.value === 'constructor') {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync);
+ }
+ }
+ }
+ }
+ var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
+ if (token.type === 3 /* Identifier */) {
+ if (token.value === 'get' && lookaheadPropertyKey) {
+ kind = 'get';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ this.context.allowYield = false;
+ value = this.parseGetterMethod();
+ }
+ else if (token.value === 'set' && lookaheadPropertyKey) {
+ kind = 'set';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ value = this.parseSetterMethod();
+ }
+ }
+ else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
+ kind = 'init';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ value = this.parseGeneratorMethod();
+ method = true;
+ }
+ if (!kind && key && this.match('(')) {
+ kind = 'init';
+ value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
+ method = true;
+ }
+ if (!kind) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ if (kind === 'init') {
+ kind = 'method';
+ }
+ if (!computed) {
+ if (isStatic && this.isPropertyKey(key, 'prototype')) {
+ this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype);
+ }
+ if (!isStatic && this.isPropertyKey(key, 'constructor')) {
+ if (kind !== 'method' || !method || (value && value.generator)) {
+ this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod);
+ }
+ if (hasConstructor.value) {
+ this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor);
+ }
+ else {
+ hasConstructor.value = true;
+ }
+ kind = 'constructor';
+ }
+ }
+ return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic));
+ };
+ Parser.prototype.parseClassElementList = function () {
+ var body = [];
+ var hasConstructor = { value: false };
+ this.expect('{');
+ while (!this.match('}')) {
+ if (this.match(';')) {
+ this.nextToken();
+ }
+ else {
+ body.push(this.parseClassElement(hasConstructor));
+ }
+ }
+ this.expect('}');
+ return body;
+ };
+ Parser.prototype.parseClassBody = function () {
+ var node = this.createNode();
+ var elementList = this.parseClassElementList();
+ return this.finalize(node, new Node.ClassBody(elementList));
+ };
+ Parser.prototype.parseClassDeclaration = function (identifierIsOptional) {
+ var node = this.createNode();
+ var previousStrict = this.context.strict;
+ this.context.strict = true;
+ this.expectKeyword('class');
+ var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier();
+ var superClass = null;
+ if (this.matchKeyword('extends')) {
+ this.nextToken();
+ superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
+ }
+ var classBody = this.parseClassBody();
+ this.context.strict = previousStrict;
+ return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody));
+ };
+ Parser.prototype.parseClassExpression = function () {
+ var node = this.createNode();
+ var previousStrict = this.context.strict;
+ this.context.strict = true;
+ this.expectKeyword('class');
+ var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null;
+ var superClass = null;
+ if (this.matchKeyword('extends')) {
+ this.nextToken();
+ superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
+ }
+ var classBody = this.parseClassBody();
+ this.context.strict = previousStrict;
+ return this.finalize(node, new Node.ClassExpression(id, superClass, classBody));
+ };
+ // https://tc39.github.io/ecma262/#sec-scripts
+ // https://tc39.github.io/ecma262/#sec-modules
+ Parser.prototype.parseModule = function () {
+ this.context.strict = true;
+ this.context.isModule = true;
+ this.scanner.isModule = true;
+ var node = this.createNode();
+ var body = this.parseDirectivePrologues();
+ while (this.lookahead.type !== 2 /* EOF */) {
+ body.push(this.parseStatementListItem());
+ }
+ return this.finalize(node, new Node.Module(body));
+ };
+ Parser.prototype.parseScript = function () {
+ var node = this.createNode();
+ var body = this.parseDirectivePrologues();
+ while (this.lookahead.type !== 2 /* EOF */) {
+ body.push(this.parseStatementListItem());
+ }
+ return this.finalize(node, new Node.Script(body));
+ };
+ // https://tc39.github.io/ecma262/#sec-imports
+ Parser.prototype.parseModuleSpecifier = function () {
+ var node = this.createNode();
+ if (this.lookahead.type !== 8 /* StringLiteral */) {
+ this.throwError(messages_1.Messages.InvalidModuleSpecifier);
+ }
+ var token = this.nextToken();
+ var raw = this.getTokenRaw(token);
+ return this.finalize(node, new Node.Literal(token.value, raw));
+ };
+ // import {} ...;
+ Parser.prototype.parseImportSpecifier = function () {
+ var node = this.createNode();
+ var imported;
+ var local;
+ if (this.lookahead.type === 3 /* Identifier */) {
+ imported = this.parseVariableIdentifier();
+ local = imported;
+ if (this.matchContextualKeyword('as')) {
+ this.nextToken();
+ local = this.parseVariableIdentifier();
+ }
+ }
+ else {
+ imported = this.parseIdentifierName();
+ local = imported;
+ if (this.matchContextualKeyword('as')) {
+ this.nextToken();
+ local = this.parseVariableIdentifier();
+ }
+ else {
+ this.throwUnexpectedToken(this.nextToken());
+ }
+ }
+ return this.finalize(node, new Node.ImportSpecifier(local, imported));
+ };
+ // {foo, bar as bas}
+ Parser.prototype.parseNamedImports = function () {
+ this.expect('{');
+ var specifiers = [];
+ while (!this.match('}')) {
+ specifiers.push(this.parseImportSpecifier());
+ if (!this.match('}')) {
+ this.expect(',');
+ }
+ }
+ this.expect('}');
+ return specifiers;
+ };
+ // import ...;
+ Parser.prototype.parseImportDefaultSpecifier = function () {
+ var node = this.createNode();
+ var local = this.parseIdentifierName();
+ return this.finalize(node, new Node.ImportDefaultSpecifier(local));
+ };
+ // import <* as foo> ...;
+ Parser.prototype.parseImportNamespaceSpecifier = function () {
+ var node = this.createNode();
+ this.expect('*');
+ if (!this.matchContextualKeyword('as')) {
+ this.throwError(messages_1.Messages.NoAsAfterImportNamespace);
+ }
+ this.nextToken();
+ var local = this.parseIdentifierName();
+ return this.finalize(node, new Node.ImportNamespaceSpecifier(local));
+ };
+ Parser.prototype.parseImportDeclaration = function () {
+ if (this.context.inFunctionBody) {
+ this.throwError(messages_1.Messages.IllegalImportDeclaration);
+ }
+ var node = this.createNode();
+ this.expectKeyword('import');
+ var src;
+ var specifiers = [];
+ if (this.lookahead.type === 8 /* StringLiteral */) {
+ // import 'foo';
+ src = this.parseModuleSpecifier();
+ }
+ else {
+ if (this.match('{')) {
+ // import {bar}
+ specifiers = specifiers.concat(this.parseNamedImports());
+ }
+ else if (this.match('*')) {
+ // import * as foo
+ specifiers.push(this.parseImportNamespaceSpecifier());
+ }
+ else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) {
+ // import foo
+ specifiers.push(this.parseImportDefaultSpecifier());
+ if (this.match(',')) {
+ this.nextToken();
+ if (this.match('*')) {
+ // import foo, * as foo
+ specifiers.push(this.parseImportNamespaceSpecifier());
+ }
+ else if (this.match('{')) {
+ // import foo, {bar}
+ specifiers = specifiers.concat(this.parseNamedImports());
+ }
+ else {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ }
+ }
+ else {
+ this.throwUnexpectedToken(this.nextToken());
+ }
+ if (!this.matchContextualKeyword('from')) {
+ var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
+ this.throwError(message, this.lookahead.value);
+ }
+ this.nextToken();
+ src = this.parseModuleSpecifier();
+ }
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.ImportDeclaration(specifiers, src));
+ };
+ // https://tc39.github.io/ecma262/#sec-exports
+ Parser.prototype.parseExportSpecifier = function () {
+ var node = this.createNode();
+ var local = this.parseIdentifierName();
+ var exported = local;
+ if (this.matchContextualKeyword('as')) {
+ this.nextToken();
+ exported = this.parseIdentifierName();
+ }
+ return this.finalize(node, new Node.ExportSpecifier(local, exported));
+ };
+ Parser.prototype.parseExportDeclaration = function () {
+ if (this.context.inFunctionBody) {
+ this.throwError(messages_1.Messages.IllegalExportDeclaration);
+ }
+ var node = this.createNode();
+ this.expectKeyword('export');
+ var exportDeclaration;
+ if (this.matchKeyword('default')) {
+ // export default ...
+ this.nextToken();
+ if (this.matchKeyword('function')) {
+ // export default function foo () {}
+ // export default function () {}
+ var declaration = this.parseFunctionDeclaration(true);
+ exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
+ }
+ else if (this.matchKeyword('class')) {
+ // export default class foo {}
+ var declaration = this.parseClassDeclaration(true);
+ exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
+ }
+ else if (this.matchContextualKeyword('async')) {
+ // export default async function f () {}
+ // export default async function () {}
+ // export default async x => x
+ var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression();
+ exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
+ }
+ else {
+ if (this.matchContextualKeyword('from')) {
+ this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value);
+ }
+ // export default {};
+ // export default [];
+ // export default (1 + 2);
+ var declaration = this.match('{') ? this.parseObjectInitializer() :
+ this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression();
+ this.consumeSemicolon();
+ exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
+ }
+ }
+ else if (this.match('*')) {
+ // export * from 'foo';
+ this.nextToken();
+ if (!this.matchContextualKeyword('from')) {
+ var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
+ this.throwError(message, this.lookahead.value);
+ }
+ this.nextToken();
+ var src = this.parseModuleSpecifier();
+ this.consumeSemicolon();
+ exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src));
+ }
+ else if (this.lookahead.type === 4 /* Keyword */) {
+ // export var f = 1;
+ var declaration = void 0;
+ switch (this.lookahead.value) {
+ case 'let':
+ case 'const':
+ declaration = this.parseLexicalDeclaration({ inFor: false });
+ break;
+ case 'var':
+ case 'class':
+ case 'function':
+ declaration = this.parseStatementListItem();
+ break;
+ default:
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
+ }
+ else if (this.matchAsyncFunction()) {
+ var declaration = this.parseFunctionDeclaration();
+ exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
+ }
+ else {
+ var specifiers = [];
+ var source = null;
+ var isExportFromIdentifier = false;
+ this.expect('{');
+ while (!this.match('}')) {
+ isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default');
+ specifiers.push(this.parseExportSpecifier());
+ if (!this.match('}')) {
+ this.expect(',');
+ }
+ }
+ this.expect('}');
+ if (this.matchContextualKeyword('from')) {
+ // export {default} from 'foo';
+ // export {foo} from 'foo';
+ this.nextToken();
+ source = this.parseModuleSpecifier();
+ this.consumeSemicolon();
+ }
+ else if (isExportFromIdentifier) {
+ // export {default}; // missing fromClause
+ var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
+ this.throwError(message, this.lookahead.value);
+ }
+ else {
+ // export {foo};
+ this.consumeSemicolon();
+ }
+ exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source));
+ }
+ return exportDeclaration;
+ };
+ return Parser;
+ }());
+ exports.Parser = Parser;
+
+
+/***/ },
+/* 9 */
+/***/ function(module, exports) {
+
+ "use strict";
+ // Ensure the condition is true, otherwise throw an error.
+ // This is only to have a better contract semantic, i.e. another safety net
+ // to catch a logic error. The condition shall be fulfilled in normal case.
+ // Do NOT use this to enforce a certain condition on any user input.
+ Object.defineProperty(exports, "__esModule", { value: true });
+ function assert(condition, message) {
+ /* istanbul ignore if */
+ if (!condition) {
+ throw new Error('ASSERT: ' + message);
+ }
+ }
+ exports.assert = assert;
+
+
+/***/ },
+/* 10 */
+/***/ function(module, exports) {
+
+ "use strict";
+ /* tslint:disable:max-classes-per-file */
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var ErrorHandler = (function () {
+ function ErrorHandler() {
+ this.errors = [];
+ this.tolerant = false;
+ }
+ ErrorHandler.prototype.recordError = function (error) {
+ this.errors.push(error);
+ };
+ ErrorHandler.prototype.tolerate = function (error) {
+ if (this.tolerant) {
+ this.recordError(error);
+ }
+ else {
+ throw error;
+ }
+ };
+ ErrorHandler.prototype.constructError = function (msg, column) {
+ var error = new Error(msg);
+ try {
+ throw error;
+ }
+ catch (base) {
+ /* istanbul ignore else */
+ if (Object.create && Object.defineProperty) {
+ error = Object.create(base);
+ Object.defineProperty(error, 'column', { value: column });
+ }
+ }
+ /* istanbul ignore next */
+ return error;
+ };
+ ErrorHandler.prototype.createError = function (index, line, col, description) {
+ var msg = 'Line ' + line + ': ' + description;
+ var error = this.constructError(msg, col);
+ error.index = index;
+ error.lineNumber = line;
+ error.description = description;
+ return error;
+ };
+ ErrorHandler.prototype.throwError = function (index, line, col, description) {
+ throw this.createError(index, line, col, description);
+ };
+ ErrorHandler.prototype.tolerateError = function (index, line, col, description) {
+ var error = this.createError(index, line, col, description);
+ if (this.tolerant) {
+ this.recordError(error);
+ }
+ else {
+ throw error;
+ }
+ };
+ return ErrorHandler;
+ }());
+ exports.ErrorHandler = ErrorHandler;
+
+
+/***/ },
+/* 11 */
+/***/ function(module, exports) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // Error messages should be identical to V8.
+ exports.Messages = {
+ BadGetterArity: 'Getter must not have any formal parameters',
+ BadSetterArity: 'Setter must have exactly one formal parameter',
+ BadSetterRestParameter: 'Setter function argument must not be a rest parameter',
+ ConstructorIsAsync: 'Class constructor may not be an async method',
+ ConstructorSpecialMethod: 'Class constructor may not be an accessor',
+ DeclarationMissingInitializer: 'Missing initializer in %0 declaration',
+ DefaultRestParameter: 'Unexpected token =',
+ DuplicateBinding: 'Duplicate binding %0',
+ DuplicateConstructor: 'A class may only have one constructor',
+ DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',
+ ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer',
+ GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts',
+ IllegalBreak: 'Illegal break statement',
+ IllegalContinue: 'Illegal continue statement',
+ IllegalExportDeclaration: 'Unexpected token',
+ IllegalImportDeclaration: 'Unexpected token',
+ IllegalLanguageModeDirective: 'Illegal \'use strict\' directive in function with non-simple parameter list',
+ IllegalReturn: 'Illegal return statement',
+ InvalidEscapedReservedWord: 'Keyword must not contain escaped characters',
+ InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence',
+ InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
+ InvalidLHSInForIn: 'Invalid left-hand side in for-in',
+ InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',
+ InvalidModuleSpecifier: 'Unexpected token',
+ InvalidRegExp: 'Invalid regular expression',
+ LetInLexicalBinding: 'let is disallowed as a lexically bound name',
+ MissingFromClause: 'Unexpected token',
+ MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
+ NewlineAfterThrow: 'Illegal newline after throw',
+ NoAsAfterImportNamespace: 'Unexpected token',
+ NoCatchOrFinally: 'Missing catch or finally after try',
+ ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',
+ Redeclaration: '%0 \'%1\' has already been declared',
+ StaticPrototype: 'Classes may not have static property named prototype',
+ StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
+ StrictDelete: 'Delete of an unqualified identifier in strict mode.',
+ StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block',
+ StrictFunctionName: 'Function name may not be eval or arguments in strict mode',
+ StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',
+ StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
+ StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
+ StrictModeWith: 'Strict mode code may not include a with statement',
+ StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',
+ StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
+ StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',
+ StrictReservedWord: 'Use of future reserved word in strict mode',
+ StrictVarName: 'Variable name may not be eval or arguments in strict mode',
+ TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',
+ UnexpectedEOS: 'Unexpected end of input',
+ UnexpectedIdentifier: 'Unexpected identifier',
+ UnexpectedNumber: 'Unexpected number',
+ UnexpectedReserved: 'Unexpected reserved word',
+ UnexpectedString: 'Unexpected string',
+ UnexpectedTemplate: 'Unexpected quasi %0',
+ UnexpectedToken: 'Unexpected token %0',
+ UnexpectedTokenIllegal: 'Unexpected token ILLEGAL',
+ UnknownLabel: 'Undefined label \'%0\'',
+ UnterminatedRegExp: 'Invalid regular expression: missing /'
+ };
+
+
+/***/ },
+/* 12 */
+/***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var assert_1 = __webpack_require__(9);
+ var character_1 = __webpack_require__(4);
+ var messages_1 = __webpack_require__(11);
+ function hexValue(ch) {
+ return '0123456789abcdef'.indexOf(ch.toLowerCase());
+ }
+ function octalValue(ch) {
+ return '01234567'.indexOf(ch);
+ }
+ var Scanner = (function () {
+ function Scanner(code, handler) {
+ this.source = code;
+ this.errorHandler = handler;
+ this.trackComment = false;
+ this.isModule = false;
+ this.length = code.length;
+ this.index = 0;
+ this.lineNumber = (code.length > 0) ? 1 : 0;
+ this.lineStart = 0;
+ this.curlyStack = [];
+ }
+ Scanner.prototype.saveState = function () {
+ return {
+ index: this.index,
+ lineNumber: this.lineNumber,
+ lineStart: this.lineStart
+ };
+ };
+ Scanner.prototype.restoreState = function (state) {
+ this.index = state.index;
+ this.lineNumber = state.lineNumber;
+ this.lineStart = state.lineStart;
+ };
+ Scanner.prototype.eof = function () {
+ return this.index >= this.length;
+ };
+ Scanner.prototype.throwUnexpectedToken = function (message) {
+ if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
+ return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
+ };
+ Scanner.prototype.tolerateUnexpectedToken = function (message) {
+ if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
+ this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
+ };
+ // https://tc39.github.io/ecma262/#sec-comments
+ Scanner.prototype.skipSingleLineComment = function (offset) {
+ var comments = [];
+ var start, loc;
+ if (this.trackComment) {
+ comments = [];
+ start = this.index - offset;
+ loc = {
+ start: {
+ line: this.lineNumber,
+ column: this.index - this.lineStart - offset
+ },
+ end: {}
+ };
+ }
+ while (!this.eof()) {
+ var ch = this.source.charCodeAt(this.index);
+ ++this.index;
+ if (character_1.Character.isLineTerminator(ch)) {
+ if (this.trackComment) {
+ loc.end = {
+ line: this.lineNumber,
+ column: this.index - this.lineStart - 1
+ };
+ var entry = {
+ multiLine: false,
+ slice: [start + offset, this.index - 1],
+ range: [start, this.index - 1],
+ loc: loc
+ };
+ comments.push(entry);
+ }
+ if (ch === 13 && this.source.charCodeAt(this.index) === 10) {
+ ++this.index;
+ }
+ ++this.lineNumber;
+ this.lineStart = this.index;
+ return comments;
+ }
+ }
+ if (this.trackComment) {
+ loc.end = {
+ line: this.lineNumber,
+ column: this.index - this.lineStart
+ };
+ var entry = {
+ multiLine: false,
+ slice: [start + offset, this.index],
+ range: [start, this.index],
+ loc: loc
+ };
+ comments.push(entry);
+ }
+ return comments;
+ };
+ Scanner.prototype.skipMultiLineComment = function () {
+ var comments = [];
+ var start, loc;
+ if (this.trackComment) {
+ comments = [];
+ start = this.index - 2;
+ loc = {
+ start: {
+ line: this.lineNumber,
+ column: this.index - this.lineStart - 2
+ },
+ end: {}
+ };
+ }
+ while (!this.eof()) {
+ var ch = this.source.charCodeAt(this.index);
+ if (character_1.Character.isLineTerminator(ch)) {
+ if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) {
+ ++this.index;
+ }
+ ++this.lineNumber;
+ ++this.index;
+ this.lineStart = this.index;
+ }
+ else if (ch === 0x2A) {
+ // Block comment ends with '*/'.
+ if (this.source.charCodeAt(this.index + 1) === 0x2F) {
+ this.index += 2;
+ if (this.trackComment) {
+ loc.end = {
+ line: this.lineNumber,
+ column: this.index - this.lineStart
+ };
+ var entry = {
+ multiLine: true,
+ slice: [start + 2, this.index - 2],
+ range: [start, this.index],
+ loc: loc
+ };
+ comments.push(entry);
+ }
+ return comments;
+ }
+ ++this.index;
+ }
+ else {
+ ++this.index;
+ }
+ }
+ // Ran off the end of the file - the whole thing is a comment
+ if (this.trackComment) {
+ loc.end = {
+ line: this.lineNumber,
+ column: this.index - this.lineStart
+ };
+ var entry = {
+ multiLine: true,
+ slice: [start + 2, this.index],
+ range: [start, this.index],
+ loc: loc
+ };
+ comments.push(entry);
+ }
+ this.tolerateUnexpectedToken();
+ return comments;
+ };
+ Scanner.prototype.scanComments = function () {
+ var comments;
+ if (this.trackComment) {
+ comments = [];
+ }
+ var start = (this.index === 0);
+ while (!this.eof()) {
+ var ch = this.source.charCodeAt(this.index);
+ if (character_1.Character.isWhiteSpace(ch)) {
+ ++this.index;
+ }
+ else if (character_1.Character.isLineTerminator(ch)) {
+ ++this.index;
+ if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) {
+ ++this.index;
+ }
+ ++this.lineNumber;
+ this.lineStart = this.index;
+ start = true;
+ }
+ else if (ch === 0x2F) {
+ ch = this.source.charCodeAt(this.index + 1);
+ if (ch === 0x2F) {
+ this.index += 2;
+ var comment = this.skipSingleLineComment(2);
+ if (this.trackComment) {
+ comments = comments.concat(comment);
+ }
+ start = true;
+ }
+ else if (ch === 0x2A) {
+ this.index += 2;
+ var comment = this.skipMultiLineComment();
+ if (this.trackComment) {
+ comments = comments.concat(comment);
+ }
+ }
+ else {
+ break;
+ }
+ }
+ else if (start && ch === 0x2D) {
+ // U+003E is '>'
+ if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) {
+ // '-->' is a single-line comment
+ this.index += 3;
+ var comment = this.skipSingleLineComment(3);
+ if (this.trackComment) {
+ comments = comments.concat(comment);
+ }
+ }
+ else {
+ break;
+ }
+ }
+ else if (ch === 0x3C && !this.isModule) {
+ if (this.source.slice(this.index + 1, this.index + 4) === '!--') {
+ this.index += 4; // ` (0,0,1,1,0,0)
+ optimize() {
+
+ // times or values may be shared with other tracks, so overwriting is unsafe
+ const times = AnimationUtils.arraySlice( this.times ),
+ values = AnimationUtils.arraySlice( this.values ),
+ stride = this.getValueSize(),
+
+ smoothInterpolation = this.getInterpolation() === InterpolateSmooth,
+
+ lastIndex = times.length - 1;
+
+ let writeIndex = 1;
+
+ for ( let i = 1; i < lastIndex; ++ i ) {
+
+ let keep = false;
+
+ const time = times[ i ];
+ const timeNext = times[ i + 1 ];
+
+ // remove adjacent keyframes scheduled at the same time
+
+ if ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {
+
+ if ( ! smoothInterpolation ) {
+
+ // remove unnecessary keyframes same as their neighbors
+
+ const offset = i * stride,
+ offsetP = offset - stride,
+ offsetN = offset + stride;
+
+ for ( let j = 0; j !== stride; ++ j ) {
+
+ const value = values[ offset + j ];
+
+ if ( value !== values[ offsetP + j ] ||
+ value !== values[ offsetN + j ] ) {
+
+ keep = true;
+ break;
+
+ }
+
+ }
+
+ } else {
+
+ keep = true;
+
+ }
+
+ }
+
+ // in-place compaction
+
+ if ( keep ) {
+
+ if ( i !== writeIndex ) {
+
+ times[ writeIndex ] = times[ i ];
+
+ const readOffset = i * stride,
+ writeOffset = writeIndex * stride;
+
+ for ( let j = 0; j !== stride; ++ j ) {
+
+ values[ writeOffset + j ] = values[ readOffset + j ];
+
+ }
+
+ }
+
+ ++ writeIndex;
+
+ }
+
+ }
+
+ // flush last keyframe (compaction looks ahead)
+
+ if ( lastIndex > 0 ) {
+
+ times[ writeIndex ] = times[ lastIndex ];
+
+ for ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {
+
+ values[ writeOffset + j ] = values[ readOffset + j ];
+
+ }
+
+ ++ writeIndex;
+
+ }
+
+ if ( writeIndex !== times.length ) {
+
+ this.times = AnimationUtils.arraySlice( times, 0, writeIndex );
+ this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );
+
+ } else {
+
+ this.times = times;
+ this.values = values;
+
+ }
+
+ return this;
+
+ }
+
+ clone() {
+
+ const times = AnimationUtils.arraySlice( this.times, 0 );
+ const values = AnimationUtils.arraySlice( this.values, 0 );
+
+ const TypedKeyframeTrack = this.constructor;
+ const track = new TypedKeyframeTrack( this.name, times, values );
+
+ // Interpolant argument to constructor is not saved, so copy the factory method directly.
+ track.createInterpolant = this.createInterpolant;
+
+ return track;
+
+ }
+
+}
+
+KeyframeTrack.prototype.TimeBufferType = Float32Array;
+KeyframeTrack.prototype.ValueBufferType = Float32Array;
+KeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;
+
+/**
+ * A Track of Boolean keyframe values.
+ */
+class BooleanKeyframeTrack extends KeyframeTrack {}
+
+BooleanKeyframeTrack.prototype.ValueTypeName = 'bool';
+BooleanKeyframeTrack.prototype.ValueBufferType = Array;
+BooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;
+BooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;
+BooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;
+
+/**
+ * A Track of keyframe values that represent color.
+ */
+class ColorKeyframeTrack extends KeyframeTrack {}
+
+ColorKeyframeTrack.prototype.ValueTypeName = 'color';
+
+/**
+ * A Track of numeric keyframe values.
+ */
+class NumberKeyframeTrack extends KeyframeTrack {}
+
+NumberKeyframeTrack.prototype.ValueTypeName = 'number';
+
+/**
+ * Spherical linear unit quaternion interpolant.
+ */
+
+class QuaternionLinearInterpolant extends Interpolant {
+
+ constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
+
+ super( parameterPositions, sampleValues, sampleSize, resultBuffer );
+
+ }
+
+ interpolate_( i1, t0, t, t1 ) {
+
+ const result = this.resultBuffer,
+ values = this.sampleValues,
+ stride = this.valueSize,
+
+ alpha = ( t - t0 ) / ( t1 - t0 );
+
+ let offset = i1 * stride;
+
+ for ( let end = offset + stride; offset !== end; offset += 4 ) {
+
+ Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );
+
+ }
+
+ return result;
+
+ }
+
+}
+
+/**
+ * A Track of quaternion keyframe values.
+ */
+class QuaternionKeyframeTrack extends KeyframeTrack {
+
+ InterpolantFactoryMethodLinear( result ) {
+
+ return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );
+
+ }
+
+}
+
+QuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';
+// ValueBufferType is inherited
+QuaternionKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;
+QuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;
+
+/**
+ * A Track that interpolates Strings
+ */
+class StringKeyframeTrack extends KeyframeTrack {}
+
+StringKeyframeTrack.prototype.ValueTypeName = 'string';
+StringKeyframeTrack.prototype.ValueBufferType = Array;
+StringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;
+StringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;
+StringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;
+
+/**
+ * A Track of vectored keyframe values.
+ */
+class VectorKeyframeTrack extends KeyframeTrack {}
+
+VectorKeyframeTrack.prototype.ValueTypeName = 'vector';
+
+class AnimationClip {
+
+ constructor( name, duration = - 1, tracks, blendMode = NormalAnimationBlendMode ) {
+
+ this.name = name;
+ this.tracks = tracks;
+ this.duration = duration;
+ this.blendMode = blendMode;
+
+ this.uuid = generateUUID();
+
+ // this means it should figure out its duration by scanning the tracks
+ if ( this.duration < 0 ) {
+
+ this.resetDuration();
+
+ }
+
+ }
+
+
+ static parse( json ) {
+
+ const tracks = [],
+ jsonTracks = json.tracks,
+ frameTime = 1.0 / ( json.fps || 1.0 );
+
+ for ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {
+
+ tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );
+
+ }
+
+ const clip = new this( json.name, json.duration, tracks, json.blendMode );
+ clip.uuid = json.uuid;
+
+ return clip;
+
+ }
+
+ static toJSON( clip ) {
+
+ const tracks = [],
+ clipTracks = clip.tracks;
+
+ const json = {
+
+ 'name': clip.name,
+ 'duration': clip.duration,
+ 'tracks': tracks,
+ 'uuid': clip.uuid,
+ 'blendMode': clip.blendMode
+
+ };
+
+ for ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {
+
+ tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );
+
+ }
+
+ return json;
+
+ }
+
+ static CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {
+
+ const numMorphTargets = morphTargetSequence.length;
+ const tracks = [];
+
+ for ( let i = 0; i < numMorphTargets; i ++ ) {
+
+ let times = [];
+ let values = [];
+
+ times.push(
+ ( i + numMorphTargets - 1 ) % numMorphTargets,
+ i,
+ ( i + 1 ) % numMorphTargets );
+
+ values.push( 0, 1, 0 );
+
+ const order = AnimationUtils.getKeyframeOrder( times );
+ times = AnimationUtils.sortedArray( times, 1, order );
+ values = AnimationUtils.sortedArray( values, 1, order );
+
+ // if there is a key at the first frame, duplicate it as the
+ // last frame as well for perfect loop.
+ if ( ! noLoop && times[ 0 ] === 0 ) {
+
+ times.push( numMorphTargets );
+ values.push( values[ 0 ] );
+
+ }
+
+ tracks.push(
+ new NumberKeyframeTrack(
+ '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',
+ times, values
+ ).scale( 1.0 / fps ) );
+
+ }
+
+ return new this( name, - 1, tracks );
+
+ }
+
+ static findByName( objectOrClipArray, name ) {
+
+ let clipArray = objectOrClipArray;
+
+ if ( ! Array.isArray( objectOrClipArray ) ) {
+
+ const o = objectOrClipArray;
+ clipArray = o.geometry && o.geometry.animations || o.animations;
+
+ }
+
+ for ( let i = 0; i < clipArray.length; i ++ ) {
+
+ if ( clipArray[ i ].name === name ) {
+
+ return clipArray[ i ];
+
+ }
+
+ }
+
+ return null;
+
+ }
+
+ static CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {
+
+ const animationToMorphTargets = {};
+
+ // tested with https://regex101.com/ on trick sequences
+ // such flamingo_flyA_003, flamingo_run1_003, crdeath0059
+ const pattern = /^([\w-]*?)([\d]+)$/;
+
+ // sort morph target names into animation groups based
+ // patterns like Walk_001, Walk_002, Run_001, Run_002
+ for ( let i = 0, il = morphTargets.length; i < il; i ++ ) {
+
+ const morphTarget = morphTargets[ i ];
+ const parts = morphTarget.name.match( pattern );
+
+ if ( parts && parts.length > 1 ) {
+
+ const name = parts[ 1 ];
+
+ let animationMorphTargets = animationToMorphTargets[ name ];
+
+ if ( ! animationMorphTargets ) {
+
+ animationToMorphTargets[ name ] = animationMorphTargets = [];
+
+ }
+
+ animationMorphTargets.push( morphTarget );
+
+ }
+
+ }
+
+ const clips = [];
+
+ for ( const name in animationToMorphTargets ) {
+
+ clips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );
+
+ }
+
+ return clips;
+
+ }
+
+ // parse the animation.hierarchy format
+ static parseAnimation( animation, bones ) {
+
+ if ( ! animation ) {
+
+ console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );
+ return null;
+
+ }
+
+ const addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {
+
+ // only return track if there are actually keys.
+ if ( animationKeys.length !== 0 ) {
+
+ const times = [];
+ const values = [];
+
+ AnimationUtils.flattenJSON( animationKeys, times, values, propertyName );
+
+ // empty keys are filtered out, so check again
+ if ( times.length !== 0 ) {
+
+ destTracks.push( new trackType( trackName, times, values ) );
+
+ }
+
+ }
+
+ };
+
+ const tracks = [];
+
+ const clipName = animation.name || 'default';
+ const fps = animation.fps || 30;
+ const blendMode = animation.blendMode;
+
+ // automatic length determination in AnimationClip.
+ let duration = animation.length || - 1;
+
+ const hierarchyTracks = animation.hierarchy || [];
+
+ for ( let h = 0; h < hierarchyTracks.length; h ++ ) {
+
+ const animationKeys = hierarchyTracks[ h ].keys;
+
+ // skip empty tracks
+ if ( ! animationKeys || animationKeys.length === 0 ) continue;
+
+ // process morph targets
+ if ( animationKeys[ 0 ].morphTargets ) {
+
+ // figure out all morph targets used in this track
+ const morphTargetNames = {};
+
+ let k;
+
+ for ( k = 0; k < animationKeys.length; k ++ ) {
+
+ if ( animationKeys[ k ].morphTargets ) {
+
+ for ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {
+
+ morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;
+
+ }
+
+ }
+
+ }
+
+ // create a track for each morph target with all zero
+ // morphTargetInfluences except for the keys in which
+ // the morphTarget is named.
+ for ( const morphTargetName in morphTargetNames ) {
+
+ const times = [];
+ const values = [];
+
+ for ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {
+
+ const animationKey = animationKeys[ k ];
+
+ times.push( animationKey.time );
+ values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );
+
+ }
+
+ tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );
+
+ }
+
+ duration = morphTargetNames.length * fps;
+
+ } else {
+
+ // ...assume skeletal animation
+
+ const boneName = '.bones[' + bones[ h ].name + ']';
+
+ addNonemptyTrack(
+ VectorKeyframeTrack, boneName + '.position',
+ animationKeys, 'pos', tracks );
+
+ addNonemptyTrack(
+ QuaternionKeyframeTrack, boneName + '.quaternion',
+ animationKeys, 'rot', tracks );
+
+ addNonemptyTrack(
+ VectorKeyframeTrack, boneName + '.scale',
+ animationKeys, 'scl', tracks );
+
+ }
+
+ }
+
+ if ( tracks.length === 0 ) {
+
+ return null;
+
+ }
+
+ const clip = new this( clipName, duration, tracks, blendMode );
+
+ return clip;
+
+ }
+
+ resetDuration() {
+
+ const tracks = this.tracks;
+ let duration = 0;
+
+ for ( let i = 0, n = tracks.length; i !== n; ++ i ) {
+
+ const track = this.tracks[ i ];
+
+ duration = Math.max( duration, track.times[ track.times.length - 1 ] );
+
+ }
+
+ this.duration = duration;
+
+ return this;
+
+ }
+
+ trim() {
+
+ for ( let i = 0; i < this.tracks.length; i ++ ) {
+
+ this.tracks[ i ].trim( 0, this.duration );
+
+ }
+
+ return this;
+
+ }
+
+ validate() {
+
+ let valid = true;
+
+ for ( let i = 0; i < this.tracks.length; i ++ ) {
+
+ valid = valid && this.tracks[ i ].validate();
+
+ }
+
+ return valid;
+
+ }
+
+ optimize() {
+
+ for ( let i = 0; i < this.tracks.length; i ++ ) {
+
+ this.tracks[ i ].optimize();
+
+ }
+
+ return this;
+
+ }
+
+ clone() {
+
+ const tracks = [];
+
+ for ( let i = 0; i < this.tracks.length; i ++ ) {
+
+ tracks.push( this.tracks[ i ].clone() );
+
+ }
+
+ return new this.constructor( this.name, this.duration, tracks, this.blendMode );
+
+ }
+
+ toJSON() {
+
+ return this.constructor.toJSON( this );
+
+ }
+
+}
+
+function getTrackTypeForValueTypeName( typeName ) {
+
+ switch ( typeName.toLowerCase() ) {
+
+ case 'scalar':
+ case 'double':
+ case 'float':
+ case 'number':
+ case 'integer':
+
+ return NumberKeyframeTrack;
+
+ case 'vector':
+ case 'vector2':
+ case 'vector3':
+ case 'vector4':
+
+ return VectorKeyframeTrack;
+
+ case 'color':
+
+ return ColorKeyframeTrack;
+
+ case 'quaternion':
+
+ return QuaternionKeyframeTrack;
+
+ case 'bool':
+ case 'boolean':
+
+ return BooleanKeyframeTrack;
+
+ case 'string':
+
+ return StringKeyframeTrack;
+
+ }
+
+ throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );
+
+}
+
+function parseKeyframeTrack( json ) {
+
+ if ( json.type === undefined ) {
+
+ throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );
+
+ }
+
+ const trackType = getTrackTypeForValueTypeName( json.type );
+
+ if ( json.times === undefined ) {
+
+ const times = [], values = [];
+
+ AnimationUtils.flattenJSON( json.keys, times, values, 'value' );
+
+ json.times = times;
+ json.values = values;
+
+ }
+
+ // derived classes can define a static parse method
+ if ( trackType.parse !== undefined ) {
+
+ return trackType.parse( json );
+
+ } else {
+
+ // by default, we assume a constructor compatible with the base
+ return new trackType( json.name, json.times, json.values, json.interpolation );
+
+ }
+
+}
+
+const Cache = {
+
+ enabled: false,
+
+ files: {},
+
+ add: function ( key, file ) {
+
+ if ( this.enabled === false ) return;
+
+ // console.log( 'THREE.Cache', 'Adding key:', key );
+
+ this.files[ key ] = file;
+
+ },
+
+ get: function ( key ) {
+
+ if ( this.enabled === false ) return;
+
+ // console.log( 'THREE.Cache', 'Checking key:', key );
+
+ return this.files[ key ];
+
+ },
+
+ remove: function ( key ) {
+
+ delete this.files[ key ];
+
+ },
+
+ clear: function () {
+
+ this.files = {};
+
+ }
+
+};
+
+class LoadingManager {
+
+ constructor( onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ let isLoading = false;
+ let itemsLoaded = 0;
+ let itemsTotal = 0;
+ let urlModifier = undefined;
+ const handlers = [];
+
+ // Refer to #5689 for the reason why we don't set .onStart
+ // in the constructor
+
+ this.onStart = undefined;
+ this.onLoad = onLoad;
+ this.onProgress = onProgress;
+ this.onError = onError;
+
+ this.itemStart = function ( url ) {
+
+ itemsTotal ++;
+
+ if ( isLoading === false ) {
+
+ if ( scope.onStart !== undefined ) {
+
+ scope.onStart( url, itemsLoaded, itemsTotal );
+
+ }
+
+ }
+
+ isLoading = true;
+
+ };
+
+ this.itemEnd = function ( url ) {
+
+ itemsLoaded ++;
+
+ if ( scope.onProgress !== undefined ) {
+
+ scope.onProgress( url, itemsLoaded, itemsTotal );
+
+ }
+
+ if ( itemsLoaded === itemsTotal ) {
+
+ isLoading = false;
+
+ if ( scope.onLoad !== undefined ) {
+
+ scope.onLoad();
+
+ }
+
+ }
+
+ };
+
+ this.itemError = function ( url ) {
+
+ if ( scope.onError !== undefined ) {
+
+ scope.onError( url );
+
+ }
+
+ };
+
+ this.resolveURL = function ( url ) {
+
+ if ( urlModifier ) {
+
+ return urlModifier( url );
+
+ }
+
+ return url;
+
+ };
+
+ this.setURLModifier = function ( transform ) {
+
+ urlModifier = transform;
+
+ return this;
+
+ };
+
+ this.addHandler = function ( regex, loader ) {
+
+ handlers.push( regex, loader );
+
+ return this;
+
+ };
+
+ this.removeHandler = function ( regex ) {
+
+ const index = handlers.indexOf( regex );
+
+ if ( index !== - 1 ) {
+
+ handlers.splice( index, 2 );
+
+ }
+
+ return this;
+
+ };
+
+ this.getHandler = function ( file ) {
+
+ for ( let i = 0, l = handlers.length; i < l; i += 2 ) {
+
+ const regex = handlers[ i ];
+ const loader = handlers[ i + 1 ];
+
+ if ( regex.global ) regex.lastIndex = 0; // see #17920
+
+ if ( regex.test( file ) ) {
+
+ return loader;
+
+ }
+
+ }
+
+ return null;
+
+ };
+
+ }
+
+}
+
+const DefaultLoadingManager = new LoadingManager();
+
+class Loader {
+
+ constructor( manager ) {
+
+ this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
+
+ this.crossOrigin = 'anonymous';
+ this.withCredentials = false;
+ this.path = '';
+ this.resourcePath = '';
+ this.requestHeader = {};
+
+ }
+
+ load( /* url, onLoad, onProgress, onError */ ) {}
+
+ loadAsync( url, onProgress ) {
+
+ const scope = this;
+
+ return new Promise( function ( resolve, reject ) {
+
+ scope.load( url, resolve, onProgress, reject );
+
+ } );
+
+ }
+
+ parse( /* data */ ) {}
+
+ setCrossOrigin( crossOrigin ) {
+
+ this.crossOrigin = crossOrigin;
+ return this;
+
+ }
+
+ setWithCredentials( value ) {
+
+ this.withCredentials = value;
+ return this;
+
+ }
+
+ setPath( path ) {
+
+ this.path = path;
+ return this;
+
+ }
+
+ setResourcePath( resourcePath ) {
+
+ this.resourcePath = resourcePath;
+ return this;
+
+ }
+
+ setRequestHeader( requestHeader ) {
+
+ this.requestHeader = requestHeader;
+ return this;
+
+ }
+
+}
+
+const loading = {};
+
+class FileLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ if ( url === undefined ) url = '';
+
+ if ( this.path !== undefined ) url = this.path + url;
+
+ url = this.manager.resolveURL( url );
+
+ const cached = Cache.get( url );
+
+ if ( cached !== undefined ) {
+
+ this.manager.itemStart( url );
+
+ setTimeout( () => {
+
+ if ( onLoad ) onLoad( cached );
+
+ this.manager.itemEnd( url );
+
+ }, 0 );
+
+ return cached;
+
+ }
+
+ // Check if request is duplicate
+
+ if ( loading[ url ] !== undefined ) {
+
+ loading[ url ].push( {
+
+ onLoad: onLoad,
+ onProgress: onProgress,
+ onError: onError
+
+ } );
+
+ return;
+
+ }
+
+ // Initialise array for duplicate requests
+ loading[ url ] = [];
+
+ loading[ url ].push( {
+ onLoad: onLoad,
+ onProgress: onProgress,
+ onError: onError,
+ } );
+
+ // create request
+ const req = new Request( url, {
+ headers: new Headers( this.requestHeader ),
+ credentials: this.withCredentials ? 'include' : 'same-origin',
+ // An abort controller could be added within a future PR
+ } );
+
+ // record states ( avoid data race )
+ const mimeType = this.mimeType;
+ const responseType = this.responseType;
+
+ // start the fetch
+ fetch( req )
+ .then( response => {
+
+ if ( response.status === 200 || response.status === 0 ) {
+
+ // Some browsers return HTTP Status 0 when using non-http protocol
+ // e.g. 'file://' or 'data://'. Handle as success.
+
+ if ( response.status === 0 ) {
+
+ console.warn( 'THREE.FileLoader: HTTP Status 0 received.' );
+
+ }
+
+ // Workaround: Checking if response.body === undefined for Alipay browser #23548
+
+ if ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {
+
+ return response;
+
+ }
+
+ const callbacks = loading[ url ];
+ const reader = response.body.getReader();
+ const contentLength = response.headers.get( 'Content-Length' );
+ const total = contentLength ? parseInt( contentLength ) : 0;
+ const lengthComputable = total !== 0;
+ let loaded = 0;
+
+ // periodically read data into the new stream tracking while download progress
+ const stream = new ReadableStream( {
+ start( controller ) {
+
+ readData();
+
+ function readData() {
+
+ reader.read().then( ( { done, value } ) => {
+
+ if ( done ) {
+
+ controller.close();
+
+ } else {
+
+ loaded += value.byteLength;
+
+ const event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );
+ for ( let i = 0, il = callbacks.length; i < il; i ++ ) {
+
+ const callback = callbacks[ i ];
+ if ( callback.onProgress ) callback.onProgress( event );
+
+ }
+
+ controller.enqueue( value );
+ readData();
+
+ }
+
+ } );
+
+ }
+
+ }
+
+ } );
+
+ return new Response( stream );
+
+ } else {
+
+ throw Error( `fetch for "${response.url}" responded with ${response.status}: ${response.statusText}` );
+
+ }
+
+ } )
+ .then( response => {
+
+ switch ( responseType ) {
+
+ case 'arraybuffer':
+
+ return response.arrayBuffer();
+
+ case 'blob':
+
+ return response.blob();
+
+ case 'document':
+
+ return response.text()
+ .then( text => {
+
+ const parser = new DOMParser();
+ return parser.parseFromString( text, mimeType );
+
+ } );
+
+ case 'json':
+
+ return response.json();
+
+ default:
+
+ if ( mimeType === undefined ) {
+
+ return response.text();
+
+ } else {
+
+ // sniff encoding
+ const re = /charset="?([^;"\s]*)"?/i;
+ const exec = re.exec( mimeType );
+ const label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;
+ const decoder = new TextDecoder( label );
+ return response.arrayBuffer().then( ab => decoder.decode( ab ) );
+
+ }
+
+ }
+
+ } )
+ .then( data => {
+
+ // Add to cache only on HTTP success, so that we do not cache
+ // error response bodies as proper responses to requests.
+ Cache.add( url, data );
+
+ const callbacks = loading[ url ];
+ delete loading[ url ];
+
+ for ( let i = 0, il = callbacks.length; i < il; i ++ ) {
+
+ const callback = callbacks[ i ];
+ if ( callback.onLoad ) callback.onLoad( data );
+
+ }
+
+ } )
+ .catch( err => {
+
+ // Abort errors and other errors are handled the same
+
+ const callbacks = loading[ url ];
+
+ if ( callbacks === undefined ) {
+
+ // When onLoad was called and url was deleted in `loading`
+ this.manager.itemError( url );
+ throw err;
+
+ }
+
+ delete loading[ url ];
+
+ for ( let i = 0, il = callbacks.length; i < il; i ++ ) {
+
+ const callback = callbacks[ i ];
+ if ( callback.onError ) callback.onError( err );
+
+ }
+
+ this.manager.itemError( url );
+
+ } )
+ .finally( () => {
+
+ this.manager.itemEnd( url );
+
+ } );
+
+ this.manager.itemStart( url );
+
+ }
+
+ setResponseType( value ) {
+
+ this.responseType = value;
+ return this;
+
+ }
+
+ setMimeType( value ) {
+
+ this.mimeType = value;
+ return this;
+
+ }
+
+}
+
+class AnimationLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const loader = new FileLoader( this.manager );
+ loader.setPath( this.path );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( this.withCredentials );
+ loader.load( url, function ( text ) {
+
+ try {
+
+ onLoad( scope.parse( JSON.parse( text ) ) );
+
+ } catch ( e ) {
+
+ if ( onError ) {
+
+ onError( e );
+
+ } else {
+
+ console.error( e );
+
+ }
+
+ scope.manager.itemError( url );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+ parse( json ) {
+
+ const animations = [];
+
+ for ( let i = 0; i < json.length; i ++ ) {
+
+ const clip = AnimationClip.parse( json[ i ] );
+
+ animations.push( clip );
+
+ }
+
+ return animations;
+
+ }
+
+}
+
+/**
+ * Abstract Base class to block based textures loader (dds, pvr, ...)
+ *
+ * Sub classes have to implement the parse() method which will be used in load().
+ */
+
+class CompressedTextureLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const images = [];
+
+ const texture = new CompressedTexture();
+
+ const loader = new FileLoader( this.manager );
+ loader.setPath( this.path );
+ loader.setResponseType( 'arraybuffer' );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( scope.withCredentials );
+
+ let loaded = 0;
+
+ function loadTexture( i ) {
+
+ loader.load( url[ i ], function ( buffer ) {
+
+ const texDatas = scope.parse( buffer, true );
+
+ images[ i ] = {
+ width: texDatas.width,
+ height: texDatas.height,
+ format: texDatas.format,
+ mipmaps: texDatas.mipmaps
+ };
+
+ loaded += 1;
+
+ if ( loaded === 6 ) {
+
+ if ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;
+
+ texture.image = images;
+ texture.format = texDatas.format;
+ texture.needsUpdate = true;
+
+ if ( onLoad ) onLoad( texture );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+ if ( Array.isArray( url ) ) {
+
+ for ( let i = 0, il = url.length; i < il; ++ i ) {
+
+ loadTexture( i );
+
+ }
+
+ } else {
+
+ // compressed cubemap texture stored in a single DDS file
+
+ loader.load( url, function ( buffer ) {
+
+ const texDatas = scope.parse( buffer, true );
+
+ if ( texDatas.isCubemap ) {
+
+ const faces = texDatas.mipmaps.length / texDatas.mipmapCount;
+
+ for ( let f = 0; f < faces; f ++ ) {
+
+ images[ f ] = { mipmaps: [] };
+
+ for ( let i = 0; i < texDatas.mipmapCount; i ++ ) {
+
+ images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );
+ images[ f ].format = texDatas.format;
+ images[ f ].width = texDatas.width;
+ images[ f ].height = texDatas.height;
+
+ }
+
+ }
+
+ texture.image = images;
+
+ } else {
+
+ texture.image.width = texDatas.width;
+ texture.image.height = texDatas.height;
+ texture.mipmaps = texDatas.mipmaps;
+
+ }
+
+ if ( texDatas.mipmapCount === 1 ) {
+
+ texture.minFilter = LinearFilter;
+
+ }
+
+ texture.format = texDatas.format;
+ texture.needsUpdate = true;
+
+ if ( onLoad ) onLoad( texture );
+
+ }, onProgress, onError );
+
+ }
+
+ return texture;
+
+ }
+
+}
+
+class ImageLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ if ( this.path !== undefined ) url = this.path + url;
+
+ url = this.manager.resolveURL( url );
+
+ const scope = this;
+
+ const cached = Cache.get( url );
+
+ if ( cached !== undefined ) {
+
+ scope.manager.itemStart( url );
+
+ setTimeout( function () {
+
+ if ( onLoad ) onLoad( cached );
+
+ scope.manager.itemEnd( url );
+
+ }, 0 );
+
+ return cached;
+
+ }
+
+ const image = createElementNS( 'img' );
+
+ function onImageLoad() {
+
+ removeEventListeners();
+
+ Cache.add( url, this );
+
+ if ( onLoad ) onLoad( this );
+
+ scope.manager.itemEnd( url );
+
+ }
+
+ function onImageError( event ) {
+
+ removeEventListeners();
+
+ if ( onError ) onError( event );
+
+ scope.manager.itemError( url );
+ scope.manager.itemEnd( url );
+
+ }
+
+ function removeEventListeners() {
+
+ image.removeEventListener( 'load', onImageLoad, false );
+ image.removeEventListener( 'error', onImageError, false );
+
+ }
+
+ image.addEventListener( 'load', onImageLoad, false );
+ image.addEventListener( 'error', onImageError, false );
+
+ if ( url.slice( 0, 5 ) !== 'data:' ) {
+
+ if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;
+
+ }
+
+ scope.manager.itemStart( url );
+
+ image.src = url;
+
+ return image;
+
+ }
+
+}
+
+class CubeTextureLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( urls, onLoad, onProgress, onError ) {
+
+ const texture = new CubeTexture();
+
+ const loader = new ImageLoader( this.manager );
+ loader.setCrossOrigin( this.crossOrigin );
+ loader.setPath( this.path );
+
+ let loaded = 0;
+
+ function loadTexture( i ) {
+
+ loader.load( urls[ i ], function ( image ) {
+
+ texture.images[ i ] = image;
+
+ loaded ++;
+
+ if ( loaded === 6 ) {
+
+ texture.needsUpdate = true;
+
+ if ( onLoad ) onLoad( texture );
+
+ }
+
+ }, undefined, onError );
+
+ }
+
+ for ( let i = 0; i < urls.length; ++ i ) {
+
+ loadTexture( i );
+
+ }
+
+ return texture;
+
+ }
+
+}
+
+/**
+ * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)
+ *
+ * Sub classes have to implement the parse() method which will be used in load().
+ */
+
+class DataTextureLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const texture = new DataTexture();
+
+ const loader = new FileLoader( this.manager );
+ loader.setResponseType( 'arraybuffer' );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setPath( this.path );
+ loader.setWithCredentials( scope.withCredentials );
+ loader.load( url, function ( buffer ) {
+
+ const texData = scope.parse( buffer );
+
+ if ( ! texData ) return;
+
+ if ( texData.image !== undefined ) {
+
+ texture.image = texData.image;
+
+ } else if ( texData.data !== undefined ) {
+
+ texture.image.width = texData.width;
+ texture.image.height = texData.height;
+ texture.image.data = texData.data;
+
+ }
+
+ texture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;
+ texture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;
+
+ texture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;
+ texture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;
+
+ texture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;
+
+ if ( texData.encoding !== undefined ) {
+
+ texture.encoding = texData.encoding;
+
+ }
+
+ if ( texData.flipY !== undefined ) {
+
+ texture.flipY = texData.flipY;
+
+ }
+
+ if ( texData.format !== undefined ) {
+
+ texture.format = texData.format;
+
+ }
+
+ if ( texData.type !== undefined ) {
+
+ texture.type = texData.type;
+
+ }
+
+ if ( texData.mipmaps !== undefined ) {
+
+ texture.mipmaps = texData.mipmaps;
+ texture.minFilter = LinearMipmapLinearFilter; // presumably...
+
+ }
+
+ if ( texData.mipmapCount === 1 ) {
+
+ texture.minFilter = LinearFilter;
+
+ }
+
+ if ( texData.generateMipmaps !== undefined ) {
+
+ texture.generateMipmaps = texData.generateMipmaps;
+
+ }
+
+ texture.needsUpdate = true;
+
+ if ( onLoad ) onLoad( texture, texData );
+
+ }, onProgress, onError );
+
+
+ return texture;
+
+ }
+
+}
+
+class TextureLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const texture = new Texture();
+
+ const loader = new ImageLoader( this.manager );
+ loader.setCrossOrigin( this.crossOrigin );
+ loader.setPath( this.path );
+
+ loader.load( url, function ( image ) {
+
+ texture.image = image;
+ texture.needsUpdate = true;
+
+ if ( onLoad !== undefined ) {
+
+ onLoad( texture );
+
+ }
+
+ }, onProgress, onError );
+
+ return texture;
+
+ }
+
+}
+
+class Light extends Object3D {
+
+ constructor( color, intensity = 1 ) {
+
+ super();
+
+ this.type = 'Light';
+
+ this.color = new Color( color );
+ this.intensity = intensity;
+
+ }
+
+ dispose() {
+
+ // Empty here in base class; some subclasses override.
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.color.copy( source.color );
+ this.intensity = source.intensity;
+
+ return this;
+
+ }
+
+ toJSON( meta ) {
+
+ const data = super.toJSON( meta );
+
+ data.object.color = this.color.getHex();
+ data.object.intensity = this.intensity;
+
+ if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();
+
+ if ( this.distance !== undefined ) data.object.distance = this.distance;
+ if ( this.angle !== undefined ) data.object.angle = this.angle;
+ if ( this.decay !== undefined ) data.object.decay = this.decay;
+ if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;
+
+ if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();
+
+ return data;
+
+ }
+
+}
+
+Light.prototype.isLight = true;
+
+class HemisphereLight extends Light {
+
+ constructor( skyColor, groundColor, intensity ) {
+
+ super( skyColor, intensity );
+
+ this.type = 'HemisphereLight';
+
+ this.position.copy( Object3D.DefaultUp );
+ this.updateMatrix();
+
+ this.groundColor = new Color( groundColor );
+
+ }
+
+ copy( source ) {
+
+ Light.prototype.copy.call( this, source );
+
+ this.groundColor.copy( source.groundColor );
+
+ return this;
+
+ }
+
+}
+
+HemisphereLight.prototype.isHemisphereLight = true;
+
+const _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();
+const _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();
+const _lookTarget$1 = /*@__PURE__*/ new Vector3();
+
+class LightShadow {
+
+ constructor( camera ) {
+
+ this.camera = camera;
+
+ this.bias = 0;
+ this.normalBias = 0;
+ this.radius = 1;
+ this.blurSamples = 8;
+
+ this.mapSize = new Vector2( 512, 512 );
+
+ this.map = null;
+ this.mapPass = null;
+ this.matrix = new Matrix4();
+
+ this.autoUpdate = true;
+ this.needsUpdate = false;
+
+ this._frustum = new Frustum();
+ this._frameExtents = new Vector2( 1, 1 );
+
+ this._viewportCount = 1;
+
+ this._viewports = [
+
+ new Vector4$1( 0, 0, 1, 1 )
+
+ ];
+
+ }
+
+ getViewportCount() {
+
+ return this._viewportCount;
+
+ }
+
+ getFrustum() {
+
+ return this._frustum;
+
+ }
+
+ updateMatrices( light ) {
+
+ const shadowCamera = this.camera;
+ const shadowMatrix = this.matrix;
+
+ _lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );
+ shadowCamera.position.copy( _lightPositionWorld$1 );
+
+ _lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );
+ shadowCamera.lookAt( _lookTarget$1 );
+ shadowCamera.updateMatrixWorld();
+
+ _projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
+ this._frustum.setFromProjectionMatrix( _projScreenMatrix$1 );
+
+ shadowMatrix.set(
+ 0.5, 0.0, 0.0, 0.5,
+ 0.0, 0.5, 0.0, 0.5,
+ 0.0, 0.0, 0.5, 0.5,
+ 0.0, 0.0, 0.0, 1.0
+ );
+
+ shadowMatrix.multiply( shadowCamera.projectionMatrix );
+ shadowMatrix.multiply( shadowCamera.matrixWorldInverse );
+
+ }
+
+ getViewport( viewportIndex ) {
+
+ return this._viewports[ viewportIndex ];
+
+ }
+
+ getFrameExtents() {
+
+ return this._frameExtents;
+
+ }
+
+ dispose() {
+
+ if ( this.map ) {
+
+ this.map.dispose();
+
+ }
+
+ if ( this.mapPass ) {
+
+ this.mapPass.dispose();
+
+ }
+
+ }
+
+ copy( source ) {
+
+ this.camera = source.camera.clone();
+
+ this.bias = source.bias;
+ this.radius = source.radius;
+
+ this.mapSize.copy( source.mapSize );
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ toJSON() {
+
+ const object = {};
+
+ if ( this.bias !== 0 ) object.bias = this.bias;
+ if ( this.normalBias !== 0 ) object.normalBias = this.normalBias;
+ if ( this.radius !== 1 ) object.radius = this.radius;
+ if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();
+
+ object.camera = this.camera.toJSON( false ).object;
+ delete object.camera.matrix;
+
+ return object;
+
+ }
+
+}
+
+class SpotLightShadow extends LightShadow {
+
+ constructor() {
+
+ super( new PerspectiveCamera( 50, 1, 0.5, 500 ) );
+
+ this.focus = 1;
+
+ }
+
+ updateMatrices( light ) {
+
+ const camera = this.camera;
+
+ const fov = RAD2DEG * 2 * light.angle * this.focus;
+ const aspect = this.mapSize.width / this.mapSize.height;
+ const far = light.distance || camera.far;
+
+ if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {
+
+ camera.fov = fov;
+ camera.aspect = aspect;
+ camera.far = far;
+ camera.updateProjectionMatrix();
+
+ }
+
+ super.updateMatrices( light );
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.focus = source.focus;
+
+ return this;
+
+ }
+
+}
+
+SpotLightShadow.prototype.isSpotLightShadow = true;
+
+class SpotLight extends Light {
+
+ constructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 1 ) {
+
+ super( color, intensity );
+
+ this.type = 'SpotLight';
+
+ this.position.copy( Object3D.DefaultUp );
+ this.updateMatrix();
+
+ this.target = new Object3D();
+
+ this.distance = distance;
+ this.angle = angle;
+ this.penumbra = penumbra;
+ this.decay = decay; // for physically correct lights, should be 2.
+
+ this.shadow = new SpotLightShadow();
+
+ }
+
+ get power() {
+
+ // compute the light's luminous power (in lumens) from its intensity (in candela)
+ // by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)
+ return this.intensity * Math.PI;
+
+ }
+
+ set power( power ) {
+
+ // set the light's intensity (in candela) from the desired luminous power (in lumens)
+ this.intensity = power / Math.PI;
+
+ }
+
+ dispose() {
+
+ this.shadow.dispose();
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.distance = source.distance;
+ this.angle = source.angle;
+ this.penumbra = source.penumbra;
+ this.decay = source.decay;
+
+ this.target = source.target.clone();
+
+ this.shadow = source.shadow.clone();
+
+ return this;
+
+ }
+
+}
+
+SpotLight.prototype.isSpotLight = true;
+
+const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
+const _lightPositionWorld = /*@__PURE__*/ new Vector3();
+const _lookTarget = /*@__PURE__*/ new Vector3();
+
+class PointLightShadow extends LightShadow {
+
+ constructor() {
+
+ super( new PerspectiveCamera( 90, 1, 0.5, 500 ) );
+
+ this._frameExtents = new Vector2( 4, 2 );
+
+ this._viewportCount = 6;
+
+ this._viewports = [
+ // These viewports map a cube-map onto a 2D texture with the
+ // following orientation:
+ //
+ // xzXZ
+ // y Y
+ //
+ // X - Positive x direction
+ // x - Negative x direction
+ // Y - Positive y direction
+ // y - Negative y direction
+ // Z - Positive z direction
+ // z - Negative z direction
+
+ // positive X
+ new Vector4$1( 2, 1, 1, 1 ),
+ // negative X
+ new Vector4$1( 0, 1, 1, 1 ),
+ // positive Z
+ new Vector4$1( 3, 1, 1, 1 ),
+ // negative Z
+ new Vector4$1( 1, 1, 1, 1 ),
+ // positive Y
+ new Vector4$1( 3, 0, 1, 1 ),
+ // negative Y
+ new Vector4$1( 1, 0, 1, 1 )
+ ];
+
+ this._cubeDirections = [
+ new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),
+ new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )
+ ];
+
+ this._cubeUps = [
+ new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),
+ new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 )
+ ];
+
+ }
+
+ updateMatrices( light, viewportIndex = 0 ) {
+
+ const camera = this.camera;
+ const shadowMatrix = this.matrix;
+
+ const far = light.distance || camera.far;
+
+ if ( far !== camera.far ) {
+
+ camera.far = far;
+ camera.updateProjectionMatrix();
+
+ }
+
+ _lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
+ camera.position.copy( _lightPositionWorld );
+
+ _lookTarget.copy( camera.position );
+ _lookTarget.add( this._cubeDirections[ viewportIndex ] );
+ camera.up.copy( this._cubeUps[ viewportIndex ] );
+ camera.lookAt( _lookTarget );
+ camera.updateMatrixWorld();
+
+ shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );
+
+ _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
+ this._frustum.setFromProjectionMatrix( _projScreenMatrix );
+
+ }
+
+}
+
+PointLightShadow.prototype.isPointLightShadow = true;
+
+class PointLight extends Light {
+
+ constructor( color, intensity, distance = 0, decay = 1 ) {
+
+ super( color, intensity );
+
+ this.type = 'PointLight';
+
+ this.distance = distance;
+ this.decay = decay; // for physically correct lights, should be 2.
+
+ this.shadow = new PointLightShadow();
+
+ }
+
+ get power() {
+
+ // compute the light's luminous power (in lumens) from its intensity (in candela)
+ // for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)
+ return this.intensity * 4 * Math.PI;
+
+ }
+
+ set power( power ) {
+
+ // set the light's intensity (in candela) from the desired luminous power (in lumens)
+ this.intensity = power / ( 4 * Math.PI );
+
+ }
+
+ dispose() {
+
+ this.shadow.dispose();
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.distance = source.distance;
+ this.decay = source.decay;
+
+ this.shadow = source.shadow.clone();
+
+ return this;
+
+ }
+
+}
+
+PointLight.prototype.isPointLight = true;
+
+class DirectionalLightShadow extends LightShadow {
+
+ constructor() {
+
+ super( new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );
+
+ }
+
+}
+
+DirectionalLightShadow.prototype.isDirectionalLightShadow = true;
+
+class DirectionalLight extends Light {
+
+ constructor( color, intensity ) {
+
+ super( color, intensity );
+
+ this.type = 'DirectionalLight';
+
+ this.position.copy( Object3D.DefaultUp );
+ this.updateMatrix();
+
+ this.target = new Object3D();
+
+ this.shadow = new DirectionalLightShadow();
+
+ }
+
+ dispose() {
+
+ this.shadow.dispose();
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.target = source.target.clone();
+ this.shadow = source.shadow.clone();
+
+ return this;
+
+ }
+
+}
+
+DirectionalLight.prototype.isDirectionalLight = true;
+
+class AmbientLight extends Light {
+
+ constructor( color, intensity ) {
+
+ super( color, intensity );
+
+ this.type = 'AmbientLight';
+
+ }
+
+}
+
+AmbientLight.prototype.isAmbientLight = true;
+
+class RectAreaLight extends Light {
+
+ constructor( color, intensity, width = 10, height = 10 ) {
+
+ super( color, intensity );
+
+ this.type = 'RectAreaLight';
+
+ this.width = width;
+ this.height = height;
+
+ }
+
+ get power() {
+
+ // compute the light's luminous power (in lumens) from its intensity (in nits)
+ return this.intensity * this.width * this.height * Math.PI;
+
+ }
+
+ set power( power ) {
+
+ // set the light's intensity (in nits) from the desired luminous power (in lumens)
+ this.intensity = power / ( this.width * this.height * Math.PI );
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.width = source.width;
+ this.height = source.height;
+
+ return this;
+
+ }
+
+ toJSON( meta ) {
+
+ const data = super.toJSON( meta );
+
+ data.object.width = this.width;
+ data.object.height = this.height;
+
+ return data;
+
+ }
+
+}
+
+RectAreaLight.prototype.isRectAreaLight = true;
+
+/**
+ * Primary reference:
+ * https://graphics.stanford.edu/papers/envmap/envmap.pdf
+ *
+ * Secondary reference:
+ * https://www.ppsloan.org/publications/StupidSH36.pdf
+ */
+
+// 3-band SH defined by 9 coefficients
+
+class SphericalHarmonics3 {
+
+ constructor() {
+
+ this.coefficients = [];
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients.push( new Vector3() );
+
+ }
+
+ }
+
+ set( coefficients ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].copy( coefficients[ i ] );
+
+ }
+
+ return this;
+
+ }
+
+ zero() {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].set( 0, 0, 0 );
+
+ }
+
+ return this;
+
+ }
+
+ // get the radiance in the direction of the normal
+ // target is a Vector3
+ getAt( normal, target ) {
+
+ // normal is assumed to be unit length
+
+ const x = normal.x, y = normal.y, z = normal.z;
+
+ const coeff = this.coefficients;
+
+ // band 0
+ target.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );
+
+ // band 1
+ target.addScaledVector( coeff[ 1 ], 0.488603 * y );
+ target.addScaledVector( coeff[ 2 ], 0.488603 * z );
+ target.addScaledVector( coeff[ 3 ], 0.488603 * x );
+
+ // band 2
+ target.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );
+ target.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );
+ target.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );
+ target.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );
+ target.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );
+
+ return target;
+
+ }
+
+ // get the irradiance (radiance convolved with cosine lobe) in the direction of the normal
+ // target is a Vector3
+ // https://graphics.stanford.edu/papers/envmap/envmap.pdf
+ getIrradianceAt( normal, target ) {
+
+ // normal is assumed to be unit length
+
+ const x = normal.x, y = normal.y, z = normal.z;
+
+ const coeff = this.coefficients;
+
+ // band 0
+ target.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095
+
+ // band 1
+ target.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603
+ target.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );
+ target.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );
+
+ // band 2
+ target.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548
+ target.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );
+ target.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3
+ target.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );
+ target.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274
+
+ return target;
+
+ }
+
+ add( sh ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].add( sh.coefficients[ i ] );
+
+ }
+
+ return this;
+
+ }
+
+ addScaledSH( sh, s ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );
+
+ }
+
+ return this;
+
+ }
+
+ scale( s ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].multiplyScalar( s );
+
+ }
+
+ return this;
+
+ }
+
+ lerp( sh, alpha ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );
+
+ }
+
+ return this;
+
+ }
+
+ equals( sh ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ if ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {
+
+ return false;
+
+ }
+
+ }
+
+ return true;
+
+ }
+
+ copy( sh ) {
+
+ return this.set( sh.coefficients );
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ fromArray( array, offset = 0 ) {
+
+ const coefficients = this.coefficients;
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ coefficients[ i ].fromArray( array, offset + ( i * 3 ) );
+
+ }
+
+ return this;
+
+ }
+
+ toArray( array = [], offset = 0 ) {
+
+ const coefficients = this.coefficients;
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ coefficients[ i ].toArray( array, offset + ( i * 3 ) );
+
+ }
+
+ return array;
+
+ }
+
+ // evaluate the basis functions
+ // shBasis is an Array[ 9 ]
+ static getBasisAt( normal, shBasis ) {
+
+ // normal is assumed to be unit length
+
+ const x = normal.x, y = normal.y, z = normal.z;
+
+ // band 0
+ shBasis[ 0 ] = 0.282095;
+
+ // band 1
+ shBasis[ 1 ] = 0.488603 * y;
+ shBasis[ 2 ] = 0.488603 * z;
+ shBasis[ 3 ] = 0.488603 * x;
+
+ // band 2
+ shBasis[ 4 ] = 1.092548 * x * y;
+ shBasis[ 5 ] = 1.092548 * y * z;
+ shBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );
+ shBasis[ 7 ] = 1.092548 * x * z;
+ shBasis[ 8 ] = 0.546274 * ( x * x - y * y );
+
+ }
+
+}
+
+SphericalHarmonics3.prototype.isSphericalHarmonics3 = true;
+
+class LightProbe extends Light {
+
+ constructor( sh = new SphericalHarmonics3(), intensity = 1 ) {
+
+ super( undefined, intensity );
+
+ this.sh = sh;
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.sh.copy( source.sh );
+
+ return this;
+
+ }
+
+ fromJSON( json ) {
+
+ this.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();
+ this.sh.fromArray( json.sh );
+
+ return this;
+
+ }
+
+ toJSON( meta ) {
+
+ const data = super.toJSON( meta );
+
+ data.object.sh = this.sh.toArray();
+
+ return data;
+
+ }
+
+}
+
+LightProbe.prototype.isLightProbe = true;
+
+class MaterialLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+ this.textures = {};
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const loader = new FileLoader( scope.manager );
+ loader.setPath( scope.path );
+ loader.setRequestHeader( scope.requestHeader );
+ loader.setWithCredentials( scope.withCredentials );
+ loader.load( url, function ( text ) {
+
+ try {
+
+ onLoad( scope.parse( JSON.parse( text ) ) );
+
+ } catch ( e ) {
+
+ if ( onError ) {
+
+ onError( e );
+
+ } else {
+
+ console.error( e );
+
+ }
+
+ scope.manager.itemError( url );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+ parse( json ) {
+
+ const textures = this.textures;
+
+ function getTexture( name ) {
+
+ if ( textures[ name ] === undefined ) {
+
+ console.warn( 'THREE.MaterialLoader: Undefined texture', name );
+
+ }
+
+ return textures[ name ];
+
+ }
+
+ const material = Material.fromType( json.type );
+
+ if ( json.uuid !== undefined ) material.uuid = json.uuid;
+ if ( json.name !== undefined ) material.name = json.name;
+ if ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );
+ if ( json.roughness !== undefined ) material.roughness = json.roughness;
+ if ( json.metalness !== undefined ) material.metalness = json.metalness;
+ if ( json.sheen !== undefined ) material.sheen = json.sheen;
+ if ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );
+ if ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;
+ if ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );
+ if ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );
+ if ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;
+ if ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );
+ if ( json.shininess !== undefined ) material.shininess = json.shininess;
+ if ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;
+ if ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;
+ if ( json.transmission !== undefined ) material.transmission = json.transmission;
+ if ( json.thickness !== undefined ) material.thickness = json.thickness;
+ if ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;
+ if ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );
+ if ( json.fog !== undefined ) material.fog = json.fog;
+ if ( json.flatShading !== undefined ) material.flatShading = json.flatShading;
+ if ( json.blending !== undefined ) material.blending = json.blending;
+ if ( json.combine !== undefined ) material.combine = json.combine;
+ if ( json.side !== undefined ) material.side = json.side;
+ if ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;
+ if ( json.opacity !== undefined ) material.opacity = json.opacity;
+ if ( json.transparent !== undefined ) material.transparent = json.transparent;
+ if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;
+ if ( json.depthTest !== undefined ) material.depthTest = json.depthTest;
+ if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;
+ if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;
+
+ if ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;
+ if ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;
+ if ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;
+ if ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;
+ if ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;
+ if ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;
+ if ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;
+ if ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;
+
+ if ( json.wireframe !== undefined ) material.wireframe = json.wireframe;
+ if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;
+ if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;
+ if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;
+
+ if ( json.rotation !== undefined ) material.rotation = json.rotation;
+
+ if ( json.linewidth !== 1 ) material.linewidth = json.linewidth;
+ if ( json.dashSize !== undefined ) material.dashSize = json.dashSize;
+ if ( json.gapSize !== undefined ) material.gapSize = json.gapSize;
+ if ( json.scale !== undefined ) material.scale = json.scale;
+
+ if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;
+ if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;
+ if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;
+
+ if ( json.dithering !== undefined ) material.dithering = json.dithering;
+
+ if ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;
+ if ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;
+
+ if ( json.visible !== undefined ) material.visible = json.visible;
+
+ if ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;
+
+ if ( json.userData !== undefined ) material.userData = json.userData;
+
+ if ( json.vertexColors !== undefined ) {
+
+ if ( typeof json.vertexColors === 'number' ) {
+
+ material.vertexColors = ( json.vertexColors > 0 ) ? true : false;
+
+ } else {
+
+ material.vertexColors = json.vertexColors;
+
+ }
+
+ }
+
+ // Shader Material
+
+ if ( json.uniforms !== undefined ) {
+
+ for ( const name in json.uniforms ) {
+
+ const uniform = json.uniforms[ name ];
+
+ material.uniforms[ name ] = {};
+
+ switch ( uniform.type ) {
+
+ case 't':
+ material.uniforms[ name ].value = getTexture( uniform.value );
+ break;
+
+ case 'c':
+ material.uniforms[ name ].value = new Color().setHex( uniform.value );
+ break;
+
+ case 'v2':
+ material.uniforms[ name ].value = new Vector2().fromArray( uniform.value );
+ break;
+
+ case 'v3':
+ material.uniforms[ name ].value = new Vector3().fromArray( uniform.value );
+ break;
+
+ case 'v4':
+ material.uniforms[ name ].value = new Vector4$1().fromArray( uniform.value );
+ break;
+
+ case 'm3':
+ material.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );
+ break;
+
+ case 'm4':
+ material.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );
+ break;
+
+ default:
+ material.uniforms[ name ].value = uniform.value;
+
+ }
+
+ }
+
+ }
+
+ if ( json.defines !== undefined ) material.defines = json.defines;
+ if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;
+ if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;
+
+ if ( json.extensions !== undefined ) {
+
+ for ( const key in json.extensions ) {
+
+ material.extensions[ key ] = json.extensions[ key ];
+
+ }
+
+ }
+
+ // Deprecated
+
+ if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading
+
+ // for PointsMaterial
+
+ if ( json.size !== undefined ) material.size = json.size;
+ if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;
+
+ // maps
+
+ if ( json.map !== undefined ) material.map = getTexture( json.map );
+ if ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );
+
+ if ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );
+
+ if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );
+ if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;
+
+ if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );
+ if ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;
+ if ( json.normalScale !== undefined ) {
+
+ let normalScale = json.normalScale;
+
+ if ( Array.isArray( normalScale ) === false ) {
+
+ // Blender exporter used to export a scalar. See #7459
+
+ normalScale = [ normalScale, normalScale ];
+
+ }
+
+ material.normalScale = new Vector2().fromArray( normalScale );
+
+ }
+
+ if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );
+ if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;
+ if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;
+
+ if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );
+ if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );
+
+ if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );
+ if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;
+
+ if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );
+ if ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );
+ if ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );
+
+ if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );
+ if ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;
+
+ if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;
+ if ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;
+
+ if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );
+ if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;
+
+ if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );
+ if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;
+
+ if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );
+
+ if ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );
+ if ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );
+ if ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );
+ if ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );
+
+ if ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );
+ if ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );
+
+ if ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );
+ if ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );
+
+ return material;
+
+ }
+
+ setTextures( value ) {
+
+ this.textures = value;
+ return this;
+
+ }
+
+}
+
+class LoaderUtils {
+
+ static decodeText( array ) {
+
+ if ( typeof TextDecoder !== 'undefined' ) {
+
+ return new TextDecoder().decode( array );
+
+ }
+
+ // Avoid the String.fromCharCode.apply(null, array) shortcut, which
+ // throws a "maximum call stack size exceeded" error for large arrays.
+
+ let s = '';
+
+ for ( let i = 0, il = array.length; i < il; i ++ ) {
+
+ // Implicitly assumes little-endian.
+ s += String.fromCharCode( array[ i ] );
+
+ }
+
+ try {
+
+ // merges multi-byte utf-8 characters.
+
+ return decodeURIComponent( escape( s ) );
+
+ } catch ( e ) { // see #16358
+
+ return s;
+
+ }
+
+ }
+
+ static extractUrlBase( url ) {
+
+ const index = url.lastIndexOf( '/' );
+
+ if ( index === - 1 ) return './';
+
+ return url.slice( 0, index + 1 );
+
+ }
+
+ static resolveURL( url, path ) {
+
+ // Invalid URL
+ if ( typeof url !== 'string' || url === '' ) return '';
+
+ // Host Relative URL
+ if ( /^https?:\/\//i.test( path ) && /^\//.test( url ) ) {
+
+ path = path.replace( /(^https?:\/\/[^\/]+).*/i, '$1' );
+
+ }
+
+ // Absolute URL http://,https://,//
+ if ( /^(https?:)?\/\//i.test( url ) ) return url;
+
+ // Data URI
+ if ( /^data:.*,.*$/i.test( url ) ) return url;
+
+ // Blob URL
+ if ( /^blob:.*$/i.test( url ) ) return url;
+
+ // Relative URL
+ return path + url;
+
+ }
+
+}
+
+class InstancedBufferGeometry extends BufferGeometry {
+
+ constructor() {
+
+ super();
+
+ this.type = 'InstancedBufferGeometry';
+ this.instanceCount = Infinity;
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.instanceCount = source.instanceCount;
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ toJSON() {
+
+ const data = super.toJSON( this );
+
+ data.instanceCount = this.instanceCount;
+
+ data.isInstancedBufferGeometry = true;
+
+ return data;
+
+ }
+
+}
+
+InstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;
+
+class BufferGeometryLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const loader = new FileLoader( scope.manager );
+ loader.setPath( scope.path );
+ loader.setRequestHeader( scope.requestHeader );
+ loader.setWithCredentials( scope.withCredentials );
+ loader.load( url, function ( text ) {
+
+ try {
+
+ onLoad( scope.parse( JSON.parse( text ) ) );
+
+ } catch ( e ) {
+
+ if ( onError ) {
+
+ onError( e );
+
+ } else {
+
+ console.error( e );
+
+ }
+
+ scope.manager.itemError( url );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+ parse( json ) {
+
+ const interleavedBufferMap = {};
+ const arrayBufferMap = {};
+
+ function getInterleavedBuffer( json, uuid ) {
+
+ if ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];
+
+ const interleavedBuffers = json.interleavedBuffers;
+ const interleavedBuffer = interleavedBuffers[ uuid ];
+
+ const buffer = getArrayBuffer( json, interleavedBuffer.buffer );
+
+ const array = getTypedArray( interleavedBuffer.type, buffer );
+ const ib = new InterleavedBuffer( array, interleavedBuffer.stride );
+ ib.uuid = interleavedBuffer.uuid;
+
+ interleavedBufferMap[ uuid ] = ib;
+
+ return ib;
+
+ }
+
+ function getArrayBuffer( json, uuid ) {
+
+ if ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];
+
+ const arrayBuffers = json.arrayBuffers;
+ const arrayBuffer = arrayBuffers[ uuid ];
+
+ const ab = new Uint32Array( arrayBuffer ).buffer;
+
+ arrayBufferMap[ uuid ] = ab;
+
+ return ab;
+
+ }
+
+ const geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();
+
+ const index = json.data.index;
+
+ if ( index !== undefined ) {
+
+ const typedArray = getTypedArray( index.type, index.array );
+ geometry.setIndex( new BufferAttribute( typedArray, 1 ) );
+
+ }
+
+ const attributes = json.data.attributes;
+
+ for ( const key in attributes ) {
+
+ const attribute = attributes[ key ];
+ let bufferAttribute;
+
+ if ( attribute.isInterleavedBufferAttribute ) {
+
+ const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );
+ bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );
+
+ } else {
+
+ const typedArray = getTypedArray( attribute.type, attribute.array );
+ const bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;
+ bufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );
+
+ }
+
+ if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;
+ if ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );
+
+ if ( attribute.updateRange !== undefined ) {
+
+ bufferAttribute.updateRange.offset = attribute.updateRange.offset;
+ bufferAttribute.updateRange.count = attribute.updateRange.count;
+
+ }
+
+ geometry.setAttribute( key, bufferAttribute );
+
+ }
+
+ const morphAttributes = json.data.morphAttributes;
+
+ if ( morphAttributes ) {
+
+ for ( const key in morphAttributes ) {
+
+ const attributeArray = morphAttributes[ key ];
+
+ const array = [];
+
+ for ( let i = 0, il = attributeArray.length; i < il; i ++ ) {
+
+ const attribute = attributeArray[ i ];
+ let bufferAttribute;
+
+ if ( attribute.isInterleavedBufferAttribute ) {
+
+ const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );
+ bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );
+
+ } else {
+
+ const typedArray = getTypedArray( attribute.type, attribute.array );
+ bufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );
+
+ }
+
+ if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;
+ array.push( bufferAttribute );
+
+ }
+
+ geometry.morphAttributes[ key ] = array;
+
+ }
+
+ }
+
+ const morphTargetsRelative = json.data.morphTargetsRelative;
+
+ if ( morphTargetsRelative ) {
+
+ geometry.morphTargetsRelative = true;
+
+ }
+
+ const groups = json.data.groups || json.data.drawcalls || json.data.offsets;
+
+ if ( groups !== undefined ) {
+
+ for ( let i = 0, n = groups.length; i !== n; ++ i ) {
+
+ const group = groups[ i ];
+
+ geometry.addGroup( group.start, group.count, group.materialIndex );
+
+ }
+
+ }
+
+ const boundingSphere = json.data.boundingSphere;
+
+ if ( boundingSphere !== undefined ) {
+
+ const center = new Vector3();
+
+ if ( boundingSphere.center !== undefined ) {
+
+ center.fromArray( boundingSphere.center );
+
+ }
+
+ geometry.boundingSphere = new Sphere( center, boundingSphere.radius );
+
+ }
+
+ if ( json.name ) geometry.name = json.name;
+ if ( json.userData ) geometry.userData = json.userData;
+
+ return geometry;
+
+ }
+
+}
+
+class ObjectLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;
+ this.resourcePath = this.resourcePath || path;
+
+ const loader = new FileLoader( this.manager );
+ loader.setPath( this.path );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( this.withCredentials );
+ loader.load( url, function ( text ) {
+
+ let json = null;
+
+ try {
+
+ json = JSON.parse( text );
+
+ } catch ( error ) {
+
+ if ( onError !== undefined ) onError( error );
+
+ console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message );
+
+ return;
+
+ }
+
+ const metadata = json.metadata;
+
+ if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {
+
+ console.error( 'THREE.ObjectLoader: Can\'t load ' + url );
+ return;
+
+ }
+
+ scope.parse( json, onLoad );
+
+ }, onProgress, onError );
+
+ }
+
+ async loadAsync( url, onProgress ) {
+
+ const scope = this;
+
+ const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;
+ this.resourcePath = this.resourcePath || path;
+
+ const loader = new FileLoader( this.manager );
+ loader.setPath( this.path );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( this.withCredentials );
+
+ const text = await loader.loadAsync( url, onProgress );
+
+ const json = JSON.parse( text );
+
+ const metadata = json.metadata;
+
+ if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {
+
+ throw new Error( 'THREE.ObjectLoader: Can\'t load ' + url );
+
+ }
+
+ return await scope.parseAsync( json );
+
+ }
+
+ parse( json, onLoad ) {
+
+ const animations = this.parseAnimations( json.animations );
+ const shapes = this.parseShapes( json.shapes );
+ const geometries = this.parseGeometries( json.geometries, shapes );
+
+ const images = this.parseImages( json.images, function () {
+
+ if ( onLoad !== undefined ) onLoad( object );
+
+ } );
+
+ const textures = this.parseTextures( json.textures, images );
+ const materials = this.parseMaterials( json.materials, textures );
+
+ const object = this.parseObject( json.object, geometries, materials, textures, animations );
+ const skeletons = this.parseSkeletons( json.skeletons, object );
+
+ this.bindSkeletons( object, skeletons );
+
+ //
+
+ if ( onLoad !== undefined ) {
+
+ let hasImages = false;
+
+ for ( const uuid in images ) {
+
+ if ( images[ uuid ] instanceof HTMLImageElement ) {
+
+ hasImages = true;
+ break;
+
+ }
+
+ }
+
+ if ( hasImages === false ) onLoad( object );
+
+ }
+
+ return object;
+
+ }
+
+ async parseAsync( json ) {
+
+ const animations = this.parseAnimations( json.animations );
+ const shapes = this.parseShapes( json.shapes );
+ const geometries = this.parseGeometries( json.geometries, shapes );
+
+ const images = await this.parseImagesAsync( json.images );
+
+ const textures = this.parseTextures( json.textures, images );
+ const materials = this.parseMaterials( json.materials, textures );
+
+ const object = this.parseObject( json.object, geometries, materials, textures, animations );
+ const skeletons = this.parseSkeletons( json.skeletons, object );
+
+ this.bindSkeletons( object, skeletons );
+
+ return object;
+
+ }
+
+ parseShapes( json ) {
+
+ const shapes = {};
+
+ if ( json !== undefined ) {
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ const shape = new Shape().fromJSON( json[ i ] );
+
+ shapes[ shape.uuid ] = shape;
+
+ }
+
+ }
+
+ return shapes;
+
+ }
+
+ parseSkeletons( json, object ) {
+
+ const skeletons = {};
+ const bones = {};
+
+ // generate bone lookup table
+
+ object.traverse( function ( child ) {
+
+ if ( child.isBone ) bones[ child.uuid ] = child;
+
+ } );
+
+ // create skeletons
+
+ if ( json !== undefined ) {
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ const skeleton = new Skeleton().fromJSON( json[ i ], bones );
+
+ skeletons[ skeleton.uuid ] = skeleton;
+
+ }
+
+ }
+
+ return skeletons;
+
+ }
+
+ parseGeometries( json, shapes ) {
+
+ const geometries = {};
+
+ if ( json !== undefined ) {
+
+ const bufferGeometryLoader = new BufferGeometryLoader();
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ let geometry;
+ const data = json[ i ];
+
+ switch ( data.type ) {
+
+ case 'BufferGeometry':
+ case 'InstancedBufferGeometry':
+
+ geometry = bufferGeometryLoader.parse( data );
+
+ break;
+
+ case 'Geometry':
+
+ console.error( 'THREE.ObjectLoader: The legacy Geometry type is no longer supported.' );
+
+ break;
+
+ default:
+
+ if ( data.type in Geometries ) {
+
+ geometry = Geometries[ data.type ].fromJSON( data, shapes );
+
+ } else {
+
+ console.warn( `THREE.ObjectLoader: Unsupported geometry type "${ data.type }"` );
+
+ }
+
+ }
+
+ geometry.uuid = data.uuid;
+
+ if ( data.name !== undefined ) geometry.name = data.name;
+ if ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData;
+
+ geometries[ data.uuid ] = geometry;
+
+ }
+
+ }
+
+ return geometries;
+
+ }
+
+ parseMaterials( json, textures ) {
+
+ const cache = {}; // MultiMaterial
+ const materials = {};
+
+ if ( json !== undefined ) {
+
+ const loader = new MaterialLoader();
+ loader.setTextures( textures );
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ const data = json[ i ];
+
+ if ( data.type === 'MultiMaterial' ) {
+
+ // Deprecated
+
+ const array = [];
+
+ for ( let j = 0; j < data.materials.length; j ++ ) {
+
+ const material = data.materials[ j ];
+
+ if ( cache[ material.uuid ] === undefined ) {
+
+ cache[ material.uuid ] = loader.parse( material );
+
+ }
+
+ array.push( cache[ material.uuid ] );
+
+ }
+
+ materials[ data.uuid ] = array;
+
+ } else {
+
+ if ( cache[ data.uuid ] === undefined ) {
+
+ cache[ data.uuid ] = loader.parse( data );
+
+ }
+
+ materials[ data.uuid ] = cache[ data.uuid ];
+
+ }
+
+ }
+
+ }
+
+ return materials;
+
+ }
+
+ parseAnimations( json ) {
+
+ const animations = {};
+
+ if ( json !== undefined ) {
+
+ for ( let i = 0; i < json.length; i ++ ) {
+
+ const data = json[ i ];
+
+ const clip = AnimationClip.parse( data );
+
+ animations[ clip.uuid ] = clip;
+
+ }
+
+ }
+
+ return animations;
+
+ }
+
+ parseImages( json, onLoad ) {
+
+ const scope = this;
+ const images = {};
+
+ let loader;
+
+ function loadImage( url ) {
+
+ scope.manager.itemStart( url );
+
+ return loader.load( url, function () {
+
+ scope.manager.itemEnd( url );
+
+ }, undefined, function () {
+
+ scope.manager.itemError( url );
+ scope.manager.itemEnd( url );
+
+ } );
+
+ }
+
+ function deserializeImage( image ) {
+
+ if ( typeof image === 'string' ) {
+
+ const url = image;
+
+ const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url;
+
+ return loadImage( path );
+
+ } else {
+
+ if ( image.data ) {
+
+ return {
+ data: getTypedArray( image.type, image.data ),
+ width: image.width,
+ height: image.height
+ };
+
+ } else {
+
+ return null;
+
+ }
+
+ }
+
+ }
+
+ if ( json !== undefined && json.length > 0 ) {
+
+ const manager = new LoadingManager( onLoad );
+
+ loader = new ImageLoader( manager );
+ loader.setCrossOrigin( this.crossOrigin );
+
+ for ( let i = 0, il = json.length; i < il; i ++ ) {
+
+ const image = json[ i ];
+ const url = image.url;
+
+ if ( Array.isArray( url ) ) {
+
+ // load array of images e.g CubeTexture
+
+ const imageArray = [];
+
+ for ( let j = 0, jl = url.length; j < jl; j ++ ) {
+
+ const currentUrl = url[ j ];
+
+ const deserializedImage = deserializeImage( currentUrl );
+
+ if ( deserializedImage !== null ) {
+
+ if ( deserializedImage instanceof HTMLImageElement ) {
+
+ imageArray.push( deserializedImage );
+
+ } else {
+
+ // special case: handle array of data textures for cube textures
+
+ imageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );
+
+ }
+
+ }
+
+ }
+
+ images[ image.uuid ] = new Source( imageArray );
+
+ } else {
+
+ // load single image
+
+ const deserializedImage = deserializeImage( image.url );
+ images[ image.uuid ] = new Source( deserializedImage );
+
+
+ }
+
+ }
+
+ }
+
+ return images;
+
+ }
+
+ async parseImagesAsync( json ) {
+
+ const scope = this;
+ const images = {};
+
+ let loader;
+
+ async function deserializeImage( image ) {
+
+ if ( typeof image === 'string' ) {
+
+ const url = image;
+
+ const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url;
+
+ return await loader.loadAsync( path );
+
+ } else {
+
+ if ( image.data ) {
+
+ return {
+ data: getTypedArray( image.type, image.data ),
+ width: image.width,
+ height: image.height
+ };
+
+ } else {
+
+ return null;
+
+ }
+
+ }
+
+ }
+
+ if ( json !== undefined && json.length > 0 ) {
+
+ loader = new ImageLoader( this.manager );
+ loader.setCrossOrigin( this.crossOrigin );
+
+ for ( let i = 0, il = json.length; i < il; i ++ ) {
+
+ const image = json[ i ];
+ const url = image.url;
+
+ if ( Array.isArray( url ) ) {
+
+ // load array of images e.g CubeTexture
+
+ const imageArray = [];
+
+ for ( let j = 0, jl = url.length; j < jl; j ++ ) {
+
+ const currentUrl = url[ j ];
+
+ const deserializedImage = await deserializeImage( currentUrl );
+
+ if ( deserializedImage !== null ) {
+
+ if ( deserializedImage instanceof HTMLImageElement ) {
+
+ imageArray.push( deserializedImage );
+
+ } else {
+
+ // special case: handle array of data textures for cube textures
+
+ imageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );
+
+ }
+
+ }
+
+ }
+
+ images[ image.uuid ] = new Source( imageArray );
+
+ } else {
+
+ // load single image
+
+ const deserializedImage = await deserializeImage( image.url );
+ images[ image.uuid ] = new Source( deserializedImage );
+
+ }
+
+ }
+
+ }
+
+ return images;
+
+ }
+
+ parseTextures( json, images ) {
+
+ function parseConstant( value, type ) {
+
+ if ( typeof value === 'number' ) return value;
+
+ console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );
+
+ return type[ value ];
+
+ }
+
+ const textures = {};
+
+ if ( json !== undefined ) {
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ const data = json[ i ];
+
+ if ( data.image === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid );
+
+ }
+
+ if ( images[ data.image ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined image', data.image );
+
+ }
+
+ const source = images[ data.image ];
+ const image = source.data;
+
+ let texture;
+
+ if ( Array.isArray( image ) ) {
+
+ texture = new CubeTexture();
+
+ if ( image.length === 6 ) texture.needsUpdate = true;
+
+ } else {
+
+ if ( image && image.data ) {
+
+ texture = new DataTexture();
+
+ } else {
+
+ texture = new Texture();
+
+ }
+
+ if ( image ) texture.needsUpdate = true; // textures can have undefined image data
+
+ }
+
+ texture.source = source;
+
+ texture.uuid = data.uuid;
+
+ if ( data.name !== undefined ) texture.name = data.name;
+
+ if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );
+
+ if ( data.offset !== undefined ) texture.offset.fromArray( data.offset );
+ if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );
+ if ( data.center !== undefined ) texture.center.fromArray( data.center );
+ if ( data.rotation !== undefined ) texture.rotation = data.rotation;
+
+ if ( data.wrap !== undefined ) {
+
+ texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );
+ texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );
+
+ }
+
+ if ( data.format !== undefined ) texture.format = data.format;
+ if ( data.type !== undefined ) texture.type = data.type;
+ if ( data.encoding !== undefined ) texture.encoding = data.encoding;
+
+ if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );
+ if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );
+ if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;
+
+ if ( data.flipY !== undefined ) texture.flipY = data.flipY;
+
+ if ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;
+ if ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;
+
+ if ( data.userData !== undefined ) texture.userData = data.userData;
+
+ textures[ data.uuid ] = texture;
+
+ }
+
+ }
+
+ return textures;
+
+ }
+
+ parseObject( data, geometries, materials, textures, animations ) {
+
+ let object;
+
+ function getGeometry( name ) {
+
+ if ( geometries[ name ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined geometry', name );
+
+ }
+
+ return geometries[ name ];
+
+ }
+
+ function getMaterial( name ) {
+
+ if ( name === undefined ) return undefined;
+
+ if ( Array.isArray( name ) ) {
+
+ const array = [];
+
+ for ( let i = 0, l = name.length; i < l; i ++ ) {
+
+ const uuid = name[ i ];
+
+ if ( materials[ uuid ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined material', uuid );
+
+ }
+
+ array.push( materials[ uuid ] );
+
+ }
+
+ return array;
+
+ }
+
+ if ( materials[ name ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined material', name );
+
+ }
+
+ return materials[ name ];
+
+ }
+
+ function getTexture( uuid ) {
+
+ if ( textures[ uuid ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined texture', uuid );
+
+ }
+
+ return textures[ uuid ];
+
+ }
+
+ let geometry, material;
+
+ switch ( data.type ) {
+
+ case 'Scene':
+
+ object = new Scene();
+
+ if ( data.background !== undefined ) {
+
+ if ( Number.isInteger( data.background ) ) {
+
+ object.background = new Color( data.background );
+
+ } else {
+
+ object.background = getTexture( data.background );
+
+ }
+
+ }
+
+ if ( data.environment !== undefined ) {
+
+ object.environment = getTexture( data.environment );
+
+ }
+
+ if ( data.fog !== undefined ) {
+
+ if ( data.fog.type === 'Fog' ) {
+
+ object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );
+
+ } else if ( data.fog.type === 'FogExp2' ) {
+
+ object.fog = new FogExp2( data.fog.color, data.fog.density );
+
+ }
+
+ }
+
+ break;
+
+ case 'PerspectiveCamera':
+
+ object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );
+
+ if ( data.focus !== undefined ) object.focus = data.focus;
+ if ( data.zoom !== undefined ) object.zoom = data.zoom;
+ if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;
+ if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;
+ if ( data.view !== undefined ) object.view = Object.assign( {}, data.view );
+
+ break;
+
+ case 'OrthographicCamera':
+
+ object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );
+
+ if ( data.zoom !== undefined ) object.zoom = data.zoom;
+ if ( data.view !== undefined ) object.view = Object.assign( {}, data.view );
+
+ break;
+
+ case 'AmbientLight':
+
+ object = new AmbientLight( data.color, data.intensity );
+
+ break;
+
+ case 'DirectionalLight':
+
+ object = new DirectionalLight( data.color, data.intensity );
+
+ break;
+
+ case 'PointLight':
+
+ object = new PointLight( data.color, data.intensity, data.distance, data.decay );
+
+ break;
+
+ case 'RectAreaLight':
+
+ object = new RectAreaLight( data.color, data.intensity, data.width, data.height );
+
+ break;
+
+ case 'SpotLight':
+
+ object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );
+
+ break;
+
+ case 'HemisphereLight':
+
+ object = new HemisphereLight( data.color, data.groundColor, data.intensity );
+
+ break;
+
+ case 'LightProbe':
+
+ object = new LightProbe().fromJSON( data );
+
+ break;
+
+ case 'SkinnedMesh':
+
+ geometry = getGeometry( data.geometry );
+ material = getMaterial( data.material );
+
+ object = new SkinnedMesh( geometry, material );
+
+ if ( data.bindMode !== undefined ) object.bindMode = data.bindMode;
+ if ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );
+ if ( data.skeleton !== undefined ) object.skeleton = data.skeleton;
+
+ break;
+
+ case 'Mesh':
+
+ geometry = getGeometry( data.geometry );
+ material = getMaterial( data.material );
+
+ object = new Mesh( geometry, material );
+
+ break;
+
+ case 'InstancedMesh':
+
+ geometry = getGeometry( data.geometry );
+ material = getMaterial( data.material );
+ const count = data.count;
+ const instanceMatrix = data.instanceMatrix;
+ const instanceColor = data.instanceColor;
+
+ object = new InstancedMesh( geometry, material, count );
+ object.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );
+ if ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );
+
+ break;
+
+ case 'LOD':
+
+ object = new LOD();
+
+ break;
+
+ case 'Line':
+
+ object = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );
+
+ break;
+
+ case 'LineLoop':
+
+ object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );
+
+ break;
+
+ case 'LineSegments':
+
+ object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );
+
+ break;
+
+ case 'PointCloud':
+ case 'Points':
+
+ object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );
+
+ break;
+
+ case 'Sprite':
+
+ object = new Sprite( getMaterial( data.material ) );
+
+ break;
+
+ case 'Group':
+
+ object = new Group();
+
+ break;
+
+ case 'Bone':
+
+ object = new Bone();
+
+ break;
+
+ default:
+
+ object = new Object3D();
+
+ }
+
+ object.uuid = data.uuid;
+
+ if ( data.name !== undefined ) object.name = data.name;
+
+ if ( data.matrix !== undefined ) {
+
+ object.matrix.fromArray( data.matrix );
+
+ if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;
+ if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );
+
+ } else {
+
+ if ( data.position !== undefined ) object.position.fromArray( data.position );
+ if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );
+ if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );
+ if ( data.scale !== undefined ) object.scale.fromArray( data.scale );
+
+ }
+
+ if ( data.castShadow !== undefined ) object.castShadow = data.castShadow;
+ if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;
+
+ if ( data.shadow ) {
+
+ if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;
+ if ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;
+ if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;
+ if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );
+ if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );
+
+ }
+
+ if ( data.visible !== undefined ) object.visible = data.visible;
+ if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;
+ if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;
+ if ( data.userData !== undefined ) object.userData = data.userData;
+ if ( data.layers !== undefined ) object.layers.mask = data.layers;
+
+ if ( data.children !== undefined ) {
+
+ const children = data.children;
+
+ for ( let i = 0; i < children.length; i ++ ) {
+
+ object.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );
+
+ }
+
+ }
+
+ if ( data.animations !== undefined ) {
+
+ const objectAnimations = data.animations;
+
+ for ( let i = 0; i < objectAnimations.length; i ++ ) {
+
+ const uuid = objectAnimations[ i ];
+
+ object.animations.push( animations[ uuid ] );
+
+ }
+
+ }
+
+ if ( data.type === 'LOD' ) {
+
+ if ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;
+
+ const levels = data.levels;
+
+ for ( let l = 0; l < levels.length; l ++ ) {
+
+ const level = levels[ l ];
+ const child = object.getObjectByProperty( 'uuid', level.object );
+
+ if ( child !== undefined ) {
+
+ object.addLevel( child, level.distance );
+
+ }
+
+ }
+
+ }
+
+ return object;
+
+ }
+
+ bindSkeletons( object, skeletons ) {
+
+ if ( Object.keys( skeletons ).length === 0 ) return;
+
+ object.traverse( function ( child ) {
+
+ if ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {
+
+ const skeleton = skeletons[ child.skeleton ];
+
+ if ( skeleton === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton );
+
+ } else {
+
+ child.bind( skeleton, child.bindMatrix );
+
+ }
+
+ }
+
+ } );
+
+ }
+
+ /* DEPRECATED */
+
+ setTexturePath( value ) {
+
+ console.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' );
+ return this.setResourcePath( value );
+
+ }
+
+}
+
+const TEXTURE_MAPPING = {
+ UVMapping: UVMapping,
+ CubeReflectionMapping: CubeReflectionMapping,
+ CubeRefractionMapping: CubeRefractionMapping,
+ EquirectangularReflectionMapping: EquirectangularReflectionMapping,
+ EquirectangularRefractionMapping: EquirectangularRefractionMapping,
+ CubeUVReflectionMapping: CubeUVReflectionMapping,
+ CubeUVRefractionMapping: CubeUVRefractionMapping
+};
+
+const TEXTURE_WRAPPING = {
+ RepeatWrapping: RepeatWrapping,
+ ClampToEdgeWrapping: ClampToEdgeWrapping,
+ MirroredRepeatWrapping: MirroredRepeatWrapping
+};
+
+const TEXTURE_FILTER = {
+ NearestFilter: NearestFilter,
+ NearestMipmapNearestFilter: NearestMipmapNearestFilter,
+ NearestMipmapLinearFilter: NearestMipmapLinearFilter,
+ LinearFilter: LinearFilter,
+ LinearMipmapNearestFilter: LinearMipmapNearestFilter,
+ LinearMipmapLinearFilter: LinearMipmapLinearFilter
+};
+
+class ImageBitmapLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ if ( typeof createImageBitmap === 'undefined' ) {
+
+ console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );
+
+ }
+
+ if ( typeof fetch === 'undefined' ) {
+
+ console.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );
+
+ }
+
+ this.options = { premultiplyAlpha: 'none' };
+
+ }
+
+ setOptions( options ) {
+
+ this.options = options;
+
+ return this;
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ if ( url === undefined ) url = '';
+
+ if ( this.path !== undefined ) url = this.path + url;
+
+ url = this.manager.resolveURL( url );
+
+ const scope = this;
+
+ const cached = Cache.get( url );
+
+ if ( cached !== undefined ) {
+
+ scope.manager.itemStart( url );
+
+ setTimeout( function () {
+
+ if ( onLoad ) onLoad( cached );
+
+ scope.manager.itemEnd( url );
+
+ }, 0 );
+
+ return cached;
+
+ }
+
+ const fetchOptions = {};
+ fetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';
+ fetchOptions.headers = this.requestHeader;
+
+ fetch( url, fetchOptions ).then( function ( res ) {
+
+ return res.blob();
+
+ } ).then( function ( blob ) {
+
+ return createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );
+
+ } ).then( function ( imageBitmap ) {
+
+ Cache.add( url, imageBitmap );
+
+ if ( onLoad ) onLoad( imageBitmap );
+
+ scope.manager.itemEnd( url );
+
+ } ).catch( function ( e ) {
+
+ if ( onError ) onError( e );
+
+ scope.manager.itemError( url );
+ scope.manager.itemEnd( url );
+
+ } );
+
+ scope.manager.itemStart( url );
+
+ }
+
+}
+
+ImageBitmapLoader.prototype.isImageBitmapLoader = true;
+
+let _context;
+
+const AudioContext = {
+
+ getContext: function () {
+
+ if ( _context === undefined ) {
+
+ _context = new ( window.AudioContext || window.webkitAudioContext )();
+
+ }
+
+ return _context;
+
+ },
+
+ setContext: function ( value ) {
+
+ _context = value;
+
+ }
+
+};
+
+class AudioLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const loader = new FileLoader( this.manager );
+ loader.setResponseType( 'arraybuffer' );
+ loader.setPath( this.path );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( this.withCredentials );
+ loader.load( url, function ( buffer ) {
+
+ try {
+
+ // Create a copy of the buffer. The `decodeAudioData` method
+ // detaches the buffer when complete, preventing reuse.
+ const bufferCopy = buffer.slice( 0 );
+
+ const context = AudioContext.getContext();
+ context.decodeAudioData( bufferCopy, function ( audioBuffer ) {
+
+ onLoad( audioBuffer );
+
+ } );
+
+ } catch ( e ) {
+
+ if ( onError ) {
+
+ onError( e );
+
+ } else {
+
+ console.error( e );
+
+ }
+
+ scope.manager.itemError( url );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+}
+
+class HemisphereLightProbe extends LightProbe {
+
+ constructor( skyColor, groundColor, intensity = 1 ) {
+
+ super( undefined, intensity );
+
+ const color1 = new Color().set( skyColor );
+ const color2 = new Color().set( groundColor );
+
+ const sky = new Vector3( color1.r, color1.g, color1.b );
+ const ground = new Vector3( color2.r, color2.g, color2.b );
+
+ // without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI );
+ const c0 = Math.sqrt( Math.PI );
+ const c1 = c0 * Math.sqrt( 0.75 );
+
+ this.sh.coefficients[ 0 ].copy( sky ).add( ground ).multiplyScalar( c0 );
+ this.sh.coefficients[ 1 ].copy( sky ).sub( ground ).multiplyScalar( c1 );
+
+ }
+
+}
+
+HemisphereLightProbe.prototype.isHemisphereLightProbe = true;
+
+class AmbientLightProbe extends LightProbe {
+
+ constructor( color, intensity = 1 ) {
+
+ super( undefined, intensity );
+
+ const color1 = new Color().set( color );
+
+ // without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI );
+ this.sh.coefficients[ 0 ].set( color1.r, color1.g, color1.b ).multiplyScalar( 2 * Math.sqrt( Math.PI ) );
+
+ }
+
+}
+
+AmbientLightProbe.prototype.isAmbientLightProbe = true;
+
+const _eyeRight = /*@__PURE__*/ new Matrix4();
+const _eyeLeft = /*@__PURE__*/ new Matrix4();
+const _projectionMatrix = /*@__PURE__*/ new Matrix4();
+
+class StereoCamera {
+
+ constructor() {
+
+ this.type = 'StereoCamera';
+
+ this.aspect = 1;
+
+ this.eyeSep = 0.064;
+
+ this.cameraL = new PerspectiveCamera();
+ this.cameraL.layers.enable( 1 );
+ this.cameraL.matrixAutoUpdate = false;
+
+ this.cameraR = new PerspectiveCamera();
+ this.cameraR.layers.enable( 2 );
+ this.cameraR.matrixAutoUpdate = false;
+
+ this._cache = {
+ focus: null,
+ fov: null,
+ aspect: null,
+ near: null,
+ far: null,
+ zoom: null,
+ eyeSep: null
+ };
+
+ }
+
+ update( camera ) {
+
+ const cache = this._cache;
+
+ const needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||
+ cache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||
+ cache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;
+
+ if ( needsUpdate ) {
+
+ cache.focus = camera.focus;
+ cache.fov = camera.fov;
+ cache.aspect = camera.aspect * this.aspect;
+ cache.near = camera.near;
+ cache.far = camera.far;
+ cache.zoom = camera.zoom;
+ cache.eyeSep = this.eyeSep;
+
+ // Off-axis stereoscopic effect based on
+ // http://paulbourke.net/stereographics/stereorender/
+
+ _projectionMatrix.copy( camera.projectionMatrix );
+ const eyeSepHalf = cache.eyeSep / 2;
+ const eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;
+ const ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;
+ let xmin, xmax;
+
+ // translate xOffset
+
+ _eyeLeft.elements[ 12 ] = - eyeSepHalf;
+ _eyeRight.elements[ 12 ] = eyeSepHalf;
+
+ // for left eye
+
+ xmin = - ymax * cache.aspect + eyeSepOnProjection;
+ xmax = ymax * cache.aspect + eyeSepOnProjection;
+
+ _projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );
+ _projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
+
+ this.cameraL.projectionMatrix.copy( _projectionMatrix );
+
+ // for right eye
+
+ xmin = - ymax * cache.aspect - eyeSepOnProjection;
+ xmax = ymax * cache.aspect - eyeSepOnProjection;
+
+ _projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );
+ _projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
+
+ this.cameraR.projectionMatrix.copy( _projectionMatrix );
+
+ }
+
+ this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );
+ this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );
+
+ }
+
+}
+
+class Clock {
+
+ constructor( autoStart = true ) {
+
+ this.autoStart = autoStart;
+
+ this.startTime = 0;
+ this.oldTime = 0;
+ this.elapsedTime = 0;
+
+ this.running = false;
+
+ }
+
+ start() {
+
+ this.startTime = now();
+
+ this.oldTime = this.startTime;
+ this.elapsedTime = 0;
+ this.running = true;
+
+ }
+
+ stop() {
+
+ this.getElapsedTime();
+ this.running = false;
+ this.autoStart = false;
+
+ }
+
+ getElapsedTime() {
+
+ this.getDelta();
+ return this.elapsedTime;
+
+ }
+
+ getDelta() {
+
+ let diff = 0;
+
+ if ( this.autoStart && ! this.running ) {
+
+ this.start();
+ return 0;
+
+ }
+
+ if ( this.running ) {
+
+ const newTime = now();
+
+ diff = ( newTime - this.oldTime ) / 1000;
+ this.oldTime = newTime;
+
+ this.elapsedTime += diff;
+
+ }
+
+ return diff;
+
+ }
+
+}
+
+function now() {
+
+ return ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732
+
+}
+
+const _position$1 = /*@__PURE__*/ new Vector3();
+const _quaternion$1 = /*@__PURE__*/ new Quaternion();
+const _scale$1 = /*@__PURE__*/ new Vector3();
+const _orientation$1 = /*@__PURE__*/ new Vector3();
+
+class AudioListener extends Object3D {
+
+ constructor() {
+
+ super();
+
+ this.type = 'AudioListener';
+
+ this.context = AudioContext.getContext();
+
+ this.gain = this.context.createGain();
+ this.gain.connect( this.context.destination );
+
+ this.filter = null;
+
+ this.timeDelta = 0;
+
+ // private
+
+ this._clock = new Clock();
+
+ }
+
+ getInput() {
+
+ return this.gain;
+
+ }
+
+ removeFilter() {
+
+ if ( this.filter !== null ) {
+
+ this.gain.disconnect( this.filter );
+ this.filter.disconnect( this.context.destination );
+ this.gain.connect( this.context.destination );
+ this.filter = null;
+
+ }
+
+ return this;
+
+ }
+
+ getFilter() {
+
+ return this.filter;
+
+ }
+
+ setFilter( value ) {
+
+ if ( this.filter !== null ) {
+
+ this.gain.disconnect( this.filter );
+ this.filter.disconnect( this.context.destination );
+
+ } else {
+
+ this.gain.disconnect( this.context.destination );
+
+ }
+
+ this.filter = value;
+ this.gain.connect( this.filter );
+ this.filter.connect( this.context.destination );
+
+ return this;
+
+ }
+
+ getMasterVolume() {
+
+ return this.gain.gain.value;
+
+ }
+
+ setMasterVolume( value ) {
+
+ this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );
+
+ return this;
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ super.updateMatrixWorld( force );
+
+ const listener = this.context.listener;
+ const up = this.up;
+
+ this.timeDelta = this._clock.getDelta();
+
+ this.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );
+
+ _orientation$1.set( 0, 0, - 1 ).applyQuaternion( _quaternion$1 );
+
+ if ( listener.positionX ) {
+
+ // code path for Chrome (see #14393)
+
+ const endTime = this.context.currentTime + this.timeDelta;
+
+ listener.positionX.linearRampToValueAtTime( _position$1.x, endTime );
+ listener.positionY.linearRampToValueAtTime( _position$1.y, endTime );
+ listener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );
+ listener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime );
+ listener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime );
+ listener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime );
+ listener.upX.linearRampToValueAtTime( up.x, endTime );
+ listener.upY.linearRampToValueAtTime( up.y, endTime );
+ listener.upZ.linearRampToValueAtTime( up.z, endTime );
+
+ } else {
+
+ listener.setPosition( _position$1.x, _position$1.y, _position$1.z );
+ listener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z );
+
+ }
+
+ }
+
+}
+
+class Audio extends Object3D {
+
+ constructor( listener ) {
+
+ super();
+
+ this.type = 'Audio';
+
+ this.listener = listener;
+ this.context = listener.context;
+
+ this.gain = this.context.createGain();
+ this.gain.connect( listener.getInput() );
+
+ this.autoplay = false;
+
+ this.buffer = null;
+ this.detune = 0;
+ this.loop = false;
+ this.loopStart = 0;
+ this.loopEnd = 0;
+ this.offset = 0;
+ this.duration = undefined;
+ this.playbackRate = 1;
+ this.isPlaying = false;
+ this.hasPlaybackControl = true;
+ this.source = null;
+ this.sourceType = 'empty';
+
+ this._startedAt = 0;
+ this._progress = 0;
+ this._connected = false;
+
+ this.filters = [];
+
+ }
+
+ getOutput() {
+
+ return this.gain;
+
+ }
+
+ setNodeSource( audioNode ) {
+
+ this.hasPlaybackControl = false;
+ this.sourceType = 'audioNode';
+ this.source = audioNode;
+ this.connect();
+
+ return this;
+
+ }
+
+ setMediaElementSource( mediaElement ) {
+
+ this.hasPlaybackControl = false;
+ this.sourceType = 'mediaNode';
+ this.source = this.context.createMediaElementSource( mediaElement );
+ this.connect();
+
+ return this;
+
+ }
+
+ setMediaStreamSource( mediaStream ) {
+
+ this.hasPlaybackControl = false;
+ this.sourceType = 'mediaStreamNode';
+ this.source = this.context.createMediaStreamSource( mediaStream );
+ this.connect();
+
+ return this;
+
+ }
+
+ setBuffer( audioBuffer ) {
+
+ this.buffer = audioBuffer;
+ this.sourceType = 'buffer';
+
+ if ( this.autoplay ) this.play();
+
+ return this;
+
+ }
+
+ play( delay = 0 ) {
+
+ if ( this.isPlaying === true ) {
+
+ console.warn( 'THREE.Audio: Audio is already playing.' );
+ return;
+
+ }
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ this._startedAt = this.context.currentTime + delay;
+
+ const source = this.context.createBufferSource();
+ source.buffer = this.buffer;
+ source.loop = this.loop;
+ source.loopStart = this.loopStart;
+ source.loopEnd = this.loopEnd;
+ source.onended = this.onEnded.bind( this );
+ source.start( this._startedAt, this._progress + this.offset, this.duration );
+
+ this.isPlaying = true;
+
+ this.source = source;
+
+ this.setDetune( this.detune );
+ this.setPlaybackRate( this.playbackRate );
+
+ return this.connect();
+
+ }
+
+ pause() {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ if ( this.isPlaying === true ) {
+
+ // update current progress
+
+ this._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;
+
+ if ( this.loop === true ) {
+
+ // ensure _progress does not exceed duration with looped audios
+
+ this._progress = this._progress % ( this.duration || this.buffer.duration );
+
+ }
+
+ this.source.stop();
+ this.source.onended = null;
+
+ this.isPlaying = false;
+
+ }
+
+ return this;
+
+ }
+
+ stop() {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ this._progress = 0;
+
+ this.source.stop();
+ this.source.onended = null;
+ this.isPlaying = false;
+
+ return this;
+
+ }
+
+ connect() {
+
+ if ( this.filters.length > 0 ) {
+
+ this.source.connect( this.filters[ 0 ] );
+
+ for ( let i = 1, l = this.filters.length; i < l; i ++ ) {
+
+ this.filters[ i - 1 ].connect( this.filters[ i ] );
+
+ }
+
+ this.filters[ this.filters.length - 1 ].connect( this.getOutput() );
+
+ } else {
+
+ this.source.connect( this.getOutput() );
+
+ }
+
+ this._connected = true;
+
+ return this;
+
+ }
+
+ disconnect() {
+
+ if ( this.filters.length > 0 ) {
+
+ this.source.disconnect( this.filters[ 0 ] );
+
+ for ( let i = 1, l = this.filters.length; i < l; i ++ ) {
+
+ this.filters[ i - 1 ].disconnect( this.filters[ i ] );
+
+ }
+
+ this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );
+
+ } else {
+
+ this.source.disconnect( this.getOutput() );
+
+ }
+
+ this._connected = false;
+
+ return this;
+
+ }
+
+ getFilters() {
+
+ return this.filters;
+
+ }
+
+ setFilters( value ) {
+
+ if ( ! value ) value = [];
+
+ if ( this._connected === true ) {
+
+ this.disconnect();
+ this.filters = value.slice();
+ this.connect();
+
+ } else {
+
+ this.filters = value.slice();
+
+ }
+
+ return this;
+
+ }
+
+ setDetune( value ) {
+
+ this.detune = value;
+
+ if ( this.source.detune === undefined ) return; // only set detune when available
+
+ if ( this.isPlaying === true ) {
+
+ this.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );
+
+ }
+
+ return this;
+
+ }
+
+ getDetune() {
+
+ return this.detune;
+
+ }
+
+ getFilter() {
+
+ return this.getFilters()[ 0 ];
+
+ }
+
+ setFilter( filter ) {
+
+ return this.setFilters( filter ? [ filter ] : [] );
+
+ }
+
+ setPlaybackRate( value ) {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ this.playbackRate = value;
+
+ if ( this.isPlaying === true ) {
+
+ this.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );
+
+ }
+
+ return this;
+
+ }
+
+ getPlaybackRate() {
+
+ return this.playbackRate;
+
+ }
+
+ onEnded() {
+
+ this.isPlaying = false;
+
+ }
+
+ getLoop() {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return false;
+
+ }
+
+ return this.loop;
+
+ }
+
+ setLoop( value ) {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ this.loop = value;
+
+ if ( this.isPlaying === true ) {
+
+ this.source.loop = this.loop;
+
+ }
+
+ return this;
+
+ }
+
+ setLoopStart( value ) {
+
+ this.loopStart = value;
+
+ return this;
+
+ }
+
+ setLoopEnd( value ) {
+
+ this.loopEnd = value;
+
+ return this;
+
+ }
+
+ getVolume() {
+
+ return this.gain.gain.value;
+
+ }
+
+ setVolume( value ) {
+
+ this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );
+
+ return this;
+
+ }
+
+}
+
+const _position = /*@__PURE__*/ new Vector3();
+const _quaternion = /*@__PURE__*/ new Quaternion();
+const _scale = /*@__PURE__*/ new Vector3();
+const _orientation = /*@__PURE__*/ new Vector3();
+
+class PositionalAudio extends Audio {
+
+ constructor( listener ) {
+
+ super( listener );
+
+ this.panner = this.context.createPanner();
+ this.panner.panningModel = 'HRTF';
+ this.panner.connect( this.gain );
+
+ }
+
+ getOutput() {
+
+ return this.panner;
+
+ }
+
+ getRefDistance() {
+
+ return this.panner.refDistance;
+
+ }
+
+ setRefDistance( value ) {
+
+ this.panner.refDistance = value;
+
+ return this;
+
+ }
+
+ getRolloffFactor() {
+
+ return this.panner.rolloffFactor;
+
+ }
+
+ setRolloffFactor( value ) {
+
+ this.panner.rolloffFactor = value;
+
+ return this;
+
+ }
+
+ getDistanceModel() {
+
+ return this.panner.distanceModel;
+
+ }
+
+ setDistanceModel( value ) {
+
+ this.panner.distanceModel = value;
+
+ return this;
+
+ }
+
+ getMaxDistance() {
+
+ return this.panner.maxDistance;
+
+ }
+
+ setMaxDistance( value ) {
+
+ this.panner.maxDistance = value;
+
+ return this;
+
+ }
+
+ setDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {
+
+ this.panner.coneInnerAngle = coneInnerAngle;
+ this.panner.coneOuterAngle = coneOuterAngle;
+ this.panner.coneOuterGain = coneOuterGain;
+
+ return this;
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ super.updateMatrixWorld( force );
+
+ if ( this.hasPlaybackControl === true && this.isPlaying === false ) return;
+
+ this.matrixWorld.decompose( _position, _quaternion, _scale );
+
+ _orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );
+
+ const panner = this.panner;
+
+ if ( panner.positionX ) {
+
+ // code path for Chrome and Firefox (see #14393)
+
+ const endTime = this.context.currentTime + this.listener.timeDelta;
+
+ panner.positionX.linearRampToValueAtTime( _position.x, endTime );
+ panner.positionY.linearRampToValueAtTime( _position.y, endTime );
+ panner.positionZ.linearRampToValueAtTime( _position.z, endTime );
+ panner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );
+ panner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );
+ panner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );
+
+ } else {
+
+ panner.setPosition( _position.x, _position.y, _position.z );
+ panner.setOrientation( _orientation.x, _orientation.y, _orientation.z );
+
+ }
+
+ }
+
+}
+
+class AudioAnalyser {
+
+ constructor( audio, fftSize = 2048 ) {
+
+ this.analyser = audio.context.createAnalyser();
+ this.analyser.fftSize = fftSize;
+
+ this.data = new Uint8Array( this.analyser.frequencyBinCount );
+
+ audio.getOutput().connect( this.analyser );
+
+ }
+
+
+ getFrequencyData() {
+
+ this.analyser.getByteFrequencyData( this.data );
+
+ return this.data;
+
+ }
+
+ getAverageFrequency() {
+
+ let value = 0;
+ const data = this.getFrequencyData();
+
+ for ( let i = 0; i < data.length; i ++ ) {
+
+ value += data[ i ];
+
+ }
+
+ return value / data.length;
+
+ }
+
+}
+
+class PropertyMixer {
+
+ constructor( binding, typeName, valueSize ) {
+
+ this.binding = binding;
+ this.valueSize = valueSize;
+
+ let mixFunction,
+ mixFunctionAdditive,
+ setIdentity;
+
+ // buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]
+ //
+ // interpolators can use .buffer as their .result
+ // the data then goes to 'incoming'
+ //
+ // 'accu0' and 'accu1' are used frame-interleaved for
+ // the cumulative result and are compared to detect
+ // changes
+ //
+ // 'orig' stores the original state of the property
+ //
+ // 'add' is used for additive cumulative results
+ //
+ // 'work' is optional and is only present for quaternion types. It is used
+ // to store intermediate quaternion multiplication results
+
+ switch ( typeName ) {
+
+ case 'quaternion':
+ mixFunction = this._slerp;
+ mixFunctionAdditive = this._slerpAdditive;
+ setIdentity = this._setAdditiveIdentityQuaternion;
+
+ this.buffer = new Float64Array( valueSize * 6 );
+ this._workIndex = 5;
+ break;
+
+ case 'string':
+ case 'bool':
+ mixFunction = this._select;
+
+ // Use the regular mix function and for additive on these types,
+ // additive is not relevant for non-numeric types
+ mixFunctionAdditive = this._select;
+
+ setIdentity = this._setAdditiveIdentityOther;
+
+ this.buffer = new Array( valueSize * 5 );
+ break;
+
+ default:
+ mixFunction = this._lerp;
+ mixFunctionAdditive = this._lerpAdditive;
+ setIdentity = this._setAdditiveIdentityNumeric;
+
+ this.buffer = new Float64Array( valueSize * 5 );
+
+ }
+
+ this._mixBufferRegion = mixFunction;
+ this._mixBufferRegionAdditive = mixFunctionAdditive;
+ this._setIdentity = setIdentity;
+ this._origIndex = 3;
+ this._addIndex = 4;
+
+ this.cumulativeWeight = 0;
+ this.cumulativeWeightAdditive = 0;
+
+ this.useCount = 0;
+ this.referenceCount = 0;
+
+ }
+
+ // accumulate data in the 'incoming' region into 'accu'
+ accumulate( accuIndex, weight ) {
+
+ // note: happily accumulating nothing when weight = 0, the caller knows
+ // the weight and shouldn't have made the call in the first place
+
+ const buffer = this.buffer,
+ stride = this.valueSize,
+ offset = accuIndex * stride + stride;
+
+ let currentWeight = this.cumulativeWeight;
+
+ if ( currentWeight === 0 ) {
+
+ // accuN := incoming * weight
+
+ for ( let i = 0; i !== stride; ++ i ) {
+
+ buffer[ offset + i ] = buffer[ i ];
+
+ }
+
+ currentWeight = weight;
+
+ } else {
+
+ // accuN := accuN + incoming * weight
+
+ currentWeight += weight;
+ const mix = weight / currentWeight;
+ this._mixBufferRegion( buffer, offset, 0, mix, stride );
+
+ }
+
+ this.cumulativeWeight = currentWeight;
+
+ }
+
+ // accumulate data in the 'incoming' region into 'add'
+ accumulateAdditive( weight ) {
+
+ const buffer = this.buffer,
+ stride = this.valueSize,
+ offset = stride * this._addIndex;
+
+ if ( this.cumulativeWeightAdditive === 0 ) {
+
+ // add = identity
+
+ this._setIdentity();
+
+ }
+
+ // add := add + incoming * weight
+
+ this._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );
+ this.cumulativeWeightAdditive += weight;
+
+ }
+
+ // apply the state of 'accu' to the binding when accus differ
+ apply( accuIndex ) {
+
+ const stride = this.valueSize,
+ buffer = this.buffer,
+ offset = accuIndex * stride + stride,
+
+ weight = this.cumulativeWeight,
+ weightAdditive = this.cumulativeWeightAdditive,
+
+ binding = this.binding;
+
+ this.cumulativeWeight = 0;
+ this.cumulativeWeightAdditive = 0;
+
+ if ( weight < 1 ) {
+
+ // accuN := accuN + original * ( 1 - cumulativeWeight )
+
+ const originalValueOffset = stride * this._origIndex;
+
+ this._mixBufferRegion(
+ buffer, offset, originalValueOffset, 1 - weight, stride );
+
+ }
+
+ if ( weightAdditive > 0 ) {
+
+ // accuN := accuN + additive accuN
+
+ this._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );
+
+ }
+
+ for ( let i = stride, e = stride + stride; i !== e; ++ i ) {
+
+ if ( buffer[ i ] !== buffer[ i + stride ] ) {
+
+ // value has changed -> update scene graph
+
+ binding.setValue( buffer, offset );
+ break;
+
+ }
+
+ }
+
+ }
+
+ // remember the state of the bound property and copy it to both accus
+ saveOriginalState() {
+
+ const binding = this.binding;
+
+ const buffer = this.buffer,
+ stride = this.valueSize,
+
+ originalValueOffset = stride * this._origIndex;
+
+ binding.getValue( buffer, originalValueOffset );
+
+ // accu[0..1] := orig -- initially detect changes against the original
+ for ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {
+
+ buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];
+
+ }
+
+ // Add to identity for additive
+ this._setIdentity();
+
+ this.cumulativeWeight = 0;
+ this.cumulativeWeightAdditive = 0;
+
+ }
+
+ // apply the state previously taken via 'saveOriginalState' to the binding
+ restoreOriginalState() {
+
+ const originalValueOffset = this.valueSize * 3;
+ this.binding.setValue( this.buffer, originalValueOffset );
+
+ }
+
+ _setAdditiveIdentityNumeric() {
+
+ const startIndex = this._addIndex * this.valueSize;
+ const endIndex = startIndex + this.valueSize;
+
+ for ( let i = startIndex; i < endIndex; i ++ ) {
+
+ this.buffer[ i ] = 0;
+
+ }
+
+ }
+
+ _setAdditiveIdentityQuaternion() {
+
+ this._setAdditiveIdentityNumeric();
+ this.buffer[ this._addIndex * this.valueSize + 3 ] = 1;
+
+ }
+
+ _setAdditiveIdentityOther() {
+
+ const startIndex = this._origIndex * this.valueSize;
+ const targetIndex = this._addIndex * this.valueSize;
+
+ for ( let i = 0; i < this.valueSize; i ++ ) {
+
+ this.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];
+
+ }
+
+ }
+
+
+ // mix functions
+
+ _select( buffer, dstOffset, srcOffset, t, stride ) {
+
+ if ( t >= 0.5 ) {
+
+ for ( let i = 0; i !== stride; ++ i ) {
+
+ buffer[ dstOffset + i ] = buffer[ srcOffset + i ];
+
+ }
+
+ }
+
+ }
+
+ _slerp( buffer, dstOffset, srcOffset, t ) {
+
+ Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );
+
+ }
+
+ _slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {
+
+ const workOffset = this._workIndex * stride;
+
+ // Store result in intermediate buffer offset
+ Quaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );
+
+ // Slerp to the intermediate result
+ Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );
+
+ }
+
+ _lerp( buffer, dstOffset, srcOffset, t, stride ) {
+
+ const s = 1 - t;
+
+ for ( let i = 0; i !== stride; ++ i ) {
+
+ const j = dstOffset + i;
+
+ buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;
+
+ }
+
+ }
+
+ _lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {
+
+ for ( let i = 0; i !== stride; ++ i ) {
+
+ const j = dstOffset + i;
+
+ buffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;
+
+ }
+
+ }
+
+}
+
+// Characters [].:/ are reserved for track binding syntax.
+const _RESERVED_CHARS_RE = '\\[\\]\\.:\\/';
+const _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );
+
+// Attempts to allow node names from any language. ES5's `\w` regexp matches
+// only latin characters, and the unicode \p{L} is not yet supported. So
+// instead, we exclude reserved characters and match everything else.
+const _wordChar = '[^' + _RESERVED_CHARS_RE + ']';
+const _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\.', '' ) + ']';
+
+// Parent directories, delimited by '/' or ':'. Currently unused, but must
+// be matched to parse the rest of the track name.
+const _directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', _wordChar );
+
+// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.
+const _nodeRe = /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );
+
+// Object on target node, and accessor. May not contain reserved
+// characters. Accessor may contain any character except closing bracket.
+const _objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', _wordChar );
+
+// Property and accessor. May not contain reserved characters. Accessor may
+// contain any non-bracket characters.
+const _propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', _wordChar );
+
+const _trackRe = new RegExp( ''
+ + '^'
+ + _directoryRe
+ + _nodeRe
+ + _objectRe
+ + _propertyRe
+ + '$'
+);
+
+const _supportedObjectNames = [ 'material', 'materials', 'bones' ];
+
+class Composite {
+
+ constructor( targetGroup, path, optionalParsedPath ) {
+
+ const parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );
+
+ this._targetGroup = targetGroup;
+ this._bindings = targetGroup.subscribe_( path, parsedPath );
+
+ }
+
+ getValue( array, offset ) {
+
+ this.bind(); // bind all binding
+
+ const firstValidIndex = this._targetGroup.nCachedObjects_,
+ binding = this._bindings[ firstValidIndex ];
+
+ // and only call .getValue on the first
+ if ( binding !== undefined ) binding.getValue( array, offset );
+
+ }
+
+ setValue( array, offset ) {
+
+ const bindings = this._bindings;
+
+ for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {
+
+ bindings[ i ].setValue( array, offset );
+
+ }
+
+ }
+
+ bind() {
+
+ const bindings = this._bindings;
+
+ for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {
+
+ bindings[ i ].bind();
+
+ }
+
+ }
+
+ unbind() {
+
+ const bindings = this._bindings;
+
+ for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {
+
+ bindings[ i ].unbind();
+
+ }
+
+ }
+
+}
+
+// Note: This class uses a State pattern on a per-method basis:
+// 'bind' sets 'this.getValue' / 'setValue' and shadows the
+// prototype version of these methods with one that represents
+// the bound state. When the property is not found, the methods
+// become no-ops.
+class PropertyBinding {
+
+ constructor( rootNode, path, parsedPath ) {
+
+ this.path = path;
+ this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );
+
+ this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;
+
+ this.rootNode = rootNode;
+
+ // initial state of these methods that calls 'bind'
+ this.getValue = this._getValue_unbound;
+ this.setValue = this._setValue_unbound;
+
+ }
+
+
+ static create( root, path, parsedPath ) {
+
+ if ( ! ( root && root.isAnimationObjectGroup ) ) {
+
+ return new PropertyBinding( root, path, parsedPath );
+
+ } else {
+
+ return new PropertyBinding.Composite( root, path, parsedPath );
+
+ }
+
+ }
+
+ /**
+ * Replaces spaces with underscores and removes unsupported characters from
+ * node names, to ensure compatibility with parseTrackName().
+ *
+ * @param {string} name Node name to be sanitized.
+ * @return {string}
+ */
+ static sanitizeNodeName( name ) {
+
+ return name.replace( /\s/g, '_' ).replace( _reservedRe, '' );
+
+ }
+
+ static parseTrackName( trackName ) {
+
+ const matches = _trackRe.exec( trackName );
+
+ if ( matches === null ) {
+
+ throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );
+
+ }
+
+ const results = {
+ // directoryName: matches[ 1 ], // (tschw) currently unused
+ nodeName: matches[ 2 ],
+ objectName: matches[ 3 ],
+ objectIndex: matches[ 4 ],
+ propertyName: matches[ 5 ], // required
+ propertyIndex: matches[ 6 ]
+ };
+
+ const lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );
+
+ if ( lastDot !== undefined && lastDot !== - 1 ) {
+
+ const objectName = results.nodeName.substring( lastDot + 1 );
+
+ // Object names must be checked against an allowlist. Otherwise, there
+ // is no way to parse 'foo.bar.baz': 'baz' must be a property, but
+ // 'bar' could be the objectName, or part of a nodeName (which can
+ // include '.' characters).
+ if ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) {
+
+ results.nodeName = results.nodeName.substring( 0, lastDot );
+ results.objectName = objectName;
+
+ }
+
+ }
+
+ if ( results.propertyName === null || results.propertyName.length === 0 ) {
+
+ throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );
+
+ }
+
+ return results;
+
+ }
+
+ static findNode( root, nodeName ) {
+
+ if ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {
+
+ return root;
+
+ }
+
+ // search into skeleton bones.
+ if ( root.skeleton ) {
+
+ const bone = root.skeleton.getBoneByName( nodeName );
+
+ if ( bone !== undefined ) {
+
+ return bone;
+
+ }
+
+ }
+
+ // search into node subtree.
+ if ( root.children ) {
+
+ const searchNodeSubtree = function ( children ) {
+
+ for ( let i = 0; i < children.length; i ++ ) {
+
+ const childNode = children[ i ];
+
+ if ( childNode.name === nodeName || childNode.uuid === nodeName ) {
+
+ return childNode;
+
+ }
+
+ const result = searchNodeSubtree( childNode.children );
+
+ if ( result ) return result;
+
+ }
+
+ return null;
+
+ };
+
+ const subTreeNode = searchNodeSubtree( root.children );
+
+ if ( subTreeNode ) {
+
+ return subTreeNode;
+
+ }
+
+ }
+
+ return null;
+
+ }
+
+ // these are used to "bind" a nonexistent property
+ _getValue_unavailable() {}
+ _setValue_unavailable() {}
+
+ // Getters
+
+ _getValue_direct( buffer, offset ) {
+
+ buffer[ offset ] = this.targetObject[ this.propertyName ];
+
+ }
+
+ _getValue_array( buffer, offset ) {
+
+ const source = this.resolvedProperty;
+
+ for ( let i = 0, n = source.length; i !== n; ++ i ) {
+
+ buffer[ offset ++ ] = source[ i ];
+
+ }
+
+ }
+
+ _getValue_arrayElement( buffer, offset ) {
+
+ buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];
+
+ }
+
+ _getValue_toArray( buffer, offset ) {
+
+ this.resolvedProperty.toArray( buffer, offset );
+
+ }
+
+ // Direct
+
+ _setValue_direct( buffer, offset ) {
+
+ this.targetObject[ this.propertyName ] = buffer[ offset ];
+
+ }
+
+ _setValue_direct_setNeedsUpdate( buffer, offset ) {
+
+ this.targetObject[ this.propertyName ] = buffer[ offset ];
+ this.targetObject.needsUpdate = true;
+
+ }
+
+ _setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {
+
+ this.targetObject[ this.propertyName ] = buffer[ offset ];
+ this.targetObject.matrixWorldNeedsUpdate = true;
+
+ }
+
+ // EntireArray
+
+ _setValue_array( buffer, offset ) {
+
+ const dest = this.resolvedProperty;
+
+ for ( let i = 0, n = dest.length; i !== n; ++ i ) {
+
+ dest[ i ] = buffer[ offset ++ ];
+
+ }
+
+ }
+
+ _setValue_array_setNeedsUpdate( buffer, offset ) {
+
+ const dest = this.resolvedProperty;
+
+ for ( let i = 0, n = dest.length; i !== n; ++ i ) {
+
+ dest[ i ] = buffer[ offset ++ ];
+
+ }
+
+ this.targetObject.needsUpdate = true;
+
+ }
+
+ _setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {
+
+ const dest = this.resolvedProperty;
+
+ for ( let i = 0, n = dest.length; i !== n; ++ i ) {
+
+ dest[ i ] = buffer[ offset ++ ];
+
+ }
+
+ this.targetObject.matrixWorldNeedsUpdate = true;
+
+ }
+
+ // ArrayElement
+
+ _setValue_arrayElement( buffer, offset ) {
+
+ this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
+
+ }
+
+ _setValue_arrayElement_setNeedsUpdate( buffer, offset ) {
+
+ this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
+ this.targetObject.needsUpdate = true;
+
+ }
+
+ _setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {
+
+ this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
+ this.targetObject.matrixWorldNeedsUpdate = true;
+
+ }
+
+ // HasToFromArray
+
+ _setValue_fromArray( buffer, offset ) {
+
+ this.resolvedProperty.fromArray( buffer, offset );
+
+ }
+
+ _setValue_fromArray_setNeedsUpdate( buffer, offset ) {
+
+ this.resolvedProperty.fromArray( buffer, offset );
+ this.targetObject.needsUpdate = true;
+
+ }
+
+ _setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {
+
+ this.resolvedProperty.fromArray( buffer, offset );
+ this.targetObject.matrixWorldNeedsUpdate = true;
+
+ }
+
+ _getValue_unbound( targetArray, offset ) {
+
+ this.bind();
+ this.getValue( targetArray, offset );
+
+ }
+
+ _setValue_unbound( sourceArray, offset ) {
+
+ this.bind();
+ this.setValue( sourceArray, offset );
+
+ }
+
+ // create getter / setter pair for a property in the scene graph
+ bind() {
+
+ let targetObject = this.node;
+ const parsedPath = this.parsedPath;
+
+ const objectName = parsedPath.objectName;
+ const propertyName = parsedPath.propertyName;
+ let propertyIndex = parsedPath.propertyIndex;
+
+ if ( ! targetObject ) {
+
+ targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;
+
+ this.node = targetObject;
+
+ }
+
+ // set fail state so we can just 'return' on error
+ this.getValue = this._getValue_unavailable;
+ this.setValue = this._setValue_unavailable;
+
+ // ensure there is a value node
+ if ( ! targetObject ) {
+
+ console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' );
+ return;
+
+ }
+
+ if ( objectName ) {
+
+ let objectIndex = parsedPath.objectIndex;
+
+ // special cases were we need to reach deeper into the hierarchy to get the face materials....
+ switch ( objectName ) {
+
+ case 'materials':
+
+ if ( ! targetObject.material ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );
+ return;
+
+ }
+
+ if ( ! targetObject.material.materials ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );
+ return;
+
+ }
+
+ targetObject = targetObject.material.materials;
+
+ break;
+
+ case 'bones':
+
+ if ( ! targetObject.skeleton ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );
+ return;
+
+ }
+
+ // potential future optimization: skip this if propertyIndex is already an integer
+ // and convert the integer string to a true integer.
+
+ targetObject = targetObject.skeleton.bones;
+
+ // support resolving morphTarget names into indices.
+ for ( let i = 0; i < targetObject.length; i ++ ) {
+
+ if ( targetObject[ i ].name === objectIndex ) {
+
+ objectIndex = i;
+ break;
+
+ }
+
+ }
+
+ break;
+
+ default:
+
+ if ( targetObject[ objectName ] === undefined ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );
+ return;
+
+ }
+
+ targetObject = targetObject[ objectName ];
+
+ }
+
+
+ if ( objectIndex !== undefined ) {
+
+ if ( targetObject[ objectIndex ] === undefined ) {
+
+ console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );
+ return;
+
+ }
+
+ targetObject = targetObject[ objectIndex ];
+
+ }
+
+ }
+
+ // resolve property
+ const nodeProperty = targetObject[ propertyName ];
+
+ if ( nodeProperty === undefined ) {
+
+ const nodeName = parsedPath.nodeName;
+
+ console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +
+ '.' + propertyName + ' but it wasn\'t found.', targetObject );
+ return;
+
+ }
+
+ // determine versioning scheme
+ let versioning = this.Versioning.None;
+
+ this.targetObject = targetObject;
+
+ if ( targetObject.needsUpdate !== undefined ) { // material
+
+ versioning = this.Versioning.NeedsUpdate;
+
+ } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform
+
+ versioning = this.Versioning.MatrixWorldNeedsUpdate;
+
+ }
+
+ // determine how the property gets bound
+ let bindingType = this.BindingType.Direct;
+
+ if ( propertyIndex !== undefined ) {
+
+ // access a sub element of the property array (only primitives are supported right now)
+
+ if ( propertyName === 'morphTargetInfluences' ) {
+
+ // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.
+
+ // support resolving morphTarget names into indices.
+ if ( ! targetObject.geometry ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );
+ return;
+
+ }
+
+ if ( targetObject.geometry.isBufferGeometry ) {
+
+ if ( ! targetObject.geometry.morphAttributes ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );
+ return;
+
+ }
+
+ if ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {
+
+ propertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];
+
+ }
+
+
+ } else {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.', this );
+ return;
+
+ }
+
+ }
+
+ bindingType = this.BindingType.ArrayElement;
+
+ this.resolvedProperty = nodeProperty;
+ this.propertyIndex = propertyIndex;
+
+ } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {
+
+ // must use copy for Object3D.Euler/Quaternion
+
+ bindingType = this.BindingType.HasFromToArray;
+
+ this.resolvedProperty = nodeProperty;
+
+ } else if ( Array.isArray( nodeProperty ) ) {
+
+ bindingType = this.BindingType.EntireArray;
+
+ this.resolvedProperty = nodeProperty;
+
+ } else {
+
+ this.propertyName = propertyName;
+
+ }
+
+ // select getter / setter
+ this.getValue = this.GetterByBindingType[ bindingType ];
+ this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];
+
+ }
+
+ unbind() {
+
+ this.node = null;
+
+ // back to the prototype version of getValue / setValue
+ // note: avoiding to mutate the shape of 'this' via 'delete'
+ this.getValue = this._getValue_unbound;
+ this.setValue = this._setValue_unbound;
+
+ }
+
+}
+
+PropertyBinding.Composite = Composite;
+
+PropertyBinding.prototype.BindingType = {
+ Direct: 0,
+ EntireArray: 1,
+ ArrayElement: 2,
+ HasFromToArray: 3
+};
+
+PropertyBinding.prototype.Versioning = {
+ None: 0,
+ NeedsUpdate: 1,
+ MatrixWorldNeedsUpdate: 2
+};
+
+PropertyBinding.prototype.GetterByBindingType = [
+
+ PropertyBinding.prototype._getValue_direct,
+ PropertyBinding.prototype._getValue_array,
+ PropertyBinding.prototype._getValue_arrayElement,
+ PropertyBinding.prototype._getValue_toArray,
+
+];
+
+PropertyBinding.prototype.SetterByBindingTypeAndVersioning = [
+
+ [
+ // Direct
+ PropertyBinding.prototype._setValue_direct,
+ PropertyBinding.prototype._setValue_direct_setNeedsUpdate,
+ PropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,
+
+ ], [
+
+ // EntireArray
+
+ PropertyBinding.prototype._setValue_array,
+ PropertyBinding.prototype._setValue_array_setNeedsUpdate,
+ PropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,
+
+ ], [
+
+ // ArrayElement
+ PropertyBinding.prototype._setValue_arrayElement,
+ PropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,
+ PropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,
+
+ ], [
+
+ // HasToFromArray
+ PropertyBinding.prototype._setValue_fromArray,
+ PropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,
+ PropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,
+
+ ]
+
+];
+
+/**
+ *
+ * A group of objects that receives a shared animation state.
+ *
+ * Usage:
+ *
+ * - Add objects you would otherwise pass as 'root' to the
+ * constructor or the .clipAction method of AnimationMixer.
+ *
+ * - Instead pass this object as 'root'.
+ *
+ * - You can also add and remove objects later when the mixer
+ * is running.
+ *
+ * Note:
+ *
+ * Objects of this class appear as one object to the mixer,
+ * so cache control of the individual objects must be done
+ * on the group.
+ *
+ * Limitation:
+ *
+ * - The animated properties must be compatible among the
+ * all objects in the group.
+ *
+ * - A single property can either be controlled through a
+ * target group or directly, but not both.
+ */
+
+class AnimationObjectGroup {
+
+ constructor() {
+
+ this.uuid = generateUUID();
+
+ // cached objects followed by the active ones
+ this._objects = Array.prototype.slice.call( arguments );
+
+ this.nCachedObjects_ = 0; // threshold
+ // note: read by PropertyBinding.Composite
+
+ const indices = {};
+ this._indicesByUUID = indices; // for bookkeeping
+
+ for ( let i = 0, n = arguments.length; i !== n; ++ i ) {
+
+ indices[ arguments[ i ].uuid ] = i;
+
+ }
+
+ this._paths = []; // inside: string
+ this._parsedPaths = []; // inside: { we don't care, here }
+ this._bindings = []; // inside: Array< PropertyBinding >
+ this._bindingsIndicesByPath = {}; // inside: indices in these arrays
+
+ const scope = this;
+
+ this.stats = {
+
+ objects: {
+ get total() {
+
+ return scope._objects.length;
+
+ },
+ get inUse() {
+
+ return this.total - scope.nCachedObjects_;
+
+ }
+ },
+ get bindingsPerObject() {
+
+ return scope._bindings.length;
+
+ }
+
+ };
+
+ }
+
+ add() {
+
+ const objects = this._objects,
+ indicesByUUID = this._indicesByUUID,
+ paths = this._paths,
+ parsedPaths = this._parsedPaths,
+ bindings = this._bindings,
+ nBindings = bindings.length;
+
+ let knownObject = undefined,
+ nObjects = objects.length,
+ nCachedObjects = this.nCachedObjects_;
+
+ for ( let i = 0, n = arguments.length; i !== n; ++ i ) {
+
+ const object = arguments[ i ],
+ uuid = object.uuid;
+ let index = indicesByUUID[ uuid ];
+
+ if ( index === undefined ) {
+
+ // unknown object -> add it to the ACTIVE region
+
+ index = nObjects ++;
+ indicesByUUID[ uuid ] = index;
+ objects.push( object );
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );
+
+ }
+
+ } else if ( index < nCachedObjects ) {
+
+ knownObject = objects[ index ];
+
+ // move existing object to the ACTIVE region
+
+ const firstActiveIndex = -- nCachedObjects,
+ lastCachedObject = objects[ firstActiveIndex ];
+
+ indicesByUUID[ lastCachedObject.uuid ] = index;
+ objects[ index ] = lastCachedObject;
+
+ indicesByUUID[ uuid ] = firstActiveIndex;
+ objects[ firstActiveIndex ] = object;
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ const bindingsForPath = bindings[ j ],
+ lastCached = bindingsForPath[ firstActiveIndex ];
+
+ let binding = bindingsForPath[ index ];
+
+ bindingsForPath[ index ] = lastCached;
+
+ if ( binding === undefined ) {
+
+ // since we do not bother to create new bindings
+ // for objects that are cached, the binding may
+ // or may not exist
+
+ binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );
+
+ }
+
+ bindingsForPath[ firstActiveIndex ] = binding;
+
+ }
+
+ } else if ( objects[ index ] !== knownObject ) {
+
+ console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +
+ 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );
+
+ } // else the object is already where we want it to be
+
+ } // for arguments
+
+ this.nCachedObjects_ = nCachedObjects;
+
+ }
+
+ remove() {
+
+ const objects = this._objects,
+ indicesByUUID = this._indicesByUUID,
+ bindings = this._bindings,
+ nBindings = bindings.length;
+
+ let nCachedObjects = this.nCachedObjects_;
+
+ for ( let i = 0, n = arguments.length; i !== n; ++ i ) {
+
+ const object = arguments[ i ],
+ uuid = object.uuid,
+ index = indicesByUUID[ uuid ];
+
+ if ( index !== undefined && index >= nCachedObjects ) {
+
+ // move existing object into the CACHED region
+
+ const lastCachedIndex = nCachedObjects ++,
+ firstActiveObject = objects[ lastCachedIndex ];
+
+ indicesByUUID[ firstActiveObject.uuid ] = index;
+ objects[ index ] = firstActiveObject;
+
+ indicesByUUID[ uuid ] = lastCachedIndex;
+ objects[ lastCachedIndex ] = object;
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ const bindingsForPath = bindings[ j ],
+ firstActive = bindingsForPath[ lastCachedIndex ],
+ binding = bindingsForPath[ index ];
+
+ bindingsForPath[ index ] = firstActive;
+ bindingsForPath[ lastCachedIndex ] = binding;
+
+ }
+
+ }
+
+ } // for arguments
+
+ this.nCachedObjects_ = nCachedObjects;
+
+ }
+
+ // remove & forget
+ uncache() {
+
+ const objects = this._objects,
+ indicesByUUID = this._indicesByUUID,
+ bindings = this._bindings,
+ nBindings = bindings.length;
+
+ let nCachedObjects = this.nCachedObjects_,
+ nObjects = objects.length;
+
+ for ( let i = 0, n = arguments.length; i !== n; ++ i ) {
+
+ const object = arguments[ i ],
+ uuid = object.uuid,
+ index = indicesByUUID[ uuid ];
+
+ if ( index !== undefined ) {
+
+ delete indicesByUUID[ uuid ];
+
+ if ( index < nCachedObjects ) {
+
+ // object is cached, shrink the CACHED region
+
+ const firstActiveIndex = -- nCachedObjects,
+ lastCachedObject = objects[ firstActiveIndex ],
+ lastIndex = -- nObjects,
+ lastObject = objects[ lastIndex ];
+
+ // last cached object takes this object's place
+ indicesByUUID[ lastCachedObject.uuid ] = index;
+ objects[ index ] = lastCachedObject;
+
+ // last object goes to the activated slot and pop
+ indicesByUUID[ lastObject.uuid ] = firstActiveIndex;
+ objects[ firstActiveIndex ] = lastObject;
+ objects.pop();
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ const bindingsForPath = bindings[ j ],
+ lastCached = bindingsForPath[ firstActiveIndex ],
+ last = bindingsForPath[ lastIndex ];
+
+ bindingsForPath[ index ] = lastCached;
+ bindingsForPath[ firstActiveIndex ] = last;
+ bindingsForPath.pop();
+
+ }
+
+ } else {
+
+ // object is active, just swap with the last and pop
+
+ const lastIndex = -- nObjects,
+ lastObject = objects[ lastIndex ];
+
+ if ( lastIndex > 0 ) {
+
+ indicesByUUID[ lastObject.uuid ] = index;
+
+ }
+
+ objects[ index ] = lastObject;
+ objects.pop();
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ const bindingsForPath = bindings[ j ];
+
+ bindingsForPath[ index ] = bindingsForPath[ lastIndex ];
+ bindingsForPath.pop();
+
+ }
+
+ } // cached or active
+
+ } // if object is known
+
+ } // for arguments
+
+ this.nCachedObjects_ = nCachedObjects;
+
+ }
+
+ // Internal interface used by befriended PropertyBinding.Composite:
+
+ subscribe_( path, parsedPath ) {
+
+ // returns an array of bindings for the given path that is changed
+ // according to the contained objects in the group
+
+ const indicesByPath = this._bindingsIndicesByPath;
+ let index = indicesByPath[ path ];
+ const bindings = this._bindings;
+
+ if ( index !== undefined ) return bindings[ index ];
+
+ const paths = this._paths,
+ parsedPaths = this._parsedPaths,
+ objects = this._objects,
+ nObjects = objects.length,
+ nCachedObjects = this.nCachedObjects_,
+ bindingsForPath = new Array( nObjects );
+
+ index = bindings.length;
+
+ indicesByPath[ path ] = index;
+
+ paths.push( path );
+ parsedPaths.push( parsedPath );
+ bindings.push( bindingsForPath );
+
+ for ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {
+
+ const object = objects[ i ];
+ bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );
+
+ }
+
+ return bindingsForPath;
+
+ }
+
+ unsubscribe_( path ) {
+
+ // tells the group to forget about a property path and no longer
+ // update the array previously obtained with 'subscribe_'
+
+ const indicesByPath = this._bindingsIndicesByPath,
+ index = indicesByPath[ path ];
+
+ if ( index !== undefined ) {
+
+ const paths = this._paths,
+ parsedPaths = this._parsedPaths,
+ bindings = this._bindings,
+ lastBindingsIndex = bindings.length - 1,
+ lastBindings = bindings[ lastBindingsIndex ],
+ lastBindingsPath = path[ lastBindingsIndex ];
+
+ indicesByPath[ lastBindingsPath ] = index;
+
+ bindings[ index ] = lastBindings;
+ bindings.pop();
+
+ parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];
+ parsedPaths.pop();
+
+ paths[ index ] = paths[ lastBindingsIndex ];
+ paths.pop();
+
+ }
+
+ }
+
+}
+
+AnimationObjectGroup.prototype.isAnimationObjectGroup = true;
+
+class AnimationAction {
+
+ constructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {
+
+ this._mixer = mixer;
+ this._clip = clip;
+ this._localRoot = localRoot;
+ this.blendMode = blendMode;
+
+ const tracks = clip.tracks,
+ nTracks = tracks.length,
+ interpolants = new Array( nTracks );
+
+ const interpolantSettings = {
+ endingStart: ZeroCurvatureEnding,
+ endingEnd: ZeroCurvatureEnding
+ };
+
+ for ( let i = 0; i !== nTracks; ++ i ) {
+
+ const interpolant = tracks[ i ].createInterpolant( null );
+ interpolants[ i ] = interpolant;
+ interpolant.settings = interpolantSettings;
+
+ }
+
+ this._interpolantSettings = interpolantSettings;
+
+ this._interpolants = interpolants; // bound by the mixer
+
+ // inside: PropertyMixer (managed by the mixer)
+ this._propertyBindings = new Array( nTracks );
+
+ this._cacheIndex = null; // for the memory manager
+ this._byClipCacheIndex = null; // for the memory manager
+
+ this._timeScaleInterpolant = null;
+ this._weightInterpolant = null;
+
+ this.loop = LoopRepeat;
+ this._loopCount = - 1;
+
+ // global mixer time when the action is to be started
+ // it's set back to 'null' upon start of the action
+ this._startTime = null;
+
+ // scaled local time of the action
+ // gets clamped or wrapped to 0..clip.duration according to loop
+ this.time = 0;
+
+ this.timeScale = 1;
+ this._effectiveTimeScale = 1;
+
+ this.weight = 1;
+ this._effectiveWeight = 1;
+
+ this.repetitions = Infinity; // no. of repetitions when looping
+
+ this.paused = false; // true -> zero effective time scale
+ this.enabled = true; // false -> zero effective weight
+
+ this.clampWhenFinished = false;// keep feeding the last frame?
+
+ this.zeroSlopeAtStart = true;// for smooth interpolation w/o separate
+ this.zeroSlopeAtEnd = true;// clips for start, loop and end
+
+ }
+
+ // State & Scheduling
+
+ play() {
+
+ this._mixer._activateAction( this );
+
+ return this;
+
+ }
+
+ stop() {
+
+ this._mixer._deactivateAction( this );
+
+ return this.reset();
+
+ }
+
+ reset() {
+
+ this.paused = false;
+ this.enabled = true;
+
+ this.time = 0; // restart clip
+ this._loopCount = - 1;// forget previous loops
+ this._startTime = null;// forget scheduling
+
+ return this.stopFading().stopWarping();
+
+ }
+
+ isRunning() {
+
+ return this.enabled && ! this.paused && this.timeScale !== 0 &&
+ this._startTime === null && this._mixer._isActiveAction( this );
+
+ }
+
+ // return true when play has been called
+ isScheduled() {
+
+ return this._mixer._isActiveAction( this );
+
+ }
+
+ startAt( time ) {
+
+ this._startTime = time;
+
+ return this;
+
+ }
+
+ setLoop( mode, repetitions ) {
+
+ this.loop = mode;
+ this.repetitions = repetitions;
+
+ return this;
+
+ }
+
+ // Weight
+
+ // set the weight stopping any scheduled fading
+ // although .enabled = false yields an effective weight of zero, this
+ // method does *not* change .enabled, because it would be confusing
+ setEffectiveWeight( weight ) {
+
+ this.weight = weight;
+
+ // note: same logic as when updated at runtime
+ this._effectiveWeight = this.enabled ? weight : 0;
+
+ return this.stopFading();
+
+ }
+
+ // return the weight considering fading and .enabled
+ getEffectiveWeight() {
+
+ return this._effectiveWeight;
+
+ }
+
+ fadeIn( duration ) {
+
+ return this._scheduleFading( duration, 0, 1 );
+
+ }
+
+ fadeOut( duration ) {
+
+ return this._scheduleFading( duration, 1, 0 );
+
+ }
+
+ crossFadeFrom( fadeOutAction, duration, warp ) {
+
+ fadeOutAction.fadeOut( duration );
+ this.fadeIn( duration );
+
+ if ( warp ) {
+
+ const fadeInDuration = this._clip.duration,
+ fadeOutDuration = fadeOutAction._clip.duration,
+
+ startEndRatio = fadeOutDuration / fadeInDuration,
+ endStartRatio = fadeInDuration / fadeOutDuration;
+
+ fadeOutAction.warp( 1.0, startEndRatio, duration );
+ this.warp( endStartRatio, 1.0, duration );
+
+ }
+
+ return this;
+
+ }
+
+ crossFadeTo( fadeInAction, duration, warp ) {
+
+ return fadeInAction.crossFadeFrom( this, duration, warp );
+
+ }
+
+ stopFading() {
+
+ const weightInterpolant = this._weightInterpolant;
+
+ if ( weightInterpolant !== null ) {
+
+ this._weightInterpolant = null;
+ this._mixer._takeBackControlInterpolant( weightInterpolant );
+
+ }
+
+ return this;
+
+ }
+
+ // Time Scale Control
+
+ // set the time scale stopping any scheduled warping
+ // although .paused = true yields an effective time scale of zero, this
+ // method does *not* change .paused, because it would be confusing
+ setEffectiveTimeScale( timeScale ) {
+
+ this.timeScale = timeScale;
+ this._effectiveTimeScale = this.paused ? 0 : timeScale;
+
+ return this.stopWarping();
+
+ }
+
+ // return the time scale considering warping and .paused
+ getEffectiveTimeScale() {
+
+ return this._effectiveTimeScale;
+
+ }
+
+ setDuration( duration ) {
+
+ this.timeScale = this._clip.duration / duration;
+
+ return this.stopWarping();
+
+ }
+
+ syncWith( action ) {
+
+ this.time = action.time;
+ this.timeScale = action.timeScale;
+
+ return this.stopWarping();
+
+ }
+
+ halt( duration ) {
+
+ return this.warp( this._effectiveTimeScale, 0, duration );
+
+ }
+
+ warp( startTimeScale, endTimeScale, duration ) {
+
+ const mixer = this._mixer,
+ now = mixer.time,
+ timeScale = this.timeScale;
+
+ let interpolant = this._timeScaleInterpolant;
+
+ if ( interpolant === null ) {
+
+ interpolant = mixer._lendControlInterpolant();
+ this._timeScaleInterpolant = interpolant;
+
+ }
+
+ const times = interpolant.parameterPositions,
+ values = interpolant.sampleValues;
+
+ times[ 0 ] = now;
+ times[ 1 ] = now + duration;
+
+ values[ 0 ] = startTimeScale / timeScale;
+ values[ 1 ] = endTimeScale / timeScale;
+
+ return this;
+
+ }
+
+ stopWarping() {
+
+ const timeScaleInterpolant = this._timeScaleInterpolant;
+
+ if ( timeScaleInterpolant !== null ) {
+
+ this._timeScaleInterpolant = null;
+ this._mixer._takeBackControlInterpolant( timeScaleInterpolant );
+
+ }
+
+ return this;
+
+ }
+
+ // Object Accessors
+
+ getMixer() {
+
+ return this._mixer;
+
+ }
+
+ getClip() {
+
+ return this._clip;
+
+ }
+
+ getRoot() {
+
+ return this._localRoot || this._mixer._root;
+
+ }
+
+ // Interna
+
+ _update( time, deltaTime, timeDirection, accuIndex ) {
+
+ // called by the mixer
+
+ if ( ! this.enabled ) {
+
+ // call ._updateWeight() to update ._effectiveWeight
+
+ this._updateWeight( time );
+ return;
+
+ }
+
+ const startTime = this._startTime;
+
+ if ( startTime !== null ) {
+
+ // check for scheduled start of action
+
+ const timeRunning = ( time - startTime ) * timeDirection;
+ if ( timeRunning < 0 || timeDirection === 0 ) {
+
+ return; // yet to come / don't decide when delta = 0
+
+ }
+
+ // start
+
+ this._startTime = null; // unschedule
+ deltaTime = timeDirection * timeRunning;
+
+ }
+
+ // apply time scale and advance time
+
+ deltaTime *= this._updateTimeScale( time );
+ const clipTime = this._updateTime( deltaTime );
+
+ // note: _updateTime may disable the action resulting in
+ // an effective weight of 0
+
+ const weight = this._updateWeight( time );
+
+ if ( weight > 0 ) {
+
+ const interpolants = this._interpolants;
+ const propertyMixers = this._propertyBindings;
+
+ switch ( this.blendMode ) {
+
+ case AdditiveAnimationBlendMode:
+
+ for ( let j = 0, m = interpolants.length; j !== m; ++ j ) {
+
+ interpolants[ j ].evaluate( clipTime );
+ propertyMixers[ j ].accumulateAdditive( weight );
+
+ }
+
+ break;
+
+ case NormalAnimationBlendMode:
+ default:
+
+ for ( let j = 0, m = interpolants.length; j !== m; ++ j ) {
+
+ interpolants[ j ].evaluate( clipTime );
+ propertyMixers[ j ].accumulate( accuIndex, weight );
+
+ }
+
+ }
+
+ }
+
+ }
+
+ _updateWeight( time ) {
+
+ let weight = 0;
+
+ if ( this.enabled ) {
+
+ weight = this.weight;
+ const interpolant = this._weightInterpolant;
+
+ if ( interpolant !== null ) {
+
+ const interpolantValue = interpolant.evaluate( time )[ 0 ];
+
+ weight *= interpolantValue;
+
+ if ( time > interpolant.parameterPositions[ 1 ] ) {
+
+ this.stopFading();
+
+ if ( interpolantValue === 0 ) {
+
+ // faded out, disable
+ this.enabled = false;
+
+ }
+
+ }
+
+ }
+
+ }
+
+ this._effectiveWeight = weight;
+ return weight;
+
+ }
+
+ _updateTimeScale( time ) {
+
+ let timeScale = 0;
+
+ if ( ! this.paused ) {
+
+ timeScale = this.timeScale;
+
+ const interpolant = this._timeScaleInterpolant;
+
+ if ( interpolant !== null ) {
+
+ const interpolantValue = interpolant.evaluate( time )[ 0 ];
+
+ timeScale *= interpolantValue;
+
+ if ( time > interpolant.parameterPositions[ 1 ] ) {
+
+ this.stopWarping();
+
+ if ( timeScale === 0 ) {
+
+ // motion has halted, pause
+ this.paused = true;
+
+ } else {
+
+ // warp done - apply final time scale
+ this.timeScale = timeScale;
+
+ }
+
+ }
+
+ }
+
+ }
+
+ this._effectiveTimeScale = timeScale;
+ return timeScale;
+
+ }
+
+ _updateTime( deltaTime ) {
+
+ const duration = this._clip.duration;
+ const loop = this.loop;
+
+ let time = this.time + deltaTime;
+ let loopCount = this._loopCount;
+
+ const pingPong = ( loop === LoopPingPong );
+
+ if ( deltaTime === 0 ) {
+
+ if ( loopCount === - 1 ) return time;
+
+ return ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;
+
+ }
+
+ if ( loop === LoopOnce ) {
+
+ if ( loopCount === - 1 ) {
+
+ // just started
+
+ this._loopCount = 0;
+ this._setEndings( true, true, false );
+
+ }
+
+ handle_stop: {
+
+ if ( time >= duration ) {
+
+ time = duration;
+
+ } else if ( time < 0 ) {
+
+ time = 0;
+
+ } else {
+
+ this.time = time;
+
+ break handle_stop;
+
+ }
+
+ if ( this.clampWhenFinished ) this.paused = true;
+ else this.enabled = false;
+
+ this.time = time;
+
+ this._mixer.dispatchEvent( {
+ type: 'finished', action: this,
+ direction: deltaTime < 0 ? - 1 : 1
+ } );
+
+ }
+
+ } else { // repetitive Repeat or PingPong
+
+ if ( loopCount === - 1 ) {
+
+ // just started
+
+ if ( deltaTime >= 0 ) {
+
+ loopCount = 0;
+
+ this._setEndings( true, this.repetitions === 0, pingPong );
+
+ } else {
+
+ // when looping in reverse direction, the initial
+ // transition through zero counts as a repetition,
+ // so leave loopCount at -1
+
+ this._setEndings( this.repetitions === 0, true, pingPong );
+
+ }
+
+ }
+
+ if ( time >= duration || time < 0 ) {
+
+ // wrap around
+
+ const loopDelta = Math.floor( time / duration ); // signed
+ time -= duration * loopDelta;
+
+ loopCount += Math.abs( loopDelta );
+
+ const pending = this.repetitions - loopCount;
+
+ if ( pending <= 0 ) {
+
+ // have to stop (switch state, clamp time, fire event)
+
+ if ( this.clampWhenFinished ) this.paused = true;
+ else this.enabled = false;
+
+ time = deltaTime > 0 ? duration : 0;
+
+ this.time = time;
+
+ this._mixer.dispatchEvent( {
+ type: 'finished', action: this,
+ direction: deltaTime > 0 ? 1 : - 1
+ } );
+
+ } else {
+
+ // keep running
+
+ if ( pending === 1 ) {
+
+ // entering the last round
+
+ const atStart = deltaTime < 0;
+ this._setEndings( atStart, ! atStart, pingPong );
+
+ } else {
+
+ this._setEndings( false, false, pingPong );
+
+ }
+
+ this._loopCount = loopCount;
+
+ this.time = time;
+
+ this._mixer.dispatchEvent( {
+ type: 'loop', action: this, loopDelta: loopDelta
+ } );
+
+ }
+
+ } else {
+
+ this.time = time;
+
+ }
+
+ if ( pingPong && ( loopCount & 1 ) === 1 ) {
+
+ // invert time for the "pong round"
+
+ return duration - time;
+
+ }
+
+ }
+
+ return time;
+
+ }
+
+ _setEndings( atStart, atEnd, pingPong ) {
+
+ const settings = this._interpolantSettings;
+
+ if ( pingPong ) {
+
+ settings.endingStart = ZeroSlopeEnding;
+ settings.endingEnd = ZeroSlopeEnding;
+
+ } else {
+
+ // assuming for LoopOnce atStart == atEnd == true
+
+ if ( atStart ) {
+
+ settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;
+
+ } else {
+
+ settings.endingStart = WrapAroundEnding;
+
+ }
+
+ if ( atEnd ) {
+
+ settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;
+
+ } else {
+
+ settings.endingEnd = WrapAroundEnding;
+
+ }
+
+ }
+
+ }
+
+ _scheduleFading( duration, weightNow, weightThen ) {
+
+ const mixer = this._mixer, now = mixer.time;
+ let interpolant = this._weightInterpolant;
+
+ if ( interpolant === null ) {
+
+ interpolant = mixer._lendControlInterpolant();
+ this._weightInterpolant = interpolant;
+
+ }
+
+ const times = interpolant.parameterPositions,
+ values = interpolant.sampleValues;
+
+ times[ 0 ] = now;
+ values[ 0 ] = weightNow;
+ times[ 1 ] = now + duration;
+ values[ 1 ] = weightThen;
+
+ return this;
+
+ }
+
+}
+
+class AnimationMixer extends EventDispatcher {
+
+ constructor( root ) {
+
+ super();
+
+ this._root = root;
+ this._initMemoryManager();
+ this._accuIndex = 0;
+ this.time = 0;
+ this.timeScale = 1.0;
+
+ }
+
+ _bindAction( action, prototypeAction ) {
+
+ const root = action._localRoot || this._root,
+ tracks = action._clip.tracks,
+ nTracks = tracks.length,
+ bindings = action._propertyBindings,
+ interpolants = action._interpolants,
+ rootUuid = root.uuid,
+ bindingsByRoot = this._bindingsByRootAndName;
+
+ let bindingsByName = bindingsByRoot[ rootUuid ];
+
+ if ( bindingsByName === undefined ) {
+
+ bindingsByName = {};
+ bindingsByRoot[ rootUuid ] = bindingsByName;
+
+ }
+
+ for ( let i = 0; i !== nTracks; ++ i ) {
+
+ const track = tracks[ i ],
+ trackName = track.name;
+
+ let binding = bindingsByName[ trackName ];
+
+ if ( binding !== undefined ) {
+
+ ++ binding.referenceCount;
+ bindings[ i ] = binding;
+
+ } else {
+
+ binding = bindings[ i ];
+
+ if ( binding !== undefined ) {
+
+ // existing binding, make sure the cache knows
+
+ if ( binding._cacheIndex === null ) {
+
+ ++ binding.referenceCount;
+ this._addInactiveBinding( binding, rootUuid, trackName );
+
+ }
+
+ continue;
+
+ }
+
+ const path = prototypeAction && prototypeAction.
+ _propertyBindings[ i ].binding.parsedPath;
+
+ binding = new PropertyMixer(
+ PropertyBinding.create( root, trackName, path ),
+ track.ValueTypeName, track.getValueSize() );
+
+ ++ binding.referenceCount;
+ this._addInactiveBinding( binding, rootUuid, trackName );
+
+ bindings[ i ] = binding;
+
+ }
+
+ interpolants[ i ].resultBuffer = binding.buffer;
+
+ }
+
+ }
+
+ _activateAction( action ) {
+
+ if ( ! this._isActiveAction( action ) ) {
+
+ if ( action._cacheIndex === null ) {
+
+ // this action has been forgotten by the cache, but the user
+ // appears to be still using it -> rebind
+
+ const rootUuid = ( action._localRoot || this._root ).uuid,
+ clipUuid = action._clip.uuid,
+ actionsForClip = this._actionsByClip[ clipUuid ];
+
+ this._bindAction( action,
+ actionsForClip && actionsForClip.knownActions[ 0 ] );
+
+ this._addInactiveAction( action, clipUuid, rootUuid );
+
+ }
+
+ const bindings = action._propertyBindings;
+
+ // increment reference counts / sort out state
+ for ( let i = 0, n = bindings.length; i !== n; ++ i ) {
+
+ const binding = bindings[ i ];
+
+ if ( binding.useCount ++ === 0 ) {
+
+ this._lendBinding( binding );
+ binding.saveOriginalState();
+
+ }
+
+ }
+
+ this._lendAction( action );
+
+ }
+
+ }
+
+ _deactivateAction( action ) {
+
+ if ( this._isActiveAction( action ) ) {
+
+ const bindings = action._propertyBindings;
+
+ // decrement reference counts / sort out state
+ for ( let i = 0, n = bindings.length; i !== n; ++ i ) {
+
+ const binding = bindings[ i ];
+
+ if ( -- binding.useCount === 0 ) {
+
+ binding.restoreOriginalState();
+ this._takeBackBinding( binding );
+
+ }
+
+ }
+
+ this._takeBackAction( action );
+
+ }
+
+ }
+
+ // Memory manager
+
+ _initMemoryManager() {
+
+ this._actions = []; // 'nActiveActions' followed by inactive ones
+ this._nActiveActions = 0;
+
+ this._actionsByClip = {};
+ // inside:
+ // {
+ // knownActions: Array< AnimationAction > - used as prototypes
+ // actionByRoot: AnimationAction - lookup
+ // }
+
+
+ this._bindings = []; // 'nActiveBindings' followed by inactive ones
+ this._nActiveBindings = 0;
+
+ this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >
+
+
+ this._controlInterpolants = []; // same game as above
+ this._nActiveControlInterpolants = 0;
+
+ const scope = this;
+
+ this.stats = {
+
+ actions: {
+ get total() {
+
+ return scope._actions.length;
+
+ },
+ get inUse() {
+
+ return scope._nActiveActions;
+
+ }
+ },
+ bindings: {
+ get total() {
+
+ return scope._bindings.length;
+
+ },
+ get inUse() {
+
+ return scope._nActiveBindings;
+
+ }
+ },
+ controlInterpolants: {
+ get total() {
+
+ return scope._controlInterpolants.length;
+
+ },
+ get inUse() {
+
+ return scope._nActiveControlInterpolants;
+
+ }
+ }
+
+ };
+
+ }
+
+ // Memory management for AnimationAction objects
+
+ _isActiveAction( action ) {
+
+ const index = action._cacheIndex;
+ return index !== null && index < this._nActiveActions;
+
+ }
+
+ _addInactiveAction( action, clipUuid, rootUuid ) {
+
+ const actions = this._actions,
+ actionsByClip = this._actionsByClip;
+
+ let actionsForClip = actionsByClip[ clipUuid ];
+
+ if ( actionsForClip === undefined ) {
+
+ actionsForClip = {
+
+ knownActions: [ action ],
+ actionByRoot: {}
+
+ };
+
+ action._byClipCacheIndex = 0;
+
+ actionsByClip[ clipUuid ] = actionsForClip;
+
+ } else {
+
+ const knownActions = actionsForClip.knownActions;
+
+ action._byClipCacheIndex = knownActions.length;
+ knownActions.push( action );
+
+ }
+
+ action._cacheIndex = actions.length;
+ actions.push( action );
+
+ actionsForClip.actionByRoot[ rootUuid ] = action;
+
+ }
+
+ _removeInactiveAction( action ) {
+
+ const actions = this._actions,
+ lastInactiveAction = actions[ actions.length - 1 ],
+ cacheIndex = action._cacheIndex;
+
+ lastInactiveAction._cacheIndex = cacheIndex;
+ actions[ cacheIndex ] = lastInactiveAction;
+ actions.pop();
+
+ action._cacheIndex = null;
+
+
+ const clipUuid = action._clip.uuid,
+ actionsByClip = this._actionsByClip,
+ actionsForClip = actionsByClip[ clipUuid ],
+ knownActionsForClip = actionsForClip.knownActions,
+
+ lastKnownAction =
+ knownActionsForClip[ knownActionsForClip.length - 1 ],
+
+ byClipCacheIndex = action._byClipCacheIndex;
+
+ lastKnownAction._byClipCacheIndex = byClipCacheIndex;
+ knownActionsForClip[ byClipCacheIndex ] = lastKnownAction;
+ knownActionsForClip.pop();
+
+ action._byClipCacheIndex = null;
+
+
+ const actionByRoot = actionsForClip.actionByRoot,
+ rootUuid = ( action._localRoot || this._root ).uuid;
+
+ delete actionByRoot[ rootUuid ];
+
+ if ( knownActionsForClip.length === 0 ) {
+
+ delete actionsByClip[ clipUuid ];
+
+ }
+
+ this._removeInactiveBindingsForAction( action );
+
+ }
+
+ _removeInactiveBindingsForAction( action ) {
+
+ const bindings = action._propertyBindings;
+
+ for ( let i = 0, n = bindings.length; i !== n; ++ i ) {
+
+ const binding = bindings[ i ];
+
+ if ( -- binding.referenceCount === 0 ) {
+
+ this._removeInactiveBinding( binding );
+
+ }
+
+ }
+
+ }
+
+ _lendAction( action ) {
+
+ // [ active actions | inactive actions ]
+ // [ active actions >| inactive actions ]
+ // s a
+ // <-swap->
+ // a s
+
+ const actions = this._actions,
+ prevIndex = action._cacheIndex,
+
+ lastActiveIndex = this._nActiveActions ++,
+
+ firstInactiveAction = actions[ lastActiveIndex ];
+
+ action._cacheIndex = lastActiveIndex;
+ actions[ lastActiveIndex ] = action;
+
+ firstInactiveAction._cacheIndex = prevIndex;
+ actions[ prevIndex ] = firstInactiveAction;
+
+ }
+
+ _takeBackAction( action ) {
+
+ // [ active actions | inactive actions ]
+ // [ active actions |< inactive actions ]
+ // a s
+ // <-swap->
+ // s a
+
+ const actions = this._actions,
+ prevIndex = action._cacheIndex,
+
+ firstInactiveIndex = -- this._nActiveActions,
+
+ lastActiveAction = actions[ firstInactiveIndex ];
+
+ action._cacheIndex = firstInactiveIndex;
+ actions[ firstInactiveIndex ] = action;
+
+ lastActiveAction._cacheIndex = prevIndex;
+ actions[ prevIndex ] = lastActiveAction;
+
+ }
+
+ // Memory management for PropertyMixer objects
+
+ _addInactiveBinding( binding, rootUuid, trackName ) {
+
+ const bindingsByRoot = this._bindingsByRootAndName,
+ bindings = this._bindings;
+
+ let bindingByName = bindingsByRoot[ rootUuid ];
+
+ if ( bindingByName === undefined ) {
+
+ bindingByName = {};
+ bindingsByRoot[ rootUuid ] = bindingByName;
+
+ }
+
+ bindingByName[ trackName ] = binding;
+
+ binding._cacheIndex = bindings.length;
+ bindings.push( binding );
+
+ }
+
+ _removeInactiveBinding( binding ) {
+
+ const bindings = this._bindings,
+ propBinding = binding.binding,
+ rootUuid = propBinding.rootNode.uuid,
+ trackName = propBinding.path,
+ bindingsByRoot = this._bindingsByRootAndName,
+ bindingByName = bindingsByRoot[ rootUuid ],
+
+ lastInactiveBinding = bindings[ bindings.length - 1 ],
+ cacheIndex = binding._cacheIndex;
+
+ lastInactiveBinding._cacheIndex = cacheIndex;
+ bindings[ cacheIndex ] = lastInactiveBinding;
+ bindings.pop();
+
+ delete bindingByName[ trackName ];
+
+ if ( Object.keys( bindingByName ).length === 0 ) {
+
+ delete bindingsByRoot[ rootUuid ];
+
+ }
+
+ }
+
+ _lendBinding( binding ) {
+
+ const bindings = this._bindings,
+ prevIndex = binding._cacheIndex,
+
+ lastActiveIndex = this._nActiveBindings ++,
+
+ firstInactiveBinding = bindings[ lastActiveIndex ];
+
+ binding._cacheIndex = lastActiveIndex;
+ bindings[ lastActiveIndex ] = binding;
+
+ firstInactiveBinding._cacheIndex = prevIndex;
+ bindings[ prevIndex ] = firstInactiveBinding;
+
+ }
+
+ _takeBackBinding( binding ) {
+
+ const bindings = this._bindings,
+ prevIndex = binding._cacheIndex,
+
+ firstInactiveIndex = -- this._nActiveBindings,
+
+ lastActiveBinding = bindings[ firstInactiveIndex ];
+
+ binding._cacheIndex = firstInactiveIndex;
+ bindings[ firstInactiveIndex ] = binding;
+
+ lastActiveBinding._cacheIndex = prevIndex;
+ bindings[ prevIndex ] = lastActiveBinding;
+
+ }
+
+
+ // Memory management of Interpolants for weight and time scale
+
+ _lendControlInterpolant() {
+
+ const interpolants = this._controlInterpolants,
+ lastActiveIndex = this._nActiveControlInterpolants ++;
+
+ let interpolant = interpolants[ lastActiveIndex ];
+
+ if ( interpolant === undefined ) {
+
+ interpolant = new LinearInterpolant(
+ new Float32Array( 2 ), new Float32Array( 2 ),
+ 1, this._controlInterpolantsResultBuffer );
+
+ interpolant.__cacheIndex = lastActiveIndex;
+ interpolants[ lastActiveIndex ] = interpolant;
+
+ }
+
+ return interpolant;
+
+ }
+
+ _takeBackControlInterpolant( interpolant ) {
+
+ const interpolants = this._controlInterpolants,
+ prevIndex = interpolant.__cacheIndex,
+
+ firstInactiveIndex = -- this._nActiveControlInterpolants,
+
+ lastActiveInterpolant = interpolants[ firstInactiveIndex ];
+
+ interpolant.__cacheIndex = firstInactiveIndex;
+ interpolants[ firstInactiveIndex ] = interpolant;
+
+ lastActiveInterpolant.__cacheIndex = prevIndex;
+ interpolants[ prevIndex ] = lastActiveInterpolant;
+
+ }
+
+ // return an action for a clip optionally using a custom root target
+ // object (this method allocates a lot of dynamic memory in case a
+ // previously unknown clip/root combination is specified)
+ clipAction( clip, optionalRoot, blendMode ) {
+
+ const root = optionalRoot || this._root,
+ rootUuid = root.uuid;
+
+ let clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;
+
+ const clipUuid = clipObject !== null ? clipObject.uuid : clip;
+
+ const actionsForClip = this._actionsByClip[ clipUuid ];
+ let prototypeAction = null;
+
+ if ( blendMode === undefined ) {
+
+ if ( clipObject !== null ) {
+
+ blendMode = clipObject.blendMode;
+
+ } else {
+
+ blendMode = NormalAnimationBlendMode;
+
+ }
+
+ }
+
+ if ( actionsForClip !== undefined ) {
+
+ const existingAction = actionsForClip.actionByRoot[ rootUuid ];
+
+ if ( existingAction !== undefined && existingAction.blendMode === blendMode ) {
+
+ return existingAction;
+
+ }
+
+ // we know the clip, so we don't have to parse all
+ // the bindings again but can just copy
+ prototypeAction = actionsForClip.knownActions[ 0 ];
+
+ // also, take the clip from the prototype action
+ if ( clipObject === null )
+ clipObject = prototypeAction._clip;
+
+ }
+
+ // clip must be known when specified via string
+ if ( clipObject === null ) return null;
+
+ // allocate all resources required to run it
+ const newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );
+
+ this._bindAction( newAction, prototypeAction );
+
+ // and make the action known to the memory manager
+ this._addInactiveAction( newAction, clipUuid, rootUuid );
+
+ return newAction;
+
+ }
+
+ // get an existing action
+ existingAction( clip, optionalRoot ) {
+
+ const root = optionalRoot || this._root,
+ rootUuid = root.uuid,
+
+ clipObject = typeof clip === 'string' ?
+ AnimationClip.findByName( root, clip ) : clip,
+
+ clipUuid = clipObject ? clipObject.uuid : clip,
+
+ actionsForClip = this._actionsByClip[ clipUuid ];
+
+ if ( actionsForClip !== undefined ) {
+
+ return actionsForClip.actionByRoot[ rootUuid ] || null;
+
+ }
+
+ return null;
+
+ }
+
+ // deactivates all previously scheduled actions
+ stopAllAction() {
+
+ const actions = this._actions,
+ nActions = this._nActiveActions;
+
+ for ( let i = nActions - 1; i >= 0; -- i ) {
+
+ actions[ i ].stop();
+
+ }
+
+ return this;
+
+ }
+
+ // advance the time and update apply the animation
+ update( deltaTime ) {
+
+ deltaTime *= this.timeScale;
+
+ const actions = this._actions,
+ nActions = this._nActiveActions,
+
+ time = this.time += deltaTime,
+ timeDirection = Math.sign( deltaTime ),
+
+ accuIndex = this._accuIndex ^= 1;
+
+ // run active actions
+
+ for ( let i = 0; i !== nActions; ++ i ) {
+
+ const action = actions[ i ];
+
+ action._update( time, deltaTime, timeDirection, accuIndex );
+
+ }
+
+ // update scene graph
+
+ const bindings = this._bindings,
+ nBindings = this._nActiveBindings;
+
+ for ( let i = 0; i !== nBindings; ++ i ) {
+
+ bindings[ i ].apply( accuIndex );
+
+ }
+
+ return this;
+
+ }
+
+ // Allows you to seek to a specific time in an animation.
+ setTime( timeInSeconds ) {
+
+ this.time = 0; // Zero out time attribute for AnimationMixer object;
+ for ( let i = 0; i < this._actions.length; i ++ ) {
+
+ this._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.
+
+ }
+
+ return this.update( timeInSeconds ); // Update used to set exact time. Returns "this" AnimationMixer object.
+
+ }
+
+ // return this mixer's root target object
+ getRoot() {
+
+ return this._root;
+
+ }
+
+ // free all resources specific to a particular clip
+ uncacheClip( clip ) {
+
+ const actions = this._actions,
+ clipUuid = clip.uuid,
+ actionsByClip = this._actionsByClip,
+ actionsForClip = actionsByClip[ clipUuid ];
+
+ if ( actionsForClip !== undefined ) {
+
+ // note: just calling _removeInactiveAction would mess up the
+ // iteration state and also require updating the state we can
+ // just throw away
+
+ const actionsToRemove = actionsForClip.knownActions;
+
+ for ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {
+
+ const action = actionsToRemove[ i ];
+
+ this._deactivateAction( action );
+
+ const cacheIndex = action._cacheIndex,
+ lastInactiveAction = actions[ actions.length - 1 ];
+
+ action._cacheIndex = null;
+ action._byClipCacheIndex = null;
+
+ lastInactiveAction._cacheIndex = cacheIndex;
+ actions[ cacheIndex ] = lastInactiveAction;
+ actions.pop();
+
+ this._removeInactiveBindingsForAction( action );
+
+ }
+
+ delete actionsByClip[ clipUuid ];
+
+ }
+
+ }
+
+ // free all resources specific to a particular root target object
+ uncacheRoot( root ) {
+
+ const rootUuid = root.uuid,
+ actionsByClip = this._actionsByClip;
+
+ for ( const clipUuid in actionsByClip ) {
+
+ const actionByRoot = actionsByClip[ clipUuid ].actionByRoot,
+ action = actionByRoot[ rootUuid ];
+
+ if ( action !== undefined ) {
+
+ this._deactivateAction( action );
+ this._removeInactiveAction( action );
+
+ }
+
+ }
+
+ const bindingsByRoot = this._bindingsByRootAndName,
+ bindingByName = bindingsByRoot[ rootUuid ];
+
+ if ( bindingByName !== undefined ) {
+
+ for ( const trackName in bindingByName ) {
+
+ const binding = bindingByName[ trackName ];
+ binding.restoreOriginalState();
+ this._removeInactiveBinding( binding );
+
+ }
+
+ }
+
+ }
+
+ // remove a targeted clip from the cache
+ uncacheAction( clip, optionalRoot ) {
+
+ const action = this.existingAction( clip, optionalRoot );
+
+ if ( action !== null ) {
+
+ this._deactivateAction( action );
+ this._removeInactiveAction( action );
+
+ }
+
+ }
+
+}
+
+AnimationMixer.prototype._controlInterpolantsResultBuffer = new Float32Array( 1 );
+
+class Uniform {
+
+ constructor( value ) {
+
+ if ( typeof value === 'string' ) {
+
+ console.warn( 'THREE.Uniform: Type parameter is no longer needed.' );
+ value = arguments[ 1 ];
+
+ }
+
+ this.value = value;
+
+ }
+
+ clone() {
+
+ return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );
+
+ }
+
+}
+
+class InstancedInterleavedBuffer extends InterleavedBuffer {
+
+ constructor( array, stride, meshPerAttribute = 1 ) {
+
+ super( array, stride );
+
+ this.meshPerAttribute = meshPerAttribute;
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.meshPerAttribute = source.meshPerAttribute;
+
+ return this;
+
+ }
+
+ clone( data ) {
+
+ const ib = super.clone( data );
+
+ ib.meshPerAttribute = this.meshPerAttribute;
+
+ return ib;
+
+ }
+
+ toJSON( data ) {
+
+ const json = super.toJSON( data );
+
+ json.isInstancedInterleavedBuffer = true;
+ json.meshPerAttribute = this.meshPerAttribute;
+
+ return json;
+
+ }
+
+}
+
+InstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;
+
+class GLBufferAttribute {
+
+ constructor( buffer, type, itemSize, elementSize, count ) {
+
+ this.buffer = buffer;
+ this.type = type;
+ this.itemSize = itemSize;
+ this.elementSize = elementSize;
+ this.count = count;
+
+ this.version = 0;
+
+ }
+
+ set needsUpdate( value ) {
+
+ if ( value === true ) this.version ++;
+
+ }
+
+ setBuffer( buffer ) {
+
+ this.buffer = buffer;
+
+ return this;
+
+ }
+
+ setType( type, elementSize ) {
+
+ this.type = type;
+ this.elementSize = elementSize;
+
+ return this;
+
+ }
+
+ setItemSize( itemSize ) {
+
+ this.itemSize = itemSize;
+
+ return this;
+
+ }
+
+ setCount( count ) {
+
+ this.count = count;
+
+ return this;
+
+ }
+
+}
+
+GLBufferAttribute.prototype.isGLBufferAttribute = true;
+
+class Raycaster {
+
+ constructor( origin, direction, near = 0, far = Infinity ) {
+
+ this.ray = new Ray( origin, direction );
+ // direction is assumed to be normalized (for accurate distance calculations)
+
+ this.near = near;
+ this.far = far;
+ this.camera = null;
+ this.layers = new Layers();
+
+ this.params = {
+ Mesh: {},
+ Line: { threshold: 1 },
+ LOD: {},
+ Points: { threshold: 1 },
+ Sprite: {}
+ };
+
+ }
+
+ set( origin, direction ) {
+
+ // direction is assumed to be normalized (for accurate distance calculations)
+
+ this.ray.set( origin, direction );
+
+ }
+
+ setFromCamera( coords, camera ) {
+
+ if ( camera.isPerspectiveCamera ) {
+
+ this.ray.origin.setFromMatrixPosition( camera.matrixWorld );
+ this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();
+ this.camera = camera;
+
+ } else if ( camera.isOrthographicCamera ) {
+
+ this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera
+ this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );
+ this.camera = camera;
+
+ } else {
+
+ console.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type );
+
+ }
+
+ }
+
+ intersectObject( object, recursive = true, intersects = [] ) {
+
+ intersectObject( object, this, intersects, recursive );
+
+ intersects.sort( ascSort );
+
+ return intersects;
+
+ }
+
+ intersectObjects( objects, recursive = true, intersects = [] ) {
+
+ for ( let i = 0, l = objects.length; i < l; i ++ ) {
+
+ intersectObject( objects[ i ], this, intersects, recursive );
+
+ }
+
+ intersects.sort( ascSort );
+
+ return intersects;
+
+ }
+
+}
+
+function ascSort( a, b ) {
+
+ return a.distance - b.distance;
+
+}
+
+function intersectObject( object, raycaster, intersects, recursive ) {
+
+ if ( object.layers.test( raycaster.layers ) ) {
+
+ object.raycast( raycaster, intersects );
+
+ }
+
+ if ( recursive === true ) {
+
+ const children = object.children;
+
+ for ( let i = 0, l = children.length; i < l; i ++ ) {
+
+ intersectObject( children[ i ], raycaster, intersects, true );
+
+ }
+
+ }
+
+}
+
+/**
+ * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system
+ *
+ * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up.
+ * The azimuthal angle (theta) is measured from the positive z-axis.
+ */
+
+class Spherical {
+
+ constructor( radius = 1, phi = 0, theta = 0 ) {
+
+ this.radius = radius;
+ this.phi = phi; // polar angle
+ this.theta = theta; // azimuthal angle
+
+ return this;
+
+ }
+
+ set( radius, phi, theta ) {
+
+ this.radius = radius;
+ this.phi = phi;
+ this.theta = theta;
+
+ return this;
+
+ }
+
+ copy( other ) {
+
+ this.radius = other.radius;
+ this.phi = other.phi;
+ this.theta = other.theta;
+
+ return this;
+
+ }
+
+ // restrict phi to be betwee EPS and PI-EPS
+ makeSafe() {
+
+ const EPS = 0.000001;
+ this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );
+
+ return this;
+
+ }
+
+ setFromVector3( v ) {
+
+ return this.setFromCartesianCoords( v.x, v.y, v.z );
+
+ }
+
+ setFromCartesianCoords( x, y, z ) {
+
+ this.radius = Math.sqrt( x * x + y * y + z * z );
+
+ if ( this.radius === 0 ) {
+
+ this.theta = 0;
+ this.phi = 0;
+
+ } else {
+
+ this.theta = Math.atan2( x, z );
+ this.phi = Math.acos( clamp$1( y / this.radius, - 1, 1 ) );
+
+ }
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+}
+
+/**
+ * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system
+ */
+
+class Cylindrical {
+
+ constructor( radius = 1, theta = 0, y = 0 ) {
+
+ this.radius = radius; // distance from the origin to a point in the x-z plane
+ this.theta = theta; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis
+ this.y = y; // height above the x-z plane
+
+ return this;
+
+ }
+
+ set( radius, theta, y ) {
+
+ this.radius = radius;
+ this.theta = theta;
+ this.y = y;
+
+ return this;
+
+ }
+
+ copy( other ) {
+
+ this.radius = other.radius;
+ this.theta = other.theta;
+ this.y = other.y;
+
+ return this;
+
+ }
+
+ setFromVector3( v ) {
+
+ return this.setFromCartesianCoords( v.x, v.y, v.z );
+
+ }
+
+ setFromCartesianCoords( x, y, z ) {
+
+ this.radius = Math.sqrt( x * x + z * z );
+ this.theta = Math.atan2( x, z );
+ this.y = y;
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+}
+
+const _vector$4 = /*@__PURE__*/ new Vector2();
+
+class Box2 {
+
+ constructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {
+
+ this.min = min;
+ this.max = max;
+
+ }
+
+ set( min, max ) {
+
+ this.min.copy( min );
+ this.max.copy( max );
+
+ return this;
+
+ }
+
+ setFromPoints( points ) {
+
+ this.makeEmpty();
+
+ for ( let i = 0, il = points.length; i < il; i ++ ) {
+
+ this.expandByPoint( points[ i ] );
+
+ }
+
+ return this;
+
+ }
+
+ setFromCenterAndSize( center, size ) {
+
+ const halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );
+ this.min.copy( center ).sub( halfSize );
+ this.max.copy( center ).add( halfSize );
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ copy( box ) {
+
+ this.min.copy( box.min );
+ this.max.copy( box.max );
+
+ return this;
+
+ }
+
+ makeEmpty() {
+
+ this.min.x = this.min.y = + Infinity;
+ this.max.x = this.max.y = - Infinity;
+
+ return this;
+
+ }
+
+ isEmpty() {
+
+ // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
+
+ return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );
+
+ }
+
+ getCenter( target ) {
+
+ return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );
+
+ }
+
+ getSize( target ) {
+
+ return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );
+
+ }
+
+ expandByPoint( point ) {
+
+ this.min.min( point );
+ this.max.max( point );
+
+ return this;
+
+ }
+
+ expandByVector( vector ) {
+
+ this.min.sub( vector );
+ this.max.add( vector );
+
+ return this;
+
+ }
+
+ expandByScalar( scalar ) {
+
+ this.min.addScalar( - scalar );
+ this.max.addScalar( scalar );
+
+ return this;
+
+ }
+
+ containsPoint( point ) {
+
+ return point.x < this.min.x || point.x > this.max.x ||
+ point.y < this.min.y || point.y > this.max.y ? false : true;
+
+ }
+
+ containsBox( box ) {
+
+ return this.min.x <= box.min.x && box.max.x <= this.max.x &&
+ this.min.y <= box.min.y && box.max.y <= this.max.y;
+
+ }
+
+ getParameter( point, target ) {
+
+ // This can potentially have a divide by zero if the box
+ // has a size dimension of 0.
+
+ return target.set(
+ ( point.x - this.min.x ) / ( this.max.x - this.min.x ),
+ ( point.y - this.min.y ) / ( this.max.y - this.min.y )
+ );
+
+ }
+
+ intersectsBox( box ) {
+
+ // using 4 splitting planes to rule out intersections
+
+ return box.max.x < this.min.x || box.min.x > this.max.x ||
+ box.max.y < this.min.y || box.min.y > this.max.y ? false : true;
+
+ }
+
+ clampPoint( point, target ) {
+
+ return target.copy( point ).clamp( this.min, this.max );
+
+ }
+
+ distanceToPoint( point ) {
+
+ const clampedPoint = _vector$4.copy( point ).clamp( this.min, this.max );
+ return clampedPoint.sub( point ).length();
+
+ }
+
+ intersect( box ) {
+
+ this.min.max( box.min );
+ this.max.min( box.max );
+
+ return this;
+
+ }
+
+ union( box ) {
+
+ this.min.min( box.min );
+ this.max.max( box.max );
+
+ return this;
+
+ }
+
+ translate( offset ) {
+
+ this.min.add( offset );
+ this.max.add( offset );
+
+ return this;
+
+ }
+
+ equals( box ) {
+
+ return box.min.equals( this.min ) && box.max.equals( this.max );
+
+ }
+
+}
+
+Box2.prototype.isBox2 = true;
+
+const _startP = /*@__PURE__*/ new Vector3();
+const _startEnd = /*@__PURE__*/ new Vector3();
+
+class Line3 {
+
+ constructor( start = new Vector3(), end = new Vector3() ) {
+
+ this.start = start;
+ this.end = end;
+
+ }
+
+ set( start, end ) {
+
+ this.start.copy( start );
+ this.end.copy( end );
+
+ return this;
+
+ }
+
+ copy( line ) {
+
+ this.start.copy( line.start );
+ this.end.copy( line.end );
+
+ return this;
+
+ }
+
+ getCenter( target ) {
+
+ return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );
+
+ }
+
+ delta( target ) {
+
+ return target.subVectors( this.end, this.start );
+
+ }
+
+ distanceSq() {
+
+ return this.start.distanceToSquared( this.end );
+
+ }
+
+ distance() {
+
+ return this.start.distanceTo( this.end );
+
+ }
+
+ at( t, target ) {
+
+ return this.delta( target ).multiplyScalar( t ).add( this.start );
+
+ }
+
+ closestPointToPointParameter( point, clampToLine ) {
+
+ _startP.subVectors( point, this.start );
+ _startEnd.subVectors( this.end, this.start );
+
+ const startEnd2 = _startEnd.dot( _startEnd );
+ const startEnd_startP = _startEnd.dot( _startP );
+
+ let t = startEnd_startP / startEnd2;
+
+ if ( clampToLine ) {
+
+ t = clamp$1( t, 0, 1 );
+
+ }
+
+ return t;
+
+ }
+
+ closestPointToPoint( point, clampToLine, target ) {
+
+ const t = this.closestPointToPointParameter( point, clampToLine );
+
+ return this.delta( target ).multiplyScalar( t ).add( this.start );
+
+ }
+
+ applyMatrix4( matrix ) {
+
+ this.start.applyMatrix4( matrix );
+ this.end.applyMatrix4( matrix );
+
+ return this;
+
+ }
+
+ equals( line ) {
+
+ return line.start.equals( this.start ) && line.end.equals( this.end );
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+}
+
+const _vector$3 = /*@__PURE__*/ new Vector3();
+
+class SpotLightHelper extends Object3D {
+
+ constructor( light, color ) {
+
+ super();
+ this.light = light;
+ this.light.updateMatrixWorld();
+
+ this.matrix = light.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.color = color;
+
+ const geometry = new BufferGeometry();
+
+ const positions = [
+ 0, 0, 0, 0, 0, 1,
+ 0, 0, 0, 1, 0, 1,
+ 0, 0, 0, - 1, 0, 1,
+ 0, 0, 0, 0, 1, 1,
+ 0, 0, 0, 0, - 1, 1
+ ];
+
+ for ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {
+
+ const p1 = ( i / l ) * Math.PI * 2;
+ const p2 = ( j / l ) * Math.PI * 2;
+
+ positions.push(
+ Math.cos( p1 ), Math.sin( p1 ), 1,
+ Math.cos( p2 ), Math.sin( p2 ), 1
+ );
+
+ }
+
+ geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
+
+ const material = new LineBasicMaterial( { fog: false, toneMapped: false } );
+
+ this.cone = new LineSegments( geometry, material );
+ this.add( this.cone );
+
+ this.update();
+
+ }
+
+ dispose() {
+
+ this.cone.geometry.dispose();
+ this.cone.material.dispose();
+
+ }
+
+ update() {
+
+ this.light.updateMatrixWorld();
+
+ const coneLength = this.light.distance ? this.light.distance : 1000;
+ const coneWidth = coneLength * Math.tan( this.light.angle );
+
+ this.cone.scale.set( coneWidth, coneWidth, coneLength );
+
+ _vector$3.setFromMatrixPosition( this.light.target.matrixWorld );
+
+ this.cone.lookAt( _vector$3 );
+
+ if ( this.color !== undefined ) {
+
+ this.cone.material.color.set( this.color );
+
+ } else {
+
+ this.cone.material.color.copy( this.light.color );
+
+ }
+
+ }
+
+}
+
+const _vector$2 = /*@__PURE__*/ new Vector3();
+const _boneMatrix = /*@__PURE__*/ new Matrix4();
+const _matrixWorldInv = /*@__PURE__*/ new Matrix4();
+
+
+class SkeletonHelper extends LineSegments {
+
+ constructor( object ) {
+
+ const bones = getBoneList( object );
+
+ const geometry = new BufferGeometry();
+
+ const vertices = [];
+ const colors = [];
+
+ const color1 = new Color( 0, 0, 1 );
+ const color2 = new Color( 0, 1, 0 );
+
+ for ( let i = 0; i < bones.length; i ++ ) {
+
+ const bone = bones[ i ];
+
+ if ( bone.parent && bone.parent.isBone ) {
+
+ vertices.push( 0, 0, 0 );
+ vertices.push( 0, 0, 0 );
+ colors.push( color1.r, color1.g, color1.b );
+ colors.push( color2.r, color2.g, color2.b );
+
+ }
+
+ }
+
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ const material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );
+
+ super( geometry, material );
+
+ this.type = 'SkeletonHelper';
+ this.isSkeletonHelper = true;
+
+ this.root = object;
+ this.bones = bones;
+
+ this.matrix = object.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ const bones = this.bones;
+
+ const geometry = this.geometry;
+ const position = geometry.getAttribute( 'position' );
+
+ _matrixWorldInv.copy( this.root.matrixWorld ).invert();
+
+ for ( let i = 0, j = 0; i < bones.length; i ++ ) {
+
+ const bone = bones[ i ];
+
+ if ( bone.parent && bone.parent.isBone ) {
+
+ _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );
+ _vector$2.setFromMatrixPosition( _boneMatrix );
+ position.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );
+
+ _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );
+ _vector$2.setFromMatrixPosition( _boneMatrix );
+ position.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );
+
+ j += 2;
+
+ }
+
+ }
+
+ geometry.getAttribute( 'position' ).needsUpdate = true;
+
+ super.updateMatrixWorld( force );
+
+ }
+
+}
+
+
+function getBoneList( object ) {
+
+ const boneList = [];
+
+ if ( object.isBone === true ) {
+
+ boneList.push( object );
+
+ }
+
+ for ( let i = 0; i < object.children.length; i ++ ) {
+
+ boneList.push.apply( boneList, getBoneList( object.children[ i ] ) );
+
+ }
+
+ return boneList;
+
+}
+
+class PointLightHelper extends Mesh {
+
+ constructor( light, sphereSize, color ) {
+
+ const geometry = new SphereGeometry( sphereSize, 4, 2 );
+ const material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );
+
+ super( geometry, material );
+
+ this.light = light;
+ this.light.updateMatrixWorld();
+
+ this.color = color;
+
+ this.type = 'PointLightHelper';
+
+ this.matrix = this.light.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.update();
+
+
+ /*
+ // TODO: delete this comment?
+ const distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );
+ const distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );
+
+ this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );
+ this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );
+
+ const d = light.distance;
+
+ if ( d === 0.0 ) {
+
+ this.lightDistance.visible = false;
+
+ } else {
+
+ this.lightDistance.scale.set( d, d, d );
+
+ }
+
+ this.add( this.lightDistance );
+ */
+
+ }
+
+ dispose() {
+
+ this.geometry.dispose();
+ this.material.dispose();
+
+ }
+
+ update() {
+
+ if ( this.color !== undefined ) {
+
+ this.material.color.set( this.color );
+
+ } else {
+
+ this.material.color.copy( this.light.color );
+
+ }
+
+ /*
+ const d = this.light.distance;
+
+ if ( d === 0.0 ) {
+
+ this.lightDistance.visible = false;
+
+ } else {
+
+ this.lightDistance.visible = true;
+ this.lightDistance.scale.set( d, d, d );
+
+ }
+ */
+
+ }
+
+}
+
+const _vector$1 = /*@__PURE__*/ new Vector3();
+const _color1 = /*@__PURE__*/ new Color();
+const _color2 = /*@__PURE__*/ new Color();
+
+class HemisphereLightHelper extends Object3D {
+
+ constructor( light, size, color ) {
+
+ super();
+ this.light = light;
+ this.light.updateMatrixWorld();
+
+ this.matrix = light.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.color = color;
+
+ const geometry = new OctahedronGeometry( size );
+ geometry.rotateY( Math.PI * 0.5 );
+
+ this.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );
+ if ( this.color === undefined ) this.material.vertexColors = true;
+
+ const position = geometry.getAttribute( 'position' );
+ const colors = new Float32Array( position.count * 3 );
+
+ geometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );
+
+ this.add( new Mesh( geometry, this.material ) );
+
+ this.update();
+
+ }
+
+ dispose() {
+
+ this.children[ 0 ].geometry.dispose();
+ this.children[ 0 ].material.dispose();
+
+ }
+
+ update() {
+
+ const mesh = this.children[ 0 ];
+
+ if ( this.color !== undefined ) {
+
+ this.material.color.set( this.color );
+
+ } else {
+
+ const colors = mesh.geometry.getAttribute( 'color' );
+
+ _color1.copy( this.light.color );
+ _color2.copy( this.light.groundColor );
+
+ for ( let i = 0, l = colors.count; i < l; i ++ ) {
+
+ const color = ( i < ( l / 2 ) ) ? _color1 : _color2;
+
+ colors.setXYZ( i, color.r, color.g, color.b );
+
+ }
+
+ colors.needsUpdate = true;
+
+ }
+
+ mesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );
+
+ }
+
+}
+
+class GridHelper extends LineSegments {
+
+ constructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {
+
+ color1 = new Color( color1 );
+ color2 = new Color( color2 );
+
+ const center = divisions / 2;
+ const step = size / divisions;
+ const halfSize = size / 2;
+
+ const vertices = [], colors = [];
+
+ for ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {
+
+ vertices.push( - halfSize, 0, k, halfSize, 0, k );
+ vertices.push( k, 0, - halfSize, k, 0, halfSize );
+
+ const color = i === center ? color1 : color2;
+
+ color.toArray( colors, j ); j += 3;
+ color.toArray( colors, j ); j += 3;
+ color.toArray( colors, j ); j += 3;
+ color.toArray( colors, j ); j += 3;
+
+ }
+
+ const geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );
+
+ super( geometry, material );
+
+ this.type = 'GridHelper';
+
+ }
+
+}
+
+class PolarGridHelper extends LineSegments {
+
+ constructor( radius = 10, radials = 16, circles = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {
+
+ color1 = new Color( color1 );
+ color2 = new Color( color2 );
+
+ const vertices = [];
+ const colors = [];
+
+ // create the radials
+
+ for ( let i = 0; i <= radials; i ++ ) {
+
+ const v = ( i / radials ) * ( Math.PI * 2 );
+
+ const x = Math.sin( v ) * radius;
+ const z = Math.cos( v ) * radius;
+
+ vertices.push( 0, 0, 0 );
+ vertices.push( x, 0, z );
+
+ const color = ( i & 1 ) ? color1 : color2;
+
+ colors.push( color.r, color.g, color.b );
+ colors.push( color.r, color.g, color.b );
+
+ }
+
+ // create the circles
+
+ for ( let i = 0; i <= circles; i ++ ) {
+
+ const color = ( i & 1 ) ? color1 : color2;
+
+ const r = radius - ( radius / circles * i );
+
+ for ( let j = 0; j < divisions; j ++ ) {
+
+ // first vertex
+
+ let v = ( j / divisions ) * ( Math.PI * 2 );
+
+ let x = Math.sin( v ) * r;
+ let z = Math.cos( v ) * r;
+
+ vertices.push( x, 0, z );
+ colors.push( color.r, color.g, color.b );
+
+ // second vertex
+
+ v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );
+
+ x = Math.sin( v ) * r;
+ z = Math.cos( v ) * r;
+
+ vertices.push( x, 0, z );
+ colors.push( color.r, color.g, color.b );
+
+ }
+
+ }
+
+ const geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );
+
+ super( geometry, material );
+
+ this.type = 'PolarGridHelper';
+
+ }
+
+}
+
+const _v1 = /*@__PURE__*/ new Vector3();
+const _v2 = /*@__PURE__*/ new Vector3();
+const _v3 = /*@__PURE__*/ new Vector3();
+
+class DirectionalLightHelper extends Object3D {
+
+ constructor( light, size, color ) {
+
+ super();
+ this.light = light;
+ this.light.updateMatrixWorld();
+
+ this.matrix = light.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.color = color;
+
+ if ( size === undefined ) size = 1;
+
+ let geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( [
+ - size, size, 0,
+ size, size, 0,
+ size, - size, 0,
+ - size, - size, 0,
+ - size, size, 0
+ ], 3 ) );
+
+ const material = new LineBasicMaterial( { fog: false, toneMapped: false } );
+
+ this.lightPlane = new Line( geometry, material );
+ this.add( this.lightPlane );
+
+ geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );
+
+ this.targetLine = new Line( geometry, material );
+ this.add( this.targetLine );
+
+ this.update();
+
+ }
+
+ dispose() {
+
+ this.lightPlane.geometry.dispose();
+ this.lightPlane.material.dispose();
+ this.targetLine.geometry.dispose();
+ this.targetLine.material.dispose();
+
+ }
+
+ update() {
+
+ _v1.setFromMatrixPosition( this.light.matrixWorld );
+ _v2.setFromMatrixPosition( this.light.target.matrixWorld );
+ _v3.subVectors( _v2, _v1 );
+
+ this.lightPlane.lookAt( _v2 );
+
+ if ( this.color !== undefined ) {
+
+ this.lightPlane.material.color.set( this.color );
+ this.targetLine.material.color.set( this.color );
+
+ } else {
+
+ this.lightPlane.material.color.copy( this.light.color );
+ this.targetLine.material.color.copy( this.light.color );
+
+ }
+
+ this.targetLine.lookAt( _v2 );
+ this.targetLine.scale.z = _v3.length();
+
+ }
+
+}
+
+const _vector = /*@__PURE__*/ new Vector3();
+const _camera = /*@__PURE__*/ new Camera();
+
+/**
+ * - shows frustum, line of sight and up of the camera
+ * - suitable for fast updates
+ * - based on frustum visualization in lightgl.js shadowmap example
+ * https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html
+ */
+
+class CameraHelper extends LineSegments {
+
+ constructor( camera ) {
+
+ const geometry = new BufferGeometry();
+ const material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );
+
+ const vertices = [];
+ const colors = [];
+
+ const pointMap = {};
+
+ // colors
+
+ const colorFrustum = new Color( 0xffaa00 );
+ const colorCone = new Color( 0xff0000 );
+ const colorUp = new Color( 0x00aaff );
+ const colorTarget = new Color( 0xffffff );
+ const colorCross = new Color( 0x333333 );
+
+ // near
+
+ addLine( 'n1', 'n2', colorFrustum );
+ addLine( 'n2', 'n4', colorFrustum );
+ addLine( 'n4', 'n3', colorFrustum );
+ addLine( 'n3', 'n1', colorFrustum );
+
+ // far
+
+ addLine( 'f1', 'f2', colorFrustum );
+ addLine( 'f2', 'f4', colorFrustum );
+ addLine( 'f4', 'f3', colorFrustum );
+ addLine( 'f3', 'f1', colorFrustum );
+
+ // sides
+
+ addLine( 'n1', 'f1', colorFrustum );
+ addLine( 'n2', 'f2', colorFrustum );
+ addLine( 'n3', 'f3', colorFrustum );
+ addLine( 'n4', 'f4', colorFrustum );
+
+ // cone
+
+ addLine( 'p', 'n1', colorCone );
+ addLine( 'p', 'n2', colorCone );
+ addLine( 'p', 'n3', colorCone );
+ addLine( 'p', 'n4', colorCone );
+
+ // up
+
+ addLine( 'u1', 'u2', colorUp );
+ addLine( 'u2', 'u3', colorUp );
+ addLine( 'u3', 'u1', colorUp );
+
+ // target
+
+ addLine( 'c', 't', colorTarget );
+ addLine( 'p', 'c', colorCross );
+
+ // cross
+
+ addLine( 'cn1', 'cn2', colorCross );
+ addLine( 'cn3', 'cn4', colorCross );
+
+ addLine( 'cf1', 'cf2', colorCross );
+ addLine( 'cf3', 'cf4', colorCross );
+
+ function addLine( a, b, color ) {
+
+ addPoint( a, color );
+ addPoint( b, color );
+
+ }
+
+ function addPoint( id, color ) {
+
+ vertices.push( 0, 0, 0 );
+ colors.push( color.r, color.g, color.b );
+
+ if ( pointMap[ id ] === undefined ) {
+
+ pointMap[ id ] = [];
+
+ }
+
+ pointMap[ id ].push( ( vertices.length / 3 ) - 1 );
+
+ }
+
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ super( geometry, material );
+
+ this.type = 'CameraHelper';
+
+ this.camera = camera;
+ if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();
+
+ this.matrix = camera.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.pointMap = pointMap;
+
+ this.update();
+
+ }
+
+ update() {
+
+ const geometry = this.geometry;
+ const pointMap = this.pointMap;
+
+ const w = 1, h = 1;
+
+ // we need just camera projection matrix inverse
+ // world matrix must be identity
+
+ _camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );
+
+ // center / target
+
+ setPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 );
+ setPoint( 't', pointMap, geometry, _camera, 0, 0, 1 );
+
+ // near
+
+ setPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 );
+ setPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 );
+ setPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 );
+ setPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 );
+
+ // far
+
+ setPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 );
+ setPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 );
+ setPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 );
+ setPoint( 'f4', pointMap, geometry, _camera, w, h, 1 );
+
+ // up
+
+ setPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 );
+ setPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 );
+ setPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 );
+
+ // cross
+
+ setPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 );
+ setPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 );
+ setPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 );
+ setPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 );
+
+ setPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 );
+ setPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 );
+ setPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 );
+ setPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 );
+
+ geometry.getAttribute( 'position' ).needsUpdate = true;
+
+ }
+
+ dispose() {
+
+ this.geometry.dispose();
+ this.material.dispose();
+
+ }
+
+}
+
+
+function setPoint( point, pointMap, geometry, camera, x, y, z ) {
+
+ _vector.set( x, y, z ).unproject( camera );
+
+ const points = pointMap[ point ];
+
+ if ( points !== undefined ) {
+
+ const position = geometry.getAttribute( 'position' );
+
+ for ( let i = 0, l = points.length; i < l; i ++ ) {
+
+ position.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );
+
+ }
+
+ }
+
+}
+
+const _box = /*@__PURE__*/ new Box3();
+
+class BoxHelper extends LineSegments {
+
+ constructor( object, color = 0xffff00 ) {
+
+ const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );
+ const positions = new Float32Array( 8 * 3 );
+
+ const geometry = new BufferGeometry();
+ geometry.setIndex( new BufferAttribute( indices, 1 ) );
+ geometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );
+
+ super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
+
+ this.object = object;
+ this.type = 'BoxHelper';
+
+ this.matrixAutoUpdate = false;
+
+ this.update();
+
+ }
+
+ update( object ) {
+
+ if ( object !== undefined ) {
+
+ console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );
+
+ }
+
+ if ( this.object !== undefined ) {
+
+ _box.setFromObject( this.object );
+
+ }
+
+ if ( _box.isEmpty() ) return;
+
+ const min = _box.min;
+ const max = _box.max;
+
+ /*
+ 5____4
+ 1/___0/|
+ | 6__|_7
+ 2/___3/
+
+ 0: max.x, max.y, max.z
+ 1: min.x, max.y, max.z
+ 2: min.x, min.y, max.z
+ 3: max.x, min.y, max.z
+ 4: max.x, max.y, min.z
+ 5: min.x, max.y, min.z
+ 6: min.x, min.y, min.z
+ 7: max.x, min.y, min.z
+ */
+
+ const position = this.geometry.attributes.position;
+ const array = position.array;
+
+ array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;
+ array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;
+ array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;
+ array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;
+ array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;
+ array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;
+ array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;
+ array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;
+
+ position.needsUpdate = true;
+
+ this.geometry.computeBoundingSphere();
+
+
+ }
+
+ setFromObject( object ) {
+
+ this.object = object;
+ this.update();
+
+ return this;
+
+ }
+
+ copy( source ) {
+
+ LineSegments.prototype.copy.call( this, source );
+
+ this.object = source.object;
+
+ return this;
+
+ }
+
+}
+
+class Box3Helper extends LineSegments {
+
+ constructor( box, color = 0xffff00 ) {
+
+ const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );
+
+ const positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];
+
+ const geometry = new BufferGeometry();
+
+ geometry.setIndex( new BufferAttribute( indices, 1 ) );
+
+ geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
+
+ super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
+
+ this.box = box;
+
+ this.type = 'Box3Helper';
+
+ this.geometry.computeBoundingSphere();
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ const box = this.box;
+
+ if ( box.isEmpty() ) return;
+
+ box.getCenter( this.position );
+
+ box.getSize( this.scale );
+
+ this.scale.multiplyScalar( 0.5 );
+
+ super.updateMatrixWorld( force );
+
+ }
+
+}
+
+class PlaneHelper extends Line {
+
+ constructor( plane, size = 1, hex = 0xffff00 ) {
+
+ const color = hex;
+
+ const positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ];
+
+ const geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
+ geometry.computeBoundingSphere();
+
+ super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
+
+ this.type = 'PlaneHelper';
+
+ this.plane = plane;
+
+ this.size = size;
+
+ const positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];
+
+ const geometry2 = new BufferGeometry();
+ geometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );
+ geometry2.computeBoundingSphere();
+
+ this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ let scale = - this.plane.constant;
+
+ if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter
+
+ this.scale.set( 0.5 * this.size, 0.5 * this.size, scale );
+
+ this.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here
+
+ this.lookAt( this.plane.normal );
+
+ super.updateMatrixWorld( force );
+
+ }
+
+}
+
+const _axis = /*@__PURE__*/ new Vector3();
+let _lineGeometry, _coneGeometry;
+
+class ArrowHelper extends Object3D {
+
+ // dir is assumed to be normalized
+
+ constructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {
+
+ super();
+
+ this.type = 'ArrowHelper';
+
+ if ( _lineGeometry === undefined ) {
+
+ _lineGeometry = new BufferGeometry();
+ _lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );
+
+ _coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 );
+ _coneGeometry.translate( 0, - 0.5, 0 );
+
+ }
+
+ this.position.copy( origin );
+
+ this.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
+ this.line.matrixAutoUpdate = false;
+ this.add( this.line );
+
+ this.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );
+ this.cone.matrixAutoUpdate = false;
+ this.add( this.cone );
+
+ this.setDirection( dir );
+ this.setLength( length, headLength, headWidth );
+
+ }
+
+ setDirection( dir ) {
+
+ // dir is assumed to be normalized
+
+ if ( dir.y > 0.99999 ) {
+
+ this.quaternion.set( 0, 0, 0, 1 );
+
+ } else if ( dir.y < - 0.99999 ) {
+
+ this.quaternion.set( 1, 0, 0, 0 );
+
+ } else {
+
+ _axis.set( dir.z, 0, - dir.x ).normalize();
+
+ const radians = Math.acos( dir.y );
+
+ this.quaternion.setFromAxisAngle( _axis, radians );
+
+ }
+
+ }
+
+ setLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {
+
+ this.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458
+ this.line.updateMatrix();
+
+ this.cone.scale.set( headWidth, headLength, headWidth );
+ this.cone.position.y = length;
+ this.cone.updateMatrix();
+
+ }
+
+ setColor( color ) {
+
+ this.line.material.color.set( color );
+ this.cone.material.color.set( color );
+
+ }
+
+ copy( source ) {
+
+ super.copy( source, false );
+
+ this.line.copy( source.line );
+ this.cone.copy( source.cone );
+
+ return this;
+
+ }
+
+}
+
+class AxesHelper extends LineSegments {
+
+ constructor( size = 1 ) {
+
+ const vertices = [
+ 0, 0, 0, size, 0, 0,
+ 0, 0, 0, 0, size, 0,
+ 0, 0, 0, 0, 0, size
+ ];
+
+ const colors = [
+ 1, 0, 0, 1, 0.6, 0,
+ 0, 1, 0, 0.6, 1, 0,
+ 0, 0, 1, 0, 0.6, 1
+ ];
+
+ const geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );
+
+ super( geometry, material );
+
+ this.type = 'AxesHelper';
+
+ }
+
+ setColors( xAxisColor, yAxisColor, zAxisColor ) {
+
+ const color = new Color();
+ const array = this.geometry.attributes.color.array;
+
+ color.set( xAxisColor );
+ color.toArray( array, 0 );
+ color.toArray( array, 3 );
+
+ color.set( yAxisColor );
+ color.toArray( array, 6 );
+ color.toArray( array, 9 );
+
+ color.set( zAxisColor );
+ color.toArray( array, 12 );
+ color.toArray( array, 15 );
+
+ this.geometry.attributes.color.needsUpdate = true;
+
+ return this;
+
+ }
+
+ dispose() {
+
+ this.geometry.dispose();
+ this.material.dispose();
+
+ }
+
+}
+
+class ShapePath {
+
+ constructor() {
+
+ this.type = 'ShapePath';
+
+ this.color = new Color();
+
+ this.subPaths = [];
+ this.currentPath = null;
+
+ }
+
+ moveTo( x, y ) {
+
+ this.currentPath = new Path();
+ this.subPaths.push( this.currentPath );
+ this.currentPath.moveTo( x, y );
+
+ return this;
+
+ }
+
+ lineTo( x, y ) {
+
+ this.currentPath.lineTo( x, y );
+
+ return this;
+
+ }
+
+ quadraticCurveTo( aCPx, aCPy, aX, aY ) {
+
+ this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );
+
+ return this;
+
+ }
+
+ bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {
+
+ this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );
+
+ return this;
+
+ }
+
+ splineThru( pts ) {
+
+ this.currentPath.splineThru( pts );
+
+ return this;
+
+ }
+
+ toShapes( isCCW, noHoles ) {
+
+ function toShapesNoHoles( inSubpaths ) {
+
+ const shapes = [];
+
+ for ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {
+
+ const tmpPath = inSubpaths[ i ];
+
+ const tmpShape = new Shape();
+ tmpShape.curves = tmpPath.curves;
+
+ shapes.push( tmpShape );
+
+ }
+
+ return shapes;
+
+ }
+
+ function isPointInsidePolygon( inPt, inPolygon ) {
+
+ const polyLen = inPolygon.length;
+
+ // inPt on polygon contour => immediate success or
+ // toggling of inside/outside at every single! intersection point of an edge
+ // with the horizontal line through inPt, left of inPt
+ // not counting lowerY endpoints of edges and whole edges on that line
+ let inside = false;
+ for ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {
+
+ let edgeLowPt = inPolygon[ p ];
+ let edgeHighPt = inPolygon[ q ];
+
+ let edgeDx = edgeHighPt.x - edgeLowPt.x;
+ let edgeDy = edgeHighPt.y - edgeLowPt.y;
+
+ if ( Math.abs( edgeDy ) > Number.EPSILON ) {
+
+ // not parallel
+ if ( edgeDy < 0 ) {
+
+ edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;
+ edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;
+
+ }
+
+ if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue;
+
+ if ( inPt.y === edgeLowPt.y ) {
+
+ if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ?
+ // continue; // no intersection or edgeLowPt => doesn't count !!!
+
+ } else {
+
+ const perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );
+ if ( perpEdge === 0 ) return true; // inPt is on contour ?
+ if ( perpEdge < 0 ) continue;
+ inside = ! inside; // true intersection left of inPt
+
+ }
+
+ } else {
+
+ // parallel or collinear
+ if ( inPt.y !== edgeLowPt.y ) continue; // parallel
+ // edge lies on the same horizontal line as inPt
+ if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||
+ ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour !
+ // continue;
+
+ }
+
+ }
+
+ return inside;
+
+ }
+
+ const isClockWise = ShapeUtils.isClockWise;
+
+ const subPaths = this.subPaths;
+ if ( subPaths.length === 0 ) return [];
+
+ if ( noHoles === true ) return toShapesNoHoles( subPaths );
+
+
+ let solid, tmpPath, tmpShape;
+ const shapes = [];
+
+ if ( subPaths.length === 1 ) {
+
+ tmpPath = subPaths[ 0 ];
+ tmpShape = new Shape();
+ tmpShape.curves = tmpPath.curves;
+ shapes.push( tmpShape );
+ return shapes;
+
+ }
+
+ let holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );
+ holesFirst = isCCW ? ! holesFirst : holesFirst;
+
+ // console.log("Holes first", holesFirst);
+
+ const betterShapeHoles = [];
+ const newShapes = [];
+ let newShapeHoles = [];
+ let mainIdx = 0;
+ let tmpPoints;
+
+ newShapes[ mainIdx ] = undefined;
+ newShapeHoles[ mainIdx ] = [];
+
+ for ( let i = 0, l = subPaths.length; i < l; i ++ ) {
+
+ tmpPath = subPaths[ i ];
+ tmpPoints = tmpPath.getPoints();
+ solid = isClockWise( tmpPoints );
+ solid = isCCW ? ! solid : solid;
+
+ if ( solid ) {
+
+ if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++;
+
+ newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };
+ newShapes[ mainIdx ].s.curves = tmpPath.curves;
+
+ if ( holesFirst ) mainIdx ++;
+ newShapeHoles[ mainIdx ] = [];
+
+ //console.log('cw', i);
+
+ } else {
+
+ newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );
+
+ //console.log('ccw', i);
+
+ }
+
+ }
+
+ // only Holes? -> probably all Shapes with wrong orientation
+ if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths );
+
+
+ if ( newShapes.length > 1 ) {
+
+ let ambiguous = false;
+ let toChange = 0;
+
+ for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {
+
+ betterShapeHoles[ sIdx ] = [];
+
+ }
+
+ for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {
+
+ const sho = newShapeHoles[ sIdx ];
+
+ for ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {
+
+ const ho = sho[ hIdx ];
+ let hole_unassigned = true;
+
+ for ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {
+
+ if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {
+
+ if ( sIdx !== s2Idx ) toChange ++;
+
+ if ( hole_unassigned ) {
+
+ hole_unassigned = false;
+ betterShapeHoles[ s2Idx ].push( ho );
+
+ } else {
+
+ ambiguous = true;
+
+ }
+
+ }
+
+ }
+
+ if ( hole_unassigned ) {
+
+ betterShapeHoles[ sIdx ].push( ho );
+
+ }
+
+ }
+
+ }
+
+ if ( toChange > 0 && ambiguous === false ) {
+
+ newShapeHoles = betterShapeHoles;
+
+ }
+
+ }
+
+ let tmpHoles;
+
+ for ( let i = 0, il = newShapes.length; i < il; i ++ ) {
+
+ tmpShape = newShapes[ i ].s;
+ shapes.push( tmpShape );
+ tmpHoles = newShapeHoles[ i ];
+
+ for ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {
+
+ tmpShape.holes.push( tmpHoles[ j ].h );
+
+ }
+
+ }
+
+ //console.log("shape", shapes);
+
+ return shapes;
+
+ }
+
+}
+
+const _floatView = new Float32Array( 1 );
+const _int32View = new Int32Array( _floatView.buffer );
+
+class DataUtils {
+
+ // Converts float32 to float16 (stored as uint16 value).
+
+ static toHalfFloat( val ) {
+
+ if ( val > 65504 ) {
+
+ console.warn( 'THREE.DataUtils.toHalfFloat(): value exceeds 65504.' );
+
+ val = 65504; // maximum representable value in float16
+
+ }
+
+ // Source: http://gamedev.stackexchange.com/questions/17326/conversion-of-a-number-from-single-precision-floating-point-representation-to-a/17410#17410
+
+ /* This method is faster than the OpenEXR implementation (very often
+ * used, eg. in Ogre), with the additional benefit of rounding, inspired
+ * by James Tursa?s half-precision code. */
+
+ _floatView[ 0 ] = val;
+ const x = _int32View[ 0 ];
+
+ let bits = ( x >> 16 ) & 0x8000; /* Get the sign */
+ let m = ( x >> 12 ) & 0x07ff; /* Keep one extra bit for rounding */
+ const e = ( x >> 23 ) & 0xff; /* Using int is faster here */
+
+ /* If zero, or denormal, or exponent underflows too much for a denormal
+ * half, return signed zero. */
+ if ( e < 103 ) return bits;
+
+ /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */
+ if ( e > 142 ) {
+
+ bits |= 0x7c00;
+ /* If exponent was 0xff and one mantissa bit was set, it means NaN,
+ * not Inf, so make sure we set one mantissa bit too. */
+ bits |= ( ( e == 255 ) ? 0 : 1 ) && ( x & 0x007fffff );
+ return bits;
+
+ }
+
+ /* If exponent underflows but not too much, return a denormal */
+ if ( e < 113 ) {
+
+ m |= 0x0800;
+ /* Extra rounding may overflow and set mantissa to 0 and exponent
+ * to 1, which is OK. */
+ bits |= ( m >> ( 114 - e ) ) + ( ( m >> ( 113 - e ) ) & 1 );
+ return bits;
+
+ }
+
+ bits |= ( ( e - 112 ) << 10 ) | ( m >> 1 );
+ /* Extra rounding. An overflow will set mantissa to 0 and increment
+ * the exponent, which is OK. */
+ bits += m & 1;
+ return bits;
+
+ }
+
+}
+
+const LineStrip = 0;
+const LinePieces = 1;
+const NoColors = 0;
+const FaceColors = 1;
+const VertexColors = 2;
+
+function MeshFaceMaterial( materials ) {
+
+ console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' );
+ return materials;
+
+}
+
+function MultiMaterial( materials = [] ) {
+
+ console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' );
+ materials.isMultiMaterial = true;
+ materials.materials = materials;
+ materials.clone = function () {
+
+ return materials.slice();
+
+ };
+
+ return materials;
+
+}
+
+function PointCloud( geometry, material ) {
+
+ console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );
+ return new Points( geometry, material );
+
+}
+
+function Particle( material ) {
+
+ console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );
+ return new Sprite( material );
+
+}
+
+function ParticleSystem( geometry, material ) {
+
+ console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );
+ return new Points( geometry, material );
+
+}
+
+function PointCloudMaterial( parameters ) {
+
+ console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );
+ return new PointsMaterial( parameters );
+
+}
+
+function ParticleBasicMaterial( parameters ) {
+
+ console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );
+ return new PointsMaterial( parameters );
+
+}
+
+function ParticleSystemMaterial( parameters ) {
+
+ console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );
+ return new PointsMaterial( parameters );
+
+}
+
+function Vertex( x, y, z ) {
+
+ console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );
+ return new Vector3( x, y, z );
+
+}
+
+//
+
+function DynamicBufferAttribute( array, itemSize ) {
+
+ console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.' );
+ return new BufferAttribute( array, itemSize ).setUsage( DynamicDrawUsage );
+
+}
+
+function Int8Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );
+ return new Int8BufferAttribute( array, itemSize );
+
+}
+
+function Uint8Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );
+ return new Uint8BufferAttribute( array, itemSize );
+
+}
+
+function Uint8ClampedAttribute( array, itemSize ) {
+
+ console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );
+ return new Uint8ClampedBufferAttribute( array, itemSize );
+
+}
+
+function Int16Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );
+ return new Int16BufferAttribute( array, itemSize );
+
+}
+
+function Uint16Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );
+ return new Uint16BufferAttribute( array, itemSize );
+
+}
+
+function Int32Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );
+ return new Int32BufferAttribute( array, itemSize );
+
+}
+
+function Uint32Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );
+ return new Uint32BufferAttribute( array, itemSize );
+
+}
+
+function Float32Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );
+ return new Float32BufferAttribute( array, itemSize );
+
+}
+
+function Float64Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );
+ return new Float64BufferAttribute( array, itemSize );
+
+}
+
+//
+
+Curve.create = function ( construct, getPoint ) {
+
+ console.log( 'THREE.Curve.create() has been deprecated' );
+
+ construct.prototype = Object.create( Curve.prototype );
+ construct.prototype.constructor = construct;
+ construct.prototype.getPoint = getPoint;
+
+ return construct;
+
+};
+
+//
+
+Path.prototype.fromPoints = function ( points ) {
+
+ console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' );
+ return this.setFromPoints( points );
+
+};
+
+//
+
+function AxisHelper( size ) {
+
+ console.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' );
+ return new AxesHelper( size );
+
+}
+
+function BoundingBoxHelper( object, color ) {
+
+ console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );
+ return new BoxHelper( object, color );
+
+}
+
+function EdgesHelper( object, hex ) {
+
+ console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );
+ return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );
+
+}
+
+GridHelper.prototype.setColors = function () {
+
+ console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );
+
+};
+
+SkeletonHelper.prototype.update = function () {
+
+ console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' );
+
+};
+
+function WireframeHelper( object, hex ) {
+
+ console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );
+ return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );
+
+}
+
+//
+
+Loader.prototype.extractUrlBase = function ( url ) {
+
+ console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' );
+ return LoaderUtils.extractUrlBase( url );
+
+};
+
+Loader.Handlers = {
+
+ add: function ( /* regex, loader */ ) {
+
+ console.error( 'THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.' );
+
+ },
+
+ get: function ( /* file */ ) {
+
+ console.error( 'THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.' );
+
+ }
+
+};
+
+function XHRLoader( manager ) {
+
+ console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );
+ return new FileLoader( manager );
+
+}
+
+function BinaryTextureLoader( manager ) {
+
+ console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );
+ return new DataTextureLoader( manager );
+
+}
+
+//
+
+Box2.prototype.center = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );
+ return this.getCenter( optionalTarget );
+
+};
+
+Box2.prototype.empty = function () {
+
+ console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );
+ return this.isEmpty();
+
+};
+
+Box2.prototype.isIntersectionBox = function ( box ) {
+
+ console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );
+ return this.intersectsBox( box );
+
+};
+
+Box2.prototype.size = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );
+ return this.getSize( optionalTarget );
+
+};
+
+//
+
+Box3.prototype.center = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );
+ return this.getCenter( optionalTarget );
+
+};
+
+Box3.prototype.empty = function () {
+
+ console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );
+ return this.isEmpty();
+
+};
+
+Box3.prototype.isIntersectionBox = function ( box ) {
+
+ console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );
+ return this.intersectsBox( box );
+
+};
+
+Box3.prototype.isIntersectionSphere = function ( sphere ) {
+
+ console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );
+ return this.intersectsSphere( sphere );
+
+};
+
+Box3.prototype.size = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );
+ return this.getSize( optionalTarget );
+
+};
+
+//
+
+Euler.prototype.toVector3 = function () {
+
+ console.error( 'THREE.Euler: .toVector3() has been removed. Use Vector3.setFromEuler() instead' );
+
+};
+
+
+//
+
+Sphere.prototype.empty = function () {
+
+ console.warn( 'THREE.Sphere: .empty() has been renamed to .isEmpty().' );
+ return this.isEmpty();
+
+};
+
+//
+
+Frustum.prototype.setFromMatrix = function ( m ) {
+
+ console.warn( 'THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().' );
+ return this.setFromProjectionMatrix( m );
+
+};
+
+//
+
+Line3.prototype.center = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );
+ return this.getCenter( optionalTarget );
+
+};
+
+//
+
+Matrix3.prototype.flattenToArrayOffset = function ( array, offset ) {
+
+ console.warn( 'THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' );
+ return this.toArray( array, offset );
+
+};
+
+Matrix3.prototype.multiplyVector3 = function ( vector ) {
+
+ console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );
+ return vector.applyMatrix3( this );
+
+};
+
+Matrix3.prototype.multiplyVector3Array = function ( /* a */ ) {
+
+ console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' );
+
+};
+
+Matrix3.prototype.applyToBufferAttribute = function ( attribute ) {
+
+ console.warn( 'THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.' );
+ return attribute.applyMatrix3( this );
+
+};
+
+Matrix3.prototype.applyToVector3Array = function ( /* array, offset, length */ ) {
+
+ console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );
+
+};
+
+Matrix3.prototype.getInverse = function ( matrix ) {
+
+ console.warn( 'THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' );
+ return this.copy( matrix ).invert();
+
+};
+
+//
+
+Matrix4.prototype.extractPosition = function ( m ) {
+
+ console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );
+ return this.copyPosition( m );
+
+};
+
+Matrix4.prototype.flattenToArrayOffset = function ( array, offset ) {
+
+ console.warn( 'THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' );
+ return this.toArray( array, offset );
+
+};
+
+Matrix4.prototype.getPosition = function () {
+
+ console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );
+ return new Vector3().setFromMatrixColumn( this, 3 );
+
+};
+
+Matrix4.prototype.setRotationFromQuaternion = function ( q ) {
+
+ console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );
+ return this.makeRotationFromQuaternion( q );
+
+};
+
+Matrix4.prototype.multiplyToArray = function () {
+
+ console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );
+
+};
+
+Matrix4.prototype.multiplyVector3 = function ( vector ) {
+
+ console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
+ return vector.applyMatrix4( this );
+
+};
+
+Matrix4.prototype.multiplyVector4 = function ( vector ) {
+
+ console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
+ return vector.applyMatrix4( this );
+
+};
+
+Matrix4.prototype.multiplyVector3Array = function ( /* a */ ) {
+
+ console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' );
+
+};
+
+Matrix4.prototype.rotateAxis = function ( v ) {
+
+ console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );
+ v.transformDirection( this );
+
+};
+
+Matrix4.prototype.crossVector = function ( vector ) {
+
+ console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
+ return vector.applyMatrix4( this );
+
+};
+
+Matrix4.prototype.translate = function () {
+
+ console.error( 'THREE.Matrix4: .translate() has been removed.' );
+
+};
+
+Matrix4.prototype.rotateX = function () {
+
+ console.error( 'THREE.Matrix4: .rotateX() has been removed.' );
+
+};
+
+Matrix4.prototype.rotateY = function () {
+
+ console.error( 'THREE.Matrix4: .rotateY() has been removed.' );
+
+};
+
+Matrix4.prototype.rotateZ = function () {
+
+ console.error( 'THREE.Matrix4: .rotateZ() has been removed.' );
+
+};
+
+Matrix4.prototype.rotateByAxis = function () {
+
+ console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );
+
+};
+
+Matrix4.prototype.applyToBufferAttribute = function ( attribute ) {
+
+ console.warn( 'THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.' );
+ return attribute.applyMatrix4( this );
+
+};
+
+Matrix4.prototype.applyToVector3Array = function ( /* array, offset, length */ ) {
+
+ console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );
+
+};
+
+Matrix4.prototype.makeFrustum = function ( left, right, bottom, top, near, far ) {
+
+ console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );
+ return this.makePerspective( left, right, top, bottom, near, far );
+
+};
+
+Matrix4.prototype.getInverse = function ( matrix ) {
+
+ console.warn( 'THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' );
+ return this.copy( matrix ).invert();
+
+};
+
+//
+
+Plane.prototype.isIntersectionLine = function ( line ) {
+
+ console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );
+ return this.intersectsLine( line );
+
+};
+
+//
+
+Quaternion.prototype.multiplyVector3 = function ( vector ) {
+
+ console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );
+ return vector.applyQuaternion( this );
+
+};
+
+Quaternion.prototype.inverse = function ( ) {
+
+ console.warn( 'THREE.Quaternion: .inverse() has been renamed to invert().' );
+ return this.invert();
+
+};
+
+//
+
+Ray.prototype.isIntersectionBox = function ( box ) {
+
+ console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );
+ return this.intersectsBox( box );
+
+};
+
+Ray.prototype.isIntersectionPlane = function ( plane ) {
+
+ console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );
+ return this.intersectsPlane( plane );
+
+};
+
+Ray.prototype.isIntersectionSphere = function ( sphere ) {
+
+ console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );
+ return this.intersectsSphere( sphere );
+
+};
+
+//
+
+Triangle.prototype.area = function () {
+
+ console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' );
+ return this.getArea();
+
+};
+
+Triangle.prototype.barycoordFromPoint = function ( point, target ) {
+
+ console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );
+ return this.getBarycoord( point, target );
+
+};
+
+Triangle.prototype.midpoint = function ( target ) {
+
+ console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' );
+ return this.getMidpoint( target );
+
+};
+
+Triangle.prototypenormal = function ( target ) {
+
+ console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );
+ return this.getNormal( target );
+
+};
+
+Triangle.prototype.plane = function ( target ) {
+
+ console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' );
+ return this.getPlane( target );
+
+};
+
+Triangle.barycoordFromPoint = function ( point, a, b, c, target ) {
+
+ console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );
+ return Triangle.getBarycoord( point, a, b, c, target );
+
+};
+
+Triangle.normal = function ( a, b, c, target ) {
+
+ console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );
+ return Triangle.getNormal( a, b, c, target );
+
+};
+
+//
+
+Shape.prototype.extractAllPoints = function ( divisions ) {
+
+ console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' );
+ return this.extractPoints( divisions );
+
+};
+
+Shape.prototype.extrude = function ( options ) {
+
+ console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );
+ return new ExtrudeGeometry( this, options );
+
+};
+
+Shape.prototype.makeGeometry = function ( options ) {
+
+ console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );
+ return new ShapeGeometry( this, options );
+
+};
+
+//
+
+Vector2.prototype.fromAttribute = function ( attribute, index, offset ) {
+
+ console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );
+ return this.fromBufferAttribute( attribute, index, offset );
+
+};
+
+Vector2.prototype.distanceToManhattan = function ( v ) {
+
+ console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );
+ return this.manhattanDistanceTo( v );
+
+};
+
+Vector2.prototype.lengthManhattan = function () {
+
+ console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' );
+ return this.manhattanLength();
+
+};
+
+//
+
+Vector3.prototype.setEulerFromRotationMatrix = function () {
+
+ console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );
+
+};
+
+Vector3.prototype.setEulerFromQuaternion = function () {
+
+ console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );
+
+};
+
+Vector3.prototype.getPositionFromMatrix = function ( m ) {
+
+ console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );
+ return this.setFromMatrixPosition( m );
+
+};
+
+Vector3.prototype.getScaleFromMatrix = function ( m ) {
+
+ console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );
+ return this.setFromMatrixScale( m );
+
+};
+
+Vector3.prototype.getColumnFromMatrix = function ( index, matrix ) {
+
+ console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );
+ return this.setFromMatrixColumn( matrix, index );
+
+};
+
+Vector3.prototype.applyProjection = function ( m ) {
+
+ console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );
+ return this.applyMatrix4( m );
+
+};
+
+Vector3.prototype.fromAttribute = function ( attribute, index, offset ) {
+
+ console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );
+ return this.fromBufferAttribute( attribute, index, offset );
+
+};
+
+Vector3.prototype.distanceToManhattan = function ( v ) {
+
+ console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );
+ return this.manhattanDistanceTo( v );
+
+};
+
+Vector3.prototype.lengthManhattan = function () {
+
+ console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' );
+ return this.manhattanLength();
+
+};
+
+//
+
+Vector4$1.prototype.fromAttribute = function ( attribute, index, offset ) {
+
+ console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );
+ return this.fromBufferAttribute( attribute, index, offset );
+
+};
+
+Vector4$1.prototype.lengthManhattan = function () {
+
+ console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' );
+ return this.manhattanLength();
+
+};
+
+//
+
+Object3D.prototype.getChildByName = function ( name ) {
+
+ console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );
+ return this.getObjectByName( name );
+
+};
+
+Object3D.prototype.renderDepth = function () {
+
+ console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );
+
+};
+
+Object3D.prototype.translate = function ( distance, axis ) {
+
+ console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );
+ return this.translateOnAxis( axis, distance );
+
+};
+
+Object3D.prototype.getWorldRotation = function () {
+
+ console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' );
+
+};
+
+Object3D.prototype.applyMatrix = function ( matrix ) {
+
+ console.warn( 'THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().' );
+ return this.applyMatrix4( matrix );
+
+};
+
+Object.defineProperties( Object3D.prototype, {
+
+ eulerOrder: {
+ get: function () {
+
+ console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );
+ return this.rotation.order;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );
+ this.rotation.order = value;
+
+ }
+ },
+ useQuaternion: {
+ get: function () {
+
+ console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );
+
+ }
+ }
+
+} );
+
+Mesh.prototype.setDrawMode = function () {
+
+ console.error( 'THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );
+
+};
+
+Object.defineProperties( Mesh.prototype, {
+
+ drawMode: {
+ get: function () {
+
+ console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.' );
+ return TrianglesDrawMode;
+
+ },
+ set: function () {
+
+ console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );
+
+ }
+ }
+
+} );
+
+SkinnedMesh.prototype.initBones = function () {
+
+ console.error( 'THREE.SkinnedMesh: initBones() has been removed.' );
+
+};
+
+//
+
+PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {
+
+ console.warn( 'THREE.PerspectiveCamera.setLens is deprecated. ' +
+ 'Use .setFocalLength and .filmGauge for a photographic setup.' );
+
+ if ( filmGauge !== undefined ) this.filmGauge = filmGauge;
+ this.setFocalLength( focalLength );
+
+};
+
+//
+
+Object.defineProperties( Light.prototype, {
+ onlyShadow: {
+ set: function () {
+
+ console.warn( 'THREE.Light: .onlyShadow has been removed.' );
+
+ }
+ },
+ shadowCameraFov: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );
+ this.shadow.camera.fov = value;
+
+ }
+ },
+ shadowCameraLeft: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );
+ this.shadow.camera.left = value;
+
+ }
+ },
+ shadowCameraRight: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );
+ this.shadow.camera.right = value;
+
+ }
+ },
+ shadowCameraTop: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );
+ this.shadow.camera.top = value;
+
+ }
+ },
+ shadowCameraBottom: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );
+ this.shadow.camera.bottom = value;
+
+ }
+ },
+ shadowCameraNear: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );
+ this.shadow.camera.near = value;
+
+ }
+ },
+ shadowCameraFar: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );
+ this.shadow.camera.far = value;
+
+ }
+ },
+ shadowCameraVisible: {
+ set: function () {
+
+ console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );
+
+ }
+ },
+ shadowBias: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );
+ this.shadow.bias = value;
+
+ }
+ },
+ shadowDarkness: {
+ set: function () {
+
+ console.warn( 'THREE.Light: .shadowDarkness has been removed.' );
+
+ }
+ },
+ shadowMapWidth: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );
+ this.shadow.mapSize.width = value;
+
+ }
+ },
+ shadowMapHeight: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );
+ this.shadow.mapSize.height = value;
+
+ }
+ }
+} );
+
+//
+
+Object.defineProperties( BufferAttribute.prototype, {
+
+ length: {
+ get: function () {
+
+ console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );
+ return this.array.length;
+
+ }
+ },
+ dynamic: {
+ get: function () {
+
+ console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );
+ return this.usage === DynamicDrawUsage;
+
+ },
+ set: function ( /* value */ ) {
+
+ console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );
+ this.setUsage( DynamicDrawUsage );
+
+ }
+ }
+
+} );
+
+BufferAttribute.prototype.setDynamic = function ( value ) {
+
+ console.warn( 'THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.' );
+ this.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );
+ return this;
+
+};
+
+BufferAttribute.prototype.copyIndicesArray = function ( /* indices */ ) {
+
+ console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' );
+
+},
+
+BufferAttribute.prototype.setArray = function ( /* array */ ) {
+
+ console.error( 'THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );
+
+};
+
+//
+
+BufferGeometry.prototype.addIndex = function ( index ) {
+
+ console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );
+ this.setIndex( index );
+
+};
+
+BufferGeometry.prototype.addAttribute = function ( name, attribute ) {
+
+ console.warn( 'THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().' );
+
+ if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) {
+
+ console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );
+
+ return this.setAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );
+
+ }
+
+ if ( name === 'index' ) {
+
+ console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );
+ this.setIndex( attribute );
+
+ return this;
+
+ }
+
+ return this.setAttribute( name, attribute );
+
+};
+
+BufferGeometry.prototype.addDrawCall = function ( start, count, indexOffset ) {
+
+ if ( indexOffset !== undefined ) {
+
+ console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );
+
+ }
+
+ console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );
+ this.addGroup( start, count );
+
+};
+
+BufferGeometry.prototype.clearDrawCalls = function () {
+
+ console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );
+ this.clearGroups();
+
+};
+
+BufferGeometry.prototype.computeOffsets = function () {
+
+ console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );
+
+};
+
+BufferGeometry.prototype.removeAttribute = function ( name ) {
+
+ console.warn( 'THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().' );
+
+ return this.deleteAttribute( name );
+
+};
+
+BufferGeometry.prototype.applyMatrix = function ( matrix ) {
+
+ console.warn( 'THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().' );
+ return this.applyMatrix4( matrix );
+
+};
+
+Object.defineProperties( BufferGeometry.prototype, {
+
+ drawcalls: {
+ get: function () {
+
+ console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );
+ return this.groups;
+
+ }
+ },
+ offsets: {
+ get: function () {
+
+ console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );
+ return this.groups;
+
+ }
+ }
+
+} );
+
+InterleavedBuffer.prototype.setDynamic = function ( value ) {
+
+ console.warn( 'THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.' );
+ this.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );
+ return this;
+
+};
+
+InterleavedBuffer.prototype.setArray = function ( /* array */ ) {
+
+ console.error( 'THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );
+
+};
+
+//
+
+ExtrudeGeometry.prototype.getArrays = function () {
+
+ console.error( 'THREE.ExtrudeGeometry: .getArrays() has been removed.' );
+
+};
+
+ExtrudeGeometry.prototype.addShapeList = function () {
+
+ console.error( 'THREE.ExtrudeGeometry: .addShapeList() has been removed.' );
+
+};
+
+ExtrudeGeometry.prototype.addShape = function () {
+
+ console.error( 'THREE.ExtrudeGeometry: .addShape() has been removed.' );
+
+};
+
+//
+
+Scene.prototype.dispose = function () {
+
+ console.error( 'THREE.Scene: .dispose() has been removed.' );
+
+};
+
+//
+
+Uniform.prototype.onUpdate = function () {
+
+ console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );
+ return this;
+
+};
+
+//
+
+Object.defineProperties( Material.prototype, {
+
+ wrapAround: {
+ get: function () {
+
+ console.warn( 'THREE.Material: .wrapAround has been removed.' );
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.Material: .wrapAround has been removed.' );
+
+ }
+ },
+
+ overdraw: {
+ get: function () {
+
+ console.warn( 'THREE.Material: .overdraw has been removed.' );
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.Material: .overdraw has been removed.' );
+
+ }
+ },
+
+ wrapRGB: {
+ get: function () {
+
+ console.warn( 'THREE.Material: .wrapRGB has been removed.' );
+ return new Color();
+
+ }
+ },
+
+ shading: {
+ get: function () {
+
+ console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
+ this.flatShading = ( value === FlatShading );
+
+ }
+ },
+
+ stencilMask: {
+ get: function () {
+
+ console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );
+ return this.stencilFuncMask;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );
+ this.stencilFuncMask = value;
+
+ }
+ },
+
+ vertexTangents: {
+ get: function () {
+
+ console.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' );
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' );
+
+ }
+ },
+
+} );
+
+Object.defineProperties( ShaderMaterial.prototype, {
+
+ derivatives: {
+ get: function () {
+
+ console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );
+ return this.extensions.derivatives;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );
+ this.extensions.derivatives = value;
+
+ }
+ }
+
+} );
+
+//
+
+WebGLRenderer.prototype.clearTarget = function ( renderTarget, color, depth, stencil ) {
+
+ console.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' );
+ this.setRenderTarget( renderTarget );
+ this.clear( color, depth, stencil );
+
+};
+
+WebGLRenderer.prototype.animate = function ( callback ) {
+
+ console.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' );
+ this.setAnimationLoop( callback );
+
+};
+
+WebGLRenderer.prototype.getCurrentRenderTarget = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );
+ return this.getRenderTarget();
+
+};
+
+WebGLRenderer.prototype.getMaxAnisotropy = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' );
+ return this.capabilities.getMaxAnisotropy();
+
+};
+
+WebGLRenderer.prototype.getPrecision = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' );
+ return this.capabilities.precision;
+
+};
+
+WebGLRenderer.prototype.resetGLState = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' );
+ return this.state.reset();
+
+};
+
+WebGLRenderer.prototype.supportsFloatTextures = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' );
+ return this.extensions.get( 'OES_texture_float' );
+
+};
+
+WebGLRenderer.prototype.supportsHalfFloatTextures = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' );
+ return this.extensions.get( 'OES_texture_half_float' );
+
+};
+
+WebGLRenderer.prototype.supportsStandardDerivatives = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' );
+ return this.extensions.get( 'OES_standard_derivatives' );
+
+};
+
+WebGLRenderer.prototype.supportsCompressedTextureS3TC = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' );
+ return this.extensions.get( 'WEBGL_compressed_texture_s3tc' );
+
+};
+
+WebGLRenderer.prototype.supportsCompressedTexturePVRTC = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' );
+ return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );
+
+};
+
+WebGLRenderer.prototype.supportsBlendMinMax = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' );
+ return this.extensions.get( 'EXT_blend_minmax' );
+
+};
+
+WebGLRenderer.prototype.supportsVertexTextures = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );
+ return this.capabilities.vertexTextures;
+
+};
+
+WebGLRenderer.prototype.supportsInstancedArrays = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' );
+ return this.extensions.get( 'ANGLE_instanced_arrays' );
+
+};
+
+WebGLRenderer.prototype.enableScissorTest = function ( boolean ) {
+
+ console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );
+ this.setScissorTest( boolean );
+
+};
+
+WebGLRenderer.prototype.initMaterial = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.addPrePlugin = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.addPostPlugin = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.updateShadowMap = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.setFaceCulling = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.allocTextureUnit = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .allocTextureUnit() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.setTexture = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .setTexture() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.setTexture2D = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .setTexture2D() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.setTextureCube = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .setTextureCube() has been removed.' );
+
+};
+
+WebGLRenderer.prototype.getActiveMipMapLevel = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().' );
+ return this.getActiveMipmapLevel();
+
+};
+
+Object.defineProperties( WebGLRenderer.prototype, {
+
+ shadowMapEnabled: {
+ get: function () {
+
+ return this.shadowMap.enabled;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );
+ this.shadowMap.enabled = value;
+
+ }
+ },
+ shadowMapType: {
+ get: function () {
+
+ return this.shadowMap.type;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );
+ this.shadowMap.type = value;
+
+ }
+ },
+ shadowMapCullFace: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );
+ return undefined;
+
+ },
+ set: function ( /* value */ ) {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );
+
+ }
+ },
+ context: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.' );
+ return this.getContext();
+
+ }
+ },
+ vr: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .vr has been renamed to .xr' );
+ return this.xr;
+
+ }
+ },
+ gammaInput: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );
+ return false;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );
+
+ }
+ },
+ gammaOutput: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );
+ return false;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );
+ this.outputEncoding = ( value === true ) ? sRGBEncoding : LinearEncoding;
+
+ }
+ },
+ toneMappingWhitePoint: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );
+ return 1.0;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );
+
+ }
+ },
+ gammaFactor: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' );
+ return 2;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' );
+
+ }
+ }
+} );
+
+Object.defineProperties( WebGLShadowMap.prototype, {
+
+ cullFace: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );
+ return undefined;
+
+ },
+ set: function ( /* cullFace */ ) {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );
+
+ }
+ },
+ renderReverseSided: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );
+ return undefined;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );
+
+ }
+ },
+ renderSingleSided: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );
+ return undefined;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );
+
+ }
+ }
+
+} );
+
+function WebGLRenderTargetCube( width, height, options ) {
+
+ console.warn( 'THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).' );
+ return new WebGLCubeRenderTarget( width, options );
+
+}
+
+//
+
+Object.defineProperties( WebGLRenderTarget.prototype, {
+
+ wrapS: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );
+ return this.texture.wrapS;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );
+ this.texture.wrapS = value;
+
+ }
+ },
+ wrapT: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );
+ return this.texture.wrapT;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );
+ this.texture.wrapT = value;
+
+ }
+ },
+ magFilter: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );
+ return this.texture.magFilter;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );
+ this.texture.magFilter = value;
+
+ }
+ },
+ minFilter: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );
+ return this.texture.minFilter;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );
+ this.texture.minFilter = value;
+
+ }
+ },
+ anisotropy: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );
+ return this.texture.anisotropy;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );
+ this.texture.anisotropy = value;
+
+ }
+ },
+ offset: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );
+ return this.texture.offset;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );
+ this.texture.offset = value;
+
+ }
+ },
+ repeat: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );
+ return this.texture.repeat;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );
+ this.texture.repeat = value;
+
+ }
+ },
+ format: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );
+ return this.texture.format;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );
+ this.texture.format = value;
+
+ }
+ },
+ type: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );
+ return this.texture.type;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );
+ this.texture.type = value;
+
+ }
+ },
+ generateMipmaps: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );
+ return this.texture.generateMipmaps;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );
+ this.texture.generateMipmaps = value;
+
+ }
+ }
+
+} );
+
+//
+
+Audio.prototype.load = function ( file ) {
+
+ console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );
+ const scope = this;
+ const audioLoader = new AudioLoader();
+ audioLoader.load( file, function ( buffer ) {
+
+ scope.setBuffer( buffer );
+
+ } );
+ return this;
+
+};
+
+
+AudioAnalyser.prototype.getData = function () {
+
+ console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );
+ return this.getFrequencyData();
+
+};
+
+//
+
+CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) {
+
+ console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' );
+ return this.update( renderer, scene );
+
+};
+
+CubeCamera.prototype.clear = function ( renderer, color, depth, stencil ) {
+
+ console.warn( 'THREE.CubeCamera: .clear() is now .renderTarget.clear().' );
+ return this.renderTarget.clear( renderer, color, depth, stencil );
+
+};
+
+ImageUtils.crossOrigin = undefined;
+
+ImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) {
+
+ console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );
+
+ const loader = new TextureLoader();
+ loader.setCrossOrigin( this.crossOrigin );
+
+ const texture = loader.load( url, onLoad, undefined, onError );
+
+ if ( mapping ) texture.mapping = mapping;
+
+ return texture;
+
+};
+
+ImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) {
+
+ console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );
+
+ const loader = new CubeTextureLoader();
+ loader.setCrossOrigin( this.crossOrigin );
+
+ const texture = loader.load( urls, onLoad, undefined, onError );
+
+ if ( mapping ) texture.mapping = mapping;
+
+ return texture;
+
+};
+
+ImageUtils.loadCompressedTexture = function () {
+
+ console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );
+
+};
+
+ImageUtils.loadCompressedTextureCube = function () {
+
+ console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );
+
+};
+
+//
+
+function CanvasRenderer() {
+
+ console.error( 'THREE.CanvasRenderer has been removed' );
+
+}
+
+//
+
+function JSONLoader() {
+
+ console.error( 'THREE.JSONLoader has been removed.' );
+
+}
+
+//
+
+const SceneUtils = {
+
+ createMultiMaterialObject: function ( /* geometry, materials */ ) {
+
+ console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );
+
+ },
+
+ detach: function ( /* child, parent, scene */ ) {
+
+ console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );
+
+ },
+
+ attach: function ( /* child, scene, parent */ ) {
+
+ console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );
+
+ }
+
+};
+
+//
+
+function LensFlare() {
+
+ console.error( 'THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js' );
+
+}
+
+//
+
+function ParametricGeometry() {
+
+ console.error( 'THREE.ParametricGeometry has been moved to /examples/jsm/geometries/ParametricGeometry.js' );
+ return new BufferGeometry();
+
+}
+
+function TextGeometry() {
+
+ console.error( 'THREE.TextGeometry has been moved to /examples/jsm/geometries/TextGeometry.js' );
+ return new BufferGeometry();
+
+}
+
+function FontLoader() {
+
+ console.error( 'THREE.FontLoader has been moved to /examples/jsm/loaders/FontLoader.js' );
+
+}
+
+function Font() {
+
+ console.error( 'THREE.Font has been moved to /examples/jsm/loaders/FontLoader.js' );
+
+}
+
+function ImmediateRenderObject() {
+
+ console.error( 'THREE.ImmediateRenderObject has been removed.' );
+
+}
+
+function WebGLMultisampleRenderTarget( width, height, options ) {
+
+ console.error( 'THREE.WebGLMultisampleRenderTarget has been removed. Use a normal render target and set the "samples" property to greater 0 to enable multisampling.' );
+ const renderTarget = new WebGLRenderTarget( width, height, options );
+ renderTarget.samples = 4;
+ return renderTarget;
+
+}
+
+function DataTexture2DArray( data, width, height, depth ) {
+
+ console.warn( 'THREE.DataTexture2DArray has been renamed to DataArrayTexture.' );
+ return new DataArrayTexture( data, width, height, depth );
+
+}
+
+function DataTexture3D( data, width, height, depth ) {
+
+ console.warn( 'THREE.DataTexture3D has been renamed to Data3DTexture.' );
+ return new Data3DTexture( data, width, height, depth );
+
+}
+
+if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {
+
+ __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {
+ revision: REVISION,
+ } } ) );
+
+}
+
+if ( typeof window !== 'undefined' ) {
+
+ if ( window.__THREE__ ) {
+
+ console.warn( 'WARNING: Multiple instances of Three.js being imported.' );
+
+ } else {
+
+ window.__THREE__ = REVISION;
+
+ }
+
+}
+
+/**
+ * Three targets are provided for both GLSL and Sculpt/JS api.
+ *
+ * 1: source -> Threejs shader source components (easy customization)
+ * 2: source -> Threejs material
+ * 3: source -> Threejs mesh (easy to use)
+ *
+ * TODO: make these materials 'plug in' to threejs' lighting model, like unity's surface shaders
+ */
+
+function glslToThreeJSShaderSource(source) {
+ return {
+ uniforms: baseUniforms(),
+ frag: threeHeader + 'const float STEP_SIZE_CONSTANT = 0.9;\n' + 'const int MAX_ITERATIONS = 300;\n' + uniformsToGLSL(baseUniforms()) + sculptureStarterCode + source + fragFooter,
+ vert: threeJSVertexSource
+ };
+}
+function glslToThreeJSMaterial(source, payload) {
+ var src = glslToThreeJSShaderSource(source);
+ return makeMaterial(src.uniforms, src.vert, src.frag, payload);
+}
+function glslToThreeJSMesh(source, payload) {
+ return makeBasicMesh(glslToThreeJSMaterial(source, payload));
+}
+function sculptToThreeJSShaderSource(source) {
+ var src = sculptToGLSL(source);
+
+ if (src.error) {
+ console.log(src.error);
+ }
+
+ var frg = threeHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(src.uniforms) + 'const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL + '\n' + src.colorGLSL + '\n' + fragFooter;
+ return {
+ uniforms: src.uniforms,
+ frag: frg,
+ vert: threeJSVertexSource,
+ error: src.error,
+ geoGLSL: src.geoGLSL,
+ colorGLSL: src.colorGLSL
+ };
+}
+function sculptToThreeJSMaterial(source, payload) {
+ var src = sculptToThreeJSShaderSource(source);
+ var material = makeMaterial(src.uniforms, src.vert, src.frag, payload);
+ material.uniformDescriptions = src.uniforms;
+ return material;
+}
+function sculptToThreeJSMesh(source, payload) {
+ source = convertFunctionToString(source);
+ return makeBasicMesh(sculptToThreeJSMaterial(source, payload));
+}
+function createSculptureWithGeometry(geometry, source) {
+ var uniformCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {
+ return {};
+ };
+ var params = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
+ geometry.computeBoundingSphere();
+ var radius = 'radius' in params ? params.radius : geometry.boundingSphere.radius;
+ params.radius = radius;
+ params.geometry = geometry;
+ return createSculpture(source, uniformCallback, params);
+} // uniformCallback
+
+function createSculpture(source) {
+ var uniformCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
+ return {};
+ };
+ var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ source = convertFunctionToString(source);
+ var radius = 'radius' in params ? params.radius : 2;
+ var geometry;
+
+ if ('geometry' in params) {
+ geometry = params.geometry;
+ } else {
+ var segments = 'segments' in params ? params.segments : 8;
+ geometry = new SphereGeometry(radius, segments, segments);
+ }
+
+ var material = sculptToThreeJSMaterial(source);
+ material.uniforms['opacity'].value = 1.0;
+ material.uniforms['mouse'].value = new Vector3();
+ material.uniforms['_scale'].value = radius;
+ var mesh = new Mesh(geometry, material);
+
+ mesh.onBeforeRender = function (renderer, scene, camera, geometry, material, group) {
+ var uniformsToUpdate = uniformCallback();
+
+ if (!(_typeof(uniformsToUpdate) === "object")) {
+ throw "createSculpture takes, (source, uniformCallback, params) the uniformCallback must be a function that returns a dictionary of uniforms to update";
+ }
+
+ for (var _i = 0, _Object$entries = Object.entries(uniformsToUpdate); _i < _Object$entries.length; _i++) {
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
+ uniform = _Object$entries$_i[0],
+ value = _Object$entries$_i[1];
+
+ material.uniforms[uniform].value = value;
+ } // material.uniforms['sculptureCenter'].value = geometry.position;
+
+ };
+
+ return mesh;
+}
+
+function uniformDescriptionToThreeJSFormat(unifs, payload) {
+ var finalUniforms = {};
+
+ if (payload && payload !== undefined && payload.msdfTexture !== undefined) {
+ finalUniforms["msdf"] = {
+ value: payload.msdfTexture || new Texture()
+ };
+ }
+
+ unifs.forEach(function (uniform) {
+ if (uniform.type === 'float') {
+ finalUniforms[uniform.name] = {
+ value: uniform.value
+ };
+ } else if (uniform.type === 'vec2') {
+ finalUniforms[uniform.name] = {
+ value: new Vector2(uniform.value.x, uniform.value.y)
+ };
+ } else if (uniform.type === 'vec3') {
+ finalUniforms[uniform.name] = {
+ value: new Vector3(uniform.value.x, uniform.value.y, uniform.value.z)
+ };
+ } else if (uniform.type === 'vec4') {
+ finalUniforms[uniform.name] = {
+ value: new Vector4(uniform.value.x, uniform.value.y, uniform.value.z, uniform.value.w)
+ };
+ }
+ });
+ return finalUniforms;
+} // could use a scale parameter
+
+
+function makeMaterial(unifs, vert, frag, payload) {
+ var material = new ShaderMaterial({
+ uniforms: uniformDescriptionToThreeJSFormat(unifs, payload),
+ vertexShader: vert,
+ fragmentShader: frag,
+ transparent: true,
+ side: BackSide
+ });
+ material.extensions.fragDepth = false;
+ return material;
+} // There should be more options supported like size and shape
+
+
+function makeBasicMesh(material) {
+ return new Mesh(new BoxGeometry(2, 2, 2), material);
+}
+
+function uniformToCpp(uniforms) {
+ var res = '';
+
+ for (var i = 0; i < uniforms.length; i++) {
+ var unif = uniforms[i];
+ res += unif.type + ' ' + unif.name + ' = ';
+
+ if (typeof unif.value === 'number') {
+ // float
+ res += unif.value + 0.0000001 + 'f';
+ } else {
+ // vec
+ res += 'vec' + unif.value.length + '(';
+
+ for (var j = 0; j < unif.value.length; j++) {
+ res += unif.value[j] + 0.0000001 + 'f';
+
+ if (j + 1 < unif.value.length) {
+ res += ', ';
+ }
+ }
+
+ res += ')';
+ }
+
+ res += ';\n';
+ }
+
+ return res;
+}
+
+var cppFooter = "\n\n";
+var cppHeader = uniformToCpp(baseUniforms());
+
+function glslToGLM(source) {
+ // converts all numbers to floats
+ var result = source.replace(/([^a-zA-Z][0-9]+([.][^a-zA-Z][0-9]*)|[.][0-9]+)()/g, '$1f'); // adds parentheses after swizzling for glm to pick up
+
+ result = result.replace(/([a-zA-Z0-9][.][w-z]{2,})()/g, '$1()');
+ return result;
+}
+
+function glslToOfflineRenderer(source) {}
+function sculptToOfflineRenderer(source) {
+ var src = sculptToGLSL(source); //console.log(filteredStarter);
+
+ return cppHeader + glslToGLM('const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + 'f;\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL + src.colorGLSL) + cppFooter;
+}
+
+function glslToMinimalRenderer(canvas, source, updateUniforms) {
+ var fullFrag = minimalHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(baseUniforms()) + 'const float STEP_SIZE_CONSTANT = 0.9;\n' + 'const int MAX_ITERATIONS = 300;\n' + sculptureStarterCode + source + fragFooter;
+ return fragToMinimalRenderer(canvas, fullFrag, updateUniforms);
+}
+/**
+ * for fast and efficient use on the web
+ * input - sculpt code
+ * output - a fully self-contained lightweight html file which renders the sculpture
+ **/
+
+function sculptToMinimalRenderer(canvas, source, updateUniforms) {
+ if (typeof source === "function") {
+ source = source.toString();
+ source = source.slice(source.indexOf("{") + 1, source.lastIndexOf("}"));
+ } else if (!(typeof source === "string")) {
+ throw "sculptToMinimalRenderer requires the source code to be a function, or a string";
+ }
+
+ var generatedGLSL = sculptToGLSL(source);
+ var fullFrag = minimalHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(generatedGLSL.uniforms) + 'const float STEP_SIZE_CONSTANT = ' + generatedGLSL.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + generatedGLSL.maxIterations + ';\n' + sculptureStarterCode + generatedGLSL.geoGLSL + '\n' + generatedGLSL.colorGLSL + '\n' + fragFooter;
+ return fragToMinimalRenderer(canvas, fullFrag, updateUniforms);
+}
+
+function fragToMinimalRenderer(canvas, fullFrag, updateUniforms) {
+ // if no update function is provided assume no-op
+ if (updateUniforms === undefined) {
+ updateUniforms = function updateUniforms() {
+ return {};
+ };
+ }
+
+ function resizeCanvas() {
+ var devicePixelRatio = window.devicePixelRatio || 1; // change this so canvas doesn't have to fill entire window
+
+ var width = window.innerWidth * devicePixelRatio;
+ var height = window.innerHeight * devicePixelRatio;
+
+ if (canvas.width != width || canvas.height != height) {
+ canvas.width = width;
+ canvas.height = height;
+ }
+ }
+
+ resizeCanvas();
+ window.addEventListener('resize', resizeCanvas);
+ var gl = canvas.getContext('webgl2');
+ var vertices = [-1.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0];
+ var indices = [3, 2, 1, 3, 1, 0];
+ var vertex_buffer = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
+ var Index_Buffer = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, Index_Buffer);
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
+ var vertShader = gl.createShader(gl.VERTEX_SHADER);
+ gl.shaderSource(vertShader, minimalVertexSource);
+ gl.compileShader(vertShader);
+ var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
+ gl.shaderSource(fragShader, fullFrag);
+ gl.compileShader(fragShader);
+
+ var logShaderComp = function logShaderComp(shader) {
+ var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
+ console.log('Shader compiled successfully: ' + compiled);
+ var compilationLog = gl.getShaderInfoLog(shader);
+ if (!compiled) console.error('Shader compiler log: ' + compilationLog);
+ };
+
+ logShaderComp(vertShader);
+ logShaderComp(fragShader);
+ var shaderProgram = gl.createProgram();
+ gl.attachShader(shaderProgram, vertShader);
+ gl.attachShader(shaderProgram, fragShader);
+ gl.linkProgram(shaderProgram); // Check if it linked.
+
+ var success = gl.getProgramParameter(shaderProgram, gl.LINK_STATUS);
+
+ if (!success) {
+ // something went wrong with the link; get the error
+ console.error("program failed to link:" + gl.getProgramInfoLog(shaderProgram));
+ }
+
+ gl.useProgram(shaderProgram);
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, Index_Buffer);
+ var coord = gl.getAttribLocation(shaderProgram, "coordinates");
+ gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, 0, 0);
+ gl.enableVertexAttribArray(coord);
+ gl.clearColor(1.0, 1.0, 1.0, 0.9);
+ gl.enable(gl.DEPTH_TEST);
+ var oTime = Date.now();
+ var loc = gl.getUniformLocation(shaderProgram, "time");
+
+ var _scale = gl.getUniformLocation(shaderProgram, "_scale");
+
+ var resolution = gl.getUniformLocation(shaderProgram, "resolution");
+ var opac = gl.getUniformLocation(shaderProgram, "opacity");
+ var mouseloc = gl.getUniformLocation(shaderProgram, "mouse");
+ gl.uniform1f(opac, 1.0);
+ gl.uniform1f(_scale, 1.0);
+ var userUniformUpdateFuncs = assignUniforms(updateUniforms);
+ canvas.addEventListener("pointermove", function (e) {
+ var devicePixelRatio = window.devicePixelRatio || 1;
+ var canvasX = (e.pageX - canvas.offsetLeft) * devicePixelRatio;
+ var canvasY = (e.pageY - canvas.offsetTop) * devicePixelRatio;
+ gl.uniform3f(mouseloc, 2.0 * canvasX / canvas.width - 1.0, 2.0 * (1.0 - canvasY / canvas.height) - 1.0, -0.5);
+ }, false);
+
+ function updateDraw() {
+ if (typeof updateUniforms === 'function') {
+ callUniformFuncs(userUniformUpdateFuncs, updateUniforms());
+ }
+
+ gl.uniform1f(loc, (Date.now() - oTime) * 0.001);
+ var devicePixelRatio = window.devicePixelRatio || 1;
+ var wwidth = window.innerWidth * devicePixelRatio;
+ var wheight = window.innerHeight * devicePixelRatio;
+ gl.uniform2fv(resolution, [wwidth, wheight]);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.viewport(0, 0, canvas.width, canvas.height);
+ gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0);
+ window.requestAnimationFrame(updateDraw);
+ }
+
+ updateDraw(); // loops through a dictionary and calls the function sotred in the value
+
+ function callUniformFuncs(uniformFuncs, updatedUniforms) {
+ if (_typeof(updatedUniforms) !== 'object') {
+ console.error('updateUniforms must return a dictionary of uniform names and values. Instead got: ', updateUniforms);
+ return;
+ }
+
+ Object.entries(uniformFuncs).forEach(function (keys) {
+ var _keys = _slicedToArray(keys, 2),
+ key = _keys[0],
+ uniformUpdateFunc = _keys[1];
+
+ if (key in updatedUniforms) {
+ uniformUpdateFunc(updatedUniforms[key]);
+ }
+ });
+ }
+
+ function assignUniforms(updateUniforms) {
+ if (typeof updateUniforms !== 'function') {
+ console.error('updateUniforms must be a function that returns a dictionary of uniform names and values');
+ return {};
+ }
+
+ var userUniformUpdateFuncs = {};
+ var uniformsDict = updateUniforms();
+
+ if (uniformsDict !== undefined && _typeof(uniformsDict) === 'object') {
+ Object.entries(uniformsDict).forEach(function (keys) {
+ var _keys2 = _slicedToArray(keys, 2),
+ key = _keys2[0],
+ val = _keys2[1];
+
+ var unifLocation = gl.getUniformLocation(shaderProgram, key);
+
+ if (typeof val === 'number') {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform1f(unifLocation, unif);
+ };
+ } else if (Array.isArray(val)) {
+ if (val.length === 1) {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform1f(unifLocation, unif[0]);
+ };
+ } else if (val.length === 2) {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform2iv(unifLocation, unif);
+ };
+ } else if (val.length === 3) {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform3iv(unifLocation, unif);
+ };
+ } else if (val.length === 4) {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform4iv(unifLocation, unif);
+ };
+ } else {
+ console.error('Uniforms must be either a float or an array with length 1, 2, 3 or 4');
+ }
+ } else {
+ console.error('Uniforms must be either a float or an array with length 1, 2, 3 or 4');
+ }
+ });
+ }
+
+ return userUniformUpdateFuncs;
+ }
+}
+
+/**
+ * for fast tesing
+ * input - sculpt code
+ * output - self-contained lightweight html which renders the sculpture
+ **/
+function sculptToMinimalHTMLRenderer(spCode, libPath) {
+ return makeHTML(spCode, 'sculptToMinimalRenderer', libPath);
+}
+function glslToMinimalHTMLRenderer(spCode, libPath) {
+ return makeHTML(spCode, 'glslToMinimalRenderer', libPath);
+}
+
+function makeHTML(spCode, minRenderFunc, libPath) {
+ return "\n\n\n Shader Park\n \n \n \n \n \n \n \n\n");
+}
+
+/**
+ * export for meshing with https://github.com/tdhooper/glsl-marching-cubes
+ * input - sculpt code
+ * output - glsl containing "mapDistance"
+ **/
+
+function sculptToRawSDF4Meshing(source) {
+ var minimalHeader = "\nprecision highp float;\nuniform float w_width;\nuniform float w_height;\nuniform mat4 projectionMatrix;\n#define cameraPosition vec3(0.0,0.0,-1.0)\n#define vUv vec2(0.0)\n#define worldPos vec4(vec2((gl_FragCoord.x/w_width-0.5)*(w_width/w_height),gl_FragCoord.y/w_height-0.5)*1.75,0.0,0.0)\n#define STEP_SIZE_CONSTANT 0.9\n#define MAX_ITERATIONS 300\n#define stepSize 0.9\n#define mouse vec3(0.0)\n#define time 0.0\n";
+ var generatedGLSL = sculptToGLSL(source);
+ var fullFrag = minimalHeader + usePBRHeader + useHemisphereLight //+ uniformsToGLSL(generatedGLSL.uniforms)
+ + sculptureStarterCode + generatedGLSL.geoGLSL;
+ return fullFrag.replace(/surfaceDistance/g, 'mapDistance');
+}
+
+/**
+ * TD target for GLSL and Sculpt/JS api.
+ *
+ * TODO: make these materials 'plug in' to Touch Designer's ' PBR lighting model.
+ */
+
+var TDHeader = "\nuniform float uShadowStrength;\nuniform vec3 uShadowColor;\nuniform vec4 uBaseColor;\nuniform float uMetallic;\nuniform float uRoughness;\nuniform float uSpecularLevel;\nuniform float uAmbientOcclusion;\nuniform vec3 cameraPosition;\nuniform sampler2D sBaseColorMap;\nuniform float useTDLighting;\n\n\nin Vertex\n{\n\tvec4 color;\n\tvec3 worldSpacePos;\n\tvec3 worldSpaceNorm;\n\tflat int cameraIndex;\n\tvec2 texCoord0;\n\tvec3 sculptureCenter;\n} iVert;\n\n#define sculptureCenter iVert.sculptureCenter;\n#define worldPos iVert.worldSpacePos\nlayout(location = 0) out vec4 oFragColor[TD_NUM_COLOR_BUFFERS];\nout float depthTexture;\n";
+var TDFooter = "\nvoid main()\n{\n\t// This allows things such as order independent transparency\n\t// and Dual-Paraboloid rendering to work properly\n\tTDCheckDiscard();\n\n\t// Raymarching\n\tvec3 rayOrigin = worldPos.xyz-sculptureCenter;\n\tvec3 rayDirection = getRayDirection();\n\trayOrigin -= rayDirection*2.0;\n\tfloat t = intersect(rayOrigin, rayDirection, stepSize);\n depthTexture = t;\n\n\tvec4 outcol = vec4(0.0, 0.0, 0.0, 0.0);\n\tvec3 diffuseSum = vec3(0.0, 0.0, 0.0);\n\tvec3 specularSum = vec3(0.0, 0.0, 0.0);\n\n\tvec3 worldSpaceNorm = normalize(iVert.worldSpaceNorm.xyz);\n\t// vec3 normal = normalize(worldSpaceNorm.xyz);\n\tif(t < 2.5) {\n\t\tvec3 p = (rayOrigin + rayDirection*t);\n\t\tvec3 normal = calcNormal(p);\n\t\tvec3 raymarchedColor = shade(p, normal);\n\t\n\t\tvec3 baseColor = uBaseColor.rgb;\n\n\t\t// 0.08 is the value for dielectric specular that\n\t\t// Substance Designer uses for it's top-end.\n\t\tfloat specularLevel = 0.08 * uSpecularLevel;\n\t\tfloat metallic = uMetallic;\n\n\t\tfloat roughness = uRoughness;\n\n\t\tfloat ambientOcclusion = uAmbientOcclusion;\n\n\t\tvec3 finalBaseColor = baseColor.rgb * iVert.color.rgb;\n\n\t\tvec2 texCoord0 = iVert.texCoord0.st;\n\t\tvec4 baseColorMap = texture(sBaseColorMap, texCoord0.st);\n\t\tfinalBaseColor *= baseColorMap.rgb;\n\n\n\t\t// A roughness of exactly 0 is not allowed\n\t\troughness = max(roughness, 0.0001);\n\n\t\tvec3 pbrDiffuseColor = finalBaseColor * (1.0 - metallic);\n\t\tvec3 pbrSpecularColor = mix(vec3(specularLevel), finalBaseColor, metallic);\n\n\t\tvec3 viewVec = normalize(uTDMats[iVert.cameraIndex].camInverse[3].xyz - iVert.worldSpacePos.xyz );\n\n\n\t\t// Your shader will be recompiled based on the number\n\t\t// of lights in your scene, so this continues to work\n\t\t// even if you change your lighting setup after the shader\n\t\t// has been exported from the Phong MAT\n\t\tfor (int i = 0; i < TD_NUM_LIGHTS; i++)\n\t\t{\n\t\t\tTDPBRResult res;\n\t\t\tres = TDLightingPBR(i,\n\t\t\t\t\t\t\t\tpbrDiffuseColor,\n\t\t\t\t\t\t\t\tpbrSpecularColor,\n\t\t\t\t\t\t\t\tiVert.worldSpacePos.xyz,\n\t\t\t\t\t\t\t\tnormal,\n\t\t\t\t\t\t\t\tuShadowStrength, uShadowColor,\n\t\t\t\t\t\t\t\tviewVec,\n\t\t\t\t\t\t\t\troughness);\n\t\t\tdiffuseSum += res.diffuse;\n\t\t\tspecularSum += res.specular;\n\t\t}\n\n\t\t// Environment lights\n\t\tfor (int i = 0; i < TD_NUM_ENV_LIGHTS; i++)\n\t\t{\n\t\t\tTDPBRResult res;\n\t\t\tres = TDEnvLightingPBR(i,\n\t\t\t\t\t\tpbrDiffuseColor,\n\t\t\t\t\t\tpbrSpecularColor,\n\t\t\t\t\t\tnormal,\n\t\t\t\t\t\tviewVec,\n\t\t\t\t\t\troughness,\n\t\t\t\t\t\tambientOcclusion);\n\t\t\tdiffuseSum += res.diffuse;\n\t\t\tspecularSum += res.specular;\n\t\t}\n\t\t// Final Diffuse Contribution\n\t\tvec3 finalDiffuse = diffuseSum;\n\t\toutcol.rgb += finalDiffuse;\n\n\t\t// Final Specular Contribution\n\t\tvec3 finalSpecular = vec3(0.0);\n\t\tfinalSpecular += specularSum;\n\n\t\toutcol.rgb += finalSpecular;\n\n\n\t\t// Apply fog, this does nothing if fog is disabled\n\t\toutcol = TDFog(outcol, iVert.worldSpacePos.xyz, iVert.cameraIndex);\n\n\t\t// Alpha Calculation\n\t\tfloat alpha = uBaseColor.a * iVert.color.a ;\n\n\t\t// Dithering, does nothing if dithering is disabled\n\t\toutcol = TDDither(outcol);\n\n\t\toutcol.rgb *= alpha;\n\n\t\t// Modern GL removed the implicit alpha test, so we need to apply\n\t\t// it manually here. This function does nothing if alpha test is disabled.\n\t\tTDAlphaTest(alpha);\n\n\t\toutcol.a = alpha;\n\t\toutcol = mix(vec4(raymarchedColor, 1.0), outcol, useTDLighting);\n\t\toFragColor[0] = TDOutputSwizzle(outcol);\n\n\n\t\t// TD_NUM_COLOR_BUFFERS will be set to the number of color buffers\n\t\t// active in the render. By default we want to output zero to every\n\t\t// buffer except the first one.\n\t\tfor (int i = 1; i < TD_NUM_COLOR_BUFFERS; i++)\n\t\t{\n\t\t\toFragColor[i] = vec4(0.0);\n\t\t}\n\t} else {\n\t\tdiscard;\n\t}\n}\n";
+function glslToTouchDesignerShaderSource(source) {
+ return {
+ uniforms: baseUniforms(),
+ frag: TDHeader + 'const float STEP_SIZE_CONSTANT = 0.9;\n' + 'const int MAX_ITERATIONS = 300;\n' + uniformsToGLSL(baseUniforms()) + sculptureStarterCode + source + TDFooter,
+ vert: minimalVertexSource
+ };
+}
+function sculptToTouchDesignerShaderSource(source) {
+ var src = sculptToGLSL(source);
+
+ if (src.error) {
+ console.log(src.error);
+ }
+
+ var frg = TDHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(src.uniforms) + 'const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL + '\n' + src.colorGLSL + '\n' + TDFooter;
+ var sdf = 'const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL;
+ return {
+ uniforms: src.uniforms,
+ frag: frg,
+ vert: minimalVertexSource,
+ error: src.error,
+ geoGLSL: src.geoGLSL,
+ colorGLSL: src.colorGLSL,
+ sdf: sdf,
+ glslUniforms: uniformsToGLSL(src.uniforms)
+ };
+}
+
+console.log('using shader-park-core version: 0.1.26'); /// Generate code for various targets
+
+export { baseUniforms, bindStaticData, createSculpture, createSculptureWithGeometry, defaultFragSourceGLSL, fragFooter, glslToMinimalHTMLRenderer, glslToMinimalRenderer, glslToOfflineRenderer, glslToThreeJSMaterial, glslToThreeJSMesh, glslToThreeJSShaderSource, glslToTouchDesignerShaderSource, minimalHeader, minimalVertexSource, sculptToGLSL, sculptToMinimalHTMLRenderer, sculptToMinimalRenderer, sculptToOfflineRenderer, sculptToRawSDF4Meshing, sculptToThreeJSMaterial, sculptToThreeJSMesh, sculptToThreeJSShaderSource, sculptToTouchDesignerShaderSource, sculptureStarterCode, uniformsToGLSL, useHemisphereLight, usePBRHeader };
diff --git a/libai/shader-park-core.umd.js b/libai/shader-park-core.umd.js
new file mode 100644
index 0000000..4401922
--- /dev/null
+++ b/libai/shader-park-core.umd.js
@@ -0,0 +1,96395 @@
+/* Version: 0.1.26 - May 29, 2022 01:18:34 */
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['shader-park-core'] = {}));
+}(this, (function (exports) { 'use strict';
+
+ function _typeof(obj) {
+ "@babel/helpers - typeof";
+
+ if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
+ _typeof = function (obj) {
+ return typeof obj;
+ };
+ } else {
+ _typeof = function (obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ }
+
+ return _typeof(obj);
+ }
+
+ var REACT_ELEMENT_TYPE;
+
+ function _jsx(type, props, key, children) {
+ if (!REACT_ELEMENT_TYPE) {
+ REACT_ELEMENT_TYPE = typeof Symbol === "function" && Symbol["for"] && Symbol["for"]("react.element") || 0xeac7;
+ }
+
+ var defaultProps = type && type.defaultProps;
+ var childrenLength = arguments.length - 3;
+
+ if (!props && childrenLength !== 0) {
+ props = {
+ children: void 0
+ };
+ }
+
+ if (childrenLength === 1) {
+ props.children = children;
+ } else if (childrenLength > 1) {
+ var childArray = new Array(childrenLength);
+
+ for (var i = 0; i < childrenLength; i++) {
+ childArray[i] = arguments[i + 3];
+ }
+
+ props.children = childArray;
+ }
+
+ if (props && defaultProps) {
+ for (var propName in defaultProps) {
+ if (props[propName] === void 0) {
+ props[propName] = defaultProps[propName];
+ }
+ }
+ } else if (!props) {
+ props = defaultProps || {};
+ }
+
+ return {
+ $$typeof: REACT_ELEMENT_TYPE,
+ type: type,
+ key: key === undefined ? null : '' + key,
+ ref: null,
+ props: props,
+ _owner: null
+ };
+ }
+
+ function _asyncIterator(iterable) {
+ var method;
+
+ if (typeof Symbol !== "undefined") {
+ if (Symbol.asyncIterator) {
+ method = iterable[Symbol.asyncIterator];
+ if (method != null) return method.call(iterable);
+ }
+
+ if (Symbol.iterator) {
+ method = iterable[Symbol.iterator];
+ if (method != null) return method.call(iterable);
+ }
+ }
+
+ throw new TypeError("Object is not async iterable");
+ }
+
+ function _AwaitValue(value) {
+ this.wrapped = value;
+ }
+
+ function _AsyncGenerator(gen) {
+ var front, back;
+
+ function send(key, arg) {
+ return new Promise(function (resolve, reject) {
+ var request = {
+ key: key,
+ arg: arg,
+ resolve: resolve,
+ reject: reject,
+ next: null
+ };
+
+ if (back) {
+ back = back.next = request;
+ } else {
+ front = back = request;
+ resume(key, arg);
+ }
+ });
+ }
+
+ function resume(key, arg) {
+ try {
+ var result = gen[key](arg);
+ var value = result.value;
+ var wrappedAwait = value instanceof _AwaitValue;
+ Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
+ if (wrappedAwait) {
+ resume(key === "return" ? "return" : "next", arg);
+ return;
+ }
+
+ settle(result.done ? "return" : "normal", arg);
+ }, function (err) {
+ resume("throw", err);
+ });
+ } catch (err) {
+ settle("throw", err);
+ }
+ }
+
+ function settle(type, value) {
+ switch (type) {
+ case "return":
+ front.resolve({
+ value: value,
+ done: true
+ });
+ break;
+
+ case "throw":
+ front.reject(value);
+ break;
+
+ default:
+ front.resolve({
+ value: value,
+ done: false
+ });
+ break;
+ }
+
+ front = front.next;
+
+ if (front) {
+ resume(front.key, front.arg);
+ } else {
+ back = null;
+ }
+ }
+
+ this._invoke = send;
+
+ if (typeof gen.return !== "function") {
+ this.return = undefined;
+ }
+ }
+
+ if (typeof Symbol === "function" && Symbol.asyncIterator) {
+ _AsyncGenerator.prototype[Symbol.asyncIterator] = function () {
+ return this;
+ };
+ }
+
+ _AsyncGenerator.prototype.next = function (arg) {
+ return this._invoke("next", arg);
+ };
+
+ _AsyncGenerator.prototype.throw = function (arg) {
+ return this._invoke("throw", arg);
+ };
+
+ _AsyncGenerator.prototype.return = function (arg) {
+ return this._invoke("return", arg);
+ };
+
+ function _wrapAsyncGenerator(fn) {
+ return function () {
+ return new _AsyncGenerator(fn.apply(this, arguments));
+ };
+ }
+
+ function _awaitAsyncGenerator(value) {
+ return new _AwaitValue(value);
+ }
+
+ function _asyncGeneratorDelegate(inner, awaitWrap) {
+ var iter = {},
+ waiting = false;
+
+ function pump(key, value) {
+ waiting = true;
+ value = new Promise(function (resolve) {
+ resolve(inner[key](value));
+ });
+ return {
+ done: false,
+ value: awaitWrap(value)
+ };
+ }
+
+ ;
+
+ if (typeof Symbol === "function" && Symbol.iterator) {
+ iter[Symbol.iterator] = function () {
+ return this;
+ };
+ }
+
+ iter.next = function (value) {
+ if (waiting) {
+ waiting = false;
+ return value;
+ }
+
+ return pump("next", value);
+ };
+
+ if (typeof inner.throw === "function") {
+ iter.throw = function (value) {
+ if (waiting) {
+ waiting = false;
+ throw value;
+ }
+
+ return pump("throw", value);
+ };
+ }
+
+ if (typeof inner.return === "function") {
+ iter.return = function (value) {
+ if (waiting) {
+ waiting = false;
+ return value;
+ }
+
+ return pump("return", value);
+ };
+ }
+
+ return iter;
+ }
+
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
+ try {
+ var info = gen[key](arg);
+ var value = info.value;
+ } catch (error) {
+ reject(error);
+ return;
+ }
+
+ if (info.done) {
+ resolve(value);
+ } else {
+ Promise.resolve(value).then(_next, _throw);
+ }
+ }
+
+ function _asyncToGenerator(fn) {
+ return function () {
+ var self = this,
+ args = arguments;
+ return new Promise(function (resolve, reject) {
+ var gen = fn.apply(self, args);
+
+ function _next(value) {
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
+ }
+
+ function _throw(err) {
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
+ }
+
+ _next(undefined);
+ });
+ };
+ }
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+
+ function _defineEnumerableProperties(obj, descs) {
+ for (var key in descs) {
+ var desc = descs[key];
+ desc.configurable = desc.enumerable = true;
+ if ("value" in desc) desc.writable = true;
+ Object.defineProperty(obj, key, desc);
+ }
+
+ if (Object.getOwnPropertySymbols) {
+ var objectSymbols = Object.getOwnPropertySymbols(descs);
+
+ for (var i = 0; i < objectSymbols.length; i++) {
+ var sym = objectSymbols[i];
+ var desc = descs[sym];
+ desc.configurable = desc.enumerable = true;
+ if ("value" in desc) desc.writable = true;
+ Object.defineProperty(obj, sym, desc);
+ }
+ }
+
+ return obj;
+ }
+
+ function _defaults(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);
+
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var value = Object.getOwnPropertyDescriptor(defaults, key);
+
+ if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }
+
+ return obj;
+ }
+
+ function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+ }
+
+ function _extends() {
+ _extends = Object.assign || function (target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+
+ return target;
+ };
+
+ return _extends.apply(this, arguments);
+ }
+
+ function _objectSpread(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i] != null ? Object(arguments[i]) : {};
+ var ownKeys = Object.keys(source);
+
+ if (typeof Object.getOwnPropertySymbols === 'function') {
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
+ }));
+ }
+
+ ownKeys.forEach(function (key) {
+ _defineProperty(target, key, source[key]);
+ });
+ }
+
+ return target;
+ }
+
+ function ownKeys(object, enumerableOnly) {
+ var keys = Object.keys(object);
+
+ if (Object.getOwnPropertySymbols) {
+ var symbols = Object.getOwnPropertySymbols(object);
+ if (enumerableOnly) symbols = symbols.filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
+ });
+ keys.push.apply(keys, symbols);
+ }
+
+ return keys;
+ }
+
+ function _objectSpread2(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i] != null ? arguments[i] : {};
+
+ if (i % 2) {
+ ownKeys(Object(source), true).forEach(function (key) {
+ _defineProperty(target, key, source[key]);
+ });
+ } else if (Object.getOwnPropertyDescriptors) {
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
+ } else {
+ ownKeys(Object(source)).forEach(function (key) {
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
+ });
+ }
+ }
+
+ return target;
+ }
+
+ function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function");
+ }
+
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ writable: true,
+ configurable: true
+ }
+ });
+ if (superClass) _setPrototypeOf(subClass, superClass);
+ }
+
+ function _inheritsLoose(subClass, superClass) {
+ subClass.prototype = Object.create(superClass.prototype);
+ subClass.prototype.constructor = subClass;
+
+ _setPrototypeOf(subClass, superClass);
+ }
+
+ function _getPrototypeOf(o) {
+ _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
+ return o.__proto__ || Object.getPrototypeOf(o);
+ };
+ return _getPrototypeOf(o);
+ }
+
+ function _setPrototypeOf(o, p) {
+ _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
+ o.__proto__ = p;
+ return o;
+ };
+
+ return _setPrototypeOf(o, p);
+ }
+
+ function _isNativeReflectConstruct() {
+ if (typeof Reflect === "undefined" || !Reflect.construct) return false;
+ if (Reflect.construct.sham) return false;
+ if (typeof Proxy === "function") return true;
+
+ try {
+ Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ function _construct(Parent, args, Class) {
+ if (_isNativeReflectConstruct()) {
+ _construct = Reflect.construct;
+ } else {
+ _construct = function _construct(Parent, args, Class) {
+ var a = [null];
+ a.push.apply(a, args);
+ var Constructor = Function.bind.apply(Parent, a);
+ var instance = new Constructor();
+ if (Class) _setPrototypeOf(instance, Class.prototype);
+ return instance;
+ };
+ }
+
+ return _construct.apply(null, arguments);
+ }
+
+ function _isNativeFunction(fn) {
+ return Function.toString.call(fn).indexOf("[native code]") !== -1;
+ }
+
+ function _wrapNativeSuper(Class) {
+ var _cache = typeof Map === "function" ? new Map() : undefined;
+
+ _wrapNativeSuper = function _wrapNativeSuper(Class) {
+ if (Class === null || !_isNativeFunction(Class)) return Class;
+
+ if (typeof Class !== "function") {
+ throw new TypeError("Super expression must either be null or a function");
+ }
+
+ if (typeof _cache !== "undefined") {
+ if (_cache.has(Class)) return _cache.get(Class);
+
+ _cache.set(Class, Wrapper);
+ }
+
+ function Wrapper() {
+ return _construct(Class, arguments, _getPrototypeOf(this).constructor);
+ }
+
+ Wrapper.prototype = Object.create(Class.prototype, {
+ constructor: {
+ value: Wrapper,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ return _setPrototypeOf(Wrapper, Class);
+ };
+
+ return _wrapNativeSuper(Class);
+ }
+
+ function _instanceof(left, right) {
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
+ return !!right[Symbol.hasInstance](left);
+ } else {
+ return left instanceof right;
+ }
+ }
+
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : {
+ default: obj
+ };
+ }
+
+ function _getRequireWildcardCache() {
+ if (typeof WeakMap !== "function") return null;
+ var cache = new WeakMap();
+
+ _getRequireWildcardCache = function () {
+ return cache;
+ };
+
+ return cache;
+ }
+
+ function _interopRequireWildcard(obj) {
+ if (obj && obj.__esModule) {
+ return obj;
+ }
+
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
+ return {
+ default: obj
+ };
+ }
+
+ var cache = _getRequireWildcardCache();
+
+ if (cache && cache.has(obj)) {
+ return cache.get(obj);
+ }
+
+ var newObj = {};
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
+
+ for (var key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
+
+ if (desc && (desc.get || desc.set)) {
+ Object.defineProperty(newObj, key, desc);
+ } else {
+ newObj[key] = obj[key];
+ }
+ }
+ }
+
+ newObj.default = obj;
+
+ if (cache) {
+ cache.set(obj, newObj);
+ }
+
+ return newObj;
+ }
+
+ function _newArrowCheck(innerThis, boundThis) {
+ if (innerThis !== boundThis) {
+ throw new TypeError("Cannot instantiate an arrow function");
+ }
+ }
+
+ function _objectDestructuringEmpty(obj) {
+ if (obj == null) throw new TypeError("Cannot destructure undefined");
+ }
+
+ function _objectWithoutPropertiesLoose(source, excluded) {
+ if (source == null) return {};
+ var target = {};
+ var sourceKeys = Object.keys(source);
+ var key, i;
+
+ for (i = 0; i < sourceKeys.length; i++) {
+ key = sourceKeys[i];
+ if (excluded.indexOf(key) >= 0) continue;
+ target[key] = source[key];
+ }
+
+ return target;
+ }
+
+ function _objectWithoutProperties(source, excluded) {
+ if (source == null) return {};
+
+ var target = _objectWithoutPropertiesLoose(source, excluded);
+
+ var key, i;
+
+ if (Object.getOwnPropertySymbols) {
+ var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
+
+ for (i = 0; i < sourceSymbolKeys.length; i++) {
+ key = sourceSymbolKeys[i];
+ if (excluded.indexOf(key) >= 0) continue;
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
+ target[key] = source[key];
+ }
+ }
+
+ return target;
+ }
+
+ function _assertThisInitialized(self) {
+ if (self === void 0) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }
+
+ return self;
+ }
+
+ function _possibleConstructorReturn(self, call) {
+ if (call && (typeof call === "object" || typeof call === "function")) {
+ return call;
+ }
+
+ return _assertThisInitialized(self);
+ }
+
+ function _createSuper(Derived) {
+ var hasNativeReflectConstruct = _isNativeReflectConstruct();
+
+ return function _createSuperInternal() {
+ var Super = _getPrototypeOf(Derived),
+ result;
+
+ if (hasNativeReflectConstruct) {
+ var NewTarget = _getPrototypeOf(this).constructor;
+
+ result = Reflect.construct(Super, arguments, NewTarget);
+ } else {
+ result = Super.apply(this, arguments);
+ }
+
+ return _possibleConstructorReturn(this, result);
+ };
+ }
+
+ function _superPropBase(object, property) {
+ while (!Object.prototype.hasOwnProperty.call(object, property)) {
+ object = _getPrototypeOf(object);
+ if (object === null) break;
+ }
+
+ return object;
+ }
+
+ function _get(target, property, receiver) {
+ if (typeof Reflect !== "undefined" && Reflect.get) {
+ _get = Reflect.get;
+ } else {
+ _get = function _get(target, property, receiver) {
+ var base = _superPropBase(target, property);
+
+ if (!base) return;
+ var desc = Object.getOwnPropertyDescriptor(base, property);
+
+ if (desc.get) {
+ return desc.get.call(receiver);
+ }
+
+ return desc.value;
+ };
+ }
+
+ return _get(target, property, receiver || target);
+ }
+
+ function set(target, property, value, receiver) {
+ if (typeof Reflect !== "undefined" && Reflect.set) {
+ set = Reflect.set;
+ } else {
+ set = function set(target, property, value, receiver) {
+ var base = _superPropBase(target, property);
+
+ var desc;
+
+ if (base) {
+ desc = Object.getOwnPropertyDescriptor(base, property);
+
+ if (desc.set) {
+ desc.set.call(receiver, value);
+ return true;
+ } else if (!desc.writable) {
+ return false;
+ }
+ }
+
+ desc = Object.getOwnPropertyDescriptor(receiver, property);
+
+ if (desc) {
+ if (!desc.writable) {
+ return false;
+ }
+
+ desc.value = value;
+ Object.defineProperty(receiver, property, desc);
+ } else {
+ _defineProperty(receiver, property, value);
+ }
+
+ return true;
+ };
+ }
+
+ return set(target, property, value, receiver);
+ }
+
+ function _set(target, property, value, receiver, isStrict) {
+ var s = set(target, property, value, receiver || target);
+
+ if (!s && isStrict) {
+ throw new Error('failed to set property');
+ }
+
+ return value;
+ }
+
+ function _taggedTemplateLiteral(strings, raw) {
+ if (!raw) {
+ raw = strings.slice(0);
+ }
+
+ return Object.freeze(Object.defineProperties(strings, {
+ raw: {
+ value: Object.freeze(raw)
+ }
+ }));
+ }
+
+ function _taggedTemplateLiteralLoose(strings, raw) {
+ if (!raw) {
+ raw = strings.slice(0);
+ }
+
+ strings.raw = raw;
+ return strings;
+ }
+
+ function _readOnlyError(name) {
+ throw new TypeError("\"" + name + "\" is read-only");
+ }
+
+ function _writeOnlyError(name) {
+ throw new TypeError("\"" + name + "\" is write-only");
+ }
+
+ function _classNameTDZError(name) {
+ throw new Error("Class \"" + name + "\" cannot be referenced in computed property keys.");
+ }
+
+ function _temporalUndefined() {}
+
+ function _tdz(name) {
+ throw new ReferenceError(name + " is not defined - temporal dead zone");
+ }
+
+ function _temporalRef(val, name) {
+ return val === _temporalUndefined ? _tdz(name) : val;
+ }
+
+ function _slicedToArray(arr, i) {
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
+ }
+
+ function _slicedToArrayLoose(arr, i) {
+ return _arrayWithHoles(arr) || _iterableToArrayLimitLoose(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
+ }
+
+ function _toArray(arr) {
+ return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();
+ }
+
+ function _toConsumableArray(arr) {
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
+ }
+
+ function _arrayWithoutHoles(arr) {
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
+ }
+
+ function _arrayWithHoles(arr) {
+ if (Array.isArray(arr)) return arr;
+ }
+
+ function _maybeArrayLike(next, arr, i) {
+ if (arr && !Array.isArray(arr) && typeof arr.length === "number") {
+ var len = arr.length;
+ return _arrayLikeToArray(arr, i !== void 0 && i < len ? i : len);
+ }
+
+ return next(arr, i);
+ }
+
+ function _iterableToArray(iter) {
+ if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
+ }
+
+ function _iterableToArrayLimit(arr, i) {
+ if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
+ var _arr = [];
+ var _n = true;
+ var _d = false;
+ var _e = undefined;
+
+ try {
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
+ _arr.push(_s.value);
+
+ if (i && _arr.length === i) break;
+ }
+ } catch (err) {
+ _d = true;
+ _e = err;
+ } finally {
+ try {
+ if (!_n && _i["return"] != null) _i["return"]();
+ } finally {
+ if (_d) throw _e;
+ }
+ }
+
+ return _arr;
+ }
+
+ function _iterableToArrayLimitLoose(arr, i) {
+ if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
+ var _arr = [];
+
+ for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
+ _arr.push(_step.value);
+
+ if (i && _arr.length === i) break;
+ }
+
+ return _arr;
+ }
+
+ function _unsupportedIterableToArray(o, minLen) {
+ if (!o) return;
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
+ var n = Object.prototype.toString.call(o).slice(8, -1);
+ if (n === "Object" && o.constructor) n = o.constructor.name;
+ if (n === "Map" || n === "Set") return Array.from(o);
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
+ }
+
+ function _arrayLikeToArray(arr, len) {
+ if (len == null || len > arr.length) len = arr.length;
+
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
+
+ return arr2;
+ }
+
+ function _nonIterableSpread() {
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+ }
+
+ function _nonIterableRest() {
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+ }
+
+ function _createForOfIteratorHelper(o, allowArrayLike) {
+ var it;
+
+ if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
+ if (it) o = it;
+ var i = 0;
+
+ var F = function () {};
+
+ return {
+ s: F,
+ n: function () {
+ if (i >= o.length) return {
+ done: true
+ };
+ return {
+ done: false,
+ value: o[i++]
+ };
+ },
+ e: function (e) {
+ throw e;
+ },
+ f: F
+ };
+ }
+
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+ }
+
+ var normalCompletion = true,
+ didErr = false,
+ err;
+ return {
+ s: function () {
+ it = o[Symbol.iterator]();
+ },
+ n: function () {
+ var step = it.next();
+ normalCompletion = step.done;
+ return step;
+ },
+ e: function (e) {
+ didErr = true;
+ err = e;
+ },
+ f: function () {
+ try {
+ if (!normalCompletion && it.return != null) it.return();
+ } finally {
+ if (didErr) throw err;
+ }
+ }
+ };
+ }
+
+ function _createForOfIteratorHelperLoose(o, allowArrayLike) {
+ var it;
+
+ if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
+ if (it) o = it;
+ var i = 0;
+ return function () {
+ if (i >= o.length) return {
+ done: true
+ };
+ return {
+ done: false,
+ value: o[i++]
+ };
+ };
+ }
+
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+ }
+
+ it = o[Symbol.iterator]();
+ return it.next.bind(it);
+ }
+
+ function _skipFirstGeneratorNext(fn) {
+ return function () {
+ var it = fn.apply(this, arguments);
+ it.next();
+ return it;
+ };
+ }
+
+ function _toPrimitive(input, hint) {
+ if (typeof input !== "object" || input === null) return input;
+ var prim = input[Symbol.toPrimitive];
+
+ if (prim !== undefined) {
+ var res = prim.call(input, hint || "default");
+ if (typeof res !== "object") return res;
+ throw new TypeError("@@toPrimitive must return a primitive value.");
+ }
+
+ return (hint === "string" ? String : Number)(input);
+ }
+
+ function _toPropertyKey(arg) {
+ var key = _toPrimitive(arg, "string");
+
+ return typeof key === "symbol" ? key : String(key);
+ }
+
+ function _initializerWarningHelper(descriptor, context) {
+ throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');
+ }
+
+ function _initializerDefineProperty(target, property, descriptor, context) {
+ if (!descriptor) return;
+ Object.defineProperty(target, property, {
+ enumerable: descriptor.enumerable,
+ configurable: descriptor.configurable,
+ writable: descriptor.writable,
+ value: descriptor.initializer ? descriptor.initializer.call(context) : void 0
+ });
+ }
+
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
+ var desc = {};
+ Object.keys(descriptor).forEach(function (key) {
+ desc[key] = descriptor[key];
+ });
+ desc.enumerable = !!desc.enumerable;
+ desc.configurable = !!desc.configurable;
+
+ if ('value' in desc || desc.initializer) {
+ desc.writable = true;
+ }
+
+ desc = decorators.slice().reverse().reduce(function (desc, decorator) {
+ return decorator(target, property, desc) || desc;
+ }, desc);
+
+ if (context && desc.initializer !== void 0) {
+ desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
+ desc.initializer = undefined;
+ }
+
+ if (desc.initializer === void 0) {
+ Object.defineProperty(target, property, desc);
+ desc = null;
+ }
+
+ return desc;
+ }
+
+ var id = 0;
+
+ function _classPrivateFieldLooseKey(name) {
+ return "__private_" + id++ + "_" + name;
+ }
+
+ function _classPrivateFieldLooseBase(receiver, privateKey) {
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
+ throw new TypeError("attempted to use private field on non-instance");
+ }
+
+ return receiver;
+ }
+
+ function _classPrivateFieldGet(receiver, privateMap) {
+ var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get");
+
+ return _classApplyDescriptorGet(receiver, descriptor);
+ }
+
+ function _classPrivateFieldSet(receiver, privateMap, value) {
+ var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set");
+
+ _classApplyDescriptorSet(receiver, descriptor, value);
+
+ return value;
+ }
+
+ function _classPrivateFieldDestructureSet(receiver, privateMap) {
+ var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set");
+
+ return _classApplyDescriptorDestructureSet(receiver, descriptor);
+ }
+
+ function _classExtractFieldDescriptor(receiver, privateMap, action) {
+ if (!privateMap.has(receiver)) {
+ throw new TypeError("attempted to " + action + " private field on non-instance");
+ }
+
+ return privateMap.get(receiver);
+ }
+
+ function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) {
+ _classCheckPrivateStaticAccess(receiver, classConstructor);
+
+ _classCheckPrivateStaticFieldDescriptor(descriptor, "get");
+
+ return _classApplyDescriptorGet(receiver, descriptor);
+ }
+
+ function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) {
+ _classCheckPrivateStaticAccess(receiver, classConstructor);
+
+ _classCheckPrivateStaticFieldDescriptor(descriptor, "set");
+
+ _classApplyDescriptorSet(receiver, descriptor, value);
+
+ return value;
+ }
+
+ function _classStaticPrivateMethodGet(receiver, classConstructor, method) {
+ _classCheckPrivateStaticAccess(receiver, classConstructor);
+
+ return method;
+ }
+
+ function _classStaticPrivateMethodSet() {
+ throw new TypeError("attempted to set read only static private field");
+ }
+
+ function _classApplyDescriptorGet(receiver, descriptor) {
+ if (descriptor.get) {
+ return descriptor.get.call(receiver);
+ }
+
+ return descriptor.value;
+ }
+
+ function _classApplyDescriptorSet(receiver, descriptor, value) {
+ if (descriptor.set) {
+ descriptor.set.call(receiver, value);
+ } else {
+ if (!descriptor.writable) {
+ throw new TypeError("attempted to set read only private field");
+ }
+
+ descriptor.value = value;
+ }
+ }
+
+ function _classApplyDescriptorDestructureSet(receiver, descriptor) {
+ if (descriptor.set) {
+ if (!("__destrObj" in descriptor)) {
+ descriptor.__destrObj = {
+ set value(v) {
+ descriptor.set.call(receiver, v);
+ }
+
+ };
+ }
+
+ return descriptor.__destrObj;
+ } else {
+ if (!descriptor.writable) {
+ throw new TypeError("attempted to set read only private field");
+ }
+
+ return descriptor;
+ }
+ }
+
+ function _classStaticPrivateFieldDestructureSet(receiver, classConstructor, descriptor) {
+ _classCheckPrivateStaticAccess(receiver, classConstructor);
+
+ _classCheckPrivateStaticFieldDescriptor(descriptor, "set");
+
+ return _classApplyDescriptorDestructureSet(receiver, descriptor);
+ }
+
+ function _classCheckPrivateStaticAccess(receiver, classConstructor) {
+ if (receiver !== classConstructor) {
+ throw new TypeError("Private static access of wrong provenance");
+ }
+ }
+
+ function _classCheckPrivateStaticFieldDescriptor(descriptor, action) {
+ if (descriptor === undefined) {
+ throw new TypeError("attempted to " + action + " private static field before its declaration");
+ }
+ }
+
+ function _decorate(decorators, factory, superClass, mixins) {
+ var api = _getDecoratorsApi();
+
+ if (mixins) {
+ for (var i = 0; i < mixins.length; i++) {
+ api = mixins[i](api);
+ }
+ }
+
+ var r = factory(function initialize(O) {
+ api.initializeInstanceElements(O, decorated.elements);
+ }, superClass);
+ var decorated = api.decorateClass(_coalesceClassElements(r.d.map(_createElementDescriptor)), decorators);
+ api.initializeClassElements(r.F, decorated.elements);
+ return api.runClassFinishers(r.F, decorated.finishers);
+ }
+
+ function _getDecoratorsApi() {
+ _getDecoratorsApi = function () {
+ return api;
+ };
+
+ var api = {
+ elementsDefinitionOrder: [["method"], ["field"]],
+ initializeInstanceElements: function (O, elements) {
+ ["method", "field"].forEach(function (kind) {
+ elements.forEach(function (element) {
+ if (element.kind === kind && element.placement === "own") {
+ this.defineClassElement(O, element);
+ }
+ }, this);
+ }, this);
+ },
+ initializeClassElements: function (F, elements) {
+ var proto = F.prototype;
+ ["method", "field"].forEach(function (kind) {
+ elements.forEach(function (element) {
+ var placement = element.placement;
+
+ if (element.kind === kind && (placement === "static" || placement === "prototype")) {
+ var receiver = placement === "static" ? F : proto;
+ this.defineClassElement(receiver, element);
+ }
+ }, this);
+ }, this);
+ },
+ defineClassElement: function (receiver, element) {
+ var descriptor = element.descriptor;
+
+ if (element.kind === "field") {
+ var initializer = element.initializer;
+ descriptor = {
+ enumerable: descriptor.enumerable,
+ writable: descriptor.writable,
+ configurable: descriptor.configurable,
+ value: initializer === void 0 ? void 0 : initializer.call(receiver)
+ };
+ }
+
+ Object.defineProperty(receiver, element.key, descriptor);
+ },
+ decorateClass: function (elements, decorators) {
+ var newElements = [];
+ var finishers = [];
+ var placements = {
+ static: [],
+ prototype: [],
+ own: []
+ };
+ elements.forEach(function (element) {
+ this.addElementPlacement(element, placements);
+ }, this);
+ elements.forEach(function (element) {
+ if (!_hasDecorators(element)) return newElements.push(element);
+ var elementFinishersExtras = this.decorateElement(element, placements);
+ newElements.push(elementFinishersExtras.element);
+ newElements.push.apply(newElements, elementFinishersExtras.extras);
+ finishers.push.apply(finishers, elementFinishersExtras.finishers);
+ }, this);
+
+ if (!decorators) {
+ return {
+ elements: newElements,
+ finishers: finishers
+ };
+ }
+
+ var result = this.decorateConstructor(newElements, decorators);
+ finishers.push.apply(finishers, result.finishers);
+ result.finishers = finishers;
+ return result;
+ },
+ addElementPlacement: function (element, placements, silent) {
+ var keys = placements[element.placement];
+
+ if (!silent && keys.indexOf(element.key) !== -1) {
+ throw new TypeError("Duplicated element (" + element.key + ")");
+ }
+
+ keys.push(element.key);
+ },
+ decorateElement: function (element, placements) {
+ var extras = [];
+ var finishers = [];
+
+ for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {
+ var keys = placements[element.placement];
+ keys.splice(keys.indexOf(element.key), 1);
+ var elementObject = this.fromElementDescriptor(element);
+ var elementFinisherExtras = this.toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject);
+ element = elementFinisherExtras.element;
+ this.addElementPlacement(element, placements);
+
+ if (elementFinisherExtras.finisher) {
+ finishers.push(elementFinisherExtras.finisher);
+ }
+
+ var newExtras = elementFinisherExtras.extras;
+
+ if (newExtras) {
+ for (var j = 0; j < newExtras.length; j++) {
+ this.addElementPlacement(newExtras[j], placements);
+ }
+
+ extras.push.apply(extras, newExtras);
+ }
+ }
+
+ return {
+ element: element,
+ finishers: finishers,
+ extras: extras
+ };
+ },
+ decorateConstructor: function (elements, decorators) {
+ var finishers = [];
+
+ for (var i = decorators.length - 1; i >= 0; i--) {
+ var obj = this.fromClassDescriptor(elements);
+ var elementsAndFinisher = this.toClassDescriptor((0, decorators[i])(obj) || obj);
+
+ if (elementsAndFinisher.finisher !== undefined) {
+ finishers.push(elementsAndFinisher.finisher);
+ }
+
+ if (elementsAndFinisher.elements !== undefined) {
+ elements = elementsAndFinisher.elements;
+
+ for (var j = 0; j < elements.length - 1; j++) {
+ for (var k = j + 1; k < elements.length; k++) {
+ if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) {
+ throw new TypeError("Duplicated element (" + elements[j].key + ")");
+ }
+ }
+ }
+ }
+ }
+
+ return {
+ elements: elements,
+ finishers: finishers
+ };
+ },
+ fromElementDescriptor: function (element) {
+ var obj = {
+ kind: element.kind,
+ key: element.key,
+ placement: element.placement,
+ descriptor: element.descriptor
+ };
+ var desc = {
+ value: "Descriptor",
+ configurable: true
+ };
+ Object.defineProperty(obj, Symbol.toStringTag, desc);
+ if (element.kind === "field") obj.initializer = element.initializer;
+ return obj;
+ },
+ toElementDescriptors: function (elementObjects) {
+ if (elementObjects === undefined) return;
+ return _toArray(elementObjects).map(function (elementObject) {
+ var element = this.toElementDescriptor(elementObject);
+ this.disallowProperty(elementObject, "finisher", "An element descriptor");
+ this.disallowProperty(elementObject, "extras", "An element descriptor");
+ return element;
+ }, this);
+ },
+ toElementDescriptor: function (elementObject) {
+ var kind = String(elementObject.kind);
+
+ if (kind !== "method" && kind !== "field") {
+ throw new TypeError('An element descriptor\'s .kind property must be either "method" or' + ' "field", but a decorator created an element descriptor with' + ' .kind "' + kind + '"');
+ }
+
+ var key = _toPropertyKey(elementObject.key);
+
+ var placement = String(elementObject.placement);
+
+ if (placement !== "static" && placement !== "prototype" && placement !== "own") {
+ throw new TypeError('An element descriptor\'s .placement property must be one of "static",' + ' "prototype" or "own", but a decorator created an element descriptor' + ' with .placement "' + placement + '"');
+ }
+
+ var descriptor = elementObject.descriptor;
+ this.disallowProperty(elementObject, "elements", "An element descriptor");
+ var element = {
+ kind: kind,
+ key: key,
+ placement: placement,
+ descriptor: Object.assign({}, descriptor)
+ };
+
+ if (kind !== "field") {
+ this.disallowProperty(elementObject, "initializer", "A method descriptor");
+ } else {
+ this.disallowProperty(descriptor, "get", "The property descriptor of a field descriptor");
+ this.disallowProperty(descriptor, "set", "The property descriptor of a field descriptor");
+ this.disallowProperty(descriptor, "value", "The property descriptor of a field descriptor");
+ element.initializer = elementObject.initializer;
+ }
+
+ return element;
+ },
+ toElementFinisherExtras: function (elementObject) {
+ var element = this.toElementDescriptor(elementObject);
+
+ var finisher = _optionalCallableProperty(elementObject, "finisher");
+
+ var extras = this.toElementDescriptors(elementObject.extras);
+ return {
+ element: element,
+ finisher: finisher,
+ extras: extras
+ };
+ },
+ fromClassDescriptor: function (elements) {
+ var obj = {
+ kind: "class",
+ elements: elements.map(this.fromElementDescriptor, this)
+ };
+ var desc = {
+ value: "Descriptor",
+ configurable: true
+ };
+ Object.defineProperty(obj, Symbol.toStringTag, desc);
+ return obj;
+ },
+ toClassDescriptor: function (obj) {
+ var kind = String(obj.kind);
+
+ if (kind !== "class") {
+ throw new TypeError('A class descriptor\'s .kind property must be "class", but a decorator' + ' created a class descriptor with .kind "' + kind + '"');
+ }
+
+ this.disallowProperty(obj, "key", "A class descriptor");
+ this.disallowProperty(obj, "placement", "A class descriptor");
+ this.disallowProperty(obj, "descriptor", "A class descriptor");
+ this.disallowProperty(obj, "initializer", "A class descriptor");
+ this.disallowProperty(obj, "extras", "A class descriptor");
+
+ var finisher = _optionalCallableProperty(obj, "finisher");
+
+ var elements = this.toElementDescriptors(obj.elements);
+ return {
+ elements: elements,
+ finisher: finisher
+ };
+ },
+ runClassFinishers: function (constructor, finishers) {
+ for (var i = 0; i < finishers.length; i++) {
+ var newConstructor = (0, finishers[i])(constructor);
+
+ if (newConstructor !== undefined) {
+ if (typeof newConstructor !== "function") {
+ throw new TypeError("Finishers must return a constructor.");
+ }
+
+ constructor = newConstructor;
+ }
+ }
+
+ return constructor;
+ },
+ disallowProperty: function (obj, name, objectType) {
+ if (obj[name] !== undefined) {
+ throw new TypeError(objectType + " can't have a ." + name + " property.");
+ }
+ }
+ };
+ return api;
+ }
+
+ function _createElementDescriptor(def) {
+ var key = _toPropertyKey(def.key);
+
+ var descriptor;
+
+ if (def.kind === "method") {
+ descriptor = {
+ value: def.value,
+ writable: true,
+ configurable: true,
+ enumerable: false
+ };
+ } else if (def.kind === "get") {
+ descriptor = {
+ get: def.value,
+ configurable: true,
+ enumerable: false
+ };
+ } else if (def.kind === "set") {
+ descriptor = {
+ set: def.value,
+ configurable: true,
+ enumerable: false
+ };
+ } else if (def.kind === "field") {
+ descriptor = {
+ configurable: true,
+ writable: true,
+ enumerable: true
+ };
+ }
+
+ var element = {
+ kind: def.kind === "field" ? "field" : "method",
+ key: key,
+ placement: def.static ? "static" : def.kind === "field" ? "own" : "prototype",
+ descriptor: descriptor
+ };
+ if (def.decorators) element.decorators = def.decorators;
+ if (def.kind === "field") element.initializer = def.value;
+ return element;
+ }
+
+ function _coalesceGetterSetter(element, other) {
+ if (element.descriptor.get !== undefined) {
+ other.descriptor.get = element.descriptor.get;
+ } else {
+ other.descriptor.set = element.descriptor.set;
+ }
+ }
+
+ function _coalesceClassElements(elements) {
+ var newElements = [];
+
+ var isSameElement = function (other) {
+ return other.kind === "method" && other.key === element.key && other.placement === element.placement;
+ };
+
+ for (var i = 0; i < elements.length; i++) {
+ var element = elements[i];
+ var other;
+
+ if (element.kind === "method" && (other = newElements.find(isSameElement))) {
+ if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {
+ if (_hasDecorators(element) || _hasDecorators(other)) {
+ throw new ReferenceError("Duplicated methods (" + element.key + ") can't be decorated.");
+ }
+
+ other.descriptor = element.descriptor;
+ } else {
+ if (_hasDecorators(element)) {
+ if (_hasDecorators(other)) {
+ throw new ReferenceError("Decorators can't be placed on different accessors with for " + "the same property (" + element.key + ").");
+ }
+
+ other.decorators = element.decorators;
+ }
+
+ _coalesceGetterSetter(element, other);
+ }
+ } else {
+ newElements.push(element);
+ }
+ }
+
+ return newElements;
+ }
+
+ function _hasDecorators(element) {
+ return element.decorators && element.decorators.length;
+ }
+
+ function _isDataDescriptor(desc) {
+ return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);
+ }
+
+ function _optionalCallableProperty(obj, name) {
+ var value = obj[name];
+
+ if (value !== undefined && typeof value !== "function") {
+ throw new TypeError("Expected '" + name + "' to be a function");
+ }
+
+ return value;
+ }
+
+ function _classPrivateMethodGet(receiver, privateSet, fn) {
+ if (!privateSet.has(receiver)) {
+ throw new TypeError("attempted to get private field on non-instance");
+ }
+
+ return fn;
+ }
+
+ function _classPrivateMethodSet() {
+ throw new TypeError("attempted to reassign private method");
+ }
+
+ function _wrapRegExp(re, groups) {
+ _wrapRegExp = function (re, groups) {
+ return new BabelRegExp(re, undefined, groups);
+ };
+
+ var _RegExp = _wrapNativeSuper(RegExp);
+
+ var _super = RegExp.prototype;
+
+ var _groups = new WeakMap();
+
+ function BabelRegExp(re, flags, groups) {
+ var _this = _RegExp.call(this, re, flags);
+
+ _groups.set(_this, groups || _groups.get(re));
+
+ return _this;
+ }
+
+ _inherits(BabelRegExp, _RegExp);
+
+ BabelRegExp.prototype.exec = function (str) {
+ var result = _super.exec.call(this, str);
+
+ if (result) result.groups = buildGroups(result, this);
+ return result;
+ };
+
+ BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {
+ if (typeof substitution === "string") {
+ var groups = _groups.get(this);
+
+ return _super[Symbol.replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) {
+ return "$" + groups[name];
+ }));
+ } else if (typeof substitution === "function") {
+ var _this = this;
+
+ return _super[Symbol.replace].call(this, str, function () {
+ var args = [];
+ args.push.apply(args, arguments);
+
+ if (typeof args[args.length - 1] !== "object") {
+ args.push(buildGroups(args, _this));
+ }
+
+ return substitution.apply(this, args);
+ });
+ } else {
+ return _super[Symbol.replace].call(this, str, substitution);
+ }
+ };
+
+ function buildGroups(result, re) {
+ var g = _groups.get(re);
+
+ return Object.keys(g).reduce(function (groups, name) {
+ groups[name] = result[g[name]];
+ return groups;
+ }, Object.create(null));
+ }
+
+ return _wrapRegExp.apply(this, arguments);
+ }
+
+ // Numbers represent type -
+ // 1:float 2:vec2 3:vec3 4:vec4
+ var geometryFunctions = {
+ sphere: {
+ args: [1]
+ },
+ line: {
+ args: [3, 3, 1]
+ },
+ cone: {
+ args: [1, 1]
+ },
+ roundCone: {
+ args: [3, 3, 1, 1]
+ },
+ plane: {
+ args: [1, 1, 1, 1]
+ }
+ };
+ var mathFunctions = {
+ nsin: {
+ args: [1],
+ ret: 1
+ },
+ ncos: {
+ args: [1],
+ ret: 1
+ },
+ round: {
+ args: [1],
+ ret: 1
+ },
+ hsv2rgb: {
+ args: [3],
+ ret: 3
+ },
+ rgb2hsv: {
+ args: [3],
+ ret: 3
+ },
+ rotateVec: {
+ args: [3, 3, 1],
+ ret: 3
+ },
+ toSpherical: {
+ args: [3],
+ ret: 3
+ },
+ fromSpherical: {
+ args: [3],
+ ret: 3
+ },
+ getRayDirection: {
+ args: [],
+ ret: 3
+ },
+ osc: {
+ args: [1],
+ ret: 1
+ },
+ _hash33: {
+ args: [3],
+ ret: 3
+ },
+ _hash13: {
+ args: [3],
+ ret: 1
+ },
+ noise: {
+ args: [3],
+ ret: 1
+ },
+ fractalNoise: {
+ args: [3],
+ ret: 1
+ },
+ sphericalDistribution: {
+ args: [3, 1],
+ ret: 4
+ }
+ }; // these all have a single input/output and are overloaded for
+ // all types so a list of names is all we need to generate them
+
+ var glslBuiltInOneToOne = ["sin", "cos", "tan", "asin", "acos", "exp", "log", "exp2", "log2", "sqrt", "inversesqrt", "abs", "sign", "floor", "ceil", "fract"]; // need better overloading system
+
+ var glslBuiltInOther = {
+ // overload pow somehow?
+ // pow: { args:[1,1], ret:1 },
+ mod: {
+ args: [1, 1],
+ ret: 1
+ },
+ min: {
+ args: [1, 1],
+ ret: 1
+ },
+ max: {
+ args: [1, 1],
+ ret: 1
+ },
+ atan: {
+ args: [1, 1],
+ ret: 1
+ },
+ clamp: {
+ args: [1, 1, 1],
+ ret: 1
+ },
+ step: {
+ args: [1, 1],
+ ret: 1
+ },
+ smoothstep: {
+ args: [1, 1, 1],
+ ret: 1
+ },
+ // also overload length for vec3 and vec2?
+ length: {
+ args: [3],
+ ret: 1
+ },
+ distance: {
+ args: [3, 3],
+ ret: 1
+ },
+ dot: {
+ args: [3, 3],
+ ret: 1
+ },
+ cross: {
+ args: [3, 3],
+ ret: 3
+ },
+ normalize: {
+ args: [3],
+ ret: 3
+ },
+ reflect: {
+ args: [3, 3],
+ ret: 3
+ },
+ refract: {
+ args: [3, 3],
+ ret: 3
+ }
+ }; // let arg = {
+ // 'mix' : (a, b, c) => (a.dim === b.dim && (c.dim === 1 || c.dim === a.dim))? a.dim: -1,
+ // };
+
+ function convertFunctionToString(source) {
+ if (typeof source === "function") {
+ source = source.toString();
+ return source.slice(source.indexOf("{") + 1, source.lastIndexOf("}"));
+ } else if (!(typeof source === "string")) {
+ throw "your Shader Park code requires the source code to be a function, or a string";
+ }
+
+ return source;
+ }
+
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+ function getDefaultExportFromCjs (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+ }
+
+ function getDefaultExportFromNamespaceIfPresent (n) {
+ return n && Object.prototype.hasOwnProperty.call(n, 'default') ? n['default'] : n;
+ }
+
+ function getDefaultExportFromNamespaceIfNotNamed (n) {
+ return n && Object.prototype.hasOwnProperty.call(n, 'default') && Object.keys(n).length === 1 ? n['default'] : n;
+ }
+
+ function getAugmentedNamespace(n) {
+ if (n.__esModule) return n;
+ var a = Object.defineProperty({}, '__esModule', {value: true});
+ Object.keys(n).forEach(function (k) {
+ var d = Object.getOwnPropertyDescriptor(n, k);
+ Object.defineProperty(a, k, d.get ? d : {
+ enumerable: true,
+ get: function () {
+ return n[k];
+ }
+ });
+ });
+ return a;
+ }
+
+ function createCommonjsModule(fn) {
+ var module = { exports: {} };
+ return fn(module, module.exports), module.exports;
+ }
+
+ function commonjsRequire (path) {
+ throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
+ }
+
+ var glslParser = createCommonjsModule(function (module, exports) {
+ // Adapted from https://github.com/cimaron/cwebgl/blob/master/external/glsl2js/glsl.js
+
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+ (function () {
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+ var glsl = {
+ runParse: function runParse(src, options) {
+ var state, result, irs;
+ state = new GlslState(options);
+ state.setSource(src); //Preprocess
+
+ result = this.preprocessor.process(state); //Parse into AST
+
+ if (result) {
+ result = this.parser.parse(state);
+ }
+ /*
+ //Generate IR
+ if (result) {
+ result = this.generate(state);
+ }
+ */
+
+
+ if (result) {
+ state.status = true;
+ }
+
+ return state;
+ },
+
+ /**
+ * Compilation targets
+ */
+ target: {
+ fragment: 0,
+ 'x-fragment': 0,
+ 'x-shader/x-fragment': 0,
+ vertex: 1,
+ 'x-vertex': 1,
+ 'x-shader/x-vertex': 1
+ }
+ }; // Copyright Joyent, Inc. and other Node contributors.
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a
+ // copy of this software and associated documentation files (the
+ // "Software"), to deal in the Software without restriction, including
+ // without limitation the rights to use, copy, modify, merge, publish,
+ // distribute, sublicense, and/or sell copies of the Software, and to permit
+ // persons to whom the Software is furnished to do so, subject to the
+ // following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included
+ // in all copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ // USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ /**
+ * Select node.js util functions
+ */
+
+ var util = {};
+
+ (function (exports) {
+ var formatRegExp = /%[sdj%]/g;
+
+ exports.format = function (f) {
+ if (!isString(f)) {
+ var objects = [];
+
+ for (var i = 0; i < arguments.length; i++) {
+ objects.push(inspect(arguments[i]));
+ }
+
+ return objects.join(' ');
+ }
+
+ var i = 1;
+ var args = arguments;
+ var len = args.length;
+ var str = String(f).replace(formatRegExp, function (x) {
+ if (x === '%%') return '%';
+ if (i >= len) return x;
+
+ switch (x) {
+ case '%s':
+ return String(args[i++]);
+
+ case '%d':
+ return Number(args[i++]);
+
+ case '%j':
+ try {
+ return JSON.stringify(args[i++]);
+ } catch (_) {
+ return '[Circular]';
+ }
+
+ default:
+ return x;
+ }
+ });
+
+ for (var x = args[i]; i < len; x = args[++i]) {
+ //if (isNull(x) || !isObject(x)) {
+ str += ' ' + x; //} else {
+ // str += ' ' + inspect(x);
+ //}
+ }
+
+ return str;
+ };
+
+ function isString(arg) {
+ return typeof arg === 'string';
+ }
+
+ exports.isString = isString;
+ /**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * The Function.prototype.inherits from lang.js rewritten as a standalone
+ * function (not on Function.prototype). NOTE: If this file is to be loaded
+ * during bootstrapping this function needs to be rewritten using some native
+ * functions as prototype setup using normal JavaScript does not work as
+ * expected during bootstrapping (see mirror.js in r114903).
+ *
+ * @param {function} ctor Constructor function which needs to inherit the
+ * prototype.
+ * @param {function} superCtor Constructor function to inherit prototype from.
+ */
+
+ exports.inherits = function (ctor, superCtor) {
+ ctor.super_ = superCtor;
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+ })(util);
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+ function GlslState(options) {
+ var i;
+ this.options = {
+ target: 0,
+ language_version: 100,
+ opt: {
+ fold_constants: true
+ }
+ };
+
+ for (i in options) {
+ this.options[i] = options[i];
+ }
+
+ this.symbols = new SymbolTable();
+ symbol_table_init(this.symbols, options.target);
+ this.status = false;
+ this.translation_unit = "";
+ this.ast = [];
+ this.ir = null;
+ this.errors = [];
+ this.warnings = [];
+ }
+
+ proto = GlslState.prototype = {};
+ /**
+ * Get identifier type
+ *
+ * @param object state GLSL state
+ * @param string name Identifier name
+ * Add error to state
+ *
+ * @return string
+ * @param string msg Message
+ * @param int line Message
+ * @param int column Message
+ */
+
+ proto.classify_identifier = function (state, name) {
+ if (this.symbols.get_variable(name) || this.symbols.get_function(name)) {
+ return 'IDENTIFIER';
+ } else if (this.symbols.get_type(name)) {
+ return 'TYPE_IDENTIFIER';
+ } else {
+ return 'NEW_IDENTIFIER';
+ }
+ };
+
+ proto.setSource = function (src) {
+ this.src = src;
+ };
+
+ proto.getSource = function () {
+ return this.src;
+ };
+
+ proto.setTranslationUnit = function (tu) {
+ this.translation_unit = tu;
+ };
+
+ proto.getTranslationUnit = function () {
+ return this.translation_unit;
+ };
+
+ proto.addAstNode = function (node) {
+ this.ast.push(node);
+ };
+
+ proto.getAst = function () {
+ return this.ast;
+ };
+
+ proto.setIR = function (ir) {
+ this.ir = ir;
+ };
+
+ proto.getIR = function () {
+ return this.ir;
+ };
+
+ proto.getStatus = function () {
+ return this.status;
+ };
+ /**
+ * Add error to state
+ *
+ * @param string msg Message
+ * @param int line Message
+ * @param int column Message
+ */
+
+
+ proto.addError = function (msg, line, column) {
+ var err;
+
+ if (!line && !column) {
+ this.errors.push(msg);
+ return;
+ }
+
+ err = util.format("%s at line %s, column %s", msg, line, column);
+ this.errors.push(err);
+ };
+ /**
+ * Add warning to state
+ *
+ * @param string msg Message
+ * @param int line Message
+ * @param int column Message
+ */
+
+
+ proto.addWarning = function (msg, line, column) {
+ var warn;
+
+ if (!line && !column) {
+ this.warnings.push(msg);
+ return;
+ }
+
+ warn = util.format("%s at line %s, column %s", msg, line, column);
+ this.warnings.push(warn);
+ };
+ /**
+ * Get compile errors
+ *
+ * @return mixed
+ */
+
+
+ proto.getErrors = function () {
+ return this.errors;
+ };
+ /**
+ * Get compile errors
+ *
+ * @return mixed
+ */
+
+
+ proto.getWarnings = function () {
+ return this.warnings;
+ };
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * Preprocessor Class
+ */
+
+
+ function Preprocessor() {}
+
+ Preprocessor.modules = {};
+ var proto = Preprocessor.prototype;
+
+ proto.process = function (state) {
+ var m,
+ out = state.getSource();
+
+ for (m in Preprocessor.modules) {
+ try {
+ out = Preprocessor.modules[m].process(out);
+ } catch (e) {
+ state.addError(e.message, e.lineNumber, e.columnNumber);
+ return false;
+ }
+ }
+
+ state.setTranslationUnit(out);
+ return true;
+ };
+
+ glsl.preprocessor = new Preprocessor();
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ Preprocessor.modules.comments = {
+ process: function process(src) {
+ var i,
+ chr,
+ la,
+ out = "",
+ line = 1,
+ in_single = 0,
+ in_multi = 0;
+
+ for (i = 0; i < src.length; i++) {
+ chr = src.substr(i, 1);
+ la = src.substr(i + 1, 1); //Enter single line comment
+
+ if (chr == '/' && la == '/' && !in_single && !in_multi) {
+ in_single = line;
+ i++;
+ continue;
+ } //Exit single line comment
+
+
+ if (chr == "\n" && in_single) {
+ in_single = 0;
+ } //Enter multi line comment
+
+
+ if (chr == '/' && la == '*' && !in_multi && !in_single) {
+ in_multi = line;
+ i++;
+ continue;
+ } //Exit multi line comment
+
+
+ if (chr == '*' && la == '/' && in_multi) {
+ //Treat single line multi-comment as space
+ if (in_multi == line) {
+ out += " ";
+ }
+
+ in_multi = 0;
+ i++;
+ continue;
+ } //Newlines are preserved
+
+
+ if (!in_multi && !in_single || chr == "\n") {
+ out += chr;
+ line++;
+ }
+ }
+
+ return out;
+ }
+ };
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ Preprocessor.modules.directives = {
+ state: {
+ lines: [],
+ defines: {}
+ },
+ process: function process(src) {
+ var i, l;
+ this.state.lines = src.split("\n");
+ this.state.defines = {
+ GL_ES: '1',
+ __FILE__: '0',
+ __LINE__: '0',
+ __VERSION__: '300'
+ };
+ this.state.cond_stack = [];
+ i = 0;
+ l = this.state.lines.length;
+
+ while (i < l) {
+ this.state.lines[i] = this.processLine(this.state.lines[i], i);
+ i++;
+ }
+
+ return this.state.lines.join("\n");
+ },
+ processLine: function processLine(line, i) {
+ var d, matches, raw, e, sub, cond;
+ matches = line.match(/^([ \t]*)#(.*)$/);
+
+ if (!matches) {
+ if (this.state.cond_stack.length != 0 && !this.state.cond_stack.slice(-1)[0]) {
+ return "";
+ }
+
+ line = this.processDefines(line, i);
+ return line;
+ }
+
+ raw = matches[2];
+
+ if (raw.match(/^\s*$/)) {
+ return "";
+ }
+
+ var lmatches = raw.split(/\s+/);
+
+ try {
+ switch (lmatches[0]) {
+ case 'define':
+ case 'undef':
+ case 'ifdef':
+ case 'endif':
+ this[lmatches[0]](line, lmatches);
+ return "";
+ }
+
+ throw new Error("Invalid directive");
+ } catch (e) {
+ e.lineNumber = i + 1;
+ e.columnNumber = matches[1].length + 1;
+ throw e;
+ }
+ },
+ processDefines: function processDefines(line, i) {
+ this.state.defines.__LINE__ = i + 1;
+
+ for (var d in this.state.defines) {
+ //easy global replace
+ line = line.split(d).join(this.state.defines[d]);
+ }
+
+ return line;
+ },
+ define: function define(line, matches) {
+ if (matches.length <= 1 || matches.length > 3) {
+ throw new Error("Syntax error in #define");
+ }
+
+ this.state.defines[matches[1]] = matches[2] || "";
+ },
+ undef: function undef(line, matches) {
+ if (matches.length != 2) {
+ throw new Error("Syntax error in #undef");
+ }
+
+ delete this.state.defines[matches[1]];
+ },
+ ifdef: function ifdef(line, matches) {
+ var def;
+ def = !!this.state.defines[matches[1]];
+ this.state.cond_stack.push(def);
+ },
+ endif: function endif(line, matches) {
+ if (this.state.cond_stack.length) {
+ this.state.cond_stack.pop();
+ } else {
+ throw new Error("unmatched #endif");
+ }
+ }
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ function Type(name, size, slots, base) {
+ this.name = name;
+ this.size = size;
+ this.slots = slots;
+ this.swizzle = size / slots != 4 ? "xyzw".slice(0, size / slots) : "";
+ this.base = base || name;
+ }
+ /**
+ * Do a cast on a constant
+ *
+ * @param string val Value to cast
+ * @param string from From type
+ * @param string to To type
+ *
+ * @return string
+ */
+
+
+ Type.castTo = function (val, from, to) {
+ var f32;
+
+ switch (to) {
+ case 'int':
+ return "" + parseInt(val);
+
+ case 'float':
+ //Should we keep maximum precision, or use the following to force to 32bit precision??
+
+ /*
+ f32 = new Float32Array(1);
+ f32[0] = parseFloat(val);
+ return "" + f32[0];
+ */
+ return "" + parseFloat(val);
+
+ case 'bool':
+ return parseFloat(val) ? "1" : "0";
+ }
+
+ return val;
+ };
+ /**
+ * Determine if can cast from one type to another
+ *
+ * @param string from From type
+ * @param string to To type
+ *
+ * @return bool
+ */
+
+
+ Type.canCast = function (from, to) {
+ var t1, t2;
+ t1 = types[from];
+ t2 = types[to];
+ return t1.size === 1 && t2.size === 1;
+ };
+
+ var types = {
+ _void: new Type("void", 1, 1),
+ bool: new Type("bool", 1, 1),
+ int: new Type("int", 1, 1),
+ float: new Type("float", 1, 1),
+ vec2: new Type("vec2", 2, 1, 'float'),
+ vec3: new Type("vec3", 3, 1, 'float'),
+ vec4: new Type("vec4", 4, 1, 'float'),
+ bvec2: new Type("bvec2", 2, 1, 'bool'),
+ bvec3: new Type("bvec3", 3, 1, 'bool'),
+ bvec4: new Type("bvec4", 4, 1, 'bool'),
+ ivec2: new Type("ivec2", 2, 1, 'int'),
+ ivec3: new Type("ivec3", 3, 1, 'int'),
+ ivec4: new Type("ivec4", 4, 1, 'int'),
+ mat2: new Type("mat2", 4, 2, 'float'),
+ mat3: new Type("mat3", 9, 3, 'float'),
+ mat4: new Type("mat4", 16, 4, 'float'),
+ sampler2D: new Type("sampler2D", 1, 1),
+ samplerCube: new Type("samplerCube", 1, 1)
+ }; //Compatibility
+
+ types['void'] = types._void;
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * SymbolTableEntry constructor
+ */
+
+ function SymbolTableEntry(name, typedef) {
+ this.depth = null;
+ this.typedef = typedef; //Variable name
+
+ this.name = name; //Type
+
+ this.type = null; //Base type (if array)
+
+ this.base_type = null; //Function definition
+
+ this.definition = []; //Qualifier
+
+ this.qualifier = null; //IR name
+
+ this.out = name; //Constant value
+
+ this.constant = null; //Array size
+
+ this.size = null; //Temp vars for IR generation
+
+ this.code = null;
+ this.Ast = null;
+ }
+
+ SymbolTableEntry.typedef = {
+ variable: 0,
+ func: 1,
+ type: 2
+ };
+
+ SymbolTableEntry.prototype.getType = function () {
+ return types[this.type];
+ };
+ /**
+ * symbol_table constructor
+ */
+
+
+ function SymbolTable() {
+ this.table = {};
+ this.depth = 0;
+ }
+
+ SymbolTable.prototype = {};
+ var proto = SymbolTable.prototype;
+ /**
+ *
+ */
+
+ proto.push_scope = function () {
+ this.depth++;
+ };
+ /**
+ *
+ */
+
+
+ proto.pop_scope = function () {
+ var n, t;
+
+ for (n in this.table) {
+ if (this.table.hasOwnProperty(n)) {
+ t = this.table[n];
+
+ while (t[0] && t[0].depth === this.depth) {
+ t.splice(0, 1);
+ }
+
+ if (t.length === 0) {
+ delete this.table[n];
+ }
+ }
+ }
+
+ this.depth--;
+ };
+ /**
+ *
+ */
+
+
+ proto.name_declared_this_scope = function (name) {
+ var e = this.get_entry(name);
+ return e && e.depth === this.depth;
+ };
+ /**
+ *
+ */
+
+
+ proto.add_variable = function (name, type) {
+ var entry = new SymbolTableEntry(name, SymbolTableEntry.typedef.variable);
+ entry.type = type;
+ return this._add_entry(entry);
+ };
+ /**
+ *
+ */
+
+
+ proto.add_type = function (name, t) {
+ var entry = new SymbolTableEntry(name, SymbolTableEntry.typedef.type);
+ entry.definition = t;
+ return this._add_entry(entry);
+ };
+ /**
+ *
+ */
+
+
+ proto.add_function = function (name, type, def) {
+ var entry;
+ entry = new SymbolTableEntry(name, SymbolTableEntry.typedef.func);
+ entry.type = type;
+
+ if (def) {
+ entry.definition = def;
+ }
+
+ return this._add_entry(entry);
+ };
+ /**
+ *
+ */
+
+
+ proto.get_variable = function (name) {
+ var entry = this.get_entry(name, SymbolTableEntry.typedef.variable);
+ return entry;
+ };
+ /**
+ *
+ */
+
+
+ proto.get_type = function (name) {
+ var entry = this.get_entry(name, SymbolTableEntry.typedef.type);
+ return entry;
+ };
+ /**
+ *
+ */
+
+
+ proto.get_function = function (name, def) {
+ var entry = this.get_entry(name, SymbolTableEntry.typedef.func, def);
+ return entry;
+ };
+ /**
+ * @protected
+ */
+
+
+ proto._match_definition = function (def, entry) {
+ var i;
+
+ if (!def) {
+ return true;
+ }
+
+ if (def.length !== entry.length) {
+ return false;
+ }
+
+ for (i = 0; i < def.length; i++) {
+ if (def[i] !== entry[i]) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+ /**
+ * @protected
+ */
+
+
+ proto._add_entry = function (entry) {
+ if (!this.table[entry.name]) {
+ this.table[entry.name] = [];
+ }
+
+ this.table[entry.name].splice(0, 0, entry);
+ entry.depth = this.depth;
+ return entry;
+ };
+ /**
+ * @protected
+ */
+
+
+ proto.get_entry = function (name, typedef, def) {
+ var t, i, entry;
+ t = this.table[name] || []; //Look for 'void' instead of empty definition list
+
+ if (def && def.length == 0) {
+ def = ["void"];
+ }
+
+ for (i = 0; i < t.length; i++) {
+ entry = t[i]; //Not type of variable we're looking for
+
+ if (entry.typedef !== typedef) {
+ continue;
+ } //Normal variable
+
+
+ if (typedef !== SymbolTableEntry.typedef.func) {
+ return entry;
+ } //Match any function definition
+
+
+ if (!def) {
+ return entry;
+ } //Match specific function definition
+
+
+ if (def.join(',') === entry.definition.join(',')) {
+ return entry;
+ }
+ }
+
+ return null;
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * Base class of all abstract syntax tree nodes
+ */
+
+
+ function AstNode() {
+ //public:
+ this.location = {
+ first_line: 0,
+ first_column: 0,
+ last_line: 0,
+ last_column: 0
+ }; //The following are used during IR generation
+
+ this.Dest = null;
+ this.Type = null;
+ this.Const = false;
+ }
+
+ var proto = AstNode.prototype; //public:
+
+ proto.getLocation = function () {
+ return this.location;
+ };
+
+ proto.setLocation = function (loc) {
+ this.location.first_line = loc.first_line;
+ this.location.first_column = loc.first_column;
+ this.location.last_line = loc.last_line;
+ this.location.last_column = loc.last_column;
+ };
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+
+ proto.toString = function () {
+ return this.constructor.name;
+ };
+
+ proto.ir = function (state, irs) {//throw new Error("Missing ir generator for node of type " + this.constructor.name);
+ }; //inverse of operators
+
+
+ var ast_operators = ["=", "POS", "NEG", "+", "-", "*", "/", "%", "<<", ">>", "<", ">", "<=", ">=", "==", "!=", "&", "^", "|", "~", "&&", "^^", "||", "!", "*=", "/=", "%=", "+=", "-=", "<<=", ">>=", "&=", "^=", "|=", "?:", "++x", "--x", "x++", "x--", ".", "[]", "()", "ident", "float", "int", "bool"];
+ var ast_precision = {
+ none: 0,
+ highp: 1,
+ mediump: 2,
+ lowp: 3
+ };
+ /**
+ * AST Type Specifier Class
+ */
+
+ function AstTypeSpecifier(specifier) {
+ AstNode.apply(this);
+ this.type_specifier = null;
+ this.type_name = null;
+ this.structure = null;
+ this.is_array = 0;
+ this.array_size = null;
+ this.precision = 2;
+ this.is_precision_statement = null;
+
+ if (AstTypeSpecifier[_typeof(specifier)]) {
+ AstTypeSpecifier[_typeof(specifier)].call(this, specifier);
+ }
+ }
+
+ util.inherits(AstTypeSpecifier, AstNode);
+ proto = AstTypeSpecifier.prototype; //overloaded constructors
+
+ AstTypeSpecifier.number = function (specifier) {
+ this.type_specifier = specifier;
+ this.precision = ast_precision.none;
+ this.is_precision_statement = false;
+ this.type_name = types[specifier].name;
+ };
+
+ AstTypeSpecifier.string = function (name) {
+ this.type_specifier = types[name];
+ this.type_name = name;
+ this.is_array = false;
+ this.precision = ast_precision.none;
+ this.is_precision_statement = false;
+ };
+
+ AstTypeSpecifier.object = function (s) {
+ this.type_specifier = types.struct;
+ this.type_name = s.name;
+ this.structure = s;
+ this.is_array = false;
+ this.precision = ast_precision.none;
+ this.is_precision_statement = false;
+ };
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+
+ proto.toString = function () {
+ var i, prec;
+
+ if (this.is_precision_statement) {
+ for (i in ast_precision) {
+ if (ast_precision.hasOwnProperty(i) && ast_precision[i] === this.precision) {
+ prec = i;
+ break;
+ }
+ }
+
+ return util.format("precision %s %s;\n", prec, this.type_name);
+ }
+
+ return (this.type_specifier === types.struct ? this.structure : this.type_name) + (this.is_array ? util.format("[%s]", this.array_size || "") : "");
+ };
+ /**
+ * AST Function Class
+ */
+
+
+ function AstFunction() {
+ AstNode.apply(this);
+ this.return_type = null;
+ this.identifier = null;
+ this.parameters = [];
+ this.entry = null;
+ }
+
+ util.inherits(AstFunction, AstNode);
+ proto = AstFunction.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("%s %s(%s)", this.return_type, this.identifier, this.parameters.join(", "));
+ };
+ /**
+ * AST Expression Class
+ */
+
+
+ function AstExpression(oper, ex0, ex1, ex2) {
+ AstNode.apply(this);
+ this.oper = oper;
+ this.grouped = false;
+ this.subexpressions = [null, null, null];
+ this.primary_expression = {};
+ this.expressions = [];
+
+ if (ast_operators.indexOf(this.oper) === -1) {
+ this.oper = 'ident';
+ this.primary_expression.identifier = oper;
+ } else {
+ this.subexpressions[0] = ex0;
+ this.subexpressions[1] = ex1;
+ this.subexpressions[2] = ex2;
+ }
+ }
+
+ util.inherits(AstExpression, AstNode);
+ proto = AstExpression.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ var output;
+
+ switch (this.oper) {
+ case '=':
+ case '+':
+ case '-':
+ case '*':
+ case '/':
+ case '%':
+ case "<<":
+ case ">>":
+ case "<":
+ case ">":
+ case "<=":
+ case ">=":
+ case "==":
+ case "!=":
+ case "&":
+ case "^":
+ case "|":
+ case "~":
+ case "&&":
+ case "^^":
+ case "||":
+ case '*=':
+ case '/=':
+ case '%=':
+ case '+=':
+ case '-=':
+ case '<<=':
+ case '>>=':
+ case '&=':
+ case '^=':
+ case '|=':
+ output = util.format("%s %s %s", this.subexpressions[0], this.oper, this.subexpressions[1]);
+ break;
+
+ case '.':
+ output = util.format("%s.%s", this.subexpressions[0], this.primary_expression.identifier);
+ break;
+
+ case 'POS':
+ output = util.format("+%s", this.subexpressions[0]);
+ break;
+
+ case 'NEG':
+ output = util.format("-%s", this.subexpressions[0]);
+ break;
+
+ case '~':
+ case '!':
+ output = util.format("%s%s", this.oper, this.subexpressions[0]);
+ break;
+
+ case '++x':
+ case '--x':
+ output = util.format("%s%s", this.oper.replace('x', ''), this.subexpressions[0]);
+ break;
+
+ case 'x++':
+ case 'x--':
+ output = util.format("%s%s", this.subexpressions[0], this.oper.replace('x', ''));
+ break;
+
+ case '?:':
+ output = util.format("%s ? %s : %s", this.subexpressions[0], this.subexpressions[1], this.subexpressions[2]);
+ break;
+
+ case '[]':
+ output = util.format("%s[%s]", this.subexpressions[0], this.subexpressions[1]);
+ break;
+
+ case '()':
+ output = util.format("%s(%s)", this.subexpressions[0], this.expressions.join(", "));
+ break;
+
+ case 'ident':
+ output = util.format("%s", this.primary_expression.identifier);
+ break;
+
+ case 'float':
+ output = util.format("%s", this.primary_expression.float_constant);
+ break;
+
+ case 'int':
+ output = util.format("%s", this.primary_expression.int_constant);
+ break;
+
+ case 'bool':
+ output = util.format("%s", this.primary_expression.bool_constant ? 'true' : 'false');
+ break;
+ }
+
+ return this.grouped ? util.format("(%s)", output) : output;
+ };
+ /**
+ * AST Fully Specified Type Class
+ */
+
+
+ function AstFullySpecifiedType() {
+ AstNode.apply(this);
+ this.qualifier = [];
+ this.specifier = null;
+ }
+
+ util.inherits(AstFullySpecifiedType, AstNode);
+ proto = AstFullySpecifiedType.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ var output;
+ output = this.qualifier.slice(0);
+ output.push(this.specifier);
+ return output.join(' ');
+ };
+ /**
+ * AST Declaration Class
+ */
+
+
+ function AstDeclaration(identifier, is_array, array_size, initializer) {
+ AstNode.apply(this);
+ this.identifier = identifier;
+ this.is_array = is_array;
+ this.array_size = array_size;
+ this.initializer = initializer;
+ }
+
+ util.inherits(AstDeclaration, AstNode);
+ proto = AstDeclaration.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return this.identifier + (this.is_array ? util.format("[%s]", this.array_size === undefined ? '' : this.array_size) : '') + (this.initializer ? util.format(" = %s", this.initializer) : "");
+ };
+ /**
+ * AST Declarator List Class
+ */
+
+
+ function AstDeclaratorList(type) {
+ AstNode.apply(this);
+ this.type = type;
+ this.declarations = [];
+ this.invariant = 0;
+ }
+
+ util.inherits(AstDeclaratorList, AstNode);
+ proto = AstDeclaratorList.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("%s %s;\n", this.type || "invariant ", this.declarations.join(", "));
+ };
+ /**
+ * AST Parameter Declarator Class
+ */
+
+
+ function AstParameterDeclarator() {
+ AstNode.apply(this);
+ this.type = null;
+ this.identifier = null;
+ this.is_array = false;
+ this.array_size = 0;
+ this.formal_parameter = null;
+ this.is_void = null;
+ }
+
+ util.inherits(AstParameterDeclarator, AstNode);
+ proto = AstParameterDeclarator.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return this.type + (this.identifier ? " " + this.identifier : "") + (this.is_array ? util.format("[%s]", this.array_size) : "");
+ };
+ /**
+ * AST Expression Statement Class
+ */
+
+
+ function AstExpressionStatement(ex) {
+ AstNode.apply(this);
+ this.expression = ex;
+ }
+
+ util.inherits(AstExpressionStatement, AstNode);
+ proto = AstExpressionStatement.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("%s;\n", this.expression || "");
+ };
+ /**
+ * AST Compound Statement Class
+ */
+
+
+ function AstCompoundStatement(new_scope, statements) {
+ AstNode.apply(this);
+ this.new_scope = new_scope;
+
+ if (statements) {
+ this.statements = statements;
+ } else {
+ this.statements = [];
+ }
+ }
+
+ util.inherits(AstCompoundStatement, AstNode);
+ proto = AstCompoundStatement.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ var str, stmts, indent;
+ AstCompoundStatement._depth++;
+ indent = new Array(AstCompoundStatement._depth).join(" ");
+ stmts = indent + " " + this.statements.join(indent + " ");
+ str = "\n" + indent + "{\n" + stmts + indent + "}\n";
+ AstCompoundStatement._depth--;
+ return str;
+ }; //Used for toString indentation
+
+
+ AstCompoundStatement._depth = 0;
+ /**
+ * AST Function Definition Class
+ */
+
+ function AstFunctionDefinition() {
+ AstNode.apply(this);
+ this.proto_type = null;
+ this.body = null;
+ }
+
+ util.inherits(AstFunctionDefinition, AstNode);
+ proto = AstFunctionDefinition.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("%s %s", this.proto_type, this.body);
+ };
+ /**
+ * AST Function Definition Class
+ */
+
+
+ function AstExpressionBin(oper, ex0, ex1) {
+ AstExpression.apply(this, [oper, ex0, ex1]);
+ }
+
+ util.inherits(AstExpressionBin, AstExpression);
+ proto = AstExpressionBin.prototype;
+ /**
+ * AST Function Expression Class
+ */
+
+ function AstFunctionExpression(arg) {
+ AstExpression.apply(this);
+ this.cons = false;
+
+ if (arg.constructor.name === 'AstExpression') {
+ this.cons = false;
+ AstExpression.call(this, '()', arg);
+ } else if (arg.constructor.name === 'AstTypeSpecifier') {
+ this.cons = true;
+ AstExpression.call(this, '()', arg);
+ }
+ }
+
+ util.inherits(AstFunctionExpression, AstExpression);
+ proto = AstFunctionExpression.prototype;
+
+ proto.is_constructor = function () {
+ return this.cons;
+ };
+
+ proto.toString = function () {
+ return util.format("%s(%s)", this.subexpressions[0], this.expressions.join(", "));
+ };
+ /**
+ * AST Selection Statement Class
+ */
+
+
+ function AstSelectionStatement(condition, then_statement, else_statement) {
+ AstNode.apply(this);
+ this.condition = condition;
+ this.then_statement = then_statement;
+ this.else_statement = else_statement;
+ }
+
+ util.inherits(AstSelectionStatement, AstNode);
+ proto = AstSelectionStatement.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ return util.format("if (%s) %s %s", this.condition, this.then_statement, this.else_statement ? util.format("else %s", this.else_statement) : "");
+ };
+ /**
+ * AST Struct Specifier Class
+ */
+
+
+ function AstStructSpecifier(identifier, declarator_list) {
+ AstNode.apply(this);
+ this.name = null;
+ this.declarations = [];
+
+ if (identifier === null) {
+ identifier = util.format("#anon_struct%d", AstStructSpecifier.anon_count);
+ AstStructSpecifier.anon_count++;
+ }
+
+ this.name = identifier;
+ this.declarations = declarator_list.declarations;
+ }
+
+ AstStructSpecifier.anon_count = 1;
+ util.inherits(AstStructSpecifier, AstNode);
+ proto = AstStructSpecifier.prototype;
+ /**
+ * AST Jump
+ */
+
+ function AstJumpStatement(mode, return_value) {
+ AstNode.apply(this);
+ this.opt_return_value = null;
+ this.mode = mode;
+
+ if (mode === 'return') {
+ this.opt_return_value = return_value;
+ }
+ }
+
+ util.inherits(AstJumpStatement, AstNode);
+ proto = AstJumpStatement.prototype;
+ /**
+ * Return string representation of node
+ *
+ * @return string
+ */
+
+ proto.toString = function () {
+ switch (this.mode) {
+ case 'continue':
+ case 'break':
+ case 'discard':
+ case 'debugger':
+ return this.mode + ";\n";
+
+ case 'return':
+ return util.format("return%s;\n", this.opt_return_value ? " " + this.opt_return_value : "");
+ }
+ };
+
+ glsl.ast = {
+ Node: AstNode,
+ TypeSpecifier: AstTypeSpecifier,
+ Function: AstFunction,
+ Expression: AstExpression,
+ FullySpecifiedType: AstFullySpecifiedType,
+ Declaration: AstDeclaration,
+ DeclaratorList: AstDeclaratorList,
+ ParameterDeclarator: AstParameterDeclarator,
+ ExpressionStatement: AstExpressionStatement,
+ CompoundStatement: AstCompoundStatement,
+ FunctionDefinition: AstFunctionDefinition,
+ ExpressionBin: AstExpressionBin,
+ FunctionExpression: AstFunctionExpression,
+ SelectionStatement: AstSelectionStatement,
+ StructSpecifier: AstStructSpecifier,
+ JumpStatement: AstJumpStatement
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ var builtin = {
+ vars: {
+ vertex: [{
+ position: 0,
+ type: 'vec4',
+ name: 'gl_Position',
+ out: 'result@0'
+ }, {
+ position: 1,
+ type: 'float',
+ name: 'gl_PointSize',
+ out: 'result@1'
+ }],
+ fragment: [{
+ position: 0,
+ type: 'vec4',
+ name: 'gl_FragColor',
+ out: 'result@0'
+ }]
+ },
+
+ /**
+ * List of instructions for operators
+ *
+ * Denoted by operator, then by definition of param types to output type
+ */
+ oper: {
+ "!": {
+ "bool:bool": ["SEQ %1.x %2.x 0.0"]
+ },
+ "+": {
+ "int,int:int": ["ADD %1.x %2.x %3.x"],
+ "float,float:float": ["ADD %1.x %2.x %3.x"],
+ "float,vec2:vec2": ["ADD %1.xy %2.x %3.xy"],
+ "float,vec3:vec3": ["ADD %1.xyz %2.x %3.xyz"],
+ "float,vec4:vec4": ["ADD %1 %2.x %3"],
+ "vec2,float:vec2": ["ADD %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["ADD %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["ADD %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["ADD %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["ADD %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["ADD %1 %2 %3"]
+ },
+ "-": {
+ "int,int:int": ["SUB %1.x %2.x %3.x"],
+ "float,float:float": ["SUB %1.x %2.x %3.x"],
+ "float,vec2:vec2": ["SUB %1.xy %2.x %3.xy"],
+ "float,vec3:vec3": ["SUB %1.xyz %2.x %3.xyz"],
+ "float,vec4:vec4": ["SUB %1 %2.x %3"],
+ "vec2,float:vec2": ["SUB %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["SUB %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["SUB %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["SUB %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["SUB %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["SUB %1 %2 %3"]
+ },
+ "*": {
+ "int,int:int": ["MUL %1.x %2.x %3.x"],
+ "float,float:float": ["MUL %1.x %2.x %3.x"],
+ "float,vec2:vec2": ["MUL %1.xy %2.x %3.xy"],
+ "float,vec3:vec3": ["MUL %1.xyz %2.x %3.xyz"],
+ "float,vec4:vec4": ["MUL %1 %2.x %3"],
+ "vec2,float:vec2": ["MUL %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["MUL %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["MUL %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["MUL %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["MUL %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["MUL %1 %2 %3"],
+ "mat3,vec3:vec3": ["MUL %1.xyz %2.xyz %3.x", "MAD %1.xyz %2@1.xyz %3.y %1", "MAD %1.xyz %2@2.xyz %3.z %1"],
+ "mat4,vec4:vec4": ["MUL %1 %2 %3.x", "MAD %1 %2@1 %3.y %1", "MAD %1 %2@2 %3.z %1", "MAD %1 %2@3 %3.w %1"],
+ "mat4,mat4:mat4": ["MUL %1 %2 %3.x", "MAD %1 %2@1 %3.y %1", "MAD %1 %2@2 %3.z %1", "MAD %1 %2@3 %3.w %1", "MUL %1@1 %2 %3@1.x", "MAD %1@1 %2@1 %3@1.y %1@1", "MAD %1@1 %2@2 %3@1.z %1@1", "MAD %1@1 %2@3 %3@1.w %1@1", "MUL %1@2 %2 %3@2.x", "MAD %1@2 %2@1 %3@2.y %1@2", "MAD %1@2 %2@2 %3@2.z %1@2", "MAD %1@2 %2@3 %3@2.w %1@2", "MUL %1@3 %2 %3@3.x", "MAD %1@3 %2@1 %3@3.y %1@3", "MAD %1@3 %2@2 %3@3.z %1@3", "MAD %1@3 %2@3 %3@3.w %1@3"]
+ },
+ "/": {
+ "int,int:int": ["DIV %1.x %2.x %3.x"],
+ "float,float:float": ["DIV %1.x %2.x %3.x"],
+ "float,vec2:vec2": ["DIV %1.xy %2.x %3.xy"],
+ "float,vec3:vec3": ["DIV %1.xyz %2.x %3.xyz"],
+ "float,vec4:vec4": ["DIV %1 %2.x %3"],
+ "vec2,float:vec2": ["DIV %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["DIV %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["DIV %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["DIV %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["DIV %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["DIV %1 %2 %3"]
+ },
+ "<": {
+ "int,int:bool": ["SLT %1.x %2.x %3.x"],
+ "float,float:bool": ["SLT %1.x %2.x %3.x"]
+ },
+ ">": {
+ "int,int:bool": ["SGT %1.x %2.x %3.x"],
+ "float,float:bool": ["SGT %1.x %2.x %3.x"]
+ },
+ "<=": {
+ "int,int:bool": ["SLE %1.x %2.x %3.x"],
+ "float,float:bool": ["SLE %1.x %2.x %3.x"]
+ },
+ ">=": {
+ "int,int:bool": ["SGE %1.x %2.x %3.x"],
+ "float,float:bool": ["SGE %1.x %2.x %3.x"]
+ },
+ "==": {
+ "int,int:bool": ["SEQ %1.x %2.x %3.x"],
+ "float,float:bool": ["SEQ %1.x %2.x %3.x"]
+ },
+ "!=": {
+ "int,int:bool": ["SNE %1.x %2.x %3.x"],
+ "float,float:bool": ["SNE %1.x %2.x %3.x"]
+ },
+ "&&": {
+ "bool,bool:bool": ["AND %1.x %2.x %3.x", "AND %1.x %1.x 1"]
+ },
+ "^^": {
+ "bool,bool:bool": ["XOR %1.x %2.x %3.x", "AND %1.x %1.x 1"]
+ },
+ "||": {
+ "bool,bool:bool": ["OR %1.x %2.x %3.x", "AND %1.x %1.x 1"]
+ }
+ },
+
+ /**
+ * List of instructions for built in functions
+ *
+ * Denoted by function name, then by definition of param types to output type
+ */
+ func: {
+ "abs": {
+ "float:float": ["ABS %1.x %2.x"],
+ "vec2:vec2": ["ABS %1.xy %2.xy"],
+ "vec3:vec3": ["ABS %1.xyz %2.xyz"],
+ "vec4:vec4": ["ABS %1 %2"]
+ },
+ "ceil": {
+ "float:float": ["CEIL %1.x %2.x"],
+ "vec2:vec2": ["CEIL %1.xy %2.xy"],
+ "vec3:vec3": ["CEIL %1.xyz %2.xyz"],
+ "vec4:vec4": ["CEIL %1 %2"]
+ },
+ "clamp": {
+ "float,float,float:float": ["MAX %1.x %2.x %3.x", "MIN %1.x %1.x %4.x"],
+ "vec2,float,float:vec2": ["MAX %1.xy %2.xy %3.x", "MIN %1.xy %1.xy %4.x"],
+ "vec3,float,float:vec3": ["MAX %1.xyz %2.xyz %3.x", "MIN %1.xyz %1.xyz %4.x"],
+ "vec4,float,float:vec4": ["MAX %1 %2 %3.x", "MIN %1 %1 %4.x"],
+ "vec2,vec2,vec2:vec2": ["MAX %1.xy %2.xy %3.xy", "MIN %1.xy %1.xy %4.xy"],
+ "vec3,vec3,vec3:vec3": ["MAX %1.xyz %2.xyz %3.xyz", "MIN %1.xyz %1.xyz %4.xyz"],
+ "vec4,vec4,vec4:vec4": ["MAX %1 %2 %3", "MIN %1 %1 %4"]
+ },
+ "cos": {
+ "float:float": ["COS %1.x %2.x"],
+ "vec2:vec2": ["COS %1.xy %2.xy"],
+ "vec3:vec3": ["COS %1.xyz %2.xyz"],
+ "vec4:vec4": ["COS %1 %2"]
+ },
+ "degrees": {
+ "float:float": ["MUL %1.x %2.x " + 180 / Math.PI],
+ "vec2:vec2": ["MUL %1.xy %2.xy " + 180 / Math.PI],
+ "vec3:vec3": ["MUL %1.xyz %2.xyz " + 180 / Math.PI],
+ "vec4:vec4": ["MUL %1 %2 " + 180 / Math.PI]
+ },
+ "dot": {
+ "vec2,vec2:float": ["DP2 %1.x %2.xy %3.xy"],
+ "vec3,vec3:float": ["DP3 %1.x %2.xyz %3.xyz"],
+ "vec4,vec4:float": ["DP4 %1.x %2 %3"]
+ },
+ "floor": {
+ "float:float": ["FLR %1.x %2.x"],
+ "vec2:vec2": ["FLR %1.xy %2.xy"],
+ "vec3:vec3": ["FLR %1.xyz %2.xyz"],
+ "vec4:vec4": ["FLR %1 %2"]
+ },
+ "fract": {
+ "float:float": ["FRC %1.x %2.x"],
+ "vec2:vec2": ["FRC %1.xy %2.xy"],
+ "vec3:vec3": ["FRC %1.xyz %2.xyz"],
+ "vec4:vec4": ["FRC %1 %2"]
+ },
+ "max": {
+ "float,float:float": ["MAX %1.x %2.x %3.x"],
+ "vec2,float:vec2": ["MAX %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["MAX %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["MAX %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["MAX %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["MAX %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["MAX %1 %2 %3"]
+ },
+ "min": {
+ "float,float:float": ["MIN %1.x %2.x %3.x"],
+ "vec2,float:vec2": ["MIN %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["MIN %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["MIN %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["MIN %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["MIN %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["MIN %1 %2 %3"]
+ },
+ "mix": {
+ "float,float,float:float": ["MAD %1.x -%2.x %4.x %2.x", "MAD %1.x %3.x %4.x %1.x"],
+ "vec2,vec2,float:vec2": ["MAD %1.xy -%2.xy %4.x %2.xy", "MAD %1.xy %3.xy %4.x %1.xy"],
+ "vec3,vec3,float:vec3": ["MAD %1.xyz -%2.xyz %4.x %2.xyz", "MAD %1.xyz %3.xyz %4.x %1.xyz"],
+ "vec4,vec4,float:vec4": ["MAD %1 -%2 %4.x %2", "MAD %1 %3 %4.x %1"],
+ "vec2,vec2,vec2:vec2": ["MAD %1.xy -%2.xy %4.xy %2.xy", "MAD %1.xy %3.xy %4.xy %1.xy"],
+ "vec3,vec3,vec3:vec3": ["MAD %1.xyz -%2.xyz %4.xyz %2.xyz", "MAD %1.xyz %3.xyz %4.xyz %1.xyz"],
+ "vec4,vec4,vec4:vec4": ["MAD %1 -%2 %4 %2", "MAD %1 %3 %4 %1"]
+ },
+ "mod": {
+ "float,float:float": ["MOD %1.x %2.x %3.x"],
+ "vec2,float:vec2": ["MOD %1.xy %2.xy %3.x"],
+ "vec3,float:vec3": ["MOD %1.xyz %2.xyz %3.x"],
+ "vec4,float:vec4": ["MOD %1 %2 %3.x"],
+ "vec2,vec2:vec2": ["MOD %1.xy %2.xy %3.xy"],
+ "vec3,vec3:vec3": ["MOD %1.xyz %2.xyz %3.xyz"],
+ "vec4,vec4:vec4": ["MOD %1 %2 %3"]
+ },
+ "normalize": {
+ "vec3:vec3": ["DP3 %1.x %2 %2", "RSQ %1.x %1.x", "MUL %1.xyz %2.xyz %1.x"],
+ "vec4:vec4": ["DP4 %1.x %2 %2", "RSQ %1.x %1.x", "MUL %1 %2 %1.x"]
+ },
+ "pow": {
+ "float,float:float": ["POW %1.x %2.x %3.x"]
+ },
+ "reflect": {
+ "vec3,vec3:vec3": ["DP3 %1.x %3 %2", "MUL %1.xyz %3 %1.x", "MAD %1.xyz -%1 2.0 %2"]
+ },
+ "radians": {
+ "float:float": ["MUL %1.x %2.x " + Math.PI / 180],
+ "vec2:vec2": ["MUL %1.xy %2.xy " + Math.PI / 180],
+ "vec3:vec3": ["MUL %1.xyz %2.xyz " + Math.PI / 180],
+ "vec4:vec4": ["MUL %1 %2 " + Math.PI / 180]
+ },
+ "sign": {
+ "float:float": ["SGT %t1.x %2.x 0", "SLT %t1.y %2.x 0", "ADD %1.x %t1.x -%t1.y"],
+ "vec2:vec2": ["SGT %t1.xy %2.xy 0", "SLT %t1.zw %2.zw 0", "ADD %1.xy %t1.xy -%t1.zw"],
+ "vec3:vec3": ["SGT %t1.xyz %2.xyz 0", "SLT %t2.xyz %2.xyz 0", "ADD %1.xyz %t1.xyz -%t2.xyz"],
+ "vec4:vec4": ["SGT %t1 %2 0", "SLT %t2 %2 0", "ADD %1 %t1 -%t2"]
+ },
+ "sin": {
+ "float:float": ["SIN %1.x %2.x"],
+ "vec2:vec2": ["SIN %1.xy %2.xy"],
+ "vec3:vec3": ["SIN %1.xyz %2.xyz"],
+ "vec4:vec4": ["SIN %1 %2"]
+ },
+ "step": {
+ "float,float:float": ["SGE %1.x %3.x %2.x"],
+ "float,vec2:vec2": ["SGE %1.xy %3.x %2.xy"],
+ "float,vec3:vec3": ["SGE %1.xyz %3.x %2.xyz"],
+ "float,vec4:vec4": ["SGE %1 %3.x %2"],
+ "vec2,vec2:vec2": ["SGE %1.xy %3.xy %2.xy"],
+ "vec3,vec3:vec3": ["SGE %1.xyz %3.xyz %2.xyz"],
+ "vec4,vec4:vec4": ["SGE %1 %3 %3"]
+ },
+ "tan": {
+ "float:float": ["TAN %1.x %2.x"],
+ "vec2:vec2": ["TAN %1.xy %2.xy"],
+ "vec3:vec3": ["TAN %1.xyz %2.xyz"],
+ "vec4:vec4": ["TAN %1 %2"]
+ },
+ "texture2D": {
+ "sampler2D,vec2:vec4": ["TEX %1 %3 %2 \"2D\""]
+ }
+ }
+ };
+
+ function _builtinParseType(str) {
+ var parts, ret;
+ parts = str.split(":");
+ parts[0] = parts[0].split(",");
+ ret = {
+ src: parts[0],
+ dest: parts[1]
+ };
+ return ret;
+ }
+
+ function symbol_table_init(table, target) {
+ var i, j, vars, v, entry, types, name;
+ vars = target === glsl.target.vertex ? builtin.vars.vertex : builtin.vars.fragment;
+
+ for (i = 0; i < vars.length; i++) {
+ v = vars[i];
+ entry = table.add_variable(v.name, v.type);
+ entry.position = v.position;
+ entry.out = v.out;
+ }
+
+ vars = builtin.func;
+
+ for (name in vars) {
+ v = vars[name];
+
+ for (j in v) {
+ types = _builtinParseType(j);
+ entry = table.add_function(name, types.dest, types.src);
+ entry.code = v[j];
+ }
+ }
+ }
+ /* parser generated by jison 0.4.15 */
+
+ /*
+ Returns a Parser object of the following structure:
+
+ Parser: {
+ yy: {}
+ }
+
+ Parser.prototype: {
+ yy: {},
+ trace: function(),
+ symbols_: {associative list: name ==> number},
+ terminals_: {associative list: number ==> name},
+ productions_: [...],
+ performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+ table: [...],
+ defaultActions: {...},
+ parseError: function(str, hash),
+ parse: function(input),
+
+ lexer: {
+ EOF: 1,
+ parseError: function(str, hash),
+ setInput: function(input),
+ input: function(),
+ unput: function(str),
+ more: function(),
+ less: function(n),
+ pastInput: function(),
+ upcomingInput: function(),
+ showPosition: function(),
+ test_match: function(regex_match_array, rule_index),
+ next: function(),
+ lex: function(),
+ begin: function(condition),
+ popState: function(),
+ _currentRules: function(),
+ topState: function(),
+ pushState: function(condition),
+
+ options: {
+ ranges: boolean (optional: true ==> token location info will include a .range[] member)
+ flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+ backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+ },
+
+ performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+ rules: [...],
+ conditions: {associative list: name ==> set},
+ }
+ }
+
+
+ token location info (@$, _$, etc.): {
+ first_line: n,
+ last_line: n,
+ first_column: n,
+ last_column: n,
+ range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
+ }
+
+
+ the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+ text: (matched text)
+ token: (the produced terminal token, if any)
+ line: (yylineno)
+ }
+ while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+ loc: (yylloc)
+ expected: (string describing the set of expected tokens)
+ recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+ }
+ */
+
+
+ var parser = function () {
+ var o = function o(k, v, _o, l) {
+ for (_o = _o || {}, l = k.length; l--; _o[k[l]] = v) {
+ ;
+ }
+
+ return _o;
+ },
+ $V0 = [13, 14, 15, 16, 17, 21, 22, 47, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $V1 = [1, 18],
+ $V2 = [1, 19],
+ $V3 = [1, 20],
+ $V4 = [1, 21],
+ $V5 = [1, 22],
+ $V6 = [1, 53],
+ $V7 = [1, 54],
+ $V8 = [1, 17],
+ $V9 = [1, 44],
+ $Va = [1, 45],
+ $Vb = [1, 28],
+ $Vc = [1, 47],
+ $Vd = [1, 48],
+ $Ve = [1, 49],
+ $Vf = [1, 50],
+ $Vg = [1, 40],
+ $Vh = [1, 41],
+ $Vi = [1, 42],
+ $Vj = [1, 43],
+ $Vk = [1, 46],
+ $Vl = [1, 55],
+ $Vm = [1, 56],
+ $Vn = [1, 57],
+ $Vo = [1, 58],
+ $Vp = [1, 59],
+ $Vq = [1, 60],
+ $Vr = [1, 61],
+ $Vs = [1, 62],
+ $Vt = [1, 63],
+ $Vu = [1, 64],
+ $Vv = [1, 65],
+ $Vw = [1, 66],
+ $Vx = [1, 67],
+ $Vy = [1, 68],
+ $Vz = [1, 69],
+ $VA = [1, 70],
+ $VB = [1, 71],
+ $VC = [1, 72],
+ $VD = [1, 73],
+ $VE = [1, 74],
+ $VF = [1, 75],
+ $VG = [1, 76],
+ $VH = [1, 37],
+ $VI = [1, 38],
+ $VJ = [1, 39],
+ $VK = [1, 77],
+ $VL = [5, 13, 14, 15, 16, 17, 21, 47, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $VM = [1, 82],
+ $VN = [1, 83],
+ $VO = [1, 84],
+ $VP = [1, 86],
+ $VQ = [1, 87],
+ $VR = [49, 106],
+ $VS = [21, 47, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $VT = [2, 121],
+ $VU = [1, 101],
+ $VV = [1, 102],
+ $VW = [1, 103],
+ $VX = [1, 100],
+ $VY = [2, 159],
+ $VZ = [21, 25, 26, 49, 106],
+ $V_ = [2, 141],
+ $V$ = [21, 25, 26, 30, 32, 49, 106],
+ $V01 = [21, 47, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 169],
+ $V11 = [21, 47, 120, 121, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $V21 = [21, 25, 26, 30, 32, 34, 49, 106],
+ $V31 = [2, 177],
+ $V41 = [2, 12],
+ $V51 = [11, 23, 30, 32, 34, 36, 38, 39, 40, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106, 170],
+ $V61 = [5, 10, 13, 14, 15, 16, 17, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 172, 189, 191, 193, 194, 195, 196, 197, 198, 202, 203, 204, 205, 206],
+ $V71 = [1, 169],
+ $V81 = [1, 170],
+ $V91 = [1, 171],
+ $Va1 = [1, 172],
+ $Vb1 = [1, 156],
+ $Vc1 = [1, 157],
+ $Vd1 = [1, 182],
+ $Ve1 = [1, 163],
+ $Vf1 = [1, 164],
+ $Vg1 = [1, 165],
+ $Vh1 = [1, 166],
+ $Vi1 = [1, 136],
+ $Vj1 = [1, 127],
+ $Vk1 = [1, 138],
+ $Vl1 = [1, 139],
+ $Vm1 = [1, 140],
+ $Vn1 = [1, 141],
+ $Vo1 = [1, 142],
+ $Vp1 = [1, 143],
+ $Vq1 = [1, 144],
+ $Vr1 = [1, 145],
+ $Vs1 = [1, 146],
+ $Vt1 = [1, 147],
+ $Vu1 = [1, 148],
+ $Vv1 = [1, 149],
+ $Vw1 = [32, 49],
+ $Vx1 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 172, 189, 193, 194, 195, 196, 197, 198, 202, 203, 204, 205, 206],
+ $Vy1 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 172, 189, 191, 193, 194, 195, 196, 197, 198, 202, 203, 204, 205, 206],
+ $Vz1 = [1, 216],
+ $VA1 = [23, 32, 36, 49, 106],
+ $VB1 = [23, 32, 36, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $VC1 = [2, 58],
+ $VD1 = [23, 32, 36, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106],
+ $VE1 = [1, 251],
+ $VF1 = [23, 32, 36, 49, 88, 90, 106],
+ $VG1 = [1, 252],
+ $VH1 = [23, 32, 34, 36, 38, 39, 40, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106],
+ $VI1 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $VJ1 = [23, 32, 36, 49, 86, 88, 90, 106],
+ $VK1 = [1, 253],
+ $VL1 = [23, 32, 36, 49, 84, 86, 88, 90, 106],
+ $VM1 = [1, 256],
+ $VN1 = [23, 32, 36, 49, 82, 84, 86, 88, 90, 106],
+ $VO1 = [1, 257],
+ $VP1 = [23, 32, 36, 49, 80, 82, 84, 86, 88, 90, 106],
+ $VQ1 = [1, 261],
+ $VR1 = [23, 32, 36, 49, 78, 80, 82, 84, 86, 88, 90, 106],
+ $VS1 = [1, 264],
+ $VT1 = [1, 265],
+ $VU1 = [10, 21, 25, 26, 28, 29, 30, 32, 39, 40, 47, 51, 57, 58, 59, 60, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169],
+ $VV1 = [23, 32, 36, 49, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $VW1 = [1, 266],
+ $VX1 = [1, 267],
+ $VY1 = [1, 268],
+ $VZ1 = [1, 269],
+ $V_1 = [23, 32, 36, 49, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $V$1 = [1, 270],
+ $V02 = [1, 271],
+ $V12 = [23, 32, 36, 49, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $V22 = [1, 272],
+ $V32 = [1, 273],
+ $V42 = [23, 32, 36, 49, 57, 58, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106],
+ $V52 = [1, 274],
+ $V62 = [1, 275],
+ $V72 = [1, 276],
+ $V82 = [21, 47, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 172],
+ $V92 = [1, 306],
+ $Va2 = [30, 34],
+ $Vb2 = [32, 106],
+ $Vc2 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169];
+
+ var parser = {
+ trace: function trace() {},
+ yy: {},
+ symbols_: {
+ "error": 2,
+ "glsl-start": 3,
+ "translation_unit": 4,
+ "EOF": 5,
+ "version_statement": 6,
+ "extension_statement_list": 7,
+ "external_declaration_list": 8,
+ "VERSION": 9,
+ "INTCONSTANT": 10,
+ "EOL": 11,
+ "pragma_statement": 12,
+ "PRAGMA_DEBUG_ON": 13,
+ "PRAGMA_DEBUG_OFF": 14,
+ "PRAGMA_OPTIMIZE_ON": 15,
+ "PRAGMA_OPTIMIZE_OFF": 16,
+ "PRAGMA_INVARIANT_ALL": 17,
+ "extension_statement": 18,
+ "any_identifier": 19,
+ "variable_identifier": 20,
+ "TYPE_IDENTIFIER": 21,
+ "EXTENSION": 22,
+ ":": 23,
+ "external_declaration": 24,
+ "IDENTIFIER": 25,
+ "NEW_IDENTIFIER": 26,
+ "primary_expression": 27,
+ "FLOATCONSTANT": 28,
+ "BOOLCONSTANT": 29,
+ "(": 30,
+ "expression": 31,
+ ")": 32,
+ "postfix_expression": 33,
+ "[": 34,
+ "integer_expression": 35,
+ "]": 36,
+ "function_call": 37,
+ ".": 38,
+ "++": 39,
+ "--": 40,
+ "function_call_or_method": 41,
+ "function_call_generic": 42,
+ "method_call_generic": 43,
+ "function_call_header_with_parameters": 44,
+ "function_call_header_no_parameters": 45,
+ "function_call_header": 46,
+ "VOID": 47,
+ "assignment_expression": 48,
+ ",": 49,
+ "type_specifier": 50,
+ "FIELD_SELECTION": 51,
+ "method_call_header_with_parameters": 52,
+ "method_call_header_no_parameters": 53,
+ "method_call_header": 54,
+ "unary_expression": 55,
+ "unary_operator": 56,
+ "+": 57,
+ "-": 58,
+ "!": 59,
+ "~": 60,
+ "multiplicative_expression": 61,
+ "*": 62,
+ "/": 63,
+ "%": 64,
+ "additive_expression": 65,
+ "shift_expression": 66,
+ "<<": 67,
+ ">>": 68,
+ "relational_expression": 69,
+ "<": 70,
+ ">": 71,
+ "<=": 72,
+ ">=": 73,
+ "equality_expression": 74,
+ "==": 75,
+ "!=": 76,
+ "and_expression": 77,
+ "&": 78,
+ "exclusive_or_expression": 79,
+ "^": 80,
+ "inclusive_or_expression": 81,
+ "|": 82,
+ "logical_and_expression": 83,
+ "&&": 84,
+ "logical_xor_expression": 85,
+ "^^": 86,
+ "logical_or_expression": 87,
+ "||": 88,
+ "conditional_expression": 89,
+ "?": 90,
+ "assignment_operator": 91,
+ "=": 92,
+ "*=": 93,
+ "/=": 94,
+ "%=": 95,
+ "+=": 96,
+ "-=": 97,
+ "<<=": 98,
+ ">>=": 99,
+ "&=": 100,
+ "^=": 101,
+ "|=": 102,
+ "constant_expression": 103,
+ "declaration": 104,
+ "function_prototype": 105,
+ ";": 106,
+ "init_declarator_list": 107,
+ "PRECISION": 108,
+ "precision_qualifier": 109,
+ "type_specifier_no_prec": 110,
+ "function_declarator": 111,
+ "function_header": 112,
+ "function_header_with_parameters": 113,
+ "parameter_declaration": 114,
+ "fully_specified_type": 115,
+ "parameter_declarator": 116,
+ "parameter_type_qualifier": 117,
+ "parameter_qualifier": 118,
+ "parameter_type_specifier": 119,
+ "IN": 120,
+ "OUT": 121,
+ "INOUT": 122,
+ "single_declaration": 123,
+ "initializer": 124,
+ "INVARIANT": 125,
+ "type_qualifier": 126,
+ "layout_qualifier": 127,
+ "LAYOUT": 128,
+ "layout_qualifier_id_list": 129,
+ "layout_qualifier_id": 130,
+ "interpolation_qualifier": 131,
+ "SMOOTH": 132,
+ "FLAT": 133,
+ "NOPERSPECTIVE": 134,
+ "CONST": 135,
+ "storage_qualifier": 136,
+ "ATTRIBUTE": 137,
+ "VARYING": 138,
+ "CENTROID": 139,
+ "UNIFORM": 140,
+ "type_specifier_nonarray": 141,
+ "basic_type_specifier_nonarray": 142,
+ "struct_specifier": 143,
+ "FLOAT": 144,
+ "DOUBLE": 145,
+ "INT": 146,
+ "BOOL": 147,
+ "VEC2": 148,
+ "VEC3": 149,
+ "VEC4": 150,
+ "BVEC2": 151,
+ "BVEC3": 152,
+ "BVEC4": 153,
+ "IVEC2": 154,
+ "IVEC3": 155,
+ "IVEC4": 156,
+ "MAT2X2": 157,
+ "MAT3X3": 158,
+ "MAT4X4": 159,
+ "SAMPLER1D": 160,
+ "SAMPLER2D": 161,
+ "SAMPLER3D": 162,
+ "SAMPLERCUBE": 163,
+ "SAMPLER1DSHADOW": 164,
+ "SAMPLER2DSHADOW": 165,
+ "HIGHP": 166,
+ "MEDIUMP": 167,
+ "LOWP": 168,
+ "STRUCT": 169,
+ "{": 170,
+ "struct_declaration_list": 171,
+ "}": 172,
+ "struct_declaration": 173,
+ "struct_declarator_list": 174,
+ "struct_declarator": 175,
+ "declaration_statement": 176,
+ "statement": 177,
+ "compound_statement": 178,
+ "simple_statement": 179,
+ "expression_statement": 180,
+ "selection_statement": 181,
+ "switch_statement": 182,
+ "case_label": 183,
+ "iteration_statement": 184,
+ "jump_statement": 185,
+ "statement_list": 186,
+ "statement_no_new_scope": 187,
+ "compound_statement_no_new_scope": 188,
+ "IF": 189,
+ "selection_rest_statement": 190,
+ "ELSE": 191,
+ "condition": 192,
+ "SWITCH": 193,
+ "CASE": 194,
+ "DEFAULT": 195,
+ "WHILE": 196,
+ "DO": 197,
+ "FOR": 198,
+ "for_init_statement": 199,
+ "for_rest_statement": 200,
+ "conditionopt": 201,
+ "CONTINUE": 202,
+ "BREAK": 203,
+ "RETURN": 204,
+ "DISCARD": 205,
+ "DEBUGGER": 206,
+ "function_definition": 207,
+ "$accept": 0,
+ "$end": 1
+ },
+ terminals_: {
+ 2: "error",
+ 5: "EOF",
+ 9: "VERSION",
+ 10: "INTCONSTANT",
+ 11: "EOL",
+ 13: "PRAGMA_DEBUG_ON",
+ 14: "PRAGMA_DEBUG_OFF",
+ 15: "PRAGMA_OPTIMIZE_ON",
+ 16: "PRAGMA_OPTIMIZE_OFF",
+ 17: "PRAGMA_INVARIANT_ALL",
+ 21: "TYPE_IDENTIFIER",
+ 22: "EXTENSION",
+ 23: ":",
+ 25: "IDENTIFIER",
+ 26: "NEW_IDENTIFIER",
+ 28: "FLOATCONSTANT",
+ 29: "BOOLCONSTANT",
+ 30: "(",
+ 32: ")",
+ 34: "[",
+ 36: "]",
+ 38: ".",
+ 39: "++",
+ 40: "--",
+ 47: "VOID",
+ 49: ",",
+ 51: "FIELD_SELECTION",
+ 57: "+",
+ 58: "-",
+ 59: "!",
+ 60: "~",
+ 62: "*",
+ 63: "/",
+ 64: "%",
+ 67: "<<",
+ 68: ">>",
+ 70: "<",
+ 71: ">",
+ 72: "<=",
+ 73: ">=",
+ 75: "==",
+ 76: "!=",
+ 78: "&",
+ 80: "^",
+ 82: "|",
+ 84: "&&",
+ 86: "^^",
+ 88: "||",
+ 90: "?",
+ 92: "=",
+ 93: "*=",
+ 94: "/=",
+ 95: "%=",
+ 96: "+=",
+ 97: "-=",
+ 98: "<<=",
+ 99: ">>=",
+ 100: "&=",
+ 101: "^=",
+ 102: "|=",
+ 106: ";",
+ 108: "PRECISION",
+ 120: "IN",
+ 121: "OUT",
+ 122: "INOUT",
+ 125: "INVARIANT",
+ 128: "LAYOUT",
+ 132: "SMOOTH",
+ 133: "FLAT",
+ 134: "NOPERSPECTIVE",
+ 135: "CONST",
+ 137: "ATTRIBUTE",
+ 138: "VARYING",
+ 139: "CENTROID",
+ 140: "UNIFORM",
+ 144: "FLOAT",
+ 145: "DOUBLE",
+ 146: "INT",
+ 147: "BOOL",
+ 148: "VEC2",
+ 149: "VEC3",
+ 150: "VEC4",
+ 151: "BVEC2",
+ 152: "BVEC3",
+ 153: "BVEC4",
+ 154: "IVEC2",
+ 155: "IVEC3",
+ 156: "IVEC4",
+ 157: "MAT2X2",
+ 158: "MAT3X3",
+ 159: "MAT4X4",
+ 160: "SAMPLER1D",
+ 161: "SAMPLER2D",
+ 162: "SAMPLER3D",
+ 163: "SAMPLERCUBE",
+ 164: "SAMPLER1DSHADOW",
+ 165: "SAMPLER2DSHADOW",
+ 166: "HIGHP",
+ 167: "MEDIUMP",
+ 168: "LOWP",
+ 169: "STRUCT",
+ 170: "{",
+ 172: "}",
+ 189: "IF",
+ 191: "ELSE",
+ 193: "SWITCH",
+ 194: "CASE",
+ 195: "DEFAULT",
+ 196: "WHILE",
+ 197: "DO",
+ 198: "FOR",
+ 202: "CONTINUE",
+ 203: "BREAK",
+ 204: "RETURN",
+ 205: "DISCARD",
+ 206: "DEBUGGER"
+ },
+ productions_: [0, [3, 2], [4, 3], [6, 0], [6, 3], [12, 2], [12, 2], [12, 2], [12, 2], [12, 2], [7, 0], [7, 2], [19, 1], [19, 1], [18, 5], [8, 1], [8, 2], [20, 1], [20, 1], [27, 1], [27, 1], [27, 1], [27, 1], [27, 3], [33, 1], [33, 4], [33, 1], [33, 3], [33, 2], [33, 2], [35, 1], [37, 1], [41, 1], [41, 3], [42, 2], [42, 2], [45, 2], [45, 1], [44, 2], [44, 3], [46, 2], [46, 2], [46, 1], [43, 2], [43, 2], [53, 2], [53, 1], [52, 2], [52, 3], [54, 2], [55, 1], [55, 2], [55, 2], [55, 2], [56, 1], [56, 1], [56, 1], [56, 1], [61, 1], [61, 3], [61, 3], [61, 3], [65, 1], [65, 3], [65, 3], [66, 1], [66, 3], [66, 3], [69, 1], [69, 3], [69, 3], [69, 3], [69, 3], [74, 1], [74, 3], [74, 3], [77, 1], [77, 3], [79, 1], [79, 3], [81, 1], [81, 3], [83, 1], [83, 3], [85, 1], [85, 3], [87, 1], [87, 3], [89, 1], [89, 5], [48, 1], [48, 3], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [31, 1], [31, 3], [103, 1], [104, 2], [104, 2], [104, 4], [105, 2], [111, 1], [111, 1], [113, 2], [113, 3], [112, 3], [116, 2], [116, 5], [114, 3], [114, 2], [114, 3], [114, 2], [118, 0], [118, 1], [118, 1], [118, 1], [119, 1], [107, 1], [107, 3], [107, 5], [107, 6], [107, 7], [107, 8], [107, 5], [123, 1], [123, 2], [123, 4], [123, 5], [123, 6], [123, 7], [123, 4], [123, 2], [115, 1], [115, 2], [127, 4], [129, 1], [129, 3], [130, 1], [130, 3], [131, 1], [131, 1], [131, 1], [117, 1], [126, 1], [126, 1], [126, 2], [126, 1], [126, 2], [126, 2], [126, 3], [126, 1], [136, 1], [136, 1], [136, 1], [136, 2], [136, 1], [136, 1], [136, 2], [136, 2], [136, 1], [50, 1], [50, 2], [110, 1], [110, 3], [110, 4], [141, 1], [141, 1], [141, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [109, 1], [109, 1], [109, 1], [143, 5], [143, 4], [171, 1], [171, 2], [173, 3], [174, 1], [174, 3], [175, 1], [175, 4], [124, 1], [176, 1], [177, 1], [177, 1], [179, 1], [179, 1], [179, 1], [179, 1], [179, 1], [179, 1], [179, 1], [178, 2], [178, 3], [187, 1], [187, 1], [188, 2], [188, 3], [186, 1], [186, 2], [180, 1], [180, 2], [181, 5], [190, 3], [190, 1], [192, 1], [192, 4], [182, 5], [183, 3], [183, 2], [184, 5], [184, 7], [184, 6], [199, 1], [199, 1], [201, 1], [201, 0], [200, 2], [200, 3], [185, 2], [185, 2], [185, 2], [185, 3], [185, 2], [185, 2], [24, 1], [24, 1], [24, 1], [207, 2]],
+ performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate
+ /* action[1] */
+ , $$
+ /* vstack */
+ , _$
+ /* lstack */
+ ) {
+ /* this == yyval */
+ var $0 = $$.length - 1;
+
+ switch (yystate) {
+ case 1:
+ return $$[$0 - 1];
+ break;
+
+ case 15:
+ case 16:
+ if ($$[$0] !== null) {
+ yy.state.addAstNode($$[$0]);
+ }
+
+ break;
+
+ case 19:
+ this.$ = new AstExpression('ident');
+ this.$.setLocation(_$[$0]);
+ this.$.primary_expression.identifier = $$[$0];
+ break;
+
+ case 20:
+ this.$ = new AstExpression('int');
+ this.$.setLocation(_$[$0]);
+ this.$.primary_expression.int_constant = $$[$0];
+ this.$.primary_expression.type = 'int';
+ break;
+
+ case 21:
+ this.$ = new AstExpression('float');
+ this.$.setLocation(_$[$0]);
+ this.$.primary_expression.float_constant = $$[$0];
+ this.$.primary_expression.type = 'float';
+ break;
+
+ case 22:
+ this.$ = new AstExpression('bool');
+ this.$.setLocation(_$[$0]);
+ this.$.primary_expression.bool_constant = $$[$0];
+ this.$.primary_expression.type = 'bool';
+ break;
+
+ case 23:
+ this.$ = $$[$0 - 1];
+ this.$.grouped = true;
+ break;
+
+ case 25:
+ this.$ = new AstExpression('[]', $$[$0 - 3], $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 3]);
+ break;
+
+ case 27:
+ this.$ = new AstExpression('.', $$[$0 - 2]);
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.primary_expression.identifier = $$[$0];
+ break;
+
+ case 28:
+ this.$ = new AstExpression('x++', $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 29:
+ this.$ = new AstExpression('x--', $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 38:
+ this.$ = $$[$0 - 1];
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.expressions.push($$[$0]);
+ break;
+
+ case 39:
+ this.$ = $$[$0 - 2];
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.expressions.push($$[$0]);
+ break;
+
+ case 40:
+ this.$ = new AstFunctionExpression($$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 41:
+ var callee = new AstExpression($$[$0 - 1]);
+ this.$ = new AstFunctionExpression(callee);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 51:
+ this.$ = new AstExpression('++x', $$[$0]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 52:
+ this.$ = new AstExpression('--x', $$[$0]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 53:
+ this.$ = new AstExpression($$[$0 - 1], $$[$0]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 54:
+ this.$ = 'POS';
+ break;
+
+ case 55:
+ this.$ = 'NEG';
+ break;
+
+ case 59:
+ case 60:
+ case 61:
+ case 63:
+ case 64:
+ case 66:
+ case 67:
+ case 69:
+ case 70:
+ case 71:
+ case 72:
+ case 74:
+ case 75:
+ case 77:
+ case 79:
+ case 81:
+ case 83:
+ case 85:
+ case 87:
+ this.$ = new AstExpressionBin($$[$0 - 1], $$[$0 - 2], $$[$0]);
+ this.$.setLocation(_$[$0 - 2]);
+ break;
+
+ case 89:
+ this.$ = new AstExpression($$[$0 - 3], $$[$0 - 4], $$[$0 - 2], $$[$0]);
+ this.$.setLocation(_$[$0 - 4]);
+ break;
+
+ case 91:
+ this.$ = new AstExpression($$[$0 - 1], $$[$0 - 2], $$[$0]);
+ this.$.setLocation(_$[$0 - 2]);
+ break;
+
+ case 103:
+ this.$ = $$[$0];
+ break;
+
+ case 104:
+ if ($$[$0 - 2].oper !== $$[$0 - 1]) {
+ this.$ = new AstExpression($$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.expressions.push($$[$0 - 2]);
+ } else {
+ this.$ = $$[$0 - 2];
+ }
+
+ this.$.expressions.push($$[$0]);
+ break;
+
+ case 106:
+ yy.state.symbols.pop_scope();
+ this.$ = $$[$0 - 1];
+ break;
+
+ case 107:
+ this.$ = $$[$0 - 1];
+ break;
+
+ case 108:
+ $$[$0 - 1].precision = $$[$0 - 2];
+ $$[$0 - 1].is_precision_statement = true;
+ this.$ = $$[$0 - 1];
+ break;
+
+ case 112:
+ this.$ = $$[$0 - 1];
+ this.$.parameters.push($$[$0]);
+ break;
+
+ case 113:
+ this.$ = $$[$0 - 2];
+ this.$.parameters.push($$[$0]);
+ break;
+
+ case 114:
+ this.$ = new AstFunction();
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.return_type = $$[$0 - 2];
+ this.$.identifier = $$[$0 - 1]; //Check for duplicates
+
+ if ($$[$0 - 1] == 'main') {
+ if (yy.state.symbols.get_function($$[$0 - 1])) {
+ var e = new Error("Cannot define main() more than once");
+ e.lineNumber = _$[$0 - 2].first_line;
+ e.columnNumber = _$[$0 - 2].first_column;
+ throw e;
+ }
+ }
+
+ this.$.entry = yy.state.symbols.add_function($$[$0 - 1], $$[$0 - 2].specifier.type_name);
+ this.$.entry.Ast = this.$;
+ yy.state.symbols.push_scope();
+ break;
+
+ case 115:
+ this.$ = new AstParameterDeclarator();
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.type = new AstFullySpecifiedType();
+ this.$.type.setLocation(_$[$0 - 1]);
+ this.$.type.specifier = $$[$0 - 1];
+ this.$.identifier = $$[$0];
+ break;
+
+ case 117:
+ $$[$0 - 2].concat($$[$0 - 1]);
+ this.$ = $$[$0];
+ this.$.type.qualifier = $$[$0 - 2];
+ break;
+
+ case 118:
+ this.$ = $$[$0];
+ this.$.type.qualifier = $$[$0 - 1];
+ break;
+
+ case 119:
+ $$[$0 - 2].concat($$[$0 - 1]);
+ this.$ = new AstParameterDeclarator();
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.type = new AstFullySpecifiedType();
+ this.$.type.qualifier = $$[$0 - 2];
+ this.$.type.specifier = $$[$0];
+ break;
+
+ case 120:
+ this.$ = new AstParameterDeclarator();
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.type = new AstFullySpecifiedType();
+ this.$.type.qualifier = $$[$0 - 1];
+ this.$.type.specifier = $$[$0];
+ break;
+
+ case 121:
+ this.$ = [];
+ break;
+
+ case 122:
+ this.$ = ['in'];
+ break;
+
+ case 123:
+ this.$ = ['out'];
+ break;
+
+ case 124:
+ this.$ = ['inout'];
+ break;
+
+ case 127:
+ var decl = new AstDeclaration($$[$0], false);
+ decl.setLocation(_$[$0 - 2]);
+ this.$ = $$[$0 - 2];
+ this.$.declarations.push(decl);
+ /*yy.state.symbols.add_variable($$[$0]);*/
+
+ break;
+
+ case 129:
+ var decl = new AstDeclaration($$[$0 - 3], true, $$[$0 - 1]);
+ decl.setLocation(_$[$0 - 5]);
+ this.$ = $$[$0 - 5];
+ this.$.declarations.push(decl);
+ /*yy.state.symbols.add_variable($$[$0-3]);*/
+
+ break;
+
+ case 132:
+ var decl = new AstDeclaration($$[$0 - 2], false, null, $$[$0]);
+ decl.setLocation(_$[$0 - 4]);
+ this.$ = $$[$0 - 4];
+ this.$.declarations.push(decl);
+ /*yy.state.symbols.add_variable($$[$0-2]);*/
+
+ break;
+
+ case 133:
+ if ($$[$0].specifier.type_specifier !== types.struct) {
+ yy.state.addError("empty declaration list", _$[$0].first_line, _$[$0].first_column);
+ return 0;
+ }
+
+ this.$ = new AstDeclaratorList($$[$0]);
+ this.$.setLocation(_$[$0]);
+ break;
+
+ case 134:
+ var decl = new AstDeclaration($$[$0], false);
+ decl.setLocation(_$[$0]);
+ this.$ = new AstDeclaratorList($$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 135:
+ var decl = new AstDeclaration($$[$0 - 2], true);
+ decl.setLocation(_$[$0 - 2]);
+ this.$ = new AstDeclaratorList($$[$0 - 3]);
+ this.$.setLocation(_$[$0 - 3]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 136:
+ var decl = new AstDeclaration($$[$0 - 3], true, $$[$0 - 1]);
+ decl.setLocation(_$[$0 - 3]);
+ this.$ = new AstDeclaratorList($$[$0 - 4]);
+ this.$.setLocation(_$[$0 - 4]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 137:
+ var decl = new AstDeclaration($$[$0 - 4], true, null, $$[$0]);
+ decl.setLocation(_$[$0 - 4]);
+ this.$ = new AstDeclaratorList($$[$0 - 5]);
+ this.$.setLocation(_$[$0 - 5]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 138:
+ var decl = new AstDeclaration($$[$0 - 5], true, $$[$0 - 3], $$[$0]);
+ decl.setLocation(_$[$0 - 5]);
+ this.$ = new AstDeclaratorList($$[$0 - 6]);
+ this.$.setLocation(_$[$0 - 6]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 139:
+ var decl = new AstDeclaration($$[$0 - 2], false, null, $$[$0]);
+ decl.setLocation(_$[$0 - 2]);
+ this.$ = new AstDeclaratorList($$[$0 - 3]);
+ this.$.setLocation(_$[$0 - 3]);
+ this.$.declarations.push(decl);
+ break;
+
+ case 141:
+ this.$ = new AstFullySpecifiedType();
+ this.$.setLocation(_$[$0]);
+ this.$.specifier = $$[$0];
+ break;
+
+ case 142:
+ this.$ = new AstFullySpecifiedType();
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.qualifier = $$[$0 - 1];
+ this.$.specifier = $$[$0];
+ break;
+
+ case 143:
+ this.$ = $$[$0 - 1];
+ break;
+
+ case 151:
+ case 160:
+ this.$ = ['const'];
+ break;
+
+ case 161:
+ this.$ = ['attribute'];
+ break;
+
+ case 162:
+ this.$ = ['varying'];
+ break;
+
+ case 163:
+ this.$ = ['centroid', 'varying'];
+ break;
+
+ case 164:
+ this.$ = ['in'];
+ break;
+
+ case 165:
+ this.$ = ['out'];
+ break;
+
+ case 166:
+ this.$ = ['centroid', 'in'];
+ break;
+
+ case 167:
+ this.$ = ['centroid', 'out'];
+ break;
+
+ case 168:
+ this.$ = ['uniform'];
+ break;
+
+ case 169:
+ this.$ = $$[$0];
+ break;
+
+ case 170:
+ this.$ = $$[$0];
+ this.$.precision = $$[$0 - 1];
+ break;
+
+ case 174:
+ case 175:
+ case 176:
+ this.$ = new AstTypeSpecifier($$[$0]);
+ this.$.setLocation(_$[$0]);
+ break;
+
+ case 200:
+ this.$ = ast_precision.highp;
+ break;
+
+ case 201:
+ this.$ = ast_precision.mediump;
+ break;
+
+ case 202:
+ this.$ = ast_precision.lowp;
+ break;
+
+ case 203:
+ this.$ = new AstStructSpecifier($$[$0 - 3], $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 4]);
+ yy.state.symbols.add_type($$[$0 - 3], types._void);
+ break;
+
+ case 205:
+ this.$ = [$$[$0]];
+ break;
+
+ case 206:
+ this.$ = $$[$0 - 1];
+ this.$.push($$[$0]);
+ break;
+
+ case 207:
+ var type = new AstFullySpecifiedType();
+ type.setLocation(_$[$0 - 2]);
+ type.specifier = $$[$0 - 2];
+ this.$ = new AstDeclaratorList(type);
+ this.$.setLocation(_$[$0 - 2]);
+ this.$.declarations = $$[$0 - 1];
+ break;
+
+ case 210:
+ this.$ = new AstDeclaration($$[$0], false);
+ this.$.setLocation(_$[$0]);
+ yy.state.symbols.add_variable($$[$0]);
+ break;
+
+ case 219:
+ case 220:
+ case 258:
+ this.$ = null;
+ break;
+
+ case 223:
+ this.$ = new AstCompoundStatement(true);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 224:
+ yy.state.symbols.push_scope();
+ this.$ = new AstCompoundStatement(true, $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 2]);
+ yy.state.symbols.pop_scope();
+ break;
+
+ case 228:
+ this.$ = new AstCompoundStatement(false, $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 2]);
+ break;
+
+ case 229:
+ if ($$[$0] === null) {
+ yy.state.addError(" statement", _$[$0].first_line, _$[$0].first_column);
+ } else {
+ this.$ = [$$[$0]];
+ }
+
+ break;
+
+ case 230:
+ if ($$[$0] === null) {
+ yy.state.addError(" statement", _$[$0 - 1].first_line, _$[$0 - 1].first_column);
+ }
+
+ this.$ = $$[$0 - 1];
+ this.$.push($$[$0]);
+ break;
+
+ case 232:
+ this.$ = new AstExpressionStatement($$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 233:
+ this.$ = new AstSelectionStatement($$[$0 - 2], $$[$0].then_statement, $$[$0].else_statement);
+ this.$.setLocation(_$[$0 - 4]);
+ break;
+
+ case 234:
+ this.$ = {};
+ this.$.then_statement = $$[$0 - 2];
+ this.$.else_statement = $$[$0];
+ break;
+
+ case 235:
+ this.$.then_statement = $$[$0];
+ break;
+
+ case 250:
+ this.$ = new AstJumpStatement('continue');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 251:
+ this.$ = new AstJumpStatement('break');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 252:
+ this.$ = new AstJumpStatement('return');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 253:
+ this.$ = new AstJumpStatement('return', $$[$0 - 1]);
+ this.$.setLocation(_$[$0 - 2]);
+ break;
+
+ case 254:
+ /* Fragment shader only.*/
+ this.$ = new AstJumpStatement('discard');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 255:
+ this.$ = new AstJumpStatement('debugger');
+ this.$.setLocation(_$[$0 - 1]);
+ break;
+
+ case 256:
+ case 257:
+ this.$ = $$[$0];
+ break;
+
+ case 259:
+ this.$ = new AstFunctionDefinition();
+ this.$.setLocation(_$[$0 - 1]);
+ this.$.proto_type = $$[$0 - 1];
+ this.$.body = $$[$0];
+ yy.state.symbols.pop_scope();
+ break;
+ }
+ },
+ table: [o($V0, [2, 3], {
+ 3: 1,
+ 4: 2,
+ 6: 3,
+ 9: [1, 4]
+ }), {
+ 1: [3]
+ }, {
+ 5: [1, 5]
+ }, o($V0, [2, 10], {
+ 7: 6
+ }), {
+ 10: [1, 7]
+ }, {
+ 1: [2, 1]
+ }, {
+ 8: 8,
+ 12: 14,
+ 13: $V1,
+ 14: $V2,
+ 15: $V3,
+ 16: $V4,
+ 17: $V5,
+ 18: 9,
+ 21: $V6,
+ 22: [1, 11],
+ 24: 10,
+ 47: $V7,
+ 50: 29,
+ 104: 13,
+ 105: 15,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 207: 12
+ }, {
+ 11: [1, 78]
+ }, {
+ 5: [2, 2],
+ 12: 14,
+ 13: $V1,
+ 14: $V2,
+ 15: $V3,
+ 16: $V4,
+ 17: $V5,
+ 21: $V6,
+ 24: 79,
+ 47: $V7,
+ 50: 29,
+ 104: 13,
+ 105: 15,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 207: 12
+ }, o($V0, [2, 11]), o($VL, [2, 15]), {
+ 19: 80,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }, o($VL, [2, 256]), o($VL, [2, 257]), o($VL, [2, 258]), {
+ 106: $VP,
+ 170: $VQ,
+ 188: 85
+ }, {
+ 49: [1, 89],
+ 106: [1, 88]
+ }, {
+ 109: 90,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ
+ }, {
+ 11: [1, 91]
+ }, {
+ 11: [1, 92]
+ }, {
+ 11: [1, 93]
+ }, {
+ 11: [1, 94]
+ }, {
+ 11: [1, 95]
+ }, {
+ 32: [1, 96]
+ }, o($VR, [2, 126]), o($VS, $VT, {
+ 114: 97,
+ 117: 98,
+ 118: 99,
+ 32: [2, 110],
+ 120: $VU,
+ 121: $VV,
+ 122: $VW,
+ 135: $VX
+ }), {
+ 32: [2, 111],
+ 49: [1, 104]
+ }, o($VR, [2, 133], {
+ 19: 105,
+ 20: 106,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }), o($VS, $VY, {
+ 20: 107,
+ 136: 108,
+ 131: 109,
+ 25: $VN,
+ 26: $VO,
+ 120: $V9,
+ 121: $Va,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }), o($VZ, $V_), {
+ 21: $V6,
+ 47: $V7,
+ 50: 110,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($V$, [2, 169]), {
+ 21: $V6,
+ 47: $V7,
+ 110: 111,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 169: $VK
+ }, o($VS, [2, 152]), o($VS, [2, 153], {
+ 136: 112,
+ 120: $V9,
+ 121: $Va,
+ 135: $Vg,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }), o($VS, [2, 155], {
+ 136: 113,
+ 120: $V9,
+ 121: $Va,
+ 135: $Vg,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }), o($V$, [2, 171], {
+ 34: [1, 114]
+ }), o($V01, [2, 200]), o($V01, [2, 201]), o($V01, [2, 202]), o($VS, [2, 160]), o($VS, [2, 161]), o($VS, [2, 162]), {
+ 120: [1, 116],
+ 121: [1, 117],
+ 138: [1, 115]
+ }, o($VS, [2, 164]), o($VS, [2, 165]), o($VS, [2, 168]), {
+ 30: [1, 118]
+ }, o($V11, [2, 148]), o($V11, [2, 149]), o($V11, [2, 150]), o($V21, [2, 174]), o($V21, [2, 175]), o($V21, [2, 176]), o($V21, $V31), o($V21, [2, 178]), o($V21, [2, 179]), o($V21, [2, 180]), o($V21, [2, 181]), o($V21, [2, 182]), o($V21, [2, 183]), o($V21, [2, 184]), o($V21, [2, 185]), o($V21, [2, 186]), o($V21, [2, 187]), o($V21, [2, 188]), o($V21, [2, 189]), o($V21, [2, 190]), o($V21, [2, 191]), o($V21, [2, 192]), o($V21, [2, 193]), o($V21, [2, 194]), o($V21, [2, 195]), o($V21, [2, 196]), o($V21, [2, 197]), o($V21, [2, 198]), o($V21, [2, 199]), {
+ 19: 119,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 170: [1, 120]
+ }, o($V0, [2, 4]), o($VL, [2, 16]), {
+ 23: [1, 121]
+ }, o([11, 23, 32, 34, 49, 92, 106, 170], $V41), o([11, 23, 32, 34, 36, 38, 39, 40, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106, 170], [2, 13]), o($V51, [2, 17]), o($V51, [2, 18]), o($VL, [2, 259]), o($V61, [2, 106]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 172: [1, 122],
+ 176: 128,
+ 177: 124,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 186: 123,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($V61, [2, 107]), {
+ 19: 187,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 110: 188,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 169: $VK
+ }, o($VL, [2, 5]), o($VL, [2, 6]), o($VL, [2, 7]), o($VL, [2, 8]), o($VL, [2, 9]), o([106, 170], [2, 109]), o($Vw1, [2, 112]), o($VS, $VT, {
+ 118: 189,
+ 120: $VU,
+ 121: $VV,
+ 122: $VW
+ }), {
+ 21: $V6,
+ 47: $V7,
+ 50: 192,
+ 109: 32,
+ 110: 31,
+ 116: 190,
+ 119: 191,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o([21, 47, 120, 121, 122, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], [2, 151]), o($VS, [2, 122]), o($VS, [2, 123]), o($VS, [2, 124]), o($VS, $VT, {
+ 117: 98,
+ 118: 99,
+ 114: 193,
+ 120: $VU,
+ 121: $VV,
+ 122: $VW,
+ 135: $VX
+ }), o($VR, [2, 134], {
+ 34: [1, 194],
+ 92: [1, 195]
+ }), o([34, 49, 92, 106], $V41, {
+ 30: [1, 196]
+ }), o($VR, [2, 140]), o($VS, [2, 157]), {
+ 120: $V9,
+ 121: $Va,
+ 135: $Vg,
+ 136: 197,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }, o($VZ, [2, 142]), o($V$, [2, 170]), o($VS, [2, 154]), o($VS, [2, 156]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 36: [1, 198],
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 199,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VS, [2, 163]), o($VS, [2, 166]), o($VS, [2, 167]), {
+ 19: 205,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 129: 203,
+ 130: 204
+ }, {
+ 170: [1, 206]
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 50: 209,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 171: 207,
+ 173: 208
+ }, {
+ 19: 210,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }, o($V61, [2, 227]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 172: [1, 211],
+ 176: 128,
+ 177: 212,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($Vx1, [2, 229]), o($Vy1, [2, 214]), o($Vy1, [2, 215]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 172: [1, 213],
+ 176: 128,
+ 177: 124,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 186: 214,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($Vy1, [2, 216]), o($Vy1, [2, 217]), o($Vy1, [2, 218]), o($Vy1, [2, 219]), o($Vy1, [2, 220]), o($Vy1, [2, 221]), o($Vy1, [2, 222]), o($Vy1, [2, 213]), o($Vy1, [2, 231]), {
+ 49: $Vz1,
+ 106: [1, 215]
+ }, {
+ 30: [1, 217]
+ }, {
+ 30: [1, 218]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 219,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 23: [1, 220]
+ }, {
+ 30: [1, 221]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 176: 128,
+ 177: 222,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, {
+ 30: [1, 223]
+ }, {
+ 106: [1, 224]
+ }, {
+ 106: [1, 225]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 227,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 106: [1, 226],
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 106: [1, 228]
+ }, {
+ 106: [1, 229]
+ }, {
+ 106: $VP
+ }, o($VA1, [2, 103]), o($VA1, [2, 90]), o($VB1, $VC1, {
+ 91: 230,
+ 92: [1, 231],
+ 93: [1, 232],
+ 94: [1, 233],
+ 95: [1, 234],
+ 96: [1, 235],
+ 97: [1, 236],
+ 98: [1, 237],
+ 99: [1, 238],
+ 100: [1, 239],
+ 101: [1, 240],
+ 102: [1, 241]
+ }), o($VA1, [2, 88], {
+ 88: [1, 243],
+ 90: [1, 242]
+ }), o($VD1, [2, 50], {
+ 34: [1, 244],
+ 38: [1, 245],
+ 39: [1, 246],
+ 40: [1, 247]
+ }), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 248,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 249,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 250,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VZ, $V_, {
+ 30: $VE1
+ }), o($VF1, [2, 86], {
+ 86: $VG1
+ }), o($VH1, [2, 24]), o($VH1, [2, 26]), o($VI1, [2, 54]), o($VI1, [2, 55]), o($VI1, [2, 56]), o($VI1, [2, 57]), o($VJ1, [2, 84], {
+ 84: $VK1
+ }), o($VH1, [2, 19], {
+ 30: [1, 254]
+ }), o($VH1, [2, 20]), o($VH1, [2, 21]), o($VH1, [2, 22]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 255,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 31]), o($VL1, [2, 82], {
+ 82: $VM1
+ }), o($VH1, [2, 32]), o($VN1, [2, 80], {
+ 80: $VO1
+ }), {
+ 32: [1, 258],
+ 49: [1, 259]
+ }, {
+ 32: [1, 260]
+ }, o($VP1, [2, 78], {
+ 78: $VQ1
+ }), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 32: [2, 37],
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: [1, 263],
+ 48: 262,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VR1, [2, 76], {
+ 75: $VS1,
+ 76: $VT1
+ }), o($VU1, [2, 42]), o($VV1, [2, 73], {
+ 70: $VW1,
+ 71: $VX1,
+ 72: $VY1,
+ 73: $VZ1
+ }), o($V_1, [2, 68], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V12, [2, 65], {
+ 57: $V22,
+ 58: $V32
+ }), o($V42, [2, 62], {
+ 62: $V52,
+ 63: $V62,
+ 64: $V72
+ }), o($VR, [2, 127], {
+ 34: [1, 277],
+ 92: [1, 278]
+ }), {
+ 106: [1, 279]
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 50: 192,
+ 109: 32,
+ 110: 31,
+ 116: 280,
+ 119: 281,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($Vw1, [2, 118]), o($Vw1, [2, 120]), o($Vw1, [2, 125], {
+ 20: 81,
+ 19: 282,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }), o($Vw1, [2, 113]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 36: [1, 283],
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 284,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 285,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o([21, 32, 47, 120, 121, 122, 135, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], [2, 114]), o($VS, [2, 158]), o($V$, [2, 172]), {
+ 36: [1, 287]
+ }, {
+ 36: [2, 105]
+ }, o($VB1, $VC1), {
+ 30: $VE1
+ }, {
+ 32: [1, 288],
+ 49: [1, 289]
+ }, o($Vw1, [2, 144]), o($Vw1, [2, 146], {
+ 92: [1, 290]
+ }), {
+ 21: $V6,
+ 47: $V7,
+ 50: 209,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 171: 291,
+ 173: 208
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 50: 209,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 172: [1, 292],
+ 173: 293
+ }, o($V82, [2, 205]), {
+ 19: 296,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 174: 294,
+ 175: 295
+ }, {
+ 11: [1, 297]
+ }, o($V61, [2, 228]), o($Vx1, [2, 230]), o($Vy1, [2, 223]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 172: [1, 298],
+ 176: 128,
+ 177: 212,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($Vy1, [2, 232]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 299,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 300,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 301,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 23: [1, 302],
+ 49: $Vz1
+ }, o($Vy1, [2, 240]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 304,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 115: 305,
+ 120: $V9,
+ 121: $Va,
+ 125: $V92,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 192: 303
+ }, {
+ 196: [1, 307]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 176: 310,
+ 180: 309,
+ 199: 308
+ }, o($Vy1, [2, 250]), o($Vy1, [2, 251]), o($Vy1, [2, 252]), {
+ 49: $Vz1,
+ 106: [1, 311]
+ }, o($Vy1, [2, 254]), o($Vy1, [2, 255]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 312,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VI1, [2, 92]), o($VI1, [2, 93]), o($VI1, [2, 94]), o($VI1, [2, 95]), o($VI1, [2, 96]), o($VI1, [2, 97]), o($VI1, [2, 98]), o($VI1, [2, 99]), o($VI1, [2, 100]), o($VI1, [2, 101]), o($VI1, [2, 102]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 313,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 314,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 316,
+ 33: 155,
+ 35: 315,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 19: 317,
+ 20: 319,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 43: 318,
+ 52: 320,
+ 53: 321,
+ 54: 322
+ }, o($VH1, [2, 28]), o($VH1, [2, 29]), o($VD1, [2, 51]), o($VD1, [2, 52]), o($VD1, [2, 53]), o($VU1, [2, 40]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 323,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 324,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VU1, [2, 41]), {
+ 32: [1, 325],
+ 49: $Vz1
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 326,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 327,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 34]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 328,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 35]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 329,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($Vw1, [2, 38]), o($Va2, $V31, {
+ 32: [2, 36]
+ }), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 330,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 331,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 332,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 333,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 334,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 335,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 336,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 337,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 338,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 339,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 340,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 341,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 342,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 36: [1, 343],
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 344,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 345,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($V61, [2, 108]), o($Vw1, [2, 117]), o($Vw1, [2, 119]), o($Vw1, [2, 115], {
+ 34: [1, 346]
+ }), o($VR, [2, 135], {
+ 92: [1, 347]
+ }), {
+ 36: [1, 348]
+ }, o($VR, [2, 139]), o([32, 49, 106], [2, 212]), o($V$, [2, 173]), o($V11, [2, 143]), {
+ 19: 205,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 130: 349
+ }, {
+ 10: [1, 350]
+ }, {
+ 21: $V6,
+ 47: $V7,
+ 50: 209,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 172: [1, 351],
+ 173: 293
+ }, o($V21, [2, 204]), o($V82, [2, 206]), {
+ 49: [1, 353],
+ 106: [1, 352]
+ }, o($VR, [2, 208]), o($VR, [2, 210], {
+ 34: [1, 354]
+ }), o($V0, [2, 14]), o($Vy1, [2, 224]), o($VA1, [2, 104]), {
+ 32: [1, 355],
+ 49: $Vz1
+ }, {
+ 32: [1, 356],
+ 49: $Vz1
+ }, o($Vy1, [2, 239]), {
+ 32: [1, 357]
+ }, o($Vb2, [2, 236], {
+ 49: $Vz1
+ }), {
+ 19: 358,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO
+ }, o($VS, $VY, {
+ 136: 108,
+ 131: 109,
+ 120: $V9,
+ 121: $Va,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk
+ }), {
+ 30: [1, 359]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 304,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 106: [2, 247],
+ 109: 32,
+ 110: 31,
+ 115: 305,
+ 120: $V9,
+ 121: $Va,
+ 125: $V92,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 192: 362,
+ 200: 360,
+ 201: 361
+ }, o($Vc2, [2, 244]), o($Vc2, [2, 245]), o($Vy1, [2, 253]), o($VA1, [2, 91]), {
+ 23: [1, 363],
+ 49: $Vz1
+ }, o($VF1, [2, 87], {
+ 86: $VG1
+ }), {
+ 36: [1, 364]
+ }, {
+ 36: [2, 30],
+ 49: $Vz1
+ }, o($VH1, [2, 27]), o($VH1, [2, 33]), o($VH1, $V41, {
+ 30: [1, 365]
+ }), {
+ 32: [1, 366],
+ 49: [1, 367]
+ }, {
+ 32: [1, 368]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 32: [2, 46],
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: [1, 370],
+ 48: 369,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VJ1, [2, 85], {
+ 84: $VK1
+ }), o($VL1, [2, 83], {
+ 82: $VM1
+ }), o($VH1, [2, 23]), o($VN1, [2, 81], {
+ 80: $VO1
+ }), o($VP1, [2, 79], {
+ 78: $VQ1
+ }), o($Vw1, [2, 39]), o($VR1, [2, 77], {
+ 75: $VS1,
+ 76: $VT1
+ }), o($VV1, [2, 74], {
+ 70: $VW1,
+ 71: $VX1,
+ 72: $VY1,
+ 73: $VZ1
+ }), o($VV1, [2, 75], {
+ 70: $VW1,
+ 71: $VX1,
+ 72: $VY1,
+ 73: $VZ1
+ }), o($V_1, [2, 69], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V_1, [2, 70], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V_1, [2, 71], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V_1, [2, 72], {
+ 67: $V$1,
+ 68: $V02
+ }), o($V12, [2, 66], {
+ 57: $V22,
+ 58: $V32
+ }), o($V12, [2, 67], {
+ 57: $V22,
+ 58: $V32
+ }), o($V42, [2, 63], {
+ 62: $V52,
+ 63: $V62,
+ 64: $V72
+ }), o($V42, [2, 64], {
+ 62: $V52,
+ 63: $V62,
+ 64: $V72
+ }), o($VB1, [2, 59]), o($VB1, [2, 60]), o($VB1, [2, 61]), o($VR, [2, 128], {
+ 92: [1, 371]
+ }), {
+ 36: [1, 372]
+ }, o($VR, [2, 132]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 373,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 374,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VR, [2, 136], {
+ 92: [1, 375]
+ }), o($Vw1, [2, 145]), o($Vw1, [2, 147]), o($V21, [2, 203]), o($V82, [2, 207]), {
+ 19: 296,
+ 20: 81,
+ 21: $VM,
+ 25: $VN,
+ 26: $VO,
+ 175: 376
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 50: 202,
+ 51: $Vd1,
+ 55: 201,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 200,
+ 103: 377,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 176: 128,
+ 177: 379,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 190: 378,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, {
+ 170: $Vj1,
+ 178: 380
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $VQ,
+ 176: 128,
+ 179: 383,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 187: 381,
+ 188: 382,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, {
+ 92: [1, 384]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 385,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 32: [1, 386]
+ }, {
+ 106: [1, 387]
+ }, {
+ 106: [2, 246]
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 388,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 25]), o($VU1, [2, 49]), o($VH1, [2, 43]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 389,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VH1, [2, 44]), o($Vw1, [2, 47]), o($Va2, $V31, {
+ 32: [2, 45]
+ }), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 390,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VR, [2, 129], {
+ 92: [1, 391]
+ }), {
+ 36: [1, 392]
+ }, o($VR, [2, 137]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 393,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VR, [2, 209]), {
+ 36: [1, 394]
+ }, o($Vy1, [2, 233]), o($Vx1, [2, 235], {
+ 191: [1, 395]
+ }), o($Vy1, [2, 238]), o($Vy1, [2, 241]), o($Vy1, [2, 225]), o($Vy1, [2, 226]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 396,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, {
+ 32: [1, 397],
+ 49: $Vz1
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $VQ,
+ 176: 128,
+ 179: 383,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 187: 398,
+ 188: 382,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 399,
+ 32: [2, 248],
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($VA1, [2, 89]), o($Vw1, [2, 48]), o($VR, [2, 130]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 286,
+ 50: 202,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 109: 32,
+ 110: 31,
+ 124: 400,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK
+ }, o($Vw1, [2, 116]), o($VR, [2, 138]), o($VR, [2, 211]), {
+ 10: $V71,
+ 20: 168,
+ 21: $V6,
+ 25: $VN,
+ 26: $VO,
+ 27: 161,
+ 28: $V81,
+ 29: $V91,
+ 30: $Va1,
+ 31: 137,
+ 33: 155,
+ 37: 162,
+ 39: $Vb1,
+ 40: $Vc1,
+ 41: 173,
+ 42: 175,
+ 44: 177,
+ 45: 178,
+ 46: 180,
+ 47: $V7,
+ 48: 151,
+ 50: 159,
+ 51: $Vd1,
+ 55: 153,
+ 56: 158,
+ 57: $Ve1,
+ 58: $Vf1,
+ 59: $Vg1,
+ 60: $Vh1,
+ 61: 186,
+ 65: 185,
+ 66: 184,
+ 69: 183,
+ 74: 181,
+ 77: 179,
+ 79: 176,
+ 81: 174,
+ 83: 167,
+ 85: 160,
+ 87: 154,
+ 89: 152,
+ 104: 135,
+ 105: 150,
+ 106: $Vi1,
+ 107: 16,
+ 108: $V8,
+ 109: 32,
+ 110: 31,
+ 111: 23,
+ 112: 25,
+ 113: 26,
+ 115: 27,
+ 120: $V9,
+ 121: $Va,
+ 123: 24,
+ 125: $Vb,
+ 126: 30,
+ 127: 34,
+ 128: $Vc,
+ 131: 35,
+ 132: $Vd,
+ 133: $Ve,
+ 134: $Vf,
+ 135: $Vg,
+ 136: 33,
+ 137: $Vh,
+ 138: $Vi,
+ 139: $Vj,
+ 140: $Vk,
+ 141: 36,
+ 142: 51,
+ 143: 52,
+ 144: $Vl,
+ 145: $Vm,
+ 146: $Vn,
+ 147: $Vo,
+ 148: $Vp,
+ 149: $Vq,
+ 150: $Vr,
+ 151: $Vs,
+ 152: $Vt,
+ 153: $Vu,
+ 154: $Vv,
+ 155: $Vw,
+ 156: $Vx,
+ 157: $Vy,
+ 158: $Vz,
+ 159: $VA,
+ 160: $VB,
+ 161: $VC,
+ 162: $VD,
+ 163: $VE,
+ 164: $VF,
+ 165: $VG,
+ 166: $VH,
+ 167: $VI,
+ 168: $VJ,
+ 169: $VK,
+ 170: $Vj1,
+ 176: 128,
+ 177: 401,
+ 178: 125,
+ 179: 126,
+ 180: 129,
+ 181: 130,
+ 182: 131,
+ 183: 132,
+ 184: 133,
+ 185: 134,
+ 189: $Vk1,
+ 193: $Vl1,
+ 194: $Vm1,
+ 195: $Vn1,
+ 196: $Vo1,
+ 197: $Vp1,
+ 198: $Vq1,
+ 202: $Vr1,
+ 203: $Vs1,
+ 204: $Vt1,
+ 205: $Vu1,
+ 206: $Vv1
+ }, o($Vb2, [2, 237]), {
+ 106: [1, 402]
+ }, o($Vy1, [2, 243]), {
+ 32: [2, 249],
+ 49: $Vz1
+ }, o($VR, [2, 131]), o($Vy1, [2, 234]), o($Vy1, [2, 242])],
+ defaultActions: {
+ 5: [2, 1],
+ 200: [2, 105],
+ 362: [2, 246]
+ },
+ parseError: function parseError(str, hash) {
+ if (hash.recoverable) {
+ this.trace(str);
+ } else {
+ throw new Error(str);
+ }
+ },
+ parse: function parse(input) {
+ var self = this,
+ stack = [0],
+ tstack = [],
+ vstack = [null],
+ lstack = [],
+ table = this.table,
+ yytext = '',
+ yylineno = 0,
+ yyleng = 0,
+ recovering = 0,
+ TERROR = 2,
+ EOF = 1;
+ var args = lstack.slice.call(arguments, 1);
+ var lexer = Object.create(this.lexer);
+ var sharedState = {
+ yy: {}
+ };
+
+ for (var k in this.yy) {
+ if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+ sharedState.yy[k] = this.yy[k];
+ }
+ }
+
+ lexer.setInput(input, sharedState.yy);
+ sharedState.yy.lexer = lexer;
+ sharedState.yy.parser = this;
+
+ if (typeof lexer.yylloc == 'undefined') {
+ lexer.yylloc = {};
+ }
+
+ var yyloc = lexer.yylloc;
+ lstack.push(yyloc);
+ var ranges = lexer.options && lexer.options.ranges;
+
+ if (typeof sharedState.yy.parseError === 'function') {
+ this.parseError = sharedState.yy.parseError;
+ } else {
+ this.parseError = Object.getPrototypeOf(this).parseError;
+ }
+
+ function popStack(n) {
+ stack.length = stack.length - 2 * n;
+ vstack.length = vstack.length - n;
+ lstack.length = lstack.length - n;
+ }
+
+ function lex() {
+ var token;
+ token = lexer.lex() || EOF;
+
+ if (typeof token !== 'number') {
+ token = self.symbols_[token] || token;
+ }
+
+ return token;
+ }
+
+ var symbol,
+ preErrorSymbol,
+ state,
+ action,
+ a,
+ r,
+ yyval = {},
+ p,
+ len,
+ newState,
+ expected;
+
+ while (true) {
+ state = stack[stack.length - 1];
+
+ if (this.defaultActions[state]) {
+ action = this.defaultActions[state];
+ } else {
+ if (symbol === null || typeof symbol == 'undefined') {
+ symbol = lex();
+ }
+
+ action = table[state] && table[state][symbol];
+ }
+
+ if (typeof action === 'undefined' || !action.length || !action[0]) {
+ var errStr = '';
+ expected = [];
+
+ for (p in table[state]) {
+ if (this.terminals_[p] && p > TERROR) {
+ expected.push('\'' + this.terminals_[p] + '\'');
+ }
+ }
+
+ if (lexer.showPosition) {
+ errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+ } else {
+ errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+ }
+
+ this.parseError(errStr, {
+ text: lexer.match,
+ token: this.terminals_[symbol] || symbol,
+ line: lexer.yylineno,
+ loc: yyloc,
+ expected: expected
+ });
+ }
+
+ if (action[0] instanceof Array && action.length > 1) {
+ throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+ }
+
+ switch (action[0]) {
+ case 1:
+ stack.push(symbol);
+ vstack.push(lexer.yytext);
+ lstack.push(lexer.yylloc);
+ stack.push(action[1]);
+ symbol = null;
+
+ if (!preErrorSymbol) {
+ yyleng = lexer.yyleng;
+ yytext = lexer.yytext;
+ yylineno = lexer.yylineno;
+ yyloc = lexer.yylloc;
+
+ if (recovering > 0) {
+ recovering--;
+ }
+ } else {
+ symbol = preErrorSymbol;
+ preErrorSymbol = null;
+ }
+
+ break;
+
+ case 2:
+ len = this.productions_[action[1]][1];
+ yyval.$ = vstack[vstack.length - len];
+ yyval._$ = {
+ first_line: lstack[lstack.length - (len || 1)].first_line,
+ last_line: lstack[lstack.length - 1].last_line,
+ first_column: lstack[lstack.length - (len || 1)].first_column,
+ last_column: lstack[lstack.length - 1].last_column
+ };
+
+ if (ranges) {
+ yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
+ }
+
+ r = this.performAction.apply(yyval, [yytext, yyleng, yylineno, sharedState.yy, action[1], vstack, lstack].concat(args));
+
+ if (typeof r !== 'undefined') {
+ return r;
+ }
+
+ if (len) {
+ stack = stack.slice(0, -1 * len * 2);
+ vstack = vstack.slice(0, -1 * len);
+ lstack = lstack.slice(0, -1 * len);
+ }
+
+ stack.push(this.productions_[action[1]][0]);
+ vstack.push(yyval.$);
+ lstack.push(yyval._$);
+ newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+ stack.push(newState);
+ break;
+
+ case 3:
+ return true;
+ }
+ }
+
+ return true;
+ }
+ };
+
+ function Parser() {
+ this.yy = {};
+ }
+
+ Parser.prototype = parser;
+ parser.Parser = Parser;
+ return new Parser();
+ }();
+
+ if (typeof commonjsRequire !== 'undefined' && 'object' !== 'undefined') {
+ exports.parser = parser;
+ exports.Parser = parser.Parser;
+
+ exports.parse = function () {
+ return parser.parse.apply(parser, arguments);
+ };
+ }
+ /* generated by jison-lex 0.3.4 */
+
+
+ var lexer = function () {
+ var lexer = {
+ EOF: 1,
+ parseError: function parseError(str, hash) {
+ if (this.yy.parser) {
+ this.yy.parser.parseError(str, hash);
+ } else {
+ throw new Error(str);
+ }
+ },
+ // resets the lexer, sets new input
+ setInput: function setInput(input, yy) {
+ this.yy = yy || this.yy || {};
+ this._input = input;
+ this._more = this._backtrack = this.done = false;
+ this.yylineno = this.yyleng = 0;
+ this.yytext = this.matched = this.match = '';
+ this.conditionStack = ['INITIAL'];
+ this.yylloc = {
+ first_line: 1,
+ first_column: 0,
+ last_line: 1,
+ last_column: 0
+ };
+
+ if (this.options.ranges) {
+ this.yylloc.range = [0, 0];
+ }
+
+ this.offset = 0;
+ return this;
+ },
+ // consumes and returns one char from the input
+ input: function input() {
+ var ch = this._input[0];
+ this.yytext += ch;
+ this.yyleng++;
+ this.offset++;
+ this.match += ch;
+ this.matched += ch;
+ var lines = ch.match(/(?:\r\n?|\n).*/g);
+
+ if (lines) {
+ this.yylineno++;
+ this.yylloc.last_line++;
+ } else {
+ this.yylloc.last_column++;
+ }
+
+ if (this.options.ranges) {
+ this.yylloc.range[1]++;
+ }
+
+ this._input = this._input.slice(1);
+ return ch;
+ },
+ // unshifts one char (or a string) into the input
+ unput: function unput(ch) {
+ var len = ch.length;
+ var lines = ch.split(/(?:\r\n?|\n)/g);
+ this._input = ch + this._input;
+ this.yytext = this.yytext.substr(0, this.yytext.length - len); //this.yyleng -= len;
+
+ this.offset -= len;
+ var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+ this.match = this.match.substr(0, this.match.length - 1);
+ this.matched = this.matched.substr(0, this.matched.length - 1);
+
+ if (lines.length - 1) {
+ this.yylineno -= lines.length - 1;
+ }
+
+ var r = this.yylloc.range;
+ this.yylloc = {
+ first_line: this.yylloc.first_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.first_column,
+ last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len
+ };
+
+ if (this.options.ranges) {
+ this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+ }
+
+ this.yyleng = this.yytext.length;
+ return this;
+ },
+ // When called from action, caches matched text and appends it on next action
+ more: function more() {
+ this._more = true;
+ return this;
+ },
+ // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+ reject: function reject() {
+ if (this.options.backtrack_lexer) {
+ this._backtrack = true;
+ } else {
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+ text: "",
+ token: null,
+ line: this.yylineno
+ });
+ }
+
+ return this;
+ },
+ // retain first n characters of the match
+ less: function less(n) {
+ this.unput(this.match.slice(n));
+ },
+ // displays already matched input, i.e. for error messages
+ pastInput: function pastInput() {
+ var past = this.matched.substr(0, this.matched.length - this.match.length);
+ return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\n/g, "");
+ },
+ // displays upcoming input, i.e. for error messages
+ upcomingInput: function upcomingInput() {
+ var next = this.match;
+
+ if (next.length < 20) {
+ next += this._input.substr(0, 20 - next.length);
+ }
+
+ return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+ },
+ // displays the character position where the lexing error occurred, i.e. for error messages
+ showPosition: function showPosition() {
+ var pre = this.pastInput();
+ var c = new Array(pre.length + 1).join("-");
+ return pre + this.upcomingInput() + "\n" + c + "^";
+ },
+ // test the lexed token: return FALSE when not a match, otherwise return token
+ test_match: function test_match(match, indexed_rule) {
+ var token, lines, backup;
+
+ if (this.options.backtrack_lexer) {
+ // save context
+ backup = {
+ yylineno: this.yylineno,
+ yylloc: {
+ first_line: this.yylloc.first_line,
+ last_line: this.last_line,
+ first_column: this.yylloc.first_column,
+ last_column: this.yylloc.last_column
+ },
+ yytext: this.yytext,
+ match: this.match,
+ matches: this.matches,
+ matched: this.matched,
+ yyleng: this.yyleng,
+ offset: this.offset,
+ _more: this._more,
+ _input: this._input,
+ yy: this.yy,
+ conditionStack: this.conditionStack.slice(0),
+ done: this.done
+ };
+
+ if (this.options.ranges) {
+ backup.yylloc.range = this.yylloc.range.slice(0);
+ }
+ }
+
+ lines = match[0].match(/(?:\r\n?|\n).*/g);
+
+ if (lines) {
+ this.yylineno += lines.length;
+ }
+
+ this.yylloc = {
+ first_line: this.yylloc.last_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.last_column,
+ last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length
+ };
+ this.yytext += match[0];
+ this.match += match[0];
+ this.matches = match;
+ this.yyleng = this.yytext.length;
+
+ if (this.options.ranges) {
+ this.yylloc.range = [this.offset, this.offset += this.yyleng];
+ }
+
+ this._more = false;
+ this._backtrack = false;
+ this._input = this._input.slice(match[0].length);
+ this.matched += match[0];
+ token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+
+ if (this.done && this._input) {
+ this.done = false;
+ }
+
+ if (token) {
+ return token;
+ } else if (this._backtrack) {
+ // recover context
+ for (var k in backup) {
+ this[k] = backup[k];
+ }
+
+ return false; // rule action called reject() implying the next rule should be tested instead.
+ }
+
+ return false;
+ },
+ // return next match in input
+ next: function next() {
+ if (this.done) {
+ return this.EOF;
+ }
+
+ if (!this._input) {
+ this.done = true;
+ }
+
+ var token, match, tempMatch, index;
+
+ if (!this._more) {
+ this.yytext = '';
+ this.match = '';
+ }
+
+ var rules = this._currentRules();
+
+ for (var i = 0; i < rules.length; i++) {
+ tempMatch = this._input.match(this.rules[rules[i]]);
+
+ if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+ match = tempMatch;
+ index = i;
+
+ if (this.options.backtrack_lexer) {
+ token = this.test_match(tempMatch, rules[i]);
+
+ if (token !== false) {
+ return token;
+ } else if (this._backtrack) {
+ match = false;
+ continue; // rule action called reject() implying a rule MISmatch.
+ } else {
+ // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+ return false;
+ }
+ } else if (!this.options.flex) {
+ break;
+ }
+ }
+ }
+
+ if (match) {
+ token = this.test_match(match, rules[index]);
+
+ if (token !== false) {
+ return token;
+ } // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+
+
+ return false;
+ }
+
+ if (this._input === "") {
+ return this.EOF;
+ } else {
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+ text: "",
+ token: null,
+ line: this.yylineno
+ });
+ }
+ },
+ // return next match that has a token
+ lex: function lex() {
+ var r = this.next();
+
+ if (r) {
+ return r;
+ } else {
+ return this.lex();
+ }
+ },
+ // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+ begin: function begin(condition) {
+ this.conditionStack.push(condition);
+ },
+ // pop the previously active lexer condition state off the condition stack
+ popState: function popState() {
+ var n = this.conditionStack.length - 1;
+
+ if (n > 0) {
+ return this.conditionStack.pop();
+ } else {
+ return this.conditionStack[0];
+ }
+ },
+ // produce the lexer rule set which is active for the currently active lexer condition state
+ _currentRules: function _currentRules() {
+ if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+ return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+ } else {
+ return this.conditions["INITIAL"].rules;
+ }
+ },
+ // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+ topState: function topState(n) {
+ n = this.conditionStack.length - 1 - Math.abs(n || 0);
+
+ if (n >= 0) {
+ return this.conditionStack[n];
+ } else {
+ return "INITIAL";
+ }
+ },
+ // alias for begin(condition)
+ pushState: function pushState(condition) {
+ this.begin(condition);
+ },
+ // return the number of states currently on the stack
+ stateStackSize: function stateStackSize() {
+ return this.conditionStack.length;
+ },
+ options: {
+ "moduleName": ""
+ },
+ performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {
+ var YYSTATE = YY_START;
+
+ switch ($avoiding_name_collisions) {
+ case 0:
+ ;
+ break;
+
+ case 1:
+ break;
+
+ case 2:
+ this.begin('PP');
+ return 'VERSION';
+ break;
+
+ case 3:
+ this.begin('PP');
+ return 'EXTENSION';
+ break;
+
+ case 4:
+ /* Eat characters until the first digit is
+ * encountered
+ */
+ var ptr = 0;
+
+ while (yy_.yytext.slice(0, 1) < '0' || yy_.yytext.slice(0, 1) > '9') {
+ ptr++;
+ }
+ /* Subtract one from the line number because
+ * yy_.yylineno is zero-based instead of
+ * one-based.
+ */
+
+
+ yy_.yylineno = parseInt(yy_.yytext.slice(0, 1), 10) - 1;
+ yy_.yylloc.source = parseInt(yy_.yytext.slice(0), 10);
+ break;
+
+ case 5:
+ /* Eat characters until the first digit is
+ * encountered
+ */
+ var ptr = 0;
+
+ while (yy_.yytext.slice(0, 1) < '0' || yy_.yytext.slice(0, 1) > '9') {
+ ptr++;
+ }
+ /* Subtract one from the line number because
+ * yy_.yylineno is zero-based instead of
+ * one-based.
+ */
+
+
+ yy_.yylineno = parseInt(yy_.yytext.slice(0, 1), 10) - 1;
+ break;
+
+ case 6:
+ this.begin('PP');
+ return 'PRAGMA_DEBUG_ON';
+ break;
+
+ case 7:
+ this.begin('PP');
+ return 'PRAGMA_DEBUG_OFF';
+ break;
+
+ case 8:
+ this.begin('PP');
+ return 'PRAGMA_OPTIMIZE_ON';
+ break;
+
+ case 9:
+ this.begin('PP');
+ return 'PRAGMA_OPTIMIZE_OFF';
+ break;
+
+ case 10:
+ this.begin('PP');
+ return 'PRAGMA_INVARIANT_ALL';
+ break;
+
+ case 11:
+ this.begin('PRAGMA');
+ break;
+
+ case 12:
+ this.begin('INITIAL');
+ yy_.yylineno++;
+ yycolumn = 0;
+ break;
+
+ case 13:
+ break;
+
+ case 14:
+ break;
+
+ case 15:
+ break;
+
+ case 16:
+ return ":";
+ break;
+
+ case 17:
+ yylval.identifier = strdup(yy_.yytext);
+ return 'IDENTIFIER';
+ break;
+
+ case 18:
+ yylval.n = parseInt(yy_.yytext);
+ return 'INTCONSTANT';
+ break;
+
+ case 19:
+ this.begin('INITIAL');
+ yy_.yylineno++;
+ yycolumn = 0;
+ return 'EOL';
+ break;
+
+ case 20:
+ /*yy_.yylineno++; yycolumn = 0;*/
+ break;
+
+ case 21:
+ return 'ATTRIBUTE';
+ break;
+
+ case 22:
+ return 'CONST';
+ break;
+
+ case 23:
+ return 'BOOL';
+ break;
+
+ case 24:
+ return 'FLOAT';
+ break;
+
+ case 25:
+ return 'INT';
+ break;
+
+ case 26:
+ return 'BREAK';
+ break;
+
+ case 27:
+ return 'CONTINUE';
+ break;
+
+ case 28:
+ return 'DO';
+ break;
+
+ case 29:
+ return 'WHILE';
+ break;
+
+ case 30:
+ return 'ELSE';
+ break;
+
+ case 31:
+ return 'FOR';
+ break;
+
+ case 32:
+ return 'IF';
+ break;
+
+ case 33:
+ return 'DISCARD';
+ break;
+
+ case 34:
+ return 'RETURN';
+ break;
+
+ case 35:
+ return 'DEBUGGER';
+ break;
+
+ case 36:
+ return 'BVEC2';
+ break;
+
+ case 37:
+ return 'BVEC3';
+ break;
+
+ case 38:
+ return 'BVEC4';
+ break;
+
+ case 39:
+ return 'IVEC2';
+ break;
+
+ case 40:
+ return 'IVEC3';
+ break;
+
+ case 41:
+ return 'IVEC4';
+ break;
+
+ case 42:
+ return 'VEC2';
+ break;
+
+ case 43:
+ return 'VEC3';
+ break;
+
+ case 44:
+ return 'VEC4';
+ break;
+
+ case 45:
+ return 'MAT2X2';
+ break;
+
+ case 46:
+ return 'MAT3X3';
+ break;
+
+ case 47:
+ return 'MAT4X4';
+ break;
+
+ case 48:
+ return 'IN';
+ break;
+
+ case 49:
+ return 'OUT';
+ break;
+
+ case 50:
+ return 'INOUT';
+ break;
+
+ case 51:
+ return 'UNIFORM';
+ break;
+
+ case 52:
+ return 'VARYING';
+ break;
+
+ case 53:
+ return 'INVARIANT';
+ break;
+
+ case 54:
+ return 'FLAT';
+ break;
+
+ case 55:
+ return 'SMOOTH';
+ break;
+
+ case 56:
+ return 'SAMPLER1D';
+ break;
+
+ case 57:
+ return 'SAMPLER2D';
+ break;
+
+ case 58:
+ return 'SAMPLER3D';
+ break;
+
+ case 59:
+ return 'SAMPLERCUBE';
+ break;
+
+ case 60:
+ return 'SAMPLER1DSHADOW';
+ break;
+
+ case 61:
+ return 'SAMPLER2DSHADOW';
+ break;
+
+ case 62:
+ return 'STRUCT';
+ break;
+
+ case 63:
+ return 'VOID';
+ break;
+
+ case 64:
+ /*copy manually*/
+ break;
+
+ case 65:
+ return '++';
+ break;
+
+ case 66:
+ return '--';
+ break;
+
+ case 67:
+ return '<=';
+ break;
+
+ case 68:
+ return '>=';
+ break;
+
+ case 69:
+ return '==';
+ break;
+
+ case 70:
+ return '!=';
+ break;
+
+ case 71:
+ return '&&';
+ break;
+
+ case 72:
+ return '||';
+ break;
+
+ case 73:
+ return '^^';
+ break;
+
+ case 74:
+ return '<<';
+ break;
+
+ case 75:
+ return '>>';
+ break;
+
+ case 76:
+ return '*=';
+ break;
+
+ case 77:
+ return '/=';
+ break;
+
+ case 78:
+ return '+=';
+ break;
+
+ case 79:
+ return '%=';
+ break;
+
+ case 80:
+ return '<<=';
+ break;
+
+ case 81:
+ return '>>=';
+ break;
+
+ case 82:
+ return '&=';
+ break;
+
+ case 83:
+ return '^=';
+ break;
+
+ case 84:
+ return '|=';
+ break;
+
+ case 85:
+ return '-=';
+ break;
+
+ case 86:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 87:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 88:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 89:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 90:
+ this.yylval = parseFloat(yy_.yytext);
+ return 'FLOATCONSTANT';
+ break;
+
+ case 91:
+ this.yylval = parseInt(yy_.yytext + 2, 16);
+ return 'INTCONSTANT';
+ break;
+
+ case 92:
+ this.yylval = parseInt(yy_.yytext, 8);
+ return 'INTCONSTANT';
+ break;
+
+ case 93:
+ this.yylval = parseInt(yy_.yytext);
+ return 'INTCONSTANT';
+ break;
+
+ case 94:
+ this.yylval = 1;
+ return 'BOOLCONSTANT';
+ break;
+
+ case 95:
+ this.yylval = 0;
+ return 'BOOLCONSTANT';
+ break;
+
+ case 96:
+ return 'ASM';
+ break;
+
+ case 97:
+ return 'CLASS';
+ break;
+
+ case 98:
+ return 'UNION';
+ break;
+
+ case 99:
+ return 'ENUM';
+ break;
+
+ case 100:
+ return 'TYPEDEF';
+ break;
+
+ case 101:
+ return 'TEMPLATE';
+ break;
+
+ case 102:
+ return 'THIS';
+ break;
+
+ case 103:
+ return 'PACKED';
+ break;
+
+ case 104:
+ return 'GOTO';
+ break;
+
+ case 105:
+ return 'SWITCH';
+ break;
+
+ case 106:
+ return 'DEFAULT';
+ break;
+
+ case 107:
+ return 'INLINE';
+ break;
+
+ case 108:
+ return 'NOINLINE';
+ break;
+
+ case 109:
+ return 'VOLATILE';
+ break;
+
+ case 110:
+ return 'PUBLIC';
+ break;
+
+ case 111:
+ return 'STATIC';
+ break;
+
+ case 112:
+ return 'EXTERN';
+ break;
+
+ case 113:
+ return 'EXTERNAL';
+ break;
+
+ case 114:
+ return 'INTERFACE';
+ break;
+
+ case 115:
+ return 'LONG';
+ break;
+
+ case 116:
+ return 'SHORT';
+ break;
+
+ case 117:
+ return 'DOUBLE';
+ break;
+
+ case 118:
+ return 'HALF';
+ break;
+
+ case 119:
+ return 'FIXED';
+ break;
+
+ case 120:
+ return 'UNSIGNED';
+ break;
+
+ case 121:
+ return 'INPUT';
+ break;
+
+ case 122:
+ return 'OUTPUT';
+ break;
+
+ case 123:
+ return 'HVEC2';
+ break;
+
+ case 124:
+ return 'HVEC3';
+ break;
+
+ case 125:
+ return 'HVEC4';
+ break;
+
+ case 126:
+ return 'DVEC2';
+ break;
+
+ case 127:
+ return 'DVEC3';
+ break;
+
+ case 128:
+ return 'DVEC4';
+ break;
+
+ case 129:
+ return 'FVEC2';
+ break;
+
+ case 130:
+ return 'FVEC3';
+ break;
+
+ case 131:
+ return 'FVEC4';
+ break;
+
+ case 132:
+ return 'SAMPLER2DRECT';
+ break;
+
+ case 133:
+ return 'SAMPLER3DRECT';
+ break;
+
+ case 134:
+ return 'SAMPLER2DRECTSHADOW';
+ break;
+
+ case 135:
+ return 'SIZEOF';
+ break;
+
+ case 136:
+ return 'CAST';
+ break;
+
+ case 137:
+ return 'NAMESPACE';
+ break;
+
+ case 138:
+ return 'USING';
+ break;
+
+ case 139:
+ return 'LOWP';
+ break;
+
+ case 140:
+ return 'MEDIUMP';
+ break;
+
+ case 141:
+ return 'HIGHP';
+ break;
+
+ case 142:
+ return 'PRECISION';
+ break;
+
+ case 143:
+ yy.yylval = yy_.yytext;
+ return yy.state.classify_identifier(yy.state, yy_.yytext);
+ break;
+
+ case 144:
+ return yy_.yytext;
+ break;
+
+ case 145:
+ return 'EOF';
+ break;
+ }
+ },
+ rules: [/^(?:[ \r\t]+)/, /^(?:[ \t]*#[ \t]*$)/, /^(?:[ \t]*#[ \t]*version\b)/, /^(?:[ \t]*#[ \t]*extension\b)/, /^(?:(^([ \t]*)([ \t]*))line([ \t]+)((([1-9][0-9]*)|([xX][0-9a-fA-F]+)|([0-7]*)))([ \t]+)((([1-9][0-9]*)|([xX][0-9a-fA-F]+)|([0-7]*)))([ \t]*)$)/, /^(?:(^([ \t]*)([ \t]*))line([ \t]+)((([1-9][0-9]*)|([xX][0-9a-fA-F]+)|([0-7]*)))([ \t]*)$)/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)debug([ \t]*)\(([ \t]*)on([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)debug([ \t]*)\(([ \t]*)off([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)optimize([ \t]*)\(([ \t]*)on([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)optimize([ \t]*)\(([ \t]*)off([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)STDGL([ \t]+)invariant([ \t]*)\(([ \t]*)all([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+))/, /^(?:[\n])/, /^(?:.)/, /^(?:\/\/[^\n]*)/, /^(?:[ \t\r]*)/, /^(?::)/, /^(?:[_a-zA-Z][_a-zA-Z0-9]*)/, /^(?:[1-9][0-9]*)/, /^(?:[\n])/, /^(?:[\n])/, /^(?:attribute\b)/, /^(?:const\b)/, /^(?:bool\b)/, /^(?:float\b)/, /^(?:int\b)/, /^(?:break\b)/, /^(?:continue\b)/, /^(?:do\b)/, /^(?:while\b)/, /^(?:else\b)/, /^(?:for\b)/, /^(?:if\b)/, /^(?:discard\b)/, /^(?:return\b)/, /^(?:debugger\b)/, /^(?:bvec2\b)/, /^(?:bvec3\b)/, /^(?:bvec4\b)/, /^(?:ivec2\b)/, /^(?:ivec3\b)/, /^(?:ivec4\b)/, /^(?:vec2\b)/, /^(?:vec3\b)/, /^(?:vec4\b)/, /^(?:mat2\b)/, /^(?:mat3\b)/, /^(?:mat4\b)/, /^(?:in\b)/, /^(?:out\b)/, /^(?:inout\b)/, /^(?:uniform\b)/, /^(?:varying\b)/, /^(?:invariant\b)/, /^(?:flat\b)/, /^(?:smooth\b)/, /^(?:sampler1D\b)/, /^(?:sampler2D\b)/, /^(?:sampler3D\b)/, /^(?:samplerCube\b)/, /^(?:sampler1DShadow\b)/, /^(?:sampler2DShadow\b)/, /^(?:struct\b)/, /^(?:void\b)/, /^(?:layout\b)/, /^(?:\+\+)/, /^(?:--)/, /^(?:<=)/, /^(?:>=)/, /^(?:==)/, /^(?:!=)/, /^(?:&&)/, /^(?:\|\|)/, /^(?:\^\^)/, /^(?:<<)/, /^(?:>>)/, /^(?:\*=)/, /^(?:\/=)/, /^(?:\+=)/, /^(?:%=)/, /^(?:<<=)/, /^(?:>>=)/, /^(?:&=)/, /^(?:\^=)/, /^(?:\|=)/, /^(?:-=)/, /^(?:[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]?)/, /^(?:\.[0-9]+([eE][+-]?[0-9]+)?[fF]?)/, /^(?:[0-9]+\.([eE][+-]?[0-9]+)?[fF]?)/, /^(?:[0-9]+[eE][+-]?[0-9]+[fF]?)/, /^(?:[0-9]+[fF])/, /^(?:0[xX][0-9a-fA-F]+)/, /^(?:0[0-7]*)/, /^(?:[1-9][0-9]*)/, /^(?:true\b)/, /^(?:false\b)/, /^(?:asm\b)/, /^(?:class\b)/, /^(?:union\b)/, /^(?:enum\b)/, /^(?:typedef\b)/, /^(?:template\b)/, /^(?:this\b)/, /^(?:packed\b)/, /^(?:goto\b)/, /^(?:switch\b)/, /^(?:default\b)/, /^(?:inline\b)/, /^(?:noinline\b)/, /^(?:volatile\b)/, /^(?:public\b)/, /^(?:static\b)/, /^(?:extern\b)/, /^(?:external\b)/, /^(?:interface\b)/, /^(?:long\b)/, /^(?:short\b)/, /^(?:double\b)/, /^(?:half\b)/, /^(?:fixed\b)/, /^(?:unsigned\b)/, /^(?:input\b)/, /^(?:output\b)/, /^(?:hvec2\b)/, /^(?:hvec3\b)/, /^(?:hvec4\b)/, /^(?:dvec2\b)/, /^(?:dvec3\b)/, /^(?:dvec4\b)/, /^(?:fvec2\b)/, /^(?:fvec3\b)/, /^(?:fvec4\b)/, /^(?:sampler2DRect\b)/, /^(?:sampler3DRect\b)/, /^(?:sampler2DRectShadow\b)/, /^(?:sizeof\b)/, /^(?:cast\b)/, /^(?:namespace\b)/, /^(?:using\b)/, /^(?:lowp\b)/, /^(?:mediump\b)/, /^(?:highp\b)/, /^(?:precision\b)/, /^(?:[_a-zA-Z][_a-zA-Z0-9]*)/, /^(?:.)/, /^(?:$)/],
+ conditions: {
+ "PRAGMA": {
+ "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145],
+ "inclusive": true
+ },
+ "PP": {
+ "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145],
+ "inclusive": true
+ },
+ "INITIAL": {
+ "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145],
+ "inclusive": true
+ }
+ }
+ };
+ return lexer;
+ }();
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * GLSL Parser Class
+ */
+
+
+ function GlslParser() {
+ //Jison Global
+ this.jison = parser;
+ this.jison.lexer = lexer;
+ }
+
+ var proto = GlslParser.prototype;
+ /**
+ * Parse Program
+ */
+
+ proto.parse = function (state) {
+ var result;
+ this.jison.yy = {
+ test: 1,
+ state: state
+ };
+
+ try {
+ this.jison.parse(state.getTranslationUnit());
+ } catch (e) {
+ state.addError(e.message, e.lineNumber, e.columnNumber);
+ return false;
+ }
+
+ return true;
+ };
+
+ glsl.parser = new GlslParser();
+ /**
+ * External Parse
+ *
+ * @param string src Source code
+ * @param object options Compilation options
+ *
+ * @return object
+ */
+
+ glsl.parse = function (src, options) {
+ var state, result, irs;
+ state = new GlslState(options);
+ state.setSource(src); //Preprocess
+
+ result = this.preprocessor.process(state); //Parse into AST
+
+ if (result) {
+ result = this.parser.parse(state);
+ }
+
+ if (result) {
+ state.status = true;
+ }
+
+ return state;
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * Constructs a program's object code from an ast and symbol table
+ *
+ * @param string The error message
+ * @param AstNode The error AstNode
+ *
+ * @return string
+ */
+
+
+ glsl.generate = function (state) {
+ var irs, ast, i, main;
+ irs = new Ir(state.options.target);
+ ast = state.getAst();
+
+ try {
+ for (i = 0; i < ast.length; i++) {
+ ast[i].ir(state, irs);
+ }
+
+ main = state.symbols.get_function('main'); //Accept main, but warn if params not void
+
+ if (main.definition.join(",") !== "void") {
+ state.addWarning("main() should take no parameters");
+ }
+
+ state.symbols.add_variable("", irs.getTemp(main.getType().slots));
+
+ if (main.type != 'void') {
+ state.addWarning("main() should be type void");
+ }
+
+ if (!main) {
+ state.addError("main() is not defined");
+ return false;
+ }
+
+ main.Ast.body.ir(state, irs);
+ } catch (e) {
+ if (!e.ir) {
+ e.message = "compiler error: " + e.message;
+ }
+
+ state.addError(e.message, e.lineNumber, e.columnNumber);
+ return false;
+ }
+
+ state.setIR(irs);
+ return true;
+ };
+ /**
+ * Constructs an error message
+ *
+ * @param string The error message
+ * @param AstNode The error AstNode
+ *
+ * @return string
+ */
+
+
+ AstNode.prototype.ir_error = function (message) {
+ var e = new IrError();
+
+ if (this.location) {
+ e.lineNumber = this.location.first_line;
+ e.columnNumber = this.location.first_column;
+ e.message = message;
+ }
+
+ throw e;
+ };
+ /**
+ * Default IR
+ */
+
+
+ AstNode.prototype.irx = function (state, irs) {
+ this.ir_error(util.format("Can't generate ir for %s", this.typeOf()));
+ };
+ /**
+ * Constructs a type specifier code block
+ *
+ * @param object state parser state
+ */
+
+
+ AstTypeSpecifier.prototype.ir = function (state, irs) {
+ if (this.is_precision_statement) {
+ return;
+ } // this.ir_error("Cannot generate type specifier");
+
+ };
+ /**
+ * Constructs a declaration list
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstDeclaratorList.prototype.ir = function (state, irs) {
+ var i;
+
+ for (i = 0; i < this.declarations.length; i++) {
+ this.declarations[i].ir(state, irs, this.type);
+ }
+ };
+ /**
+ * Constructs a declaration
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstDeclaration.prototype.ir = function (state, irs, type) {
+ var qualifier, name, entry, constant, assign, lhs, size;
+
+ if (type.qualifier) {
+ qualifier = type.qualifier;
+ }
+
+ name = this.identifier; //add symbol table entry
+
+ entry = state.symbols.add_variable(name);
+ entry.type = type.specifier.type_name;
+ entry.qualifier = qualifier;
+
+ if (qualifier.indexOf('uniform') !== -1) {
+ entry.out = irs.getUniform(entry);
+ } else if (qualifier.indexOf('attribute') !== -1) {
+ entry.out = irs.getAttribute(entry);
+ } else if (qualifier.indexOf('varying') !== -1) {
+ entry.out = irs.getVarying(entry);
+ } else {
+ entry.out = irs.getTemp(entry.getType().slots);
+ }
+
+ constant = qualifier === 'const';
+
+ if (this.is_array) {
+ this.array_size.ir(state, irs);
+
+ if (this.array_size.Type != 'int') {
+ this.ir_error("array size must be an integer");
+ }
+
+ if (!this.array_size.Const) {
+ this.ir_error("array size must be constant");
+ }
+
+ size = parseInt(this.array_size.Dest);
+
+ if (size < 1) {
+ this.ir_error("array size cannot be less than 1");
+ }
+
+ entry.size = size; //Change the type of the entry so that expressions without indexing will fail
+
+ entry.base_type = entry.type;
+ entry.type += '[]';
+ }
+
+ if (this.initializer) {
+ //@todo: generate constants at compile time (this may be able to be taken care of in the generator)
+ if (constant) {//entry.constant = this.initializer.Dest;
+ } else {
+ lhs = new AstExpression('ident');
+ lhs.primary_expression.identifier = name;
+ assign = new AstExpression('=', lhs, this.initializer);
+ assign.setLocation(this.location);
+ assign.ir(state, irs);
+ }
+ } else {
+ if (constant) {
+ this.ir_error("Declaring const without initialier");
+ }
+ }
+ };
+ /**
+ * Constructs a function definition block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstFunctionDefinition.prototype.ir = function (state, irs) {
+ //handle function proto
+ this.proto_type.ir(state, irs);
+ this.proto_type.entry.Ast = this;
+ };
+ /**
+ * Constructs a function header code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstFunction.prototype.ir = function (state, irs) {
+ var i;
+
+ if (this.parameters.length == 0) {
+ this.entry.definition.push('void');
+ } //generate param list
+
+
+ for (i = 0; i < this.parameters.length; i++) {
+ this.entry.definition.push(this.parameters[i].type.specifier.type_name);
+ }
+ };
+ /**
+ * Constructs a compound statement code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstCompoundStatement.prototype.ir = function (state, irs) {
+ var i, stmt, retd_entry, maybe_returned;
+ retd_entry = state.symbols.get_variable("");
+ maybe_returned = false;
+
+ for (i = 0; i < this.statements.length; i++) {
+ stmt = this.statements[i];
+ stmt.ir(state, irs);
+
+ if (stmt instanceof AstJumpStatement && stmt.mode == 'return') {
+ //Returning from block, set return status, and skip following instructions in block (unreachable)
+ retd_entry.Passed = true;
+ irs.push(new IrInstruction("MOV", retd_entry.out + ".x", "1.0"));
+ break;
+ }
+
+ if (!maybe_returned && retd_entry.Passed) {
+ maybe_returned = true;
+ irs.push(new IrInstruction("IF", retd_entry.out + ".x"));
+ }
+ }
+
+ if (maybe_returned) {
+ irs.push(new IrInstruction("ENDIF"));
+ }
+ };
+ /**
+ * Constructs an expression statement code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpressionStatement.prototype.ir = function (state, irs) {
+ this.expression.ir(state, irs);
+ };
+ /**
+ * Constructs an expression code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir = function (state, irs) {
+ var i; //simple (variable, or value)
+
+ for (i in this.primary_expression) {
+ return this.ir_simple(state, irs);
+ } //operator
+
+
+ if (this.oper) {
+ return this.ir_op(state, irs);
+ } //cast
+
+
+ if (this.constructor.name == 'AstTypeSpecifier') {
+ this.Type = this.type_specifier;
+ return;
+ }
+
+ this.ir_error("Could not translate unknown expression type");
+ };
+ /**
+ * Constructs an operator expression code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_op = function (state, irs) {
+ var se, temp, ops;
+
+ if (se = this.subexpressions) {
+ se[0] ? se[0].ir(state, irs) : null;
+ se[1] ? se[1].ir(state, irs) : null;
+ se[2] ? se[2].ir(state, irs) : null;
+ }
+
+ switch (this.oper) {
+ //case '+=':
+ case '=':
+ this.ir_assign(state, irs);
+ break;
+
+ case 'POS':
+ //useless
+ this.Dest = se[0].Dest;
+ this.Type = se[0].Type;
+ break;
+
+ case 'NEG':
+ if (se[0].Dest.substring(0, 1) != '-') {
+ this.Dest = "-" + se[0].Dest;
+ } else {
+ this.Dest = se[0].Dest.substring(1);
+ }
+
+ this.Type = se[0].Type;
+
+ if (se[0].Const) {
+ this.Const = se[0].Const;
+ }
+
+ break;
+ //Arithmetic
+
+ case '+':
+ case '-':
+ case '*':
+ case '/':
+ case '%':
+ case '&':
+ case '^':
+ case '|':
+ case '~':
+ case '<<':
+ case '>>':
+ this.ir_generate(state, irs, 2, true);
+ break;
+ //Boolean
+
+ case '<':
+ case '>':
+ case '<=':
+ case '>=':
+ case '==':
+ case '!=':
+ case '&&':
+ case '^^':
+ case '||':
+ this.ir_generate(state, irs, 2);
+ break;
+
+ case '!':
+ this.ir_generate(state, irs, 1);
+ break;
+
+ /*
+ case '*=':
+ case '/=':
+ case '%=':
+ case '+=':
+ case '-=':
+ case '<<=':
+ case '>>=':
+ case '&=':
+ case '^=':
+ case '|=':
+ break;
+ case '?:':
+ break;
+ */
+ //Increment / Decrement
+
+ case '++x':
+ case '--x':
+ case 'x++':
+ case 'x--':
+ this.ir_incdec(state, irs);
+ break;
+ //case '.': break;
+
+ case '[]':
+ this.ir_arr_index(state, irs);
+ break;
+
+ /*
+ case 'VAR':
+ case 'int':
+ case 'float':
+ case 'bool':
+ ir_expression_simple(e, se);
+ break;
+ */
+
+ default:
+ this.ir_error(util.format("Could not translate unknown expression %s (%s)", this, this.oper));
+ }
+ };
+ /**
+ * Constructs an assignment expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_assign = function (state, irs, skip_comment
+ /*, local*/
+ ) {
+ var cond, ir, temp, size, slots, swz, i, entry, lhs, rhs, com;
+ lhs = this.subexpressions[0];
+ rhs = this.subexpressions[1];
+
+ if (lhs.Type != rhs.Type || rhs.Const) {
+ this.ir_cast.apply(rhs, [state, irs, lhs.Type]);
+ }
+
+ this.Type = lhs.Type;
+
+ if (lhs.Entry && lhs.Entry.constant) {
+ this.ir_error(util.format("Cannot assign value to constant %s", lhs.Dest));
+ }
+
+ if (!skip_comment) {
+ com = util.format("%s => %s %s <%s>", rhs.Dest, lhs.Type, lhs.Dest, lhs.toString());
+ irs.push(new IrComment(com, this.location));
+ }
+
+ size = types[this.Type].size;
+ slots = types[this.Type].slots; //get the swizzle for each slot
+
+ swz = Ir.swizzles[0].substring(0, 4 - (slots * 4 - size) / slots); //all components are used up in all slots
+
+ if (swz == Ir.swizzles[0]) {
+ swz = "";
+ }
+
+ for (i = 0; i < slots; i++) {
+ /*
+ if (cond && !local) {
+ ir = new IR('CMP', se[0].Dest, "-" + cond, se[1].Dest, se[0].Dest);
+ ir.addOffset(i);
+ ir.setSwizzle(swz);
+ irs.push(ir);
+ } else {
+ */
+ ir = new IrInstruction('MOV', lhs.Dest, rhs.Dest);
+ ir.addOffset(i);
+ ir.setSwizzle(swz);
+ irs.push(ir);
+ /*
+ }
+ */
+ }
+ };
+ /**
+ * Constructs a cast operation
+ */
+
+
+ AstExpression.prototype.ir_cast = function (state, irs, type) {
+ //Can cast to type?
+ if (Type.canCast(this.Type, type)) {
+ //Simple case, constant
+ if (this.Const) {
+ this.Dest = Type.castTo(this.Dest, this.Type, type);
+ this.Type = type;
+ } else {
+ //@todo: generate cast instructions
+ this.ir_error(util.format("Could not assign value of type %s to %s", this.Type, type));
+ }
+ } else {
+ this.ir_error(util.format("Could not assign value of type %s to %s", this.Type, type));
+ }
+ };
+ /**
+ * Constructs a simple expression code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_simple = function (state, irs) {
+ var name, entry, t;
+
+ if (this.oper == '.') {
+ this.ir_field(state, irs);
+ return;
+ } //identifier
+
+
+ if (name = this.primary_expression.identifier) {
+ //lookup identifier in symbol table
+ entry = state.symbols.get_variable(name) || state.symbols.get_function(name);
+
+ if (!entry
+ /*|| !entry.type*/
+ ) {
+ this.ir_error(util.format("%s is undefined", name));
+ }
+
+ this.Type = entry.type;
+ this.Entry = entry;
+
+ if (entry.constant) {
+ this.Dest = entry.constant;
+ } else {
+ this.Dest = entry.out;
+ }
+
+ return;
+ } //float constant
+
+
+ if (this.primary_expression.type == 'float') {
+ this.Type = 'float';
+ this.Dest = this.primary_expression.float_constant;
+ this.Const = true;
+ return;
+ } //int constant
+
+
+ if (this.primary_expression.type == 'int') {
+ this.Type = 'int';
+ this.Dest = this.primary_expression.int_constant;
+ this.Const = true;
+ return;
+ }
+
+ this.ir_error("Cannot translate unknown simple expression type");
+ };
+ /**
+ * Constructs the code for an expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_generate = function (state, irs, len, arith) {
+ var table, se, oprd_types, dest, i, j, def, match, comment, cnst;
+
+ if (!(table = builtin.oper[this.oper])) {
+ this.ir_error(util.format("Could not generate operation %s", this.oper));
+ }
+
+ se = this.subexpressions; //Fold constants
+
+ if (state.options.opt.fold_constants && arith) {
+ if (se[0].Const && se[1].Const) {
+ cnst = eval(se[0].Dest + this.oper + se[1].Dest); //If the calculation results in an error, resume normal IR generation and let it be handled at runtime
+
+ if (Number.isFinite(cnst)) {
+ this.Dest = "" + cnst;
+ this.Type = 'float';
+ this.Const = true;
+ return;
+ }
+ }
+ }
+
+ oprd_types = [];
+ dest = [];
+
+ for (i = 0; i < len; i++) {
+ oprd_types.push(se[i].Type);
+ dest.push(se[i].Dest);
+ }
+
+ def = new RegExp(oprd_types.join(",") + "\:(.*)");
+
+ for (j in table) {
+ if (match = j.match(def)) {
+ break;
+ }
+ }
+
+ if (!match) {
+ this.ir_error(util.format("Could not apply operation %s to %s", this.oper, oprd_types.join(", ")));
+ }
+
+ this.Type = match[1];
+ this.Dest = irs.getTemp(types[this.Type].slots);
+ dest.splice(0, 0, this.Dest);
+
+ if (len <= 4) {//this.Dest += util.format(".%s", swizzles[0].substring(0, glsl.type.size[this.Type]));
+ }
+
+ if (len == 1) {
+ comment = util.format("(%s %s %s) => %s %s", this.oper, se[0].Type, se[0].Dest, this.Type, this.Dest);
+ } else if (len == 2) {
+ comment = util.format("(%s %s %s %s %s) => %s %s", se[0].Type, se[0].Dest, this.oper, se[1].Type, se[1].Dest, this.Type, this.Dest);
+ } else if (len == 3) {
+ comment = util.format("(%s %s ? %s %s : %s %s) => %s %s", se[0].Type, se[0].Dest, se[1].Type, se[1].Dest, se[2].Type, se[2].Dest, this.Type, this.Dest);
+ }
+
+ irs.push(new IrComment(comment, this.location));
+ irs.build(table[j], dest);
+ };
+ /**
+ * Constructs an pre/post increment/decrement expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_incdec = function (state, irs) {
+ var se, op, ins, post, type, i, ir;
+ se = this.subexpressions[0];
+ op = this.oper.replace('x', '');
+ ins = op === '++' ? 'ADD' : 'SUB';
+ post = this.oper.indexOf('x') === 0;
+ type = types[se.Type]; //Type check: base type must be int or float
+
+ if (type.base != 'int' && type.base != 'float') {
+ this.ir_error(util.format("Could not apply operation %s to %s", op, se.Type));
+ }
+
+ this.Type = se.Type;
+
+ if (post) {
+ //For post increment, the returned happens before the increment, so we need a temp to store it
+ this.Dest = irs.getTemp(type.slots);
+ } else {
+ this.Dest = se.Dest;
+ }
+
+ irs.push(new IrComment(util.format("(%s%s) => %s %s", post ? se.Dest : op, post ? op : se.Dest, this.Type, this.Dest), this.location));
+
+ for (i = 0; i < type.slots; i++) {
+ if (post) {
+ this.Dest = irs.getTemp(type.slots);
+ ir = new IrInstruction('MOV', this.Dest, se.Dest);
+ ir.addOffset(i);
+ ir.setSwizzle(type.swizzle);
+ irs.push(ir);
+ }
+
+ ir = new IrInstruction(ins, se.Dest, se.Dest, "1.0");
+ ir.addOffset(i);
+ ir.setSwizzle(type.swizzle);
+ irs.push(ir);
+ }
+ };
+ /**
+ * Constructs an array index expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_arr_index = function (state, irs) {
+ var arr, idx, entry, size, cnst, oprd;
+ arr = this.subexpressions[0];
+ idx = this.subexpressions[1];
+ entry = arr.Entry; //Ensure array index is integer
+
+ if (idx.Type != 'int') {
+ this.ir_error("array index out of bounds");
+ } //@todo: Need to implement array indexing syntax for vector components
+
+
+ if (!entry.size) {
+ this.ir_error("cannot index a non-array value");
+ } //@todo: Need to implement array indexing for matrices
+
+
+ if (types[entry.base_type].slots > 1) {
+ this.ir_error("array indexing for matrices not implemented yet");
+ }
+
+ this.Type = entry.base_type; //If constant index, we can do some additional error checking
+
+ if (idx.Const) {
+ cnst = parseInt(idx.Dest);
+
+ if (cnst < 0 || cnst >= entry.size) {
+ this.ir_error("array index out of bounds");
+ }
+
+ oprd = new IrOperand(arr.Dest);
+ oprd.index = cnst;
+ this.Dest = oprd.toString();
+ } else {
+ //@todo: variable indexing is permitted by spec, but behavior is undefined for out of bounds
+ this.ir_error("variable indexing not implemented yet");
+ }
+ };
+ /**
+ * Constructs a function expression
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstFunctionExpression.prototype.ir = function (state, irs) {
+ var i, e, name, entry, ret_entry, retd_entry, call_types, operands, param, proto, loc;
+
+ if (this.cons) {
+ return this.ir_constructor(state, irs);
+ }
+
+ name = this.subexpressions[0].primary_expression.identifier;
+ operands = [];
+ call_types = [];
+
+ for (i = 0; i < this.expressions.length; i++) {
+ e = this.expressions[i];
+ e.ir(state, irs);
+ call_types.push(e.Type);
+ operands.push(e.Dest);
+ }
+
+ entry = state.symbols.get_function(name, call_types);
+
+ if (!entry) {
+ this.ir_error(util.format("Function %s(%s) is not defined", name, call_types.join(", ")));
+ }
+
+ this.Type = entry.type;
+ this.Dest = irs.getTemp(entry.getType().slots);
+ irs.push(new IrComment(util.format("%s(%s) => %s %s", name, operands.join(", "), this.Type, this.Dest), this.location));
+
+ if (entry.code) {
+ //Use function template
+ operands.unshift(this.Dest);
+ irs.build(entry.code, operands);
+ } else if (entry.Ast) {
+ //Rebuild inline function from AST
+ state.symbols.push_scope(); //Enter vars into local symbol table
+
+ proto = entry.Ast.proto_type;
+
+ for (i = 0; i < proto.parameters.length; i++) {
+ param = proto.parameters[i];
+ loc = state.symbols.add_variable(param.identifier, param.type.specifier.type_name);
+ loc.out = irs.getTemp(loc.getType().slots); //Add MOV operation from called param to local param
+
+ irs.push(new IrComment(util.format("PARAM %s => %s %s", operands[i], loc.out, param.type.specifier.type_name), param.location)); //Piggy-back off assignment generation
+
+ lhs = new AstExpression('');
+ lhs.setLocation(this.getLocation());
+ lhs.Type = loc.type;
+ lhs.Dest = loc.out;
+ assign = new AstExpression('=', lhs, this.expressions[i]);
+ assign.setLocation(this.getLocation());
+ assign.ir_assign(state, irs, true);
+ } //Create a return entry for the new call scope
+
+
+ ret_entry = state.symbols.add_variable("", this.Type);
+ ret_entry.out = this.Dest;
+ retd_entry = state.symbols.add_variable("", "bool");
+ retd_entry.out = irs.getTemp(retd_entry.getType().slots);
+ entry.Ast.body.ir(state, irs);
+ state.symbols.pop_scope();
+ }
+ };
+ /**
+ * Constructs a type constructor
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstFunctionExpression.prototype.ir_constructor = function (state, irs) {
+ var type, comment_text, comment, i, expr, src_expr, src_i, src_c, oprd, dest;
+ type = this.subexpressions[0].type_specifier;
+ this.Type = type.name;
+ this.Dest = irs.getTemp(type.slots);
+ comment_text = [];
+ comment = new IrComment("", this.location);
+ irs.push(comment); //Prepare components
+
+ for (i = 0; i < this.expressions.length; i++) {
+ expr = this.expressions[i];
+
+ if (expr) {
+ expr.ir(state, irs);
+ comment_text.push(expr.Dest);
+ }
+ }
+
+ src_expr = this.expressions[0];
+ src_i = 0; //Source expression index
+
+ src_c = 0; //Component of source expression
+
+ for (dest_i = 0; dest_i < type.size; dest_i++) {
+ if (!src_expr) {
+ this.ir_error("Not enough parameters to constructor");
+ } //@todo: need to add support for > vec4
+
+
+ if (types[src_expr.Type].size > 4) {
+ this.ir_error("Matrix components not implemented yet");
+ } //compute destination
+
+
+ dest = util.format("%s.%s", this.Dest, Ir.swizzles[0][dest_i]); //compute source
+
+ oprd = new IrOperand(src_expr.Dest);
+
+ if (!oprd.swizzle) {
+ oprd.swizzle = Ir.swizzles[0][src_c];
+ }
+
+ irs.push(new IrInstruction('MOV', dest, oprd.toString()));
+ src_c++; //Get next source component expression
+
+ if (src_c >= types[src_expr.Type].size) {
+ if (this.expressions[src_i + 1]) {
+ src_i++;
+ src_expr = this.expressions[src_i];
+ src_c = 0;
+ }
+ }
+ }
+
+ comment.comment = util.format("%s(%s) => %s %s", this.Type, comment_text.join(", "), this.Type, this.Dest);
+ };
+ /**
+ * Constructs a field selection code block
+ *
+ * @param object state GLSL state
+ * @param object irs IR representation
+ */
+
+
+ AstExpression.prototype.ir_field = function (state, irs) {
+ var field, swz, base, se; //pick swizzle set
+
+ field = this.primary_expression.identifier;
+ se = this.subexpressions[0];
+ se.ir(state, irs);
+
+ if (Ir.isSwizzle(field)) {
+ base = types[se.Type].base;
+
+ if (field.length > 1) {
+ if (base == 'int') {
+ base = 'ivec' + field.length;
+ }
+
+ if (base == 'bool') {
+ base = 'bvec' + field.length;
+ }
+
+ if (base == 'float') {
+ base = 'vec' + field.length;
+ }
+ }
+
+ this.Type = base;
+
+ if (field.length > 4 || !this.Type) {
+ this.ir_error(util.format("Invalid field selection %s.%s", se, field));
+ }
+
+ this.Dest = util.format("%s.%s", se.Dest, Ir.normalizeSwizzle(field));
+ }
+ };
+ /**
+ * Constructs a selection statement
+ *
+ * @param ast_node Statement
+ */
+
+
+ AstSelectionStatement.prototype.ir = function (state, irs) {
+ var ir, cond;
+ this.condition.ir(state, irs); //@todo: add a check that condition is bool type?
+
+ irs.push(new IrComment(util.format("if %s then", this.condition.Dest), this.location)); //set a flag based on the result
+
+ ir = new IrInstruction('IF', this.condition.Dest);
+
+ if (['bool', 'int', 'float'].indexOf(this.condition.Type) === -1) {
+ this.ir_error("boolean expression expected");
+ }
+
+ if (!ir.d.swizzle) {
+ ir.d.swizzle = 'x';
+ }
+
+ irs.push(ir);
+ this.then_statement.ir(state, irs);
+
+ if (this.else_statement) {
+ irs.push(new IrInstruction('ELSE'));
+ this.else_statement.ir(state, irs);
+ }
+
+ irs.push(new IrInstruction('ENDIF'));
+ };
+ /**
+ * Constructs a jump statement
+ *
+ * Note: jump semantics are a bit different in glsl as there is no true "jumping":
+ * functions are inlined, loops are unrolled, etc.
+ *
+ * @param ast_node Statement
+ */
+
+
+ AstJumpStatement.prototype.ir = function (state, irs) {
+ var ret, ret_entry, assign, lhs;
+
+ switch (this.mode) {
+ case 'return':
+ ret = this.opt_return_value;
+
+ if (ret) {
+ ret.ir(state, irs);
+ ret_entry = state.symbols.get_variable(''); //@todo: need to compare return value type with current function type
+
+ irs.push(new IrComment(util.format("return => %s %s", ret.Dest, ret.Type), this.location)); //Piggy-back off assignment generation
+
+ lhs = new AstExpression('');
+ lhs.setLocation(this.getLocation());
+ lhs.Type = ret.Type;
+ lhs.Dest = ret_entry.out;
+ assign = new AstExpression('=', lhs, ret);
+ assign.setLocation(this.getLocation());
+ assign.ir_assign(state, irs, true);
+ } else {
+ irs.push(new IrComment("return", this.location));
+ }
+
+ break;
+
+ case 'debugger':
+ irs.push(new IrComment("debugger", this.location));
+ irs.push(new IrInstruction("DBGR"));
+ break;
+
+ default: //@todo:
+
+ }
+ };
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * IR Class
+ *
+ * Stores IR code tree
+ */
+
+
+ function Ir(target) {
+ this.target = target;
+ this.symbols = {
+ uniform: {
+ next: 0,
+ entries: {}
+ },
+ attribute: {
+ next: 0,
+ entries: {}
+ },
+ varying: {
+ next: 0,
+ entries: {}
+ },
+ temp: {
+ next: 0
+ }
+ };
+ this.code = [];
+ this.last = null;
+ }
+
+ Ir.prototype.getTemp = function (n) {
+ var t;
+ n = n || 1;
+ t = 'temp@' + this.symbols.temp.next;
+ this.symbols.temp.next += n;
+ return t;
+ };
+ /**
+ * Add a symbol table entry into the local symbol table and return a new IR identifier
+ *
+ * @param object entry Symbol table entry
+ *
+ * @return string
+ */
+
+
+ Ir.prototype.getUniform = function (entry) {
+ var table = this.symbols.uniform,
+ out;
+
+ if (!table.entries[entry.name]) {
+ table.entries[entry.name] = entry;
+ entry.out = 'uniform@' + table.next;
+ table.next += entry.getType().slots;
+ }
+
+ return entry.out;
+ };
+ /**
+ * Add a symbol table entry into the local symbol table and return a new IR identifier
+ *
+ * @param object entry Symbol table entry
+ *
+ * @return string
+ */
+
+
+ Ir.prototype.getAttribute = function (entry) {
+ var table = this.symbols.attribute,
+ out;
+
+ if (!table.entries[entry.name]) {
+ table.entries[entry.name] = entry;
+ entry.out = 'attribute@' + table.next;
+ table.next += entry.getType().slots;
+ }
+
+ return entry.out;
+ };
+ /**
+ * Add a symbol table entry into the local symbol table and return a new IR identifier
+ *
+ * @param object entry Symbol table entry
+ *
+ * @return string
+ */
+
+
+ Ir.prototype.getVarying = function (entry) {
+ var table = this.symbols.varying,
+ out;
+
+ if (!table.entries[entry.name]) {
+ table.entries[entry.name] = entry;
+ entry.out = 'varying@' + table.next;
+ table.next += entry.getType().slots;
+ }
+
+ return entry.out;
+ };
+
+ Ir.prototype.get = function (i) {
+ return this.code[i];
+ };
+
+ Ir.prototype.push = function (ir) {
+ this.code.push(ir);
+ this.last = ir;
+ };
+
+ Ir.isSwizzle = function (swz) {
+ if (swz.match(/[xyzw]+/)) {
+ return true;
+ }
+
+ if (swz.match(/[rgba]+/)) {
+ return true;
+ }
+
+ if (swz.match(/[stpq]+/)) {
+ return true;
+ }
+ };
+
+ Ir.normalizeSwizzle = function (swz) {
+ var n;
+
+ if (!this.isSwizzle(swz)) {
+ return null;
+ }
+
+ n = swz.replace(/[rs]/g, 'x').replace(/[gt]/g, 'y').replace(/[bp]/g, 'z').replace(/[aq]/g, 'w');
+ return n;
+ };
+
+ Ir.swizzles = ["xyzw", "rgba", "stpq"];
+ /**
+ * Replaces all instances of an operand name and base index in all instructions after start
+ *
+ * @param integer Starting instruction number
+ * @param string Old name to search for
+ * @param string New name to replace with
+ * @param integer Add offset
+ * @param boolean True if replacing with a completely new operand
+ */
+
+ Ir.prototype.replaceName = function (start, old, nw, index, repl) {
+ var i, j, ir, f, name, neg_const;
+ neg_const = old.match(/^\-([0-9]+\.[0-9]+)/);
+
+ if (neg_const) {
+ old = neg_const[1];
+ neg_const = true;
+ }
+
+ for (i = start; i < this.code.length; i++) {
+ ir = this.code[i]; //foreach each operand field
+
+ for (j = 0; j < IR.operands.length; j++) {
+ f = IR.operands[j];
+
+ if (ir[f] && ir[f].name == old) {
+ if (repl) {
+ ir[f] = new Ir.Operand(ir[f].neg + nw);
+ } else {
+ ir[f].name = nw;
+ ir[f].addOffset(index);
+ }
+
+ if (neg_const && ir[f].neg) {
+ ir[f].neg = "";
+ }
+ }
+ }
+ }
+ };
+
+ Ir.prototype.toString = function () {
+ return this.code.join("\n");
+ };
+ /**
+ * Builds instructions from code table record
+ *
+ * @param array List of instruction strings
+ * @param array List of operands
+ */
+
+
+ Ir.prototype.build = function (code, oprds) {
+ var dest, i, j, k, o, n, t, oprd, ir, new_swz, temps; //Parse operands
+
+ for (i = 0; i < oprds.length; i++) {
+ oprd = new IrOperand(oprds[i]);
+
+ if (oprd.swizzle) {
+ //need a new temp to move the swizzle so our code pattern works
+ new_swz = Ir.swizzles[0].substring(0, oprd.swizzle.length);
+
+ if (oprd.swizzle != new_swz) {
+ dest = this.getTemp();
+ ir = new IrInstruction('MOV', util.format("%s.%s", dest, new_swz), oprd.full);
+ this.push(ir);
+ oprd = new IrOperand(dest);
+ }
+ }
+
+ oprds[i] = oprd;
+ }
+
+ temps = []; //Merge template with passed operands
+
+ for (i = 0; i < code.length; i++) {
+ ir = new IrInstruction(code[i]); //For each operand
+
+ for (j = 0; j < IrInstruction.operands.length; j++) {
+ o = IrInstruction.operands[j];
+ oprd = ir[o];
+
+ if (!oprd) {
+ break;
+ } //Normal src/dest
+
+
+ n = oprd.name.match(/%(\d+)/);
+
+ if (n) {
+ n = parseInt(n[1]);
+ ir[o] = new IrOperand(oprds[n - 1].toString());
+ ir[o].addOffset(oprd.address);
+ ir[o].swizzle = oprd.swizzle;
+ ir[o].neg = oprd.neg;
+ } //Need temp
+
+
+ t = oprd.name.match(/%t(\d+)/);
+
+ if (t) {
+ //Build up enough temps
+ t = parseInt(t[1]);
+
+ while (temps.length < t) {
+ temps.push(this.getTemp());
+ }
+
+ t = temps[t - 1].split('@');
+ oprd.name = t[0];
+ oprd.address = t[1];
+ oprd.full = oprd.toString();
+ }
+ }
+
+ this.push(ir);
+ }
+ };
+ /**
+ * Ir Error Class
+ *
+ * Used to differentiate between a compilation error and a compiler error
+ */
+
+
+ function IrError(msg) {
+ this.msg = msg;
+ this.ir = true;
+ }
+
+ IrError.prototype = Error.prototype;
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * IR Instruction Class
+ *
+ * Represents a single assembly-like instruction
+ */
+
+ function IrInstruction(op, d, s1, s2, s3) {
+ var args;
+ this.str = null;
+ this.line = null;
+
+ if (arguments.length == 1) {
+ args = op.split(/[\s,]/);
+ op = args[0];
+ d = args[1];
+ s1 = args[2];
+ s2 = args[3];
+ s3 = args[4];
+ }
+
+ this.op = op;
+ this.d = this.operand(d);
+ this.s1 = this.operand(s1);
+ this.s2 = this.operand(s2);
+ this.s3 = this.operand(s3);
+ }
+
+ IrInstruction.operands = ['d', 's1', 's2', 's3'];
+
+ IrInstruction.prototype.operand = function (opr) {
+ return opr ? new IrOperand(opr) : "";
+ };
+ /**
+ * Adds the offset to all operands
+ *
+ * @param integer The offset to set
+ */
+
+
+ IrInstruction.prototype.addOffset = function (offset) {
+ var i, o;
+
+ for (i = 0; i < IrInstruction.operands.length; i++) {
+ o = IrInstruction.operands[i];
+
+ if (this[o]) {
+ this[o].addOffset(offset);
+ }
+ }
+ };
+ /**
+ * Set the swizzle components on all operands
+ *
+ * @param string The swizzle to set
+ */
+
+
+ IrInstruction.prototype.setSwizzle = function (swz) {
+ var i, o;
+
+ for (i = 0; i < IrInstruction.operands.length; i++) {
+ o = IrInstruction.operands[i];
+
+ if (this[o] && !this[o].swizzle) {
+ this[o].swizzle = swz;
+ }
+ }
+ };
+ /**
+ * toString method
+ *
+ * @return string
+ */
+
+
+ IrInstruction.prototype.toString = function () {
+ var out;
+ out = util.format("%s%s%s%s%s;", this.op, this.d ? ' ' + this.d : '', this.s1 ? ', ' + this.s1 : '', this.s2 ? ', ' + this.s2 : '', this.s3 ? ', ' + this.s3 : '');
+ return out;
+ };
+ /**
+ * IR Comment Class
+ *
+ * Represents a single comment
+ */
+
+
+ function IrComment(comment, loc) {
+ this.comment = comment;
+ this.loc = loc;
+ }
+
+ IrComment.prototype.toString = function () {
+ var c = this.comment;
+
+ if (this.loc) {
+ c = util.format("%s [%s:%s-%s:%s]", c, this.loc.first_line, this.loc.first_column, this.loc.last_line, this.loc.last_column);
+ }
+
+ c = "\n# " + c;
+ return c;
+ };
+ /**
+ * IR Operand Class
+ *
+ * Represents a single operand
+ */
+
+
+ function IrOperand(str, raw) {
+ this.full = "";
+ this.neg = "";
+ this.name = "";
+ this.address = "";
+ this.swizzle = "";
+ this.number = "";
+ this.raw = "";
+ this.index = "";
+
+ if (raw) {
+ this.full = str;
+ this.raw = str;
+ } else {
+ this.parse(str);
+ }
+ }
+ /**
+ * Parses operand string
+ *
+ * @param string string that represents a single variable
+ */
+
+
+ IrOperand.prototype.parse = function (str) {
+ var parts, regex;
+
+ if (!str) {
+ return;
+ }
+
+ if (!isNaN(parseFloat(str))) {
+ this.raw = str;
+ return;
+ } //neg
+
+
+ regex = "(\-)?"; //name (include '%' for our code substitution rules)
+
+ regex += "([\\w%]+)"; //number
+
+ regex += "(?:@(\\d+))?"; //index
+
+ regex += "(?:\\[(\\d+)\\])?"; //swizzle
+
+ regex += "(?:\\.([xyzw]+))?";
+ regex = new RegExp("^" + regex + "$");
+
+ if (parts = str.match(regex)) {
+ this.neg = parts[1] || "";
+ this.name = parts[2];
+ this.address = parseInt(parts[3]) || 0;
+ this.index = parseInt(parts[4]) || 0;
+ this.swizzle = parts[5] || "";
+ } else {
+ if (parts = str.match(/^"(.*)"$/)) {
+ this.raw = parts[1];
+ } else {
+ this.raw = str;
+ }
+ }
+
+ this.full = this.toString();
+ };
+ /**
+ * Adds an offset
+ *
+ * @param integer Offset to add
+ */
+
+
+ IrOperand.prototype.addOffset = function (offset) {
+ this.address = this.address || 0;
+ this.address += offset;
+ };
+ /**
+ * toString method
+ *
+ * @return string
+ */
+
+
+ IrOperand.prototype.toString = function () {
+ var str;
+
+ if (this.raw) {
+ str = this.raw;
+ } else {
+ str = this.neg + this.name + ("@" + this.address) + (this.index !== "" ? "[" + this.index + "]" : "") + (this.swizzle ? "." + this.swizzle : "");
+ }
+
+ return str;
+ };
+ /*
+ Copyright (c) 2014 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * GlslProgramJavascript class
+ */
+
+
+ function GlslProgramJavascript() {
+ this.vertex_code = [];
+ this.fragment_code = [];
+ this.symbols = new GlslProgramJavascriptVars();
+ this.context = new GlslProgramJavascriptContext();
+ this.library = {
+ tex: function tex(dest, i, sampler, src, j, dim) {
+ dest[i] = 0;
+ dest[i + 1] = 0;
+ dest[i + 2] = 0;
+ dest[i + 3] = 1;
+ }
+ };
+ this.vertex = null;
+ this.shader = null;
+ }
+
+ var proto = GlslProgramJavascript.prototype;
+ GlslProgramJavascript.translation_table = {
+ 'ABS': '%1.* = Math.abs(%2.*);',
+ 'ADD': '%1.* = %2.* + %3.*;',
+ 'AND': '%1.* = %2.* & %3.*;',
+ //'ARL' : false,
+ 'CEIL': '%1.* = Math.ceil(%2.*);',
+ 'CMP': '%1.* = (%2.* < 0.0) ? %3.* : %4.*;',
+ 'COS': '%1.* = Math.cos(%2.*);',
+ 'DIV': '%1.* = %2.* / %3.*;',
+ 'DBGR': 'debugger;',
+ 'DP2': '%1.x = (%2.x * %3.x) + (%2.y * %3.y);',
+ 'DP3': '%1.x = (%2.x * %3.x) + (%2.y * %3.y) + (%2.z * %3.z);',
+ 'DP4': '%1.x = (%2.x * %3.x) + (%2.y * %3.y) + (%2.z * %3.z) + (%2.w * %3.w);',
+ //'DPH' : '%1.* = (%2.x * %3.x + %2.y * %3.y + %2.z + %3.z + %3.w);',
+ //'DST' : '%1.* = [1, %2.y * %3.y, %2.z, %3.w];',
+ 'ELSE': '} else {',
+ 'ENDIF': '}',
+ 'FLR': '%1.* = Math.floor(%2.*);',
+ 'FRC': '%1.* = %2.* - Math.floor(%2.*);',
+ 'IF': 'if (%1.x) {',
+ 'MAD': '%1.* = (%2.* * %3.*) + %4.*;',
+ 'MAX': '%1.* = Math.max(%2.*, %3.*);',
+ 'MIN': '%1.* = Math.min(%2.*, %3.*);',
+ 'MOD': '%1.* = %2.* % %3.*;',
+ 'MOV': '%1.* = %2.*;',
+ 'MUL': '%1.* = %2.* * %3.*;',
+ 'OR': '%1.* = %2.* | %3.*;',
+ 'POW': '%1.x = Math.pow(%2.x, %3.x);',
+ 'RET': 'return;',
+ 'RSQ': '%1.* = (1.0 / Math.sqrt(%2.*));',
+ 'SEQ': '%1.* = (%2.* === %3.*) ? 1.0 : 0.0;',
+ 'SGE': '%1.* = (%2.* >= %3.*) ? 1.0 : 0.0;',
+ 'SGT': '%1.* = (%2.* > %3.*) ? 1.0 : 0.0;',
+ 'SIN': '%1.* = Math.sin(%2.*);',
+ 'SLE': '%1.* = (%2.* <= %3.*) ? 1.0 : 0.0;',
+ 'SLT': '%1.* = (%2.* < %3.*) ? 1.0 : 0.0;',
+ 'SNE': '%1.* = (%2.* !== %3.*) ? 1.0 : 0.0;',
+ 'SUB': '%1.* = %2.* - %3.*;',
+ 'TAN': '%1.* = Math.tan(%2.*);',
+ //Non-standard opcode for NV_gpu
+ 'TEX': 'tex(%1, %4, %2, %5, %3.x, 0);',
+ //%4 = address of %1, %5 = address of %2
+ 'XOR': '%1.* = %2.* ^ %3.*;'
+ };
+ /**
+ * Return string representation of program
+ *
+ * @param int target target
+ *
+ * @return string
+ */
+
+ proto.toString = function (target) {
+ if (target === glsl.target.fragment) {
+ return this.fragment_code.join("\n");
+ } else if (target === glsl.target.vertex) {
+ return this.vertex_code.join("\n");
+ } else {
+ return this.current.join("\n");
+ }
+ };
+ /**
+ * Translates IR code into a javascript representation
+ *
+ * @return bool true if there were no errors
+ */
+
+
+ proto.addObjectCode = function (object, target) {
+ var i, errors; //optimize(irs, symbols);
+
+ this.mergeSymbols(object);
+ this.current = [];
+
+ for (i = 0; i < object.code.length; i++) {
+ try {
+ this.instruction(object.code[i]);
+ } catch (e) {
+ this.error = util.format("%s at %s:%s", e.message, e.lineNumber, e.columnNumber);
+ return false;
+ }
+ }
+
+ if (target == glsl.target.vertex) {
+ this.vertex_code = this.current;
+ } else if (target == glsl.target.fragment) {
+ this.fragment_code = this.current;
+ }
+
+ return true;
+ };
+ /**
+ * Merge symbol code into program table
+ */
+
+
+ proto.mergeSymbols = function (object) {
+ var s, t, n, entry, sym, start, slots, comp;
+
+ for (s in object.symbols) {
+ t = object.symbols[s].entries;
+
+ for (n in t) {
+ entry = t[n];
+ start = parseInt(entry.out.split('@')[1]);
+ slots = entry.getType().slots;
+ comp = entry.getType().size / slots;
+
+ if (s == 'uniform') {
+ sym = this.symbols.addUniform(entry.name, start, slots, comp);
+
+ if (this.findSymbolCollision(this.symbols.uniform, sym)) {
+ this.rewriteSymbol(this.symbols.uniform, sym, object);
+ }
+ } else if (s == 'attribute') {
+ this.symbols.addAttribute(entry.name, start, slots, comp);
+ } else if (s == 'varying') {
+ this.symbols.addVarying(entry.name, start, slots, comp);
+ }
+ }
+ }
+ };
+ /**
+ * Scan symbol table to find collisions
+ */
+
+
+ proto.findSymbolCollision = function (table, symbol) {
+ var i, my_start, my_end, start, end;
+ my_start = symbol.pos;
+ my_end = my_start + symbol.slots - 1;
+
+ for (i in table) {
+ if (i == symbol.name) {
+ continue;
+ }
+
+ start = table[i].pos;
+ end = start + table[i].slots - 1;
+
+ if (my_start >= start && my_start <= end || my_end >= start && my_end <= end) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+ /**
+ * Rewrite symbol table entry position in code
+ */
+
+
+ proto.findNewSymbolPosition = function (table, symbol) {
+ var i, size, addresses, last, next;
+ addresses = []; //find new address
+
+ for (i in table) {
+ if (symbol.name == i) {
+ continue;
+ } //start address
+
+
+ addresses.push(table[i].pos); //end address
+
+ addresses.push(table[i].pos + table[i].slots - 1);
+ }
+
+ addresses.sort(); //Can insert at beginning
+
+ if (addresses[0] >= symbol.slots) {
+ return 0;
+ } //Can insert in between
+
+
+ for (i = 1; i < addresses.length; i += 2) {
+ last = addresses[i];
+ next = addresses[i];
+
+ if (next - last - 1 > symbol.slots) {
+ return last + 1;
+ }
+ } //Can insert at end
+
+
+ return addresses.slice(-1)[0] + 1;
+ };
+ /**
+ * Rewrite symbol table entry position in code
+ */
+
+
+ proto.rewriteSymbol = function (table, symbol, object) {
+ var pos, old_start, old_end, diff, i, ins;
+ old_start = symbol.pos;
+ old_end = old_start + symbol.slots - 1;
+ symbol.pos = this.findNewSymbolPosition(table, symbol);
+ diff = symbol.pos - old_start;
+
+ for (i = 0; i < object.code.length; i++) {
+ ins = object.code[i];
+
+ if (!(ins instanceof IrInstruction)) {
+ continue;
+ }
+
+ this.rewriteOperandAddress(ins.d, old_start, old_end, diff, symbol);
+ this.rewriteOperandAddress(ins.s1, old_start, old_end, diff, symbol);
+ this.rewriteOperandAddress(ins.s2, old_start, old_end, diff, symbol);
+ this.rewriteOperandAddress(ins.s3, old_start, old_end, diff, symbol);
+ }
+ };
+ /**
+ * Rewrite symbol table entry position in code
+ */
+
+
+ proto.rewriteOperandAddress = function (oprd, old_start, old_end, diff, symbol) {
+ var diff;
+
+ if (!oprd) {
+ return;
+ }
+
+ if (oprd.name != symbol.type) {
+ return;
+ }
+
+ if (oprd.address >= old_start && oprd.address <= old_end) {
+ oprd.address += diff;
+ }
+ };
+ /**
+ * Build a program
+ *
+ * @return function
+ */
+
+
+ proto.build = function () {
+ var module, shaders;
+ module = new Function("stdlib", "foreign", "heap", "//\"use asm\";\n" + "var\n" + "uniform_f32 = new stdlib.Float32Array(heap, 0, 128),\n" + "attribute_f32 = new stdlib.Float32Array(heap, 512, 128),\n" + "varying_f32 = new stdlib.Float32Array(heap, 1024, 128),\n" + "result_f32 = new stdlib.Float32Array(heap, 1536, 128),\n" + "temp_f32 = new stdlib.Float32Array(heap, 2048, 128),\n" + "jstemp = new stdlib.Float32Array(heap, 2544, 4),\n" + "tex = foreign.tex;\n" + ";\n" + "function vs() {\n" + this.vertex_code.join("\n") + "\n" + "}\n" + "function fs() {\n" + this.fragment_code.join("\n") + "\n" + "}\n" + "return { fragment : fs, vertex : vs };");
+ shaders = module(window, this.library, this.context.heap);
+ this.vertex = shaders.vertex;
+ this.fragment = shaders.fragment;
+ };
+ /**
+ * Translates ASM instruction into output format
+ *
+ * @param string string that represents a single instruction
+ */
+
+
+ proto.instruction = function (ins) {
+ var tpl, dest, src, i, j, k, code, js;
+
+ if (ins instanceof IrComment) {
+ this.current.push('// ' + ins.toString().replace("\n", ""));
+ return;
+ }
+
+ this.current.push('// ' + ins.toString());
+
+ if (!(tpl = GlslProgramJavascript.translation_table[ins.op])) {
+ throw new Error(util.format("Could not translate opcode '%s'", ins.op));
+ } //variables
+
+
+ dest = this.buildComponents(ins.d, true);
+
+ if (!dest) {
+ this.current.push(tpl);
+ return;
+ }
+
+ src = [];
+ src.push(this.buildComponents(ins.s1));
+ src.push(this.buildComponents(ins.s2));
+ src.push(this.buildComponents(ins.s3));
+
+ if (ins.op == 'TEX') {
+ js = tpl.replace(/%1/g, dest.name);
+ js = js.replace(/%2/g, src[0].name);
+ js = this.replaceOperand(js, '%3', src[1], 0);
+ js = js.replace(/%4/g, dest.start);
+ js = js.replace(/%5/g, src[0].start);
+ this.current.push(js);
+ this.current.push("");
+ return;
+ }
+
+ this.generateTemp(dest, src, tpl);
+
+ for (i = 0; i < dest.components.length; i++) {
+ js = this.replaceOperand(tpl, '%1', dest, i);
+
+ for (j = 0; j < 3; j++) {
+ if (src[j]) {
+ js = this.replaceOperand(js, '%' + (j + 2), src[j], i);
+ }
+ }
+
+ this.current.push(js);
+ }
+
+ this.current.push("");
+ };
+ /**
+ * Replace an operand into code template
+ *
+ * @param string tpl Template
+ * @param string from Template operand
+ * @param object op Operand info
+ * @param int n Current component iteration
+ */
+
+
+ proto.replaceOperand = function (tpl, from, op, n) {
+ var i,
+ out,
+ name,
+ addr,
+ swz = ['x', 'y', 'z', 'w'];
+
+ if (op.raw) {
+ name = op.name;
+ } else {
+ if (op.jstemp && op.jstemp[n]) {
+ name = 'jstemp';
+ addr = n;
+ } else {
+ name = op.name;
+
+ if (op.components) {
+ addr = op.start + op.components[n];
+ }
+ }
+ }
+
+ if (op.components) {
+ out = tpl.replace(from + '.*', util.format("%s[%s]", name, addr));
+ } else {
+ out = tpl.replace(from + '.*', name);
+ }
+
+ for (i = 0; i < swz.length; i++) {
+ out = out.replace(new RegExp(from + '\.' + swz[i], 'g'), util.format("%s[%s]", name, op.start + i));
+ }
+
+ return out;
+ };
+ /**
+ * Prepares info on IR operand
+ *
+ * @param IrOperand opr Operand
+ * @param bool dest Is destination?
+ *
+ * @return object
+ */
+
+
+ proto.buildComponents = function (opr, dest) {
+ var i, swz, out;
+
+ if (!opr) {
+ return null;
+ }
+
+ out = {};
+
+ if (opr.raw) {
+ out.name = opr.raw;
+ out.raw = true;
+ return out;
+ }
+
+ out.name = opr.neg + opr.name + '_f32';
+ out.start = 4 * opr.address + 4 * opr.index;
+ out.components = [];
+ out.jstemp = []; //generate array representation of swizzle components, expanding if necessary
+
+ swz = opr.swizzle || "xyzw";
+ swz = swz.split("");
+
+ for (i = 0; i < 4; i++) {
+ //exact swizzle specified and less than 4 components, grab last one
+ if (swz.length <= i) {
+ if (!dest) {
+ //repeat last one
+ out.components.push(out.components[i - 1]);
+ out.jstemp.push(null);
+ }
+ } else {
+ out.components.push("xyzw".indexOf(swz[i]));
+ out.jstemp.push(null);
+ }
+ }
+
+ return out;
+ };
+
+ proto.generateTemp = function (dest, src, tpl) {
+ var i, c, op, written;
+
+ for (i = 0; i < dest.components.length; i++) {
+ written = dest.components.slice(0, i);
+
+ for (c = 0; c < src.length; c++) {
+ op = src[c];
+
+ if (op && op.name == dest.name && op.start == dest.start && written.indexOf(op.components[i]) != -1) {
+ op.jstemp[i] = true;
+ this.current.push(util.format("jstemp[%s] = %s[%s]", i, op.name, op.start + op.components[i]));
+ }
+ }
+ } //console.log(tpl, dest, src);
+ //debugger;
+
+ };
+ /**
+ * Get Uniform Location
+ *
+ * @param string name Name
+ *
+ * @return int
+ */
+
+
+ proto.getUniformLocation = function (name) {
+ if (this.symbols.uniform[name]) {
+ return this.symbols.uniform[name].start;
+ }
+
+ return false;
+ };
+ /**
+ * Get Uniform Size
+ *
+ * @param string name Name
+ *
+ * @return int
+ */
+
+
+ proto.getUniformSize = function (name) {
+ if (this.symbols.uniform[name]) {
+ return this.symbols.uniform[name].size;
+ }
+
+ return false;
+ };
+ /**
+ * Set Uniform data
+ *
+ * @param string name Name
+ * @param array data Data
+ */
+
+
+ proto.setUniformData = function (name, data) {
+ var i, l, s, d;
+ d = data.length;
+ l = this.getUniformSize(name);
+ s = this.getUniformLocation(name);
+
+ if (l === false) {
+ return;
+ }
+
+ this.context.uniform_f32.set(data, i + s);
+ };
+ /**
+ * Get Attribute Location
+ *
+ * @param string name Name
+ *
+ * @return int
+ */
+
+
+ proto.getAttributeLocation = function (name) {
+ if (this.symbols.attribute[name]) {
+ return this.symbols.attribute[name].start;
+ }
+
+ return false;
+ };
+ /**
+ * Get Attribute Size
+ *
+ * @param string name Name
+ *
+ * @return int
+ */
+
+
+ proto.getAttributeSize = function (name) {
+ if (this.symbols.attribute[name]) {
+ return this.symbols.attribute[name].size;
+ }
+
+ return false;
+ };
+ /**
+ * Set Attribute data
+ *
+ * @param string name Name
+ * @param array data Data
+ */
+
+
+ proto.setAttributeData = function (name, data) {
+ var i, l, s, d;
+ d = data.length;
+ l = this.getAttributeSize(name);
+ s = this.getAttributeLocation(name);
+
+ if (l === false) {
+ return;
+ }
+
+ this.context.attribute_f32.set(data, i + s);
+ };
+ /**
+ * Get result data
+ *
+ * @param int start Start pos
+ * @param int size Size
+ *
+ * @return array
+ */
+
+
+ proto.getResultData = function (start, size) {
+ var res;
+ res = Array.prototype.slice.apply(this.context.result_f32, [start, size]);
+ return res;
+ };
+ /**
+ * Set TEX lookup function
+ *
+ *
+ */
+
+
+ proto.setTexFunction = function (func) {
+ this.library.tex = func;
+ };
+
+ glsl.program = GlslProgramJavascript;
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * GlslProgramJavascriptContext class
+ */
+
+ function GlslProgramJavascriptContext() {
+ this.heap = new ArrayBuffer(640 * 4);
+ this.uniform_f32 = new Float32Array(this.heap, 0, 128);
+ this.attribute_f32 = new Float32Array(this.heap, 128 * 4, 128);
+ this.varying_f32 = new Float32Array(this.heap, 256 * 4, 128);
+ this.result_f32 = new Float32Array(this.heap, 384 * 4, 128);
+ }
+
+ var proto = GlslProgramJavascriptContext.prototype;
+ /*
+ Copyright (c) 2011 Cimaron Shanahan
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * GlslProgramJavascriptVars Class
+ */
+
+ function GlslProgramJavascriptVars() {
+ this.uniform = {};
+ this.attribute = {};
+ this.varying = {};
+ }
+
+ var proto = GlslProgramJavascriptVars.prototype;
+ /**
+ * Add uniform variable
+ */
+
+ proto.addUniform = function (name, pos, slots, comp) {
+ this.uniform[name] = new GlslProgramJavascriptVar(name, pos, slots, comp, 'uniform');
+ return this.uniform[name];
+ };
+ /**
+ * Add attribute variable
+ */
+
+
+ proto.addAttribute = function (name, pos, slots, comp) {
+ this.attribute[name] = new GlslProgramJavascriptVar(name, pos, slots, comp, 'attribute');
+ return this.attribute[name];
+ };
+ /**
+ * Add varying variable
+ */
+
+
+ proto.addVarying = function (name, pos, slots, comp) {
+ this.varying[name] = new GlslProgramJavascriptVar(name, pos, slots, comp, 'varying');
+ return this.varying[name];
+ };
+ /**
+ * GlslProgramJavascriptVar Class
+ */
+
+
+ function GlslProgramJavascriptVar(name, pos, slots, comp, type) {
+ this.name = name;
+ this.pos = pos;
+ this.slots = slots;
+ this.components = comp;
+ this.type = type;
+ } //this.glsl = glsl;
+
+
+ if ('object' !== 'undefined') {
+ module.exports = glsl;
+ }
+ })();
+ });
+
+ var ast$1 = createCommonjsModule(function (module, exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.makeEveryOtherGenerator = exports.makeGenerator = exports.visit = exports.evaluate = void 0;
+ var isNode = function (node) { return !!(node === null || node === void 0 ? void 0 : node.type); };
+ var isTraversable = function (node) { return isNode(node) || Array.isArray(node); };
+ var evaluate = function (ast, visitors) {
+ var visit = function (node) {
+ var visitor = visitors[node.type];
+ if (!visitor) {
+ throw new Error("No evaluate() visitor for " + node.type);
+ }
+ return visitors[node.type](node, visit);
+ };
+ return visit(ast);
+ };
+ exports.evaluate = evaluate;
+ var makePath = function (node, parent, parentPath, key, index) { return ({
+ node: node,
+ parent: parent,
+ parentPath: parentPath,
+ key: key,
+ index: index,
+ skip: function () {
+ this.skipped = true;
+ },
+ remove: function () {
+ this.removed = true;
+ },
+ replaceWith: function (replacer) {
+ this.replaced = replacer;
+ },
+ findParent: function (test) {
+ return !parentPath
+ ? parentPath
+ : test(parentPath)
+ ? parentPath
+ : parentPath.findParent(test);
+ },
+ }); };
+ /**
+ * Apply the visitor pattern to an AST that conforms to this compiler's spec
+ */
+ var visit = function (ast, visitors) {
+ var visitNode = function (node, parent, parentPath, key, index) {
+ var _a;
+ var visitor = visitors[node.type];
+ var path = makePath(node, parent, parentPath, key, index);
+ if (visitor === null || visitor === void 0 ? void 0 : visitor.enter) {
+ visitor.enter(path);
+ if (path.removed) {
+ if (!key || !parent) {
+ throw new Error("Asked to remove " + node.id + " but no parent key was present in " + (parent === null || parent === void 0 ? void 0 : parent.id));
+ }
+ if (typeof index === 'number') {
+ parent[key].splice(index, 1);
+ }
+ else {
+ parent[key] = null;
+ }
+ return path;
+ }
+ if (path.replaced) {
+ if (!key || !parent) {
+ throw new Error("Asked to remove " + node.id + " but no parent key was present in " + (parent === null || parent === void 0 ? void 0 : parent.id));
+ }
+ if (typeof index === 'number') {
+ parent[key].splice(index, 1, path.replaced);
+ }
+ else {
+ parent[key] = path.replaced;
+ }
+ }
+ if (path.skipped) {
+ return path;
+ }
+ }
+ Object.entries(node)
+ .filter(function (_a) {
+ var nodeKey = _a[0], nodeValue = _a[1];
+ return isTraversable(nodeValue);
+ })
+ .forEach(function (_a) {
+ var nodeKey = _a[0], nodeValue = _a[1];
+ if (Array.isArray(nodeValue)) {
+ for (var i = 0, offset = 0; i - offset < nodeValue.length; i++) {
+ var child = nodeValue[i - offset];
+ var res = visitNode(child, node, path, nodeKey, i - offset);
+ if (res === null || res === void 0 ? void 0 : res.removed) {
+ offset += 1;
+ }
+ }
+ }
+ else {
+ visitNode(nodeValue, node, path, nodeKey);
+ }
+ });
+ (_a = visitor === null || visitor === void 0 ? void 0 : visitor.exit) === null || _a === void 0 ? void 0 : _a.call(visitor, path);
+ // visitor?.exit?.(node, parent, key, index);
+ };
+ return visitNode(ast);
+ };
+ exports.visit = visit;
+ /**
+ * Stringify an AST
+ */
+ var makeGenerator = function (generators) {
+ var gen = function (ast) {
+ return typeof ast === 'string'
+ ? ast
+ : ast === null || ast === undefined
+ ? ''
+ : Array.isArray(ast)
+ ? ast.map(gen).join('')
+ : ast.type in generators
+ ? generators[ast.type](ast)
+ : "NO GENERATOR FOR " + ast.type + ast;
+ };
+ return gen;
+ };
+ exports.makeGenerator = makeGenerator;
+ var makeEveryOtherGenerator = function (generate) {
+ var everyOther = function (nodes, eo) {
+ return nodes.reduce(function (output, node, index) {
+ return output +
+ generate(node) +
+ (index === nodes.length - 1 ? '' : generate(eo[index]));
+ }, '');
+ };
+ return everyOther;
+ };
+ exports.makeEveryOtherGenerator = makeEveryOtherGenerator;
+ });
+
+ var ast$2 = /*@__PURE__*/getDefaultExportFromCjs(ast$1);
+
+ "use strict";
+
+
+ var generators = {
+ program: function (node) { return generate(node.ws) + generate(node.program); },
+ preprocessor: function (node) { return generate(node.line) + generate(node._); },
+ keyword: function (node) { return generate(node.token) + generate(node.whitespace); },
+ precision: function (node) {
+ return generate(node.prefix) + generate(node.qualifier) + generate(node.specifier);
+ },
+ // Statements
+ expression_statement: function (node) {
+ return generate(node.expression) + generate(node.semi);
+ },
+ if_statement: function (node) {
+ return generate(node.if) +
+ generate(node.lp) +
+ generate(node.condition) +
+ generate(node.rp) +
+ generate(node.body) +
+ generate(node.else);
+ },
+ switch_statement: function (node) {
+ return generate(node.switch) +
+ generate(node.lp) +
+ generate(node.expression) +
+ generate(node.rp) +
+ generate(node.lb) +
+ generate(node.cases) +
+ generate(node.rb);
+ },
+ break_statement: function (node) { return generate(node.break) + generate(node.semi); },
+ do_statement: function (node) {
+ return generate(node.do) +
+ generate(node.body) +
+ generate(node.while) +
+ generate(node.lp) +
+ generate(node.expression) +
+ generate(node.rp) +
+ generate(node.semi);
+ },
+ continue_statement: function (node) { return generate(node.continue) + generate(node.semi); },
+ return_statement: function (node) {
+ return generate(node.return) + generate(node.expression) + generate(node.semi);
+ },
+ discard_statement: function (node) { return generate(node.discard) + generate(node.semi); },
+ while_statement: function (node) {
+ return generate(node.while) +
+ generate(node.lp) +
+ generate(node.condition) +
+ generate(node.rp) +
+ generate(node.body);
+ },
+ for_statement: function (node) {
+ return generate(node.for) +
+ generate(node.lp) +
+ generate(node.init) +
+ generate(node.initSemi) +
+ generate(node.condition) +
+ generate(node.conditionSemi) +
+ generate(node.operation) +
+ generate(node.rp) +
+ generate(node.body);
+ },
+ condition_expression: function (node) {
+ return generate(node.specified_type) +
+ generate(node.identifier) +
+ generate(node.declarator) +
+ generate(node.op) +
+ generate(node.initializer);
+ },
+ declaration_statement: function (node) {
+ return generate(node.declaration) + generate(node.semi);
+ },
+ fully_specified_type: function (node) {
+ return generate(node.qualifiers) + generate(node.specifier);
+ },
+ layout_qualifier: function (node) {
+ return generate(node.layout) +
+ generate(node.lp) +
+ generateWithEveryOther(node.qualifiers, node.commas) +
+ generate(node.rp);
+ },
+ layout_qualifier_id: function (node) {
+ return generate(node.identifier) +
+ generate(node.operator) +
+ generate(node.expression);
+ },
+ switch_case: function (node) {
+ return generate(node.case) +
+ generate(node.test) +
+ generate(node.colon) +
+ generate(node.statements);
+ },
+ default_case: function (node) {
+ return generate(node.default) + generate(node.colon) + generate(node.statements);
+ },
+ declaration: function (node) {
+ return generate(node.specified_type) +
+ generate(node.identifier) +
+ generate(node.quantifier) +
+ generate(node.operator) +
+ generate(node.initializer);
+ },
+ declarator_list: function (node) {
+ return generate(node.specified_type) +
+ generateWithEveryOther(node.declarations, node.commas);
+ },
+ declarator: function (node) {
+ return generate(node.specified_type) +
+ generate(node.identifier) +
+ generate(node.qualifiers) +
+ generate(node.quantifier);
+ },
+ type_specifier: function (node) {
+ return generate(node.specifier) +
+ generate(node.quantifier) +
+ generate(node.declarations);
+ },
+ array_specifiers: function (node) { return generate(node.specifiers); },
+ array_specifier: function (node) {
+ return generate(node.lb) + generate(node.expression) + generate(node.rb);
+ },
+ identifier: function (node) { return node.identifier + generate(node.whitespace); },
+ function: function (node) {
+ return generate(node['prototype']) + generate(node.body) + generate(node.rp);
+ },
+ function_header: function (node) {
+ return generate(node.returnType) + generate(node.name) + generate(node.lp);
+ },
+ function_prototype: function (node) {
+ return generate(node.header.returnType) +
+ generate(node.header.name) +
+ generate(node.header.lp) +
+ (node.parameters
+ ? generateWithEveryOther(node.parameters, node.commas)
+ : '') +
+ generate(node.rp);
+ },
+ parameter_declaration: function (node) {
+ return generate(node.qualifier) + generate(node.declaration);
+ },
+ compound_statement: function (node) {
+ return generate(node.lb) + generate(node.statements) + generate(node.rb);
+ },
+ function_call: function (node) {
+ return generate(node.identifier) +
+ generate(node.lp) +
+ generate(node.args) +
+ generate(node.rp);
+ },
+ parameter_declarator: function (node) {
+ return generate(node.qualifier) +
+ generate(node.specifier) +
+ generate(node.identifier) +
+ generate(node.quantifier);
+ },
+ postfix: function (node) { return generate(node.expr) + generate(node.postfix); },
+ quantifier: function (node) {
+ return generate(node.lb) + generate(node.expr) + generate(node.rb);
+ },
+ quantified_identifier: function (node) {
+ return generate(node.identifier) + generate(node.quantifier);
+ },
+ field_selection: function (node) { return generate(node.dot) + generate(node.selection); },
+ subroutine_qualifier: function (node) {
+ return generate(node.subroutine) +
+ generate(node.lp) +
+ generate(node.type_names) +
+ generate(node.commas) +
+ generate(node.rp);
+ },
+ assignment: function (node) {
+ return generate(node.left) + generate(node.operator) + generate(node.right);
+ },
+ ternary: function (node) {
+ return generate(node.expr) +
+ generate(node.question) +
+ generate(node.left) +
+ generate(node.colon) +
+ generate(node.right);
+ },
+ binary: function (node) {
+ return generate(node.left) + generate(node.operator) + generate(node.right);
+ },
+ group: function (node) {
+ return generate(node.lp) + generate(node.expression) + generate(node.rp);
+ },
+ unary: function (node) { return generate(node.operator) + generate(node.expression); },
+ float_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ double_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ int_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ uint_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ bool_constant: function (node) { return generate(node.token) + generate(node.whitespace); },
+ literal: function (node) { return generate(node.literal) + generate(node.whitespace); },
+ struct: function (node) {
+ return generate(node.struct) +
+ generate(node.typeName) +
+ generate(node.lb) +
+ generate(node.declarations) +
+ generate(node.rb);
+ },
+ struct_declaration: function (node) {
+ return generate(node.declaration) + generate(node.semi);
+ },
+ interface_declarator: function (node) {
+ return generate(node.qualifiers) +
+ generate(node.interface_type) +
+ generate(node.lp) +
+ generate(node.declarations) +
+ generate(node.rp) +
+ generate(node.identifier);
+ },
+ struct_declarator: function (node) {
+ return generate(node.specified_type) +
+ generateWithEveryOther(node.declarations, node.commas);
+ },
+ initializer_list: function (node) {
+ return generate(node.lb) +
+ generateWithEveryOther(node.initializers, node.commas) +
+ generate(node.rb);
+ },
+ qualifier_declarator: function (node) {
+ return generate(node.qualifiers) +
+ generateWithEveryOther(node.declarations, node.commas);
+ },
+ };
+ var generate = (0, ast$1.makeGenerator)(generators);
+ var generateWithEveryOther = (0, ast$1.makeEveryOtherGenerator)(generate);
+ var _default = generate;
+
+ var generator = /*#__PURE__*/Object.defineProperty({
+ default: _default
+ }, '__esModule', {value: true});
+
+ // Generated by Peggy 1.2.0.
+ //
+ // https://peggyjs.org/
+
+ "use strict";
+
+ function peg$subclass(child, parent) {
+ function C() { this.constructor = child; }
+ C.prototype = parent.prototype;
+ child.prototype = new C();
+ }
+
+ function peg$SyntaxError(message, expected, found, location) {
+ var self = Error.call(this, message);
+ if (Object.setPrototypeOf) {
+ Object.setPrototypeOf(self, peg$SyntaxError.prototype);
+ }
+ self.expected = expected;
+ self.found = found;
+ self.location = location;
+ self.name = "SyntaxError";
+ return self;
+ }
+
+ peg$subclass(peg$SyntaxError, Error);
+
+ function peg$padEnd(str, targetLength, padString) {
+ padString = padString || " ";
+ if (str.length > targetLength) { return str; }
+ targetLength -= str.length;
+ padString += padString.repeat(targetLength);
+ return str + padString.slice(0, targetLength);
+ }
+
+ peg$SyntaxError.prototype.format = function(sources) {
+ var str = "Error: " + this.message;
+ if (this.location) {
+ var src = null;
+ var k;
+ for (k = 0; k < sources.length; k++) {
+ if (sources[k].source === this.location.source) {
+ src = sources[k].text.split(/\r\n|\n|\r/g);
+ break;
+ }
+ }
+ var s = this.location.start;
+ var loc = this.location.source + ":" + s.line + ":" + s.column;
+ if (src) {
+ var e = this.location.end;
+ var filler = peg$padEnd("", s.line.toString().length);
+ var line = src[s.line - 1];
+ var last = s.line === e.line ? e.column : line.length + 1;
+ str += "\n --> " + loc + "\n"
+ + filler + " |\n"
+ + s.line + " | " + line + "\n"
+ + filler + " | " + peg$padEnd("", s.column - 1)
+ + peg$padEnd("", last - s.column, "^");
+ } else {
+ str += "\n at " + loc;
+ }
+ }
+ return str;
+ };
+
+ peg$SyntaxError.buildMessage = function(expected, found) {
+ var DESCRIBE_EXPECTATION_FNS = {
+ literal: function(expectation) {
+ return "\"" + literalEscape(expectation.text) + "\"";
+ },
+
+ class: function(expectation) {
+ var escapedParts = expectation.parts.map(function(part) {
+ return Array.isArray(part)
+ ? classEscape(part[0]) + "-" + classEscape(part[1])
+ : classEscape(part);
+ });
+
+ return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
+ },
+
+ any: function() {
+ return "any character";
+ },
+
+ end: function() {
+ return "end of input";
+ },
+
+ other: function(expectation) {
+ return expectation.description;
+ }
+ };
+
+ function hex(ch) {
+ return ch.charCodeAt(0).toString(16).toUpperCase();
+ }
+
+ function literalEscape(s) {
+ return s
+ .replace(/\\/g, "\\\\")
+ .replace(/"/g, "\\\"")
+ .replace(/\0/g, "\\0")
+ .replace(/\t/g, "\\t")
+ .replace(/\n/g, "\\n")
+ .replace(/\r/g, "\\r")
+ .replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); })
+ .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); });
+ }
+
+ function classEscape(s) {
+ return s
+ .replace(/\\/g, "\\\\")
+ .replace(/\]/g, "\\]")
+ .replace(/\^/g, "\\^")
+ .replace(/-/g, "\\-")
+ .replace(/\0/g, "\\0")
+ .replace(/\t/g, "\\t")
+ .replace(/\n/g, "\\n")
+ .replace(/\r/g, "\\r")
+ .replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); })
+ .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); });
+ }
+
+ function describeExpectation(expectation) {
+ return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
+ }
+
+ function describeExpected(expected) {
+ var descriptions = expected.map(describeExpectation);
+ var i, j;
+
+ descriptions.sort();
+
+ if (descriptions.length > 0) {
+ for (i = 1, j = 1; i < descriptions.length; i++) {
+ if (descriptions[i - 1] !== descriptions[i]) {
+ descriptions[j] = descriptions[i];
+ j++;
+ }
+ }
+ descriptions.length = j;
+ }
+
+ switch (descriptions.length) {
+ case 1:
+ return descriptions[0];
+
+ case 2:
+ return descriptions[0] + " or " + descriptions[1];
+
+ default:
+ return descriptions.slice(0, -1).join(", ")
+ + ", or "
+ + descriptions[descriptions.length - 1];
+ }
+ }
+
+ function describeFound(found) {
+ return found ? "\"" + literalEscape(found) + "\"" : "end of input";
+ }
+
+ return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
+ };
+
+ function peg$parse(input, options) {
+ options = options !== undefined ? options : {};
+
+ var peg$FAILED = {};
+ var peg$source = options.grammarSource;
+
+ var peg$startRuleFunctions = { start: peg$parsestart };
+ var peg$startRuleFunction = peg$parsestart;
+
+ var peg$c0 = "attribute";
+ var peg$c1 = "varying";
+ var peg$c2 = "const";
+ var peg$c3 = "bool";
+ var peg$c4 = "float";
+ var peg$c5 = "double";
+ var peg$c6 = "int";
+ var peg$c7 = "uint";
+ var peg$c8 = "break";
+ var peg$c9 = "continue";
+ var peg$c10 = "do";
+ var peg$c11 = "else";
+ var peg$c12 = "for";
+ var peg$c13 = "if";
+ var peg$c14 = "discard";
+ var peg$c15 = "return";
+ var peg$c16 = "switch";
+ var peg$c17 = "case";
+ var peg$c18 = "default";
+ var peg$c19 = "subroutine";
+ var peg$c20 = "bvec2";
+ var peg$c21 = "bvec3";
+ var peg$c22 = "bvec4";
+ var peg$c23 = "ivec2";
+ var peg$c24 = "ivec3";
+ var peg$c25 = "ivec4";
+ var peg$c26 = "uvec2";
+ var peg$c27 = "uvec3";
+ var peg$c28 = "uvec4";
+ var peg$c29 = "vec2";
+ var peg$c30 = "vec3";
+ var peg$c31 = "vec4";
+ var peg$c32 = "mat2";
+ var peg$c33 = "mat3";
+ var peg$c34 = "mat4";
+ var peg$c35 = "centroid";
+ var peg$c36 = "in";
+ var peg$c37 = "out";
+ var peg$c38 = "inout";
+ var peg$c39 = "uniform";
+ var peg$c40 = "patch";
+ var peg$c41 = "sample";
+ var peg$c42 = "buffer";
+ var peg$c43 = "shared";
+ var peg$c44 = "coherent";
+ var peg$c45 = "volatile";
+ var peg$c46 = "restrict";
+ var peg$c47 = "readonly";
+ var peg$c48 = "writeonly";
+ var peg$c49 = "dvec2";
+ var peg$c50 = "dvec3";
+ var peg$c51 = "dvec4";
+ var peg$c52 = "dmat2";
+ var peg$c53 = "dmat3";
+ var peg$c54 = "dmat4";
+ var peg$c55 = "noperspective";
+ var peg$c56 = "flat";
+ var peg$c57 = "smooth";
+ var peg$c58 = "layout";
+ var peg$c59 = "mat2x2";
+ var peg$c60 = "mat2x3";
+ var peg$c61 = "mat2x4";
+ var peg$c62 = "mat3x2";
+ var peg$c63 = "mat3x3";
+ var peg$c64 = "mat3x4";
+ var peg$c65 = "mat4x2";
+ var peg$c66 = "mat4x3";
+ var peg$c67 = "mat4x4";
+ var peg$c68 = "dmat2x2";
+ var peg$c69 = "dmat2x3";
+ var peg$c70 = "dmat2x4";
+ var peg$c71 = "dmat3x2";
+ var peg$c72 = "dmat3x3";
+ var peg$c73 = "dmat3x4";
+ var peg$c74 = "dmat4x2";
+ var peg$c75 = "dmat4x3";
+ var peg$c76 = "dmat4x4";
+ var peg$c77 = "atomic_uint";
+ var peg$c78 = "sampler1D";
+ var peg$c79 = "sampler2D";
+ var peg$c80 = "sampler3D";
+ var peg$c81 = "samplerCube";
+ var peg$c82 = "sampler1DShadow";
+ var peg$c83 = "sampler2DShadow";
+ var peg$c84 = "samplerCubeShadow";
+ var peg$c85 = "sampler1DArray";
+ var peg$c86 = "sampler2DArray";
+ var peg$c87 = "sampler1DArrayShadow";
+ var peg$c88 = "sampler2DArrayshadow";
+ var peg$c89 = "isampler1D";
+ var peg$c90 = "isampler2D";
+ var peg$c91 = "isampler3D";
+ var peg$c92 = "isamplerCube";
+ var peg$c93 = "isampler1Darray";
+ var peg$c94 = "isampler2DArray";
+ var peg$c95 = "usampler1D";
+ var peg$c96 = "usampler2D";
+ var peg$c97 = "usampler3D";
+ var peg$c98 = "usamplerCube";
+ var peg$c99 = "usampler1DArray";
+ var peg$c100 = "usampler2DArray";
+ var peg$c101 = "sampler2DRect";
+ var peg$c102 = "sampler2DRectshadow";
+ var peg$c103 = "isampler2DRect";
+ var peg$c104 = "usampler2DRect";
+ var peg$c105 = "samplerBuffer";
+ var peg$c106 = "isamplerBuffer";
+ var peg$c107 = "usamplerBuffer";
+ var peg$c108 = "samplerCubeArray";
+ var peg$c109 = "samplerCubeArrayShadow";
+ var peg$c110 = "isamplerCubeArray";
+ var peg$c111 = "usamplerCubeArray";
+ var peg$c112 = "sampler2DMS";
+ var peg$c113 = "isampler2DMS";
+ var peg$c114 = "usampler2DMS";
+ var peg$c115 = "sampler2DMSArray";
+ var peg$c116 = "isampler2DMSArray";
+ var peg$c117 = "usampler2DMSArray";
+ var peg$c118 = "image1D";
+ var peg$c119 = "iimage1D";
+ var peg$c120 = "uimage1D";
+ var peg$c121 = "image2D";
+ var peg$c122 = "iimage2D";
+ var peg$c123 = "uimage2D";
+ var peg$c124 = "image3D";
+ var peg$c125 = "iimage3D";
+ var peg$c126 = "uimage3D";
+ var peg$c127 = "image2DRect";
+ var peg$c128 = "iimage2DRect";
+ var peg$c129 = "uimage2DRect";
+ var peg$c130 = "imageCube";
+ var peg$c131 = "iimageCube";
+ var peg$c132 = "uimageCube";
+ var peg$c133 = "imageBuffer";
+ var peg$c134 = "iimageBuffer";
+ var peg$c135 = "uimageBuffer";
+ var peg$c136 = "image1DArray";
+ var peg$c137 = "iimage1DArray";
+ var peg$c138 = "uimage1DArray";
+ var peg$c139 = "image2DArray";
+ var peg$c140 = "iimage2DArray";
+ var peg$c141 = "uimage2DArray";
+ var peg$c142 = "imageCubeArray";
+ var peg$c143 = "iimageCubeArray";
+ var peg$c144 = "uimageCubeArray";
+ var peg$c145 = "image2DMS";
+ var peg$c146 = "iimage2DMS";
+ var peg$c147 = "uimage2DMS";
+ var peg$c148 = "image2DMArray";
+ var peg$c149 = "iimage2DMSArray";
+ var peg$c150 = "uimage2DMSArray";
+ var peg$c151 = "struct";
+ var peg$c152 = "void";
+ var peg$c153 = "while";
+ var peg$c154 = "invariant";
+ var peg$c155 = "precise";
+ var peg$c156 = "highp";
+ var peg$c157 = "mediump";
+ var peg$c158 = "lowp";
+ var peg$c159 = "precision";
+ var peg$c160 = "true";
+ var peg$c161 = "false";
+ var peg$c162 = "<<";
+ var peg$c163 = ">>";
+ var peg$c164 = "++";
+ var peg$c165 = "--";
+ var peg$c166 = "<=";
+ var peg$c167 = ">=";
+ var peg$c168 = "==";
+ var peg$c169 = "!=";
+ var peg$c170 = "&&";
+ var peg$c171 = "||";
+ var peg$c172 = "^^";
+ var peg$c173 = "*=";
+ var peg$c174 = "/=";
+ var peg$c175 = "+=";
+ var peg$c176 = "%=";
+ var peg$c177 = "<<=";
+ var peg$c178 = ">>=";
+ var peg$c179 = "&=";
+ var peg$c180 = "^=";
+ var peg$c181 = "|=";
+ var peg$c182 = "-=";
+ var peg$c183 = "(";
+ var peg$c184 = ")";
+ var peg$c185 = "[";
+ var peg$c186 = "]";
+ var peg$c187 = "{";
+ var peg$c188 = "}";
+ var peg$c189 = ".";
+ var peg$c190 = ",";
+ var peg$c191 = ":";
+ var peg$c192 = "=";
+ var peg$c193 = ";";
+ var peg$c194 = "!";
+ var peg$c195 = "-";
+ var peg$c196 = "~";
+ var peg$c197 = "+";
+ var peg$c198 = "*";
+ var peg$c199 = "/";
+ var peg$c200 = "%";
+ var peg$c201 = "<";
+ var peg$c202 = ">";
+ var peg$c203 = "|";
+ var peg$c204 = "^";
+ var peg$c205 = "&";
+ var peg$c206 = "?";
+ var peg$c207 = "0";
+ var peg$c208 = "lf";
+ var peg$c209 = "LF";
+ var peg$c210 = "#";
+ var peg$c211 = "//";
+ var peg$c212 = "/*";
+ var peg$c213 = "*/";
+
+ var peg$r0 = /^[A-Za-z_]/;
+ var peg$r1 = /^[A-Za-z_0-9]/;
+ var peg$r2 = /^[uU]/;
+ var peg$r3 = /^[1-9]/;
+ var peg$r4 = /^[0-7]/;
+ var peg$r5 = /^[xX]/;
+ var peg$r6 = /^[0-9a-fA-F]/;
+ var peg$r7 = /^[0-9]/;
+ var peg$r8 = /^[eE]/;
+ var peg$r9 = /^[+\-]/;
+ var peg$r10 = /^[fF]/;
+ var peg$r11 = /^[^\n]/;
+ var peg$r12 = /^[ \t\n\r]/;
+
+ var peg$e0 = peg$literalExpectation("attribute", false);
+ var peg$e1 = peg$literalExpectation("varying", false);
+ var peg$e2 = peg$literalExpectation("const", false);
+ var peg$e3 = peg$literalExpectation("bool", false);
+ var peg$e4 = peg$literalExpectation("float", false);
+ var peg$e5 = peg$literalExpectation("double", false);
+ var peg$e6 = peg$literalExpectation("int", false);
+ var peg$e7 = peg$literalExpectation("uint", false);
+ var peg$e8 = peg$literalExpectation("break", false);
+ var peg$e9 = peg$literalExpectation("continue", false);
+ var peg$e10 = peg$literalExpectation("do", false);
+ var peg$e11 = peg$literalExpectation("else", false);
+ var peg$e12 = peg$literalExpectation("for", false);
+ var peg$e13 = peg$literalExpectation("if", false);
+ var peg$e14 = peg$literalExpectation("discard", false);
+ var peg$e15 = peg$literalExpectation("return", false);
+ var peg$e16 = peg$literalExpectation("switch", false);
+ var peg$e17 = peg$literalExpectation("case", false);
+ var peg$e18 = peg$literalExpectation("default", false);
+ var peg$e19 = peg$literalExpectation("subroutine", false);
+ var peg$e20 = peg$literalExpectation("bvec2", false);
+ var peg$e21 = peg$literalExpectation("bvec3", false);
+ var peg$e22 = peg$literalExpectation("bvec4", false);
+ var peg$e23 = peg$literalExpectation("ivec2", false);
+ var peg$e24 = peg$literalExpectation("ivec3", false);
+ var peg$e25 = peg$literalExpectation("ivec4", false);
+ var peg$e26 = peg$literalExpectation("uvec2", false);
+ var peg$e27 = peg$literalExpectation("uvec3", false);
+ var peg$e28 = peg$literalExpectation("uvec4", false);
+ var peg$e29 = peg$literalExpectation("vec2", false);
+ var peg$e30 = peg$literalExpectation("vec3", false);
+ var peg$e31 = peg$literalExpectation("vec4", false);
+ var peg$e32 = peg$literalExpectation("mat2", false);
+ var peg$e33 = peg$literalExpectation("mat3", false);
+ var peg$e34 = peg$literalExpectation("mat4", false);
+ var peg$e35 = peg$literalExpectation("centroid", false);
+ var peg$e36 = peg$literalExpectation("in", false);
+ var peg$e37 = peg$literalExpectation("out", false);
+ var peg$e38 = peg$literalExpectation("inout", false);
+ var peg$e39 = peg$literalExpectation("uniform", false);
+ var peg$e40 = peg$literalExpectation("patch", false);
+ var peg$e41 = peg$literalExpectation("sample", false);
+ var peg$e42 = peg$literalExpectation("buffer", false);
+ var peg$e43 = peg$literalExpectation("shared", false);
+ var peg$e44 = peg$literalExpectation("coherent", false);
+ var peg$e45 = peg$literalExpectation("volatile", false);
+ var peg$e46 = peg$literalExpectation("restrict", false);
+ var peg$e47 = peg$literalExpectation("readonly", false);
+ var peg$e48 = peg$literalExpectation("writeonly", false);
+ var peg$e49 = peg$literalExpectation("dvec2", false);
+ var peg$e50 = peg$literalExpectation("dvec3", false);
+ var peg$e51 = peg$literalExpectation("dvec4", false);
+ var peg$e52 = peg$literalExpectation("dmat2", false);
+ var peg$e53 = peg$literalExpectation("dmat3", false);
+ var peg$e54 = peg$literalExpectation("dmat4", false);
+ var peg$e55 = peg$literalExpectation("noperspective", false);
+ var peg$e56 = peg$literalExpectation("flat", false);
+ var peg$e57 = peg$literalExpectation("smooth", false);
+ var peg$e58 = peg$literalExpectation("layout", false);
+ var peg$e59 = peg$literalExpectation("mat2x2", false);
+ var peg$e60 = peg$literalExpectation("mat2x3", false);
+ var peg$e61 = peg$literalExpectation("mat2x4", false);
+ var peg$e62 = peg$literalExpectation("mat3x2", false);
+ var peg$e63 = peg$literalExpectation("mat3x3", false);
+ var peg$e64 = peg$literalExpectation("mat3x4", false);
+ var peg$e65 = peg$literalExpectation("mat4x2", false);
+ var peg$e66 = peg$literalExpectation("mat4x3", false);
+ var peg$e67 = peg$literalExpectation("mat4x4", false);
+ var peg$e68 = peg$literalExpectation("dmat2x2", false);
+ var peg$e69 = peg$literalExpectation("dmat2x3", false);
+ var peg$e70 = peg$literalExpectation("dmat2x4", false);
+ var peg$e71 = peg$literalExpectation("dmat3x2", false);
+ var peg$e72 = peg$literalExpectation("dmat3x3", false);
+ var peg$e73 = peg$literalExpectation("dmat3x4", false);
+ var peg$e74 = peg$literalExpectation("dmat4x2", false);
+ var peg$e75 = peg$literalExpectation("dmat4x3", false);
+ var peg$e76 = peg$literalExpectation("dmat4x4", false);
+ var peg$e77 = peg$literalExpectation("atomic_uint", false);
+ var peg$e78 = peg$literalExpectation("sampler1D", false);
+ var peg$e79 = peg$literalExpectation("sampler2D", false);
+ var peg$e80 = peg$literalExpectation("sampler3D", false);
+ var peg$e81 = peg$literalExpectation("samplerCube", false);
+ var peg$e82 = peg$literalExpectation("sampler1DShadow", false);
+ var peg$e83 = peg$literalExpectation("sampler2DShadow", false);
+ var peg$e84 = peg$literalExpectation("samplerCubeShadow", false);
+ var peg$e85 = peg$literalExpectation("sampler1DArray", false);
+ var peg$e86 = peg$literalExpectation("sampler2DArray", false);
+ var peg$e87 = peg$literalExpectation("sampler1DArrayShadow", false);
+ var peg$e88 = peg$literalExpectation("sampler2DArrayshadow", false);
+ var peg$e89 = peg$literalExpectation("isampler1D", false);
+ var peg$e90 = peg$literalExpectation("isampler2D", false);
+ var peg$e91 = peg$literalExpectation("isampler3D", false);
+ var peg$e92 = peg$literalExpectation("isamplerCube", false);
+ var peg$e93 = peg$literalExpectation("isampler1Darray", false);
+ var peg$e94 = peg$literalExpectation("isampler2DArray", false);
+ var peg$e95 = peg$literalExpectation("usampler1D", false);
+ var peg$e96 = peg$literalExpectation("usampler2D", false);
+ var peg$e97 = peg$literalExpectation("usampler3D", false);
+ var peg$e98 = peg$literalExpectation("usamplerCube", false);
+ var peg$e99 = peg$literalExpectation("usampler1DArray", false);
+ var peg$e100 = peg$literalExpectation("usampler2DArray", false);
+ var peg$e101 = peg$literalExpectation("sampler2DRect", false);
+ var peg$e102 = peg$literalExpectation("sampler2DRectshadow", false);
+ var peg$e103 = peg$literalExpectation("isampler2DRect", false);
+ var peg$e104 = peg$literalExpectation("usampler2DRect", false);
+ var peg$e105 = peg$literalExpectation("samplerBuffer", false);
+ var peg$e106 = peg$literalExpectation("isamplerBuffer", false);
+ var peg$e107 = peg$literalExpectation("usamplerBuffer", false);
+ var peg$e108 = peg$literalExpectation("samplerCubeArray", false);
+ var peg$e109 = peg$literalExpectation("samplerCubeArrayShadow", false);
+ var peg$e110 = peg$literalExpectation("isamplerCubeArray", false);
+ var peg$e111 = peg$literalExpectation("usamplerCubeArray", false);
+ var peg$e112 = peg$literalExpectation("sampler2DMS", false);
+ var peg$e113 = peg$literalExpectation("isampler2DMS", false);
+ var peg$e114 = peg$literalExpectation("usampler2DMS", false);
+ var peg$e115 = peg$literalExpectation("sampler2DMSArray", false);
+ var peg$e116 = peg$literalExpectation("isampler2DMSArray", false);
+ var peg$e117 = peg$literalExpectation("usampler2DMSArray", false);
+ var peg$e118 = peg$literalExpectation("image1D", false);
+ var peg$e119 = peg$literalExpectation("iimage1D", false);
+ var peg$e120 = peg$literalExpectation("uimage1D", false);
+ var peg$e121 = peg$literalExpectation("image2D", false);
+ var peg$e122 = peg$literalExpectation("iimage2D", false);
+ var peg$e123 = peg$literalExpectation("uimage2D", false);
+ var peg$e124 = peg$literalExpectation("image3D", false);
+ var peg$e125 = peg$literalExpectation("iimage3D", false);
+ var peg$e126 = peg$literalExpectation("uimage3D", false);
+ var peg$e127 = peg$literalExpectation("image2DRect", false);
+ var peg$e128 = peg$literalExpectation("iimage2DRect", false);
+ var peg$e129 = peg$literalExpectation("uimage2DRect", false);
+ var peg$e130 = peg$literalExpectation("imageCube", false);
+ var peg$e131 = peg$literalExpectation("iimageCube", false);
+ var peg$e132 = peg$literalExpectation("uimageCube", false);
+ var peg$e133 = peg$literalExpectation("imageBuffer", false);
+ var peg$e134 = peg$literalExpectation("iimageBuffer", false);
+ var peg$e135 = peg$literalExpectation("uimageBuffer", false);
+ var peg$e136 = peg$literalExpectation("image1DArray", false);
+ var peg$e137 = peg$literalExpectation("iimage1DArray", false);
+ var peg$e138 = peg$literalExpectation("uimage1DArray", false);
+ var peg$e139 = peg$literalExpectation("image2DArray", false);
+ var peg$e140 = peg$literalExpectation("iimage2DArray", false);
+ var peg$e141 = peg$literalExpectation("uimage2DArray", false);
+ var peg$e142 = peg$literalExpectation("imageCubeArray", false);
+ var peg$e143 = peg$literalExpectation("iimageCubeArray", false);
+ var peg$e144 = peg$literalExpectation("uimageCubeArray", false);
+ var peg$e145 = peg$literalExpectation("image2DMS", false);
+ var peg$e146 = peg$literalExpectation("iimage2DMS", false);
+ var peg$e147 = peg$literalExpectation("uimage2DMS", false);
+ var peg$e148 = peg$literalExpectation("image2DMArray", false);
+ var peg$e149 = peg$literalExpectation("iimage2DMSArray", false);
+ var peg$e150 = peg$literalExpectation("uimage2DMSArray", false);
+ var peg$e151 = peg$literalExpectation("struct", false);
+ var peg$e152 = peg$literalExpectation("void", false);
+ var peg$e153 = peg$literalExpectation("while", false);
+ var peg$e154 = peg$literalExpectation("invariant", false);
+ var peg$e155 = peg$literalExpectation("precise", false);
+ var peg$e156 = peg$literalExpectation("highp", false);
+ var peg$e157 = peg$literalExpectation("mediump", false);
+ var peg$e158 = peg$literalExpectation("lowp", false);
+ var peg$e159 = peg$literalExpectation("precision", false);
+ var peg$e160 = peg$literalExpectation("true", false);
+ var peg$e161 = peg$literalExpectation("false", false);
+ var peg$e162 = peg$otherExpectation("keyword");
+ var peg$e163 = peg$literalExpectation("<<", false);
+ var peg$e164 = peg$literalExpectation(">>", false);
+ var peg$e165 = peg$literalExpectation("++", false);
+ var peg$e166 = peg$literalExpectation("--", false);
+ var peg$e167 = peg$literalExpectation("<=", false);
+ var peg$e168 = peg$literalExpectation(">=", false);
+ var peg$e169 = peg$literalExpectation("==", false);
+ var peg$e170 = peg$literalExpectation("!=", false);
+ var peg$e171 = peg$literalExpectation("&&", false);
+ var peg$e172 = peg$literalExpectation("||", false);
+ var peg$e173 = peg$literalExpectation("^^", false);
+ var peg$e174 = peg$literalExpectation("*=", false);
+ var peg$e175 = peg$literalExpectation("/=", false);
+ var peg$e176 = peg$literalExpectation("+=", false);
+ var peg$e177 = peg$literalExpectation("%=", false);
+ var peg$e178 = peg$literalExpectation("<<=", false);
+ var peg$e179 = peg$literalExpectation(">>=", false);
+ var peg$e180 = peg$literalExpectation("&=", false);
+ var peg$e181 = peg$literalExpectation("^=", false);
+ var peg$e182 = peg$literalExpectation("|=", false);
+ var peg$e183 = peg$literalExpectation("-=", false);
+ var peg$e184 = peg$literalExpectation("(", false);
+ var peg$e185 = peg$literalExpectation(")", false);
+ var peg$e186 = peg$literalExpectation("[", false);
+ var peg$e187 = peg$literalExpectation("]", false);
+ var peg$e188 = peg$literalExpectation("{", false);
+ var peg$e189 = peg$literalExpectation("}", false);
+ var peg$e190 = peg$literalExpectation(".", false);
+ var peg$e191 = peg$literalExpectation(",", false);
+ var peg$e192 = peg$literalExpectation(":", false);
+ var peg$e193 = peg$literalExpectation("=", false);
+ var peg$e194 = peg$literalExpectation(";", false);
+ var peg$e195 = peg$literalExpectation("!", false);
+ var peg$e196 = peg$literalExpectation("-", false);
+ var peg$e197 = peg$literalExpectation("~", false);
+ var peg$e198 = peg$literalExpectation("+", false);
+ var peg$e199 = peg$literalExpectation("*", false);
+ var peg$e200 = peg$literalExpectation("/", false);
+ var peg$e201 = peg$literalExpectation("%", false);
+ var peg$e202 = peg$literalExpectation("<", false);
+ var peg$e203 = peg$literalExpectation(">", false);
+ var peg$e204 = peg$literalExpectation("|", false);
+ var peg$e205 = peg$literalExpectation("^", false);
+ var peg$e206 = peg$literalExpectation("&", false);
+ var peg$e207 = peg$literalExpectation("?", false);
+ var peg$e208 = peg$classExpectation([["A", "Z"], ["a", "z"], "_"], false, false);
+ var peg$e209 = peg$classExpectation([["A", "Z"], ["a", "z"], "_", ["0", "9"]], false, false);
+ var peg$e210 = peg$classExpectation(["u", "U"], false, false);
+ var peg$e211 = peg$classExpectation([["1", "9"]], false, false);
+ var peg$e212 = peg$literalExpectation("0", false);
+ var peg$e213 = peg$classExpectation([["0", "7"]], false, false);
+ var peg$e214 = peg$classExpectation(["x", "X"], false, false);
+ var peg$e215 = peg$classExpectation([["0", "9"], ["a", "f"], ["A", "F"]], false, false);
+ var peg$e216 = peg$classExpectation([["0", "9"]], false, false);
+ var peg$e217 = peg$otherExpectation("exponent");
+ var peg$e218 = peg$classExpectation(["e", "E"], false, false);
+ var peg$e219 = peg$classExpectation(["+", "-"], false, false);
+ var peg$e220 = peg$classExpectation(["f", "F"], false, false);
+ var peg$e221 = peg$literalExpectation("lf", false);
+ var peg$e222 = peg$literalExpectation("LF", false);
+ var peg$e223 = peg$otherExpectation("primary expression");
+ var peg$e224 = peg$otherExpectation("unary expression");
+ var peg$e225 = peg$otherExpectation("equality expression");
+ var peg$e226 = peg$otherExpectation("and expression");
+ var peg$e227 = peg$otherExpectation("asignment");
+ var peg$e228 = peg$otherExpectation("expression");
+ var peg$e229 = peg$otherExpectation("precision statement");
+ var peg$e230 = peg$otherExpectation("function prototype");
+ var peg$e231 = peg$otherExpectation("function header");
+ var peg$e232 = peg$otherExpectation("function parameters");
+ var peg$e233 = peg$otherExpectation("parameter declaration");
+ var peg$e234 = peg$otherExpectation("parameter declarator");
+ var peg$e235 = peg$otherExpectation("single type qualifier");
+ var peg$e236 = peg$otherExpectation("interpolation qualifier");
+ var peg$e237 = peg$otherExpectation("storage qualifier");
+ var peg$e238 = peg$otherExpectation("type specifier");
+ var peg$e239 = peg$otherExpectation("array specifier");
+ var peg$e240 = peg$otherExpectation("precision qualifier");
+ var peg$e241 = peg$otherExpectation("struct specifier");
+ var peg$e242 = peg$otherExpectation("iteration statement");
+ var peg$e243 = peg$otherExpectation("jump statement");
+ var peg$e244 = peg$otherExpectation("prepocessor");
+ var peg$e245 = peg$literalExpectation("#", false);
+ var peg$e246 = peg$classExpectation(["\n"], true, false);
+ var peg$e247 = peg$otherExpectation("whitespace");
+ var peg$e248 = peg$literalExpectation("//", false);
+ var peg$e249 = peg$literalExpectation("/*", false);
+ var peg$e250 = peg$literalExpectation("*/", false);
+ var peg$e251 = peg$anyExpectation();
+ var peg$e252 = peg$classExpectation([" ", "\t", "\n", "\r"], false, false);
+
+ var peg$f0 = function(ws, program) {
+ return { type: 'program', ws, program, scopes };
+ };
+ var peg$f1 = function(token, t) { return node('keyword', { token, whitespace: t }); };
+ var peg$f2 = function(token, _) { return node('float_constant', { token, whitespace: _ }); };
+ var peg$f3 = function(token, _) { return node('double_constant', { token, whitespace: _ }); };
+ var peg$f4 = function(token, _) { return node('int_constant', { token, whitespace: _ }); };
+ var peg$f5 = function(token, _) { return node('uint_constant', { token, whitespace: _ }); };
+ var peg$f6 = function(token, _) { return node('bool_constant', { token, whitespace:_ }); };
+ var peg$f7 = function(token, _) { return node('literal', { literal: token, whitespace: _ }); };
+ var peg$f8 = function(identifier, _) { return node('identifier', { identifier, whitespace: _ }); };
+ var peg$f9 = function(ident) {
+ const { identifier } = ident;
+
+ // We do scope checking and parsing all in one pass. In the case of calling an
+ // undefined function, here, we don't know that we're in a function, so we
+ // can't warn appropriately. If we return false for the missing typename, the
+ // program won't parse, since the function call node won't match since it uses
+ // type_name for the function_identifier. So all we can do here is go on our
+ // merry way if the type isn't known.
+
+ // This only applies to structs. I'm not sure if it's right. Because TYPE_NAME
+ // is used in lots of places, it's easier to put this check here.
+ let found;
+ if(found = findTypeScope(scope, identifier)) {
+ addTypeReference(found, identifier, ident);
+ // I removed this because a type name reference here can't be renamed because
+ // it's just a string and we don't know the parent node. This might apply
+ // to the type reference above as well
+ // } else if(found = findFunctionScope(scope, identifier)) {
+ // addFunctionReference(found, identifier, identifier);
+ }
+
+ return ident;
+ };
+ var peg$f10 = function(lp, expression, rp) {
+ return node('group', { lp, expression, rp });
+ };
+ var peg$f11 = function(ident) {
+ const { identifier } = ident;
+ addBindingReference(scope, identifier, ident);
+ return ident;
+ };
+ var peg$f12 = function(body) {
+ // Postfix becomes a left associative tree
+ return body.flat().reduceRight((postfix, expr) =>
+ postfix ?
+ node('postfix', { expr, postfix }) :
+ expr
+ );
+ };
+ var peg$f13 = function(lb, expr, rb) {
+ return node('quantifier', { lb, expr, rb });
+ };
+ var peg$f14 = function(dot, selection) {
+ return node('field_selection', { dot, selection });
+ };
+ var peg$f15 = function(identifier, args, rp) {
+ // Warning: This may be brittle. The langauge spec says that a
+ // function_call name is a "type_specifier" which can be "float[3](...)"
+ // or a TYPE_NAME. If it's a TYPE_NAME, it will have an identifier, so
+ // add it to the referenced scope. If it's a constructor (the "float"
+ // case) it won't, so don't add a reference ot it
+ const fnName = (identifier.identifier.type === 'postfix') ?
+ identifier.identifier.expr.identifier.specifier.identifier :
+ identifier.identifier.specifier.identifier;
+
+ const n = node('function_call', { ...identifier, args, rp });
+
+ // struct constructors are stored in scope types, not scope functions,
+ // skip them (the isDeclaredType check)
+ if(fnName && !isDeclaredType(scope, fnName) && !builtIns.has(fnName)) {
+ if(!isDeclaredFunction(scope, fnName)) {
+ warn(`Warning: Function "${fnName}" has not been declared`);
+ }
+ addFunctionReference(scope, fnName, n);
+ }
+
+ return n;
+ };
+ var peg$f16 = function(v) {
+ return [v];
+ };
+ var peg$f17 = function(head, tail) {
+ // For convenience, we don't store commas as trees, but rather flatten
+ // into an array
+ return [head, ...tail.flat()];
+ };
+ var peg$f18 = function(head, suffix, lp) {
+ return { head: [head, suffix], lp };
+ };
+ var peg$f19 = function(identifier) {
+ return {
+ lp: identifier.lp,
+ identifier: [identifier.head].flat().reduceRight((postfix, expr) =>
+ postfix ?
+ node('postfix', { expr, postfix }) :
+ expr
+ )
+ };
+ };
+ var peg$f20 = function(identifier, lp, args, rp) {
+ return node('function_call', { identifier, lp, args, rp });
+ };
+ var peg$f21 = function(operator, expression) {
+ return node('unary', { operator, expression });
+ };
+ var peg$f22 = function(head, tail) {
+ return leftAssociate(head, tail);
+ };
+ var peg$f23 = function(expr, question, left, colon, right) {
+ return { question, left, right, colon };
+ };
+ var peg$f24 = function(expr, suffix) {
+ // ? and : operators are right associative, which happens automatically
+ // in pegjs grammar
+ return suffix ?
+ node('ternary', { expr, ...suffix }) :
+ expr
+ };
+ var peg$f25 = function(left, operator, right) {
+ return node('assignment', { left, operator, right });
+ };
+ var peg$f26 = function(declaration) {
+ return node(
+ 'declaration_statement',
+ {
+ declaration: declaration[0],
+ semi: declaration[1],
+ }
+ );
+ };
+ var peg$f27 = function(qualifiers, head, tail) {
+ return node(
+ 'qualifier_declarator',
+ {
+ qualifiers,
+ // Head is optional, so remove falsey
+ declarations: xnil([head, ...tail.map(t => t[1])]),
+ commas: tail.map(t => t[0])
+ }
+ );
+ };
+ var peg$f28 = function(qualifiers, interface_type, lp, declarations, rp, identifier) {
+ const n = node(
+ 'interface_declarator',
+ { qualifiers, interface_type, lp, declarations, rp, identifier }
+ );
+ createBindings(scope, [interface_type.identifier, n]);
+ return n;
+ };
+ var peg$f29 = function(prefix, qualifier, specifier) {
+ return node('precision', { prefix, qualifier, specifier });
+ };
+ var peg$f30 = function(header, params, rp) {
+ const bindings = (params?.parameters || [])
+ // Ignore any param without an identifier, aka main(void)
+ .filter(p => !!p.declaration.identifier)
+ .map(p => [p.declaration.identifier.identifier, p]);
+ createBindings(scope, ...bindings);
+ return node('function_prototype', { header, ...params, rp });
+ };
+ var peg$f31 = function(returnType, name, lp) {
+ const n = node(
+ 'function_header',
+ { returnType, name, lp }
+ );
+ addFunctionReference(scope, name.identifier, n);
+ scope = pushScope(makeScope(name.identifier, scope));
+ return n;
+ };
+ var peg$f32 = function(head, tail) {
+ return {
+ parameters: [head, ...tail.map(t => t[1])],
+ commas: tail.map(t => t[0])
+ }
+ };
+ var peg$f33 = function(qualifier, declaration) {
+ return node(
+ 'parameter_declaration',
+ { qualifier, declaration }
+ );
+ };
+ var peg$f34 = function(specifier, identifier, quantifier) {
+ return node(
+ 'parameter_declarator',
+ { specifier, identifier, quantifier }
+ );
+ };
+ var peg$f35 = function(head, tail) {
+ const declarations = [
+ head.declaration, ...tail.map(t => t[1])
+ ].filter(decl => !!decl.identifier);
+
+ createBindings(scope, ...declarations.map(decl => [decl.identifier.identifier, decl]));
+
+ // TODO: I might need to start storing node parents for easy traversal
+ return node(
+ 'declarator_list',
+ {
+ specified_type: head.specified_type,
+ declarations,
+ commas: tail.map(t => t[0])
+ }
+ );
+ };
+ var peg$f36 = function(identifier, quantifier, suffix) {
+ const [operator, initializer] = suffix || [];
+ return node(
+ 'declaration',
+ { identifier, quantifier, operator, initializer }
+ );
+ };
+ var peg$f37 = function(specified_type, suffix) {
+ // No gaurantee of a suffix because fully_specified_type contains a
+ // type_specifier which includes structs and type_names (IDENTIFIERs)
+ const [identifier, quantifier, suffix_tail] = suffix || [];
+ const [operator, initializer] = suffix_tail || [];
+
+ // Break out the specified type so it can be grouped into the
+ // declarator_list
+ return {
+ declaration: node(
+ 'declaration',
+ { identifier, quantifier, operator, initializer }
+ ),
+ specified_type
+ };
+ };
+ var peg$f38 = function(qualifiers, specifier) {
+ return node(
+ 'fully_specified_type',
+ { qualifiers, specifier }
+ );
+ };
+ var peg$f39 = function(layout, lp, head, tail) {
+ return {
+ qualifiers: [head, ...tail.map(t => t[1])],
+ commas: tail.map(t => t[0])
+ };
+ };
+ var peg$f40 = function(layout, lp, qualifiers, rp) {
+ return node(
+ 'layout_qualifier',
+ { layout, lp, ...qualifiers, rp }
+ );
+ };
+ var peg$f41 = function(identifier, tail) {
+ const [operator, expression] = tail || [];
+ return node('layout_qualifier_id', { identifier, operator, expression });
+ };
+ var peg$f42 = function(subroutine, lp, head, tail, rp) {
+ return {
+ lp,
+ type_names: [head, ...tail.map(t => t[1])],
+ commas: tail.map(t => t[0]),
+ rp,
+ };
+ };
+ var peg$f43 = function(subroutine, type_names) {
+ return node(
+ 'subroutine_qualifier',
+ {
+ subroutine,
+ ...type_names,
+ }
+ );
+ };
+ var peg$f44 = function(specifier, quantifier) {
+ return node('type_specifier', { specifier, quantifier });
+ };
+ var peg$f45 = function(lb, expression, rb) {
+ return node('array_specifier', { lb, expression, rb });
+ };
+ var peg$f46 = function(specifiers) {
+ return node('array_specifiers', { specifiers });
+ };
+ var peg$f47 = function(struct, typeName, lb, declarations, rb) {
+ const n = node('struct', { lb, declarations, rb, struct, typeName });
+ // Anonymous structs don't get a type name
+ if(typeName) {
+ addTypes(scope, [typeName.identifier, n]);
+
+ // Struct names also become constructors for functions. Needing to track
+ // this as both a type and a function makes me think my scope data model
+ // is probably wrong
+ // addFunctionReference(scope, typeName.identifier, n);
+ }
+ return n;
+ };
+ var peg$f48 = function(declaration, semi) {
+ return node('struct_declaration', { declaration, semi });
+ };
+ var peg$f49 = function(specified_type, head, tail) {
+ return node(
+ 'struct_declarator',
+ {
+ specified_type,
+ declarations: [head, ...tail.map(t => t[1])],
+ commas: tail.map(t => t[0])
+ }
+ );
+ };
+ var peg$f50 = function(identifier, quantifier) {
+ return node('quantified_identifier', { identifier, quantifier });
+ };
+ var peg$f51 = function(lb, head, tail, trailing, rb) {
+ // TODO: Scope
+ return node(
+ 'initializer_list',
+ {
+ lb,
+ initializers: [head, ...tail.map(t => t[1])],
+ commas: xnil(tail.map(t => t[0]), trailing),
+ rb
+ }
+ );
+ };
+ var peg$f52 = function(sym) {
+ // Apparently peggy can't handle an open curly brace in a string
+ scope = pushScope(makeScope(OPEN_CURLY, scope));
+ return sym;
+ };
+ var peg$f53 = function(lb, statements, rb) {
+ scope = popScope(scope);
+ return node(
+ 'compound_statement',
+ { lb, statements: (statements || []).flat(), rb }
+ );
+ };
+ var peg$f54 = function(lb, statements, rb) {
+ return node(
+ 'compound_statement',
+ { lb, statements: (statements || []).flat(), rb }
+ );
+ };
+ var peg$f55 = function(expression, semi) {
+ return node('expression_statement', { expression, semi });
+ };
+ var peg$f56 = function(ifSymbol, lp, condition, rp, tail) {
+ const [body, elseBranch] = tail;
+ return node(
+ 'if_statement',
+ {
+ 'if': ifSymbol,
+ body,
+ lp,
+ condition,
+ rp,
+ ...elseBranch && { 'else': elseBranch.flat() },
+ });
+ };
+ var peg$f57 = function(switchSymbol, lp, expression, rp, lb, statements, rb) {
+ // TODO: Scope?
+ return node(
+ 'switch_statement',
+ {
+ switch: switchSymbol,
+ lp,
+ expression,
+ rp,
+ lb,
+ cases: groupCases(statements),
+ rb
+ }
+ );
+ };
+ var peg$f58 = function(caseSymbol, test, colon) {
+ return node('case_label', { 'case': caseSymbol, test, colon });
+ };
+ var peg$f59 = function(defaultSymbol, colon) {
+ return node('default_label', { default: defaultSymbol, colon });
+ };
+ var peg$f60 = function(sym) {
+ scope = pushScope(makeScope('while', scope));
+ return sym;
+ };
+ var peg$f61 = function(whileSymbol, lp, condition, rp, body) {
+ scope = popScope(scope);
+ return node(
+ 'while_statement',
+ {
+ while: whileSymbol,
+ lp,
+ condition,
+ rp,
+ body
+ }
+ );
+ };
+ var peg$f62 = function(doSymbol, body, whileSymbol, lp, expression, rp, semi) {
+ return node(
+ 'do_statement',
+ {
+ do: doSymbol,
+ body,
+ while: whileSymbol,
+ lp,
+ expression,
+ rp,
+ semi
+ }
+ );
+ };
+ var peg$f63 = function(sym) {
+ scope = pushScope(makeScope('for', scope));
+ return sym;
+ };
+ var peg$f64 = function(forSymbol, lp, init, condition, conditionSemi, operation, rp, body) {
+ scope = popScope(scope);
+ return node(
+ 'for_statement',
+ {
+ 'for': forSymbol,
+ body,
+ lp,
+ init: init.expression || init.declaration,
+ initSemi: init.semi,
+ condition,
+ conditionSemi,
+ operation,
+ rp,
+ body
+ }
+ );
+ };
+ var peg$f65 = function(specified_type, identifier, op, initializer) {
+ const n = node(
+ 'condition_expression',
+ { specified_type, identifier, op, initializer }
+ );
+ createBindings(scope, [identifier.identifier, n]);
+ return n;
+ };
+ var peg$f66 = function(jump, semi) {
+ return node('continue_statement', { continue: jump, semi });
+ };
+ var peg$f67 = function(jump, semi) {
+ return node('break_statement', { break: jump, semi });
+ };
+ var peg$f68 = function(jump, expression, semi) {
+ return node('return_statement', { return: jump, expression, semi });
+ };
+ var peg$f69 = function(jump, semi) { // Fragment shader only.
+ return node('discard_statement', { discard: jump, semi });
+ };
+ var peg$f70 = function(line, _) { return node('preprocessor', { line, _ }); };
+ var peg$f71 = function(prototype, body) {
+ const n = node('function', { prototype, body });
+ scope = popScope(scope);
+ // addFunctionReference(scope, prototype.header.name.identifier, n);
+ return n;
+ };
+ var peg$f72 = function(w, rest) {
+ return collapse(w, rest);
+ };
+ var peg$f73 = function(a, x, cc) { return xnil(x, cc); };
+ var peg$f74 = function(a, d) { return xnil(a, d.flat()); };
+ var peg$f75 = function(i) { return i; };
+ var peg$f76 = function(_) { return _; };
+
+ var peg$currPos = 0;
+ var peg$savedPos = 0;
+ var peg$posDetailsCache = [{ line: 1, column: 1 }];
+ var peg$maxFailPos = 0;
+ var peg$maxFailExpected = [];
+ var peg$silentFails = 0;
+
+ var peg$resultsCache = {};
+
+ var peg$result;
+
+ if ("startRule" in options) {
+ if (!(options.startRule in peg$startRuleFunctions)) {
+ throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
+ }
+
+ peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
+ }
+
+ function text() {
+ return input.substring(peg$savedPos, peg$currPos);
+ }
+
+ function offset() {
+ return peg$savedPos;
+ }
+
+ function range() {
+ return {
+ source: peg$source,
+ start: peg$savedPos,
+ end: peg$currPos
+ };
+ }
+
+ function location() {
+ return peg$computeLocation(peg$savedPos, peg$currPos);
+ }
+
+ function expected(description, location) {
+ location = location !== undefined
+ ? location
+ : peg$computeLocation(peg$savedPos, peg$currPos);
+
+ throw peg$buildStructuredError(
+ [peg$otherExpectation(description)],
+ input.substring(peg$savedPos, peg$currPos),
+ location
+ );
+ }
+
+ function error(message, location) {
+ location = location !== undefined
+ ? location
+ : peg$computeLocation(peg$savedPos, peg$currPos);
+
+ throw peg$buildSimpleError(message, location);
+ }
+
+ function peg$literalExpectation(text, ignoreCase) {
+ return { type: "literal", text: text, ignoreCase: ignoreCase };
+ }
+
+ function peg$classExpectation(parts, inverted, ignoreCase) {
+ return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
+ }
+
+ function peg$anyExpectation() {
+ return { type: "any" };
+ }
+
+ function peg$endExpectation() {
+ return { type: "end" };
+ }
+
+ function peg$otherExpectation(description) {
+ return { type: "other", description: description };
+ }
+
+ function peg$computePosDetails(pos) {
+ var details = peg$posDetailsCache[pos];
+ var p;
+
+ if (details) {
+ return details;
+ } else {
+ p = pos - 1;
+ while (!peg$posDetailsCache[p]) {
+ p--;
+ }
+
+ details = peg$posDetailsCache[p];
+ details = {
+ line: details.line,
+ column: details.column
+ };
+
+ while (p < pos) {
+ if (input.charCodeAt(p) === 10) {
+ details.line++;
+ details.column = 1;
+ } else {
+ details.column++;
+ }
+
+ p++;
+ }
+
+ peg$posDetailsCache[pos] = details;
+
+ return details;
+ }
+ }
+
+ function peg$computeLocation(startPos, endPos) {
+ var startPosDetails = peg$computePosDetails(startPos);
+ var endPosDetails = peg$computePosDetails(endPos);
+
+ return {
+ source: peg$source,
+ start: {
+ offset: startPos,
+ line: startPosDetails.line,
+ column: startPosDetails.column
+ },
+ end: {
+ offset: endPos,
+ line: endPosDetails.line,
+ column: endPosDetails.column
+ }
+ };
+ }
+
+ function peg$fail(expected) {
+ if (peg$currPos < peg$maxFailPos) { return; }
+
+ if (peg$currPos > peg$maxFailPos) {
+ peg$maxFailPos = peg$currPos;
+ peg$maxFailExpected = [];
+ }
+
+ peg$maxFailExpected.push(expected);
+ }
+
+ function peg$buildSimpleError(message, location) {
+ return new peg$SyntaxError(message, null, null, location);
+ }
+
+ function peg$buildStructuredError(expected, found, location) {
+ return new peg$SyntaxError(
+ peg$SyntaxError.buildMessage(expected, found),
+ expected,
+ found,
+ location
+ );
+ }
+
+ function peg$parsestart() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 0;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parse_();
+ s2 = peg$parsetranslation_unit();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f0(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseATTRIBUTE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 1;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c0) {
+ s1 = peg$c0;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e0); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVARYING() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 2;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c1) {
+ s1 = peg$c1;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e1); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCONST() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 3;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c2) {
+ s1 = peg$c2;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e2); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBOOL() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 4;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c3) {
+ s1 = peg$c3;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e3); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseFLOAT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 5;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c4) {
+ s1 = peg$c4;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e4); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDOUBLE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 6;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c5) {
+ s1 = peg$c5;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e5); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 7;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c6) {
+ s1 = peg$c6;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e6); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUINT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 8;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c7) {
+ s1 = peg$c7;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e7); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBREAK() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 9;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c8) {
+ s1 = peg$c8;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e8); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCONTINUE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 10;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c9) {
+ s1 = peg$c9;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e9); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDO() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 11;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c10) {
+ s1 = peg$c10;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e10); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseELSE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 12;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c11) {
+ s1 = peg$c11;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e11); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseFOR() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 13;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c12) {
+ s1 = peg$c12;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e12); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIF() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 14;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c13) {
+ s1 = peg$c13;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e13); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDISCARD() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 15;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c14) {
+ s1 = peg$c14;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e14); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRETURN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 16;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c15) {
+ s1 = peg$c15;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e15); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSWITCH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 17;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c16) {
+ s1 = peg$c16;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e16); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCASE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 18;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c17) {
+ s1 = peg$c17;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e17); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDEFAULT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 19;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c18) {
+ s1 = peg$c18;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e18); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSUBROUTINE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 20;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c19) {
+ s1 = peg$c19;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e19); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 21;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c20) {
+ s1 = peg$c20;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e20); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 22;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c21) {
+ s1 = peg$c21;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e21); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 23;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c22) {
+ s1 = peg$c22;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e22); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 24;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c23) {
+ s1 = peg$c23;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e23); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 25;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c24) {
+ s1 = peg$c24;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e24); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 26;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c25) {
+ s1 = peg$c25;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e25); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 27;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c26) {
+ s1 = peg$c26;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e26); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 28;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c27) {
+ s1 = peg$c27;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e27); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 29;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c28) {
+ s1 = peg$c28;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e28); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 30;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c29) {
+ s1 = peg$c29;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e29); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 31;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c30) {
+ s1 = peg$c30;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e30); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 32;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c31) {
+ s1 = peg$c31;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e31); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 33;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c32) {
+ s1 = peg$c32;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e32); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 34;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c33) {
+ s1 = peg$c33;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e33); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 35;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c34) {
+ s1 = peg$c34;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e34); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCENTROID() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 36;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c35) {
+ s1 = peg$c35;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e35); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 37;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c36) {
+ s1 = peg$c36;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e36); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseOUT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 38;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c37) {
+ s1 = peg$c37;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e37); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINOUT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 39;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c38) {
+ s1 = peg$c38;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e38); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUNIFORM() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 40;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c39) {
+ s1 = peg$c39;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e39); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePATCH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 41;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c40) {
+ s1 = peg$c40;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e40); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 42;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c41) {
+ s1 = peg$c41;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e41); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 43;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c42) {
+ s1 = peg$c42;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e42); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSHARED() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 44;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c43) {
+ s1 = peg$c43;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e43); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCOHERENT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 45;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c44) {
+ s1 = peg$c44;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e44); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVOLATILE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 46;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c45) {
+ s1 = peg$c45;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e45); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRESTRICT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 47;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c46) {
+ s1 = peg$c46;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e46); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseREADONLY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 48;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c47) {
+ s1 = peg$c47;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e47); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseWRITEONLY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 49;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c48) {
+ s1 = peg$c48;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e48); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDVEC2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 50;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c49) {
+ s1 = peg$c49;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e49); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDVEC3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 51;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c50) {
+ s1 = peg$c50;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e50); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDVEC4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 52;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c51) {
+ s1 = peg$c51;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e51); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 53;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c52) {
+ s1 = peg$c52;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e52); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 54;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c53) {
+ s1 = peg$c53;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e53); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 55;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c54) {
+ s1 = peg$c54;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e54); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseNOPERSPECTIVE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 56;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c55) {
+ s1 = peg$c55;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e55); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseFLAT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 57;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c56) {
+ s1 = peg$c56;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e56); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSMOOTH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 58;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c57) {
+ s1 = peg$c57;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e57); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLAYOUT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 59;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c58) {
+ s1 = peg$c58;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e58); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT2X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 60;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c59) {
+ s1 = peg$c59;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e59); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT2X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 61;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c60) {
+ s1 = peg$c60;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e60); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT2X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 62;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c61) {
+ s1 = peg$c61;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e61); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT3X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 63;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c62) {
+ s1 = peg$c62;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e62); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT3X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 64;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c63) {
+ s1 = peg$c63;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e63); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT3X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 65;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c64) {
+ s1 = peg$c64;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e64); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT4X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 66;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c65) {
+ s1 = peg$c65;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e65); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT4X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 67;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c66) {
+ s1 = peg$c66;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e66); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMAT4X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 68;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c67) {
+ s1 = peg$c67;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e67); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT2X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 69;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c68) {
+ s1 = peg$c68;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e68); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT2X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 70;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c69) {
+ s1 = peg$c69;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e69); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT2X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 71;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c70) {
+ s1 = peg$c70;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e70); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT3X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 72;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c71) {
+ s1 = peg$c71;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e71); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT3X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 73;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c72) {
+ s1 = peg$c72;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e72); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT3X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 74;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c73) {
+ s1 = peg$c73;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e73); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT4X2() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 75;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c74) {
+ s1 = peg$c74;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e74); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT4X3() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 76;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c75) {
+ s1 = peg$c75;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e75); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDMAT4X4() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 77;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c76) {
+ s1 = peg$c76;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e76); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseATOMIC_UINT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 78;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c77) {
+ s1 = peg$c77;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e77); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 79;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c78) {
+ s1 = peg$c78;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e78); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 80;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c79) {
+ s1 = peg$c79;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e79); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 81;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c80) {
+ s1 = peg$c80;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e80); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERCUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 82;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c81) {
+ s1 = peg$c81;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e81); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER1DSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 83;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c82) {
+ s1 = peg$c82;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e82); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 84;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c83) {
+ s1 = peg$c83;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e83); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERCUBESHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 85;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c84) {
+ s1 = peg$c84;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e84); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 86;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c85) {
+ s1 = peg$c85;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e85); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 87;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c86) {
+ s1 = peg$c86;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e86); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER1DARRAYSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 88;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 20) === peg$c87) {
+ s1 = peg$c87;
+ peg$currPos += 20;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e87); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DARRAYSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 89;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 20) === peg$c88) {
+ s1 = peg$c88;
+ peg$currPos += 20;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e88); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 90;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c89) {
+ s1 = peg$c89;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e89); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 91;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c90) {
+ s1 = peg$c90;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e90); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 92;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c91) {
+ s1 = peg$c91;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e91); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLERCUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 93;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c92) {
+ s1 = peg$c92;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e92); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 94;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c93) {
+ s1 = peg$c93;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e93); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 95;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c94) {
+ s1 = peg$c94;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e94); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 96;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c95) {
+ s1 = peg$c95;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e95); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 97;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c96) {
+ s1 = peg$c96;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e96); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 98;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c97) {
+ s1 = peg$c97;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e97); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLERCUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 99;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c98) {
+ s1 = peg$c98;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e98); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 100;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c99) {
+ s1 = peg$c99;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e99); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 101;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c100) {
+ s1 = peg$c100;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e100); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 102;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c101) {
+ s1 = peg$c101;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e101); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DRECTSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 103;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 19) === peg$c102) {
+ s1 = peg$c102;
+ peg$currPos += 19;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e102); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 104;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c103) {
+ s1 = peg$c103;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e103); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 105;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c104) {
+ s1 = peg$c104;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e104); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 106;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c105) {
+ s1 = peg$c105;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e105); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLERBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 107;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c106) {
+ s1 = peg$c106;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e106); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLERBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 108;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c107) {
+ s1 = peg$c107;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e107); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERCUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 109;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 16) === peg$c108) {
+ s1 = peg$c108;
+ peg$currPos += 16;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e108); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLERCUBEARRAYSHADOW() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 110;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 22) === peg$c109) {
+ s1 = peg$c109;
+ peg$currPos += 22;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e109); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLERCUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 111;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c110) {
+ s1 = peg$c110;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e110); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLERCUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 112;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c111) {
+ s1 = peg$c111;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e111); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 113;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c112) {
+ s1 = peg$c112;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e112); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 114;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c113) {
+ s1 = peg$c113;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e113); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 115;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c114) {
+ s1 = peg$c114;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e114); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSAMPLER2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 116;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 16) === peg$c115) {
+ s1 = peg$c115;
+ peg$currPos += 16;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e115); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseISAMPLER2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 117;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c116) {
+ s1 = peg$c116;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e116); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUSAMPLER2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 118;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 17) === peg$c117) {
+ s1 = peg$c117;
+ peg$currPos += 17;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e117); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 119;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c118) {
+ s1 = peg$c118;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e118); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 120;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c119) {
+ s1 = peg$c119;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e119); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE1D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 121;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c120) {
+ s1 = peg$c120;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e120); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 122;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c121) {
+ s1 = peg$c121;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e121); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 123;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c122) {
+ s1 = peg$c122;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e122); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 124;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c123) {
+ s1 = peg$c123;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e123); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 125;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c124) {
+ s1 = peg$c124;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e124); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 126;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c125) {
+ s1 = peg$c125;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e125); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE3D() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 127;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 8) === peg$c126) {
+ s1 = peg$c126;
+ peg$currPos += 8;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e126); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 128;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c127) {
+ s1 = peg$c127;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e127); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 129;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c128) {
+ s1 = peg$c128;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e128); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2DRECT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 130;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c129) {
+ s1 = peg$c129;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e129); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGECUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 131;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c130) {
+ s1 = peg$c130;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e130); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGECUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 132;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c131) {
+ s1 = peg$c131;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e131); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGECUBE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 133;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c132) {
+ s1 = peg$c132;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e132); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGEBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 134;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 11) === peg$c133) {
+ s1 = peg$c133;
+ peg$currPos += 11;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e133); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGEBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 135;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c134) {
+ s1 = peg$c134;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e134); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGEBUFFER() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 136;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c135) {
+ s1 = peg$c135;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e135); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 137;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c136) {
+ s1 = peg$c136;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e136); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 138;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c137) {
+ s1 = peg$c137;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e137); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE1DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 139;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c138) {
+ s1 = peg$c138;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e138); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 140;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 12) === peg$c139) {
+ s1 = peg$c139;
+ peg$currPos += 12;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e139); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 141;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c140) {
+ s1 = peg$c140;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e140); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2DARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 142;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c141) {
+ s1 = peg$c141;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e141); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGECUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 143;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 14) === peg$c142) {
+ s1 = peg$c142;
+ peg$currPos += 14;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e142); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGECUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 144;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c143) {
+ s1 = peg$c143;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e143); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGECUBEARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 145;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c144) {
+ s1 = peg$c144;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e144); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 146;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c145) {
+ s1 = peg$c145;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e145); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 147;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c146) {
+ s1 = peg$c146;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e146); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2DMS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 148;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 10) === peg$c147) {
+ s1 = peg$c147;
+ peg$currPos += 10;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e147); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIMAGE2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 149;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 13) === peg$c148) {
+ s1 = peg$c148;
+ peg$currPos += 13;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e148); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIIMAGE2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 150;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c149) {
+ s1 = peg$c149;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e149); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUIMAGE2DMSARRAY() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 151;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 15) === peg$c150) {
+ s1 = peg$c150;
+ peg$currPos += 15;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e150); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSTRUCT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 152;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 6) === peg$c151) {
+ s1 = peg$c151;
+ peg$currPos += 6;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e151); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVOID() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 153;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c152) {
+ s1 = peg$c152;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e152); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseWHILE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 154;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c153) {
+ s1 = peg$c153;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e153); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINVARIANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 155;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c154) {
+ s1 = peg$c154;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e154); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePRECISE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 156;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c155) {
+ s1 = peg$c155;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e155); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseHIGH_PRECISION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 157;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 5) === peg$c156) {
+ s1 = peg$c156;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e156); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMEDIUM_PRECISION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 158;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 7) === peg$c157) {
+ s1 = peg$c157;
+ peg$currPos += 7;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e157); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLOW_PRECISION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 159;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c158) {
+ s1 = peg$c158;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e158); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePRECISION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 160;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 9) === peg$c159) {
+ s1 = peg$c159;
+ peg$currPos += 9;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e159); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseterminal();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f1(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseFLOATCONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 161;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefloating_constant();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f2(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDOUBLECONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 162;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefloating_constant();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f3(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINTCONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 163;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseinteger_constant();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f4(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseUINTCONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 164;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseinteger_constant();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f5(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBOOLCONSTANT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 165;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 4) === peg$c160) {
+ s1 = peg$c160;
+ peg$currPos += 4;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e160); }
+ }
+ if (s1 === peg$FAILED) {
+ if (input.substr(peg$currPos, 5) === peg$c161) {
+ s1 = peg$c161;
+ peg$currPos += 5;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e161); }
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f6(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsekeyword() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 166;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseATTRIBUTE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVARYING();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCONST();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBOOL();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFLOAT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDOUBLE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBREAK();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCONTINUE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDO();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseELSE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFOR();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIF();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDISCARD();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRETURN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSWITCH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCASE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDEFAULT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSUBROUTINE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCENTROID();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUNIFORM();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePATCH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSHARED();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCOHERENT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVOLATILE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRESTRICT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseREADONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseWRITEONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseNOPERSPECTIVE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFLAT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSMOOTH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseLAYOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseATOMIC_UINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBESHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DRECTSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBEARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSTRUCT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVOID();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseWHILE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINVARIANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePRECISE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseHIGH_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMEDIUM_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseLOW_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePRECISION();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e162); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 167;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c162) {
+ s1 = peg$c162;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e163); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 168;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c163) {
+ s1 = peg$c163;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e164); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseINC_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 169;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c164) {
+ s1 = peg$c164;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e165); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDEC_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 170;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c165) {
+ s1 = peg$c165;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e166); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLE_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 171;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c166) {
+ s1 = peg$c166;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e167); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseGE_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 172;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c167) {
+ s1 = peg$c167;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e168); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseEQ_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 173;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c168) {
+ s1 = peg$c168;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e169); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseNE_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 174;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c169) {
+ s1 = peg$c169;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e170); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseAND_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 175;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c170) {
+ s1 = peg$c170;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e171); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseOR_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 176;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c171) {
+ s1 = peg$c171;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e172); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseXOR_OP() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 177;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c172) {
+ s1 = peg$c172;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e173); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMUL_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 178;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c173) {
+ s1 = peg$c173;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e174); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDIV_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 179;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c174) {
+ s1 = peg$c174;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e175); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseADD_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 180;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c175) {
+ s1 = peg$c175;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e176); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseMOD_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 181;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c176) {
+ s1 = peg$c176;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e177); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 182;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c177) {
+ s1 = peg$c177;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e178); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 183;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 3) === peg$c178) {
+ s1 = peg$c178;
+ peg$currPos += 3;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e179); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseAND_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 184;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c179) {
+ s1 = peg$c179;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e180); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseXOR_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 185;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c180) {
+ s1 = peg$c180;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e181); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseOR_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 186;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c181) {
+ s1 = peg$c181;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e182); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSUB_ASSIGN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 187;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c182) {
+ s1 = peg$c182;
+ peg$currPos += 2;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e183); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_PAREN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 188;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 40) {
+ s1 = peg$c183;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e184); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_PAREN() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 189;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 41) {
+ s1 = peg$c184;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e185); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_BRACKET() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 190;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 91) {
+ s1 = peg$c185;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e186); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_BRACKET() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 191;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 93) {
+ s1 = peg$c186;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e187); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_BRACE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 192;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 123) {
+ s1 = peg$c187;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e188); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_BRACE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 193;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 125) {
+ s1 = peg$c188;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e189); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDOT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 194;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 46) {
+ s1 = peg$c189;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e190); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCOMMA() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 195;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 44) {
+ s1 = peg$c190;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e191); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCOLON() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 196;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 58) {
+ s1 = peg$c191;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e192); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseEQUAL() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 197;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 61) {
+ s1 = peg$c192;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e193); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSEMICOLON() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 198;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 59) {
+ s1 = peg$c193;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e194); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseBANG() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 199;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 33) {
+ s1 = peg$c194;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e195); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseDASH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 200;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 45) {
+ s1 = peg$c195;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e196); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseTILDE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 201;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 126) {
+ s1 = peg$c196;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e197); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePLUS() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 202;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 43) {
+ s1 = peg$c197;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e198); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSTAR() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 203;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 42) {
+ s1 = peg$c198;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e199); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseSLASH() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 204;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 47) {
+ s1 = peg$c199;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e200); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsePERCENT() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 205;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 37) {
+ s1 = peg$c200;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e201); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseLEFT_ANGLE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 206;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 60) {
+ s1 = peg$c201;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e202); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseRIGHT_ANGLE() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 207;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 62) {
+ s1 = peg$c202;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e203); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseVERTICAL_BAR() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 208;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 124) {
+ s1 = peg$c203;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e204); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseCARET() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 209;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 94) {
+ s1 = peg$c204;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e205); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseAMPERSAND() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 210;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 38) {
+ s1 = peg$c205;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e206); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseQUESTION() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 211;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 63) {
+ s1 = peg$c206;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e207); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f7(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseIDENTIFIER() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 212;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ peg$silentFails++;
+ s2 = peg$parsekeyword();
+ peg$silentFails--;
+ if (s2 === peg$FAILED) {
+ s1 = undefined;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$currPos;
+ if (peg$r0.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e208); }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = [];
+ if (peg$r1.test(input.charAt(peg$currPos))) {
+ s6 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e209); }
+ }
+ while (s6 !== peg$FAILED) {
+ s5.push(s6);
+ if (peg$r1.test(input.charAt(peg$currPos))) {
+ s6 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e209); }
+ }
+ }
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ if (s3 !== peg$FAILED) {
+ s2 = input.substring(s2, peg$currPos);
+ } else {
+ s2 = s3;
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f8(s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseTYPE_NAME() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 213;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ peg$silentFails++;
+ s2 = peg$parsekeyword();
+ peg$silentFails--;
+ if (s2 === peg$FAILED) {
+ s1 = undefined;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f9(s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinteger_constant() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 214;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsedecimal_constant();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseinteger_suffix();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parseoctal_constant();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseinteger_suffix();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsehexadecimal_constant();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseinteger_suffix();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinteger_suffix() {
+ var s0;
+
+ var key = peg$currPos * 305 + 215;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ if (peg$r2.test(input.charAt(peg$currPos))) {
+ s0 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e210); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedecimal_constant() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 216;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ if (peg$r3.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e211); }
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$parsedigit();
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$parsedigit();
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseoctal_constant() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 217;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 48) {
+ s1 = peg$c207;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e212); }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ if (peg$r4.test(input.charAt(peg$currPos))) {
+ s3 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e213); }
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ if (peg$r4.test(input.charAt(peg$currPos))) {
+ s3 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e213); }
+ }
+ }
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsehexadecimal_constant() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 218;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 48) {
+ s1 = peg$c207;
+ peg$currPos++;
+ } else {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e212); }
+ }
+ if (s1 !== peg$FAILED) {
+ if (peg$r5.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e214); }
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ if (peg$r6.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e215); }
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ if (peg$r6.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e215); }
+ }
+ }
+ s1 = [s1, s2, s3];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedigit() {
+ var s0;
+
+ var key = peg$currPos * 305 + 219;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ if (peg$r7.test(input.charAt(peg$currPos))) {
+ s0 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e216); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefloating_constant() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 220;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsefractional_constant();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexponent_part();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parsefloating_suffix();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsedigit_sequence();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexponent_part();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsefloating_suffix();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefractional_constant() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 221;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsedigit_sequence();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ if (input.charCodeAt(peg$currPos) === 46) {
+ s3 = peg$c189;
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e190); }
+ }
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsedigit_sequence();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexponent_part() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 222;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ if (peg$r8.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e218); }
+ }
+ if (s2 !== peg$FAILED) {
+ if (peg$r9.test(input.charAt(peg$currPos))) {
+ s3 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e219); }
+ }
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parsedigit_sequence();
+ if (s4 !== peg$FAILED) {
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e217); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedigit_sequence() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 223;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = [];
+ s2 = peg$parsedigit();
+ if (s2 !== peg$FAILED) {
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ s2 = peg$parsedigit();
+ }
+ } else {
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefloating_suffix() {
+ var s0;
+
+ var key = peg$currPos * 305 + 224;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ if (peg$r10.test(input.charAt(peg$currPos))) {
+ s0 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e220); }
+ }
+ if (s0 === peg$FAILED) {
+ if (input.substr(peg$currPos, 2) === peg$c208) {
+ s0 = peg$c208;
+ peg$currPos += 2;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e221); }
+ }
+ if (s0 === peg$FAILED) {
+ if (input.substr(peg$currPos, 2) === peg$c209) {
+ s0 = peg$c209;
+ peg$currPos += 2;
+ } else {
+ s0 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e222); }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseprimary_expression() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 225;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseFLOATCONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINTCONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUINTCONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBOOLCONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDOUBLECONSTANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseLEFT_PAREN();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseexpression();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseRIGHT_PAREN();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f10(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseIDENTIFIER();
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f11(s1);
+ }
+ s0 = s1;
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e223); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsepostfix_expression() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 226;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsefunction_call();
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$parsepostfix_expression_suffix();
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$parsepostfix_expression_suffix();
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 === peg$FAILED) {
+ s1 = peg$currPos;
+ s2 = peg$parseprimary_expression();
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$parsepostfix_expression_suffix();
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$parsepostfix_expression_suffix();
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f12(s1);
+ }
+ s0 = s1;
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsepostfix_expression_suffix() {
+ var s0;
+
+ var key = peg$currPos * 305 + 227;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseinteger_index();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsefield_selection();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINC_OP();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDEC_OP();
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinteger_index() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 228;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseLEFT_BRACKET();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseexpression();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseRIGHT_BRACKET();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f13(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefield_selection() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 229;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseDOT();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f14(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_call() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 230;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefunction_identifier();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsefunction_arguments();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseRIGHT_PAREN();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f15(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_arguments() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 231;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseVOID();
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f16(s1);
+ }
+ s0 = s1;
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseassignment_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseassignment_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseassignment_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f17(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_identifier() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 232;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parsechained_function_call();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsefunction_suffix();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseLEFT_PAREN();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s1 = peg$f18(s2, s3, s4);
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 === peg$FAILED) {
+ s1 = peg$currPos;
+ s2 = peg$parsetype_specifier();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsefunction_suffix();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parseLEFT_PAREN();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s1 = peg$f18(s2, s3, s4);
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f19(s1);
+ }
+ s0 = s1;
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_suffix() {
+ var s0;
+
+ var key = peg$currPos * 305 + 233;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseinteger_index();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsefield_selection();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsechained_function_call() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 234;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsetype_specifier();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsefunction_arguments();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f20(s1, s2, s3, s4);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseunary_expression() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 235;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parsepostfix_expression();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseINC_OP();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parseDEC_OP();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsePLUS();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parseDASH();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parseBANG();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parseTILDE();
+ }
+ }
+ }
+ }
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseunary_expression();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f21(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e224); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsemultiplicative_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 236;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseunary_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseSTAR();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseSLASH();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parsePERCENT();
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseunary_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseSTAR();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseSLASH();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parsePERCENT();
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseunary_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseadditive_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 237;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsemultiplicative_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parsePLUS();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseDASH();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsemultiplicative_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parsePLUS();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseDASH();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsemultiplicative_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseshift_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 238;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseadditive_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseRIGHT_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseLEFT_OP();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseadditive_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseRIGHT_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseLEFT_OP();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseadditive_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parserelational_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 239;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseshift_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseLE_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseGE_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseLEFT_ANGLE();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseRIGHT_ANGLE();
+ }
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseshift_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseLE_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseGE_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseLEFT_ANGLE();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseRIGHT_ANGLE();
+ }
+ }
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseshift_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseequality_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 240;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parserelational_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseEQ_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseNE_OP();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parserelational_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseEQ_OP();
+ if (s4 === peg$FAILED) {
+ s4 = peg$parseNE_OP();
+ }
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parserelational_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e225); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseand_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 241;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseequality_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseAMPERSAND();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseequality_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseAMPERSAND();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseequality_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e226); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexclusive_or_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 242;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseand_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCARET();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseand_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCARET();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseand_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinclusive_or_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 243;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseexclusive_or_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseVERTICAL_BAR();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseexclusive_or_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseVERTICAL_BAR();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseexclusive_or_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselogical_and_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 244;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseinclusive_or_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseAND_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseinclusive_or_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseAND_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseinclusive_or_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselogical_xor_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 245;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parselogical_and_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseXOR_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parselogical_and_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseXOR_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parselogical_and_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselogical_or_expression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 246;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parselogical_xor_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseOR_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parselogical_xor_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseOR_OP();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parselogical_xor_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseternary_expression() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 247;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parselogical_or_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$parseQUESTION();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseexpression();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseCOLON();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseassignment_expression();
+ if (s6 !== peg$FAILED) {
+ peg$savedPos = s2;
+ s2 = peg$f23(s1, s3, s4, s5, s6);
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f24(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseassignment_expression() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 248;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseunary_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseassignment_operator();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseassignment_expression();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f25(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseternary_expression();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseassignment_operator() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 249;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseEQUAL();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMUL_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDIV_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMOD_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseADD_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSUB_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseLEFT_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRIGHT_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseAND_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseXOR_ASSIGN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseOR_ASSIGN();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e227); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexpression() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 250;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseassignment_expression();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseassignment_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseassignment_expression();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f22(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e228); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedeclaration_statement() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 251;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsedeclaration();
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f26(s1);
+ }
+ s0 = s1;
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsedeclaration() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 252;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefunction_prototype();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseprecision_declarator();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseinterface_declarator();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parsequalifier_declarator();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseinit_declarator_list();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ s1 = [s1, s2];
+ s0 = s1;
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsequalifier_declarator() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 253;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsetype_qualifiers();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = [];
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseIDENTIFIER();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseIDENTIFIER();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f27(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinterface_declarator() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 254;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsetype_qualifiers();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseLEFT_BRACE();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsestruct_declaration_list();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseRIGHT_BRACE();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsequantified_identifier();
+ if (s6 === peg$FAILED) {
+ s6 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f28(s1, s2, s3, s4, s5, s6);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseprecision_declarator() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 255;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsePRECISION();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseprecision_qualifier();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsetype_specifier();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f29(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e229); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_prototype() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 256;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsefunction_header();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsefunction_parameters();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseRIGHT_PAREN();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f30(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e230); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_header() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 257;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsefully_specified_type();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseLEFT_PAREN();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f31(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e231); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_parameters() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 258;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseparameter_declaration();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseparameter_declaration();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseparameter_declaration();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f32(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e232); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseparameter_declaration() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 259;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = [];
+ s2 = peg$parseparameter_qualifier();
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ s2 = peg$parseparameter_qualifier();
+ }
+ s2 = peg$parseparameter_declarator();
+ if (s2 === peg$FAILED) {
+ s2 = peg$parsetype_specifier();
+ }
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f33(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e233); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseparameter_declarator() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 260;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsetype_specifier();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsearray_specifier();
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f34(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e234); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseparameter_qualifier() {
+ var s0;
+
+ var key = peg$currPos * 305 + 261;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseCONST();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsememory_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseprecision_qualifier();
+ }
+ }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsememory_qualifier() {
+ var s0;
+
+ var key = peg$currPos * 305 + 262;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseCOHERENT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVOLATILE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRESTRICT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseREADONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseWRITEONLY();
+ }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinit_declarator_list() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 263;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseinitial_declaration();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsesubsequent_declaration();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parseCOMMA();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsesubsequent_declaration();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f35(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsesubsequent_declaration() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 264;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseIDENTIFIER();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsearray_specifier();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$currPos;
+ s4 = peg$parseEQUAL();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseinitializer();
+ if (s5 !== peg$FAILED) {
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f36(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinitial_declaration() {
+ var s0, s1, s2, s3, s4, s5, s6, s7;
+
+ var key = peg$currPos * 305 + 265;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefully_specified_type();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$parseIDENTIFIER();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsearray_specifier();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$currPos;
+ s6 = peg$parseEQUAL();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$parseinitializer();
+ if (s7 !== peg$FAILED) {
+ s6 = [s6, s7];
+ s5 = s6;
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ if (s5 === peg$FAILED) {
+ s5 = null;
+ }
+ s3 = [s3, s4, s5];
+ s2 = s3;
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f37(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefully_specified_type() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 266;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsetype_qualifiers();
+ if (s1 === peg$FAILED) {
+ s1 = null;
+ }
+ s2 = peg$parsetype_specifier();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f38(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselayout_qualifier() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8;
+
+ var key = peg$currPos * 305 + 267;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseLAYOUT();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$currPos;
+ s4 = peg$parselayout_qualifier_id();
+ if (s4 !== peg$FAILED) {
+ s5 = [];
+ s6 = peg$currPos;
+ s7 = peg$parseCOMMA();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parselayout_qualifier_id();
+ if (s8 !== peg$FAILED) {
+ s7 = [s7, s8];
+ s6 = s7;
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ while (s6 !== peg$FAILED) {
+ s5.push(s6);
+ s6 = peg$currPos;
+ s7 = peg$parseCOMMA();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parselayout_qualifier_id();
+ if (s8 !== peg$FAILED) {
+ s7 = [s7, s8];
+ s6 = s7;
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s3;
+ s3 = peg$f39(s1, s2, s4, s5);
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f40(s1, s2, s3, s4);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parselayout_qualifier_id() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 268;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseIDENTIFIER();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$parseEQUAL();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseternary_expression();
+ if (s4 !== peg$FAILED) {
+ s3 = [s3, s4];
+ s2 = s3;
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f41(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSHARED();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsetype_qualifiers() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 269;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = [];
+ s1 = peg$parsesingle_type_qualifier();
+ if (s1 !== peg$FAILED) {
+ while (s1 !== peg$FAILED) {
+ s0.push(s1);
+ s1 = peg$parsesingle_type_qualifier();
+ }
+ } else {
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsesingle_type_qualifier() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 270;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parsestorage_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parselayout_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseprecision_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseinterpolation_qualifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINVARIANT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePRECISE();
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e235); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinterpolation_qualifier() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 271;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseSMOOTH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFLAT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseNOPERSPECTIVE();
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e236); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestorage_qualifier() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8;
+
+ var key = peg$currPos * 305 + 272;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseCONST();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIN();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseOUT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCENTROID();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsePATCH();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUNIFORM();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSHARED();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseCOHERENT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVOLATILE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseRESTRICT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseREADONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseWRITEONLY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVARYING();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseATTRIBUTE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseSUBROUTINE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$currPos;
+ s3 = peg$parseLEFT_PAREN();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseTYPE_NAME();
+ if (s4 !== peg$FAILED) {
+ s5 = [];
+ s6 = peg$currPos;
+ s7 = peg$parseCOMMA();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parseTYPE_NAME();
+ if (s8 !== peg$FAILED) {
+ s7 = [s7, s8];
+ s6 = s7;
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ while (s6 !== peg$FAILED) {
+ s5.push(s6);
+ s6 = peg$currPos;
+ s7 = peg$parseCOMMA();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parseTYPE_NAME();
+ if (s8 !== peg$FAILED) {
+ s7 = [s7, s8];
+ s6 = s7;
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s6;
+ s6 = peg$FAILED;
+ }
+ }
+ s6 = peg$parseRIGHT_PAREN();
+ if (s6 !== peg$FAILED) {
+ peg$savedPos = s2;
+ s2 = peg$f42(s1, s3, s4, s5, s6);
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f43(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e237); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsetype_specifier() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 273;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsetype_specifier_nonarray();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsearray_specifier();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f44(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e238); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsetype_specifier_nonarray() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 274;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseVOID();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseFLOAT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDOUBLE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBOOL();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseBVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUVEC4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT2X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT3X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMAT4X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT2X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT3X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X2();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X3();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseDMAT4X4();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseATOMIC_UINT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBESHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER1DARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERCUBEARRAYSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERCUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERCUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DRECTSHADOW();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLERBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseSAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseISAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUSAMPLER2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE1D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE3D();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DRECT();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGECUBE();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGEBUFFER();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE1DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGECUBEARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DMS();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseIIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseUIMAGE2DMSARRAY();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsestruct_specifier();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseTYPE_NAME();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e238); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsearray_specifier() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 275;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = [];
+ s2 = peg$currPos;
+ s3 = peg$parseLEFT_BRACKET();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseternary_expression();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$parseRIGHT_BRACKET();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s2;
+ s2 = peg$f45(s3, s4, s5);
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 !== peg$FAILED) {
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ s2 = peg$currPos;
+ s3 = peg$parseLEFT_BRACKET();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseternary_expression();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$parseRIGHT_BRACKET();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s2;
+ s2 = peg$f45(s3, s4, s5);
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ }
+ } else {
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s1 = peg$f46(s1);
+ }
+ s0 = s1;
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e239); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseprecision_qualifier() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 276;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$parseHIGH_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseMEDIUM_PRECISION();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseLOW_PRECISION();
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e240); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestruct_specifier() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 277;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseSTRUCT();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseLEFT_BRACE();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parsestruct_declaration_list();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseRIGHT_BRACE();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f47(s1, s2, s3, s4, s5);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e241); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestruct_declaration_list() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 278;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = [];
+ s1 = peg$currPos;
+ s2 = peg$parsestruct_declaration();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseSEMICOLON();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s1 = peg$f48(s2, s3);
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ while (s1 !== peg$FAILED) {
+ s0.push(s1);
+ s1 = peg$currPos;
+ s2 = peg$parsestruct_declaration();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseSEMICOLON();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s1 = peg$f48(s2, s3);
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ }
+ } else {
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestruct_declaration() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 279;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefully_specified_type();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsequantified_identifier();
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsequantified_identifier();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsequantified_identifier();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f49(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsequantified_identifier() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 280;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseIDENTIFIER();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsearray_specifier();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ peg$savedPos = s0;
+ s0 = peg$f50(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseinitializer() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 281;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parseassignment_expression();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseLEFT_BRACE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseinitializer();
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseinitializer();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$currPos;
+ s5 = peg$parseCOMMA();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseinitializer();
+ if (s6 !== peg$FAILED) {
+ s5 = [s5, s6];
+ s4 = s5;
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ }
+ s4 = peg$parseCOMMA();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$parseRIGHT_BRACE();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f51(s1, s2, s3, s4, s5);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestatement() {
+ var s0;
+
+ var key = peg$currPos * 305 + 282;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsecompound_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsesimple_statement();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsesimple_statement() {
+ var s0;
+
+ var key = peg$currPos * 305 + 283;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsejump_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsedeclaration_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseexpression_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseif_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseswitch_statement();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsecase_label();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseiteration_statement();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecompound_statement() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 284;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parseLEFT_BRACE();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s2 = peg$f52(s2);
+ }
+ s1 = s2;
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsestatement_list();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseRIGHT_BRACE();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f53(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecompound_statement_no_new_scope() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 285;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseLEFT_BRACE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsestatement_list();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseRIGHT_BRACE();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f54(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestatement_no_new_scope() {
+ var s0;
+
+ var key = peg$currPos * 305 + 286;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsecompound_statement_no_new_scope();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsesimple_statement();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsestatement_list() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 287;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = [];
+ s1 = peg$parsestatement();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsepreprocessor();
+ }
+ if (s1 !== peg$FAILED) {
+ while (s1 !== peg$FAILED) {
+ s0.push(s1);
+ s1 = peg$parsestatement();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsepreprocessor();
+ }
+ }
+ } else {
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexpression_statement() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 288;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseexpression();
+ if (s1 === peg$FAILED) {
+ s1 = null;
+ }
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f55(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseif_statement() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
+
+ var key = peg$currPos * 305 + 289;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseIF();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexpression();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$currPos;
+ s6 = peg$parsestatement();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$currPos;
+ s8 = peg$parseELSE();
+ if (s8 !== peg$FAILED) {
+ s9 = peg$parsestatement();
+ if (s9 !== peg$FAILED) {
+ s8 = [s8, s9];
+ s7 = s8;
+ } else {
+ peg$currPos = s7;
+ s7 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s7;
+ s7 = peg$FAILED;
+ }
+ if (s7 === peg$FAILED) {
+ s7 = null;
+ }
+ s6 = [s6, s7];
+ s5 = s6;
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f56(s1, s2, s3, s4, s5);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseswitch_statement() {
+ var s0, s1, s2, s3, s4, s5, s6, s7;
+
+ var key = peg$currPos * 305 + 290;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseSWITCH();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexpression();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseLEFT_BRACE();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parsestatement_list();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$parseRIGHT_BRACE();
+ if (s7 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f57(s1, s2, s3, s4, s5, s6, s7);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecase_label() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 291;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parseCASE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseexpression();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseCOLON();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f58(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseDEFAULT();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseCOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f59(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseiteration_statement() {
+ var s0, s1, s2, s3, s4, s5, s6, s7, s8;
+
+ var key = peg$currPos * 305 + 292;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parseWHILE();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s2 = peg$f60(s2);
+ }
+ s1 = s2;
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parsecondition();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseRIGHT_PAREN();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsestatement_no_new_scope();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f61(s1, s2, s3, s4, s5);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseDO();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsestatement();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseWHILE();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseLEFT_PAREN();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parseexpression();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseRIGHT_PAREN();
+ if (s6 !== peg$FAILED) {
+ s7 = peg$parseSEMICOLON();
+ if (s7 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f62(s1, s2, s3, s4, s5, s6, s7);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$parseFOR();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s1;
+ s2 = peg$f63(s2);
+ }
+ s1 = s2;
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseLEFT_PAREN();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseexpression_statement();
+ if (s3 === peg$FAILED) {
+ s3 = peg$parsedeclaration_statement();
+ }
+ if (s3 === peg$FAILED) {
+ s3 = null;
+ }
+ s4 = peg$parsecondition();
+ if (s4 === peg$FAILED) {
+ s4 = null;
+ }
+ s5 = peg$parseSEMICOLON();
+ if (s5 !== peg$FAILED) {
+ s6 = peg$parseexpression();
+ if (s6 === peg$FAILED) {
+ s6 = null;
+ }
+ s7 = peg$parseRIGHT_PAREN();
+ if (s7 !== peg$FAILED) {
+ s8 = peg$parsestatement_no_new_scope();
+ if (s8 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f64(s1, s2, s3, s4, s5, s6, s7, s8);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e242); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecondition() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 293;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefully_specified_type();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseIDENTIFIER();
+ if (s2 !== peg$FAILED) {
+ s3 = peg$parseEQUAL();
+ if (s3 !== peg$FAILED) {
+ s4 = peg$parseinitializer();
+ if (s4 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f65(s1, s2, s3, s4);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$parseexpression();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsejump_statement() {
+ var s0, s1, s2, s3;
+
+ var key = peg$currPos * 305 + 294;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parseCONTINUE();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f66(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseBREAK();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f67(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseRETURN();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseexpression();
+ if (s2 === peg$FAILED) {
+ s2 = null;
+ }
+ s3 = peg$parseSEMICOLON();
+ if (s3 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f68(s1, s2, s3);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parseDISCARD();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parseSEMICOLON();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f69(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+ }
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e243); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsepreprocessor() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 295;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ s2 = peg$currPos;
+ if (input.charCodeAt(peg$currPos) === 35) {
+ s3 = peg$c210;
+ peg$currPos++;
+ } else {
+ s3 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e245); }
+ }
+ if (s3 !== peg$FAILED) {
+ s4 = [];
+ if (peg$r11.test(input.charAt(peg$currPos))) {
+ s5 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s5 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e246); }
+ }
+ while (s5 !== peg$FAILED) {
+ s4.push(s5);
+ if (peg$r11.test(input.charAt(peg$currPos))) {
+ s5 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s5 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e246); }
+ }
+ }
+ s3 = [s3, s4];
+ s2 = s3;
+ } else {
+ peg$currPos = s2;
+ s2 = peg$FAILED;
+ }
+ if (s2 !== peg$FAILED) {
+ s1 = input.substring(s1, peg$currPos);
+ } else {
+ s1 = s2;
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f70(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ peg$silentFails--;
+ if (s0 === peg$FAILED) {
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e244); }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsetranslation_unit() {
+ var s0, s1;
+
+ var key = peg$currPos * 305 + 296;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = [];
+ s1 = peg$parseexternal_declaration();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsepreprocessor();
+ }
+ if (s1 !== peg$FAILED) {
+ while (s1 !== peg$FAILED) {
+ s0.push(s1);
+ s1 = peg$parseexternal_declaration();
+ if (s1 === peg$FAILED) {
+ s1 = peg$parsepreprocessor();
+ }
+ }
+ } else {
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseexternal_declaration() {
+ var s0;
+
+ var key = peg$currPos * 305 + 297;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsefunction_definition();
+ if (s0 === peg$FAILED) {
+ s0 = peg$parsedeclaration_statement();
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsefunction_definition() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 298;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$parsefunction_prototype();
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parsecompound_statement_no_new_scope();
+ if (s2 !== peg$FAILED) {
+ peg$savedPos = s0;
+ s0 = peg$f71(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parse_() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 299;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ peg$silentFails++;
+ s0 = peg$currPos;
+ s1 = peg$parsewhitespace();
+ if (s1 === peg$FAILED) {
+ s1 = null;
+ }
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parsecomment();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsewhitespace();
+ if (s5 === peg$FAILED) {
+ s5 = null;
+ }
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parsecomment();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsewhitespace();
+ if (s5 === peg$FAILED) {
+ s5 = null;
+ }
+ s4 = [s4, s5];
+ s3 = s4;
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f72(s1, s2);
+ peg$silentFails--;
+ s1 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e247); }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsecomment() {
+ var s0, s1, s2, s3, s4, s5;
+
+ var key = peg$currPos * 305 + 300;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$parsesingle_comment();
+ if (s0 === peg$FAILED) {
+ s0 = peg$currPos;
+ s1 = peg$parsemultiline_comment();
+ if (s1 !== peg$FAILED) {
+ s2 = [];
+ s3 = peg$currPos;
+ s4 = peg$parsewhitespace();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsecomment();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s3;
+ s3 = peg$f73(s1, s4, s5);
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ while (s3 !== peg$FAILED) {
+ s2.push(s3);
+ s3 = peg$currPos;
+ s4 = peg$parsewhitespace();
+ if (s4 !== peg$FAILED) {
+ s5 = peg$parsecomment();
+ if (s5 !== peg$FAILED) {
+ peg$savedPos = s3;
+ s3 = peg$f73(s1, s4, s5);
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s3;
+ s3 = peg$FAILED;
+ }
+ }
+ peg$savedPos = s0;
+ s0 = peg$f74(s1, s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsesingle_comment() {
+ var s0, s1, s2, s3, s4;
+
+ var key = peg$currPos * 305 + 301;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c211) {
+ s2 = peg$c211;
+ peg$currPos += 2;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e248); }
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ if (peg$r11.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e246); }
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ if (peg$r11.test(input.charAt(peg$currPos))) {
+ s4 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e246); }
+ }
+ }
+ s2 = [s2, s3];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsemultiline_comment() {
+ var s0, s1, s2, s3, s4, s5, s6;
+
+ var key = peg$currPos * 305 + 302;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ if (input.substr(peg$currPos, 2) === peg$c212) {
+ s2 = peg$c212;
+ peg$currPos += 2;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e249); }
+ }
+ if (s2 !== peg$FAILED) {
+ s3 = [];
+ s4 = peg$currPos;
+ s5 = peg$currPos;
+ peg$silentFails++;
+ if (input.substr(peg$currPos, 2) === peg$c213) {
+ s6 = peg$c213;
+ peg$currPos += 2;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e250); }
+ }
+ peg$silentFails--;
+ if (s6 === peg$FAILED) {
+ s5 = undefined;
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ if (s5 !== peg$FAILED) {
+ if (input.length > peg$currPos) {
+ s6 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e251); }
+ }
+ if (s6 !== peg$FAILED) {
+ peg$savedPos = s4;
+ s4 = peg$f75(s6);
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ while (s4 !== peg$FAILED) {
+ s3.push(s4);
+ s4 = peg$currPos;
+ s5 = peg$currPos;
+ peg$silentFails++;
+ if (input.substr(peg$currPos, 2) === peg$c213) {
+ s6 = peg$c213;
+ peg$currPos += 2;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e250); }
+ }
+ peg$silentFails--;
+ if (s6 === peg$FAILED) {
+ s5 = undefined;
+ } else {
+ peg$currPos = s5;
+ s5 = peg$FAILED;
+ }
+ if (s5 !== peg$FAILED) {
+ if (input.length > peg$currPos) {
+ s6 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s6 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e251); }
+ }
+ if (s6 !== peg$FAILED) {
+ peg$savedPos = s4;
+ s4 = peg$f75(s6);
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s4;
+ s4 = peg$FAILED;
+ }
+ }
+ if (input.substr(peg$currPos, 2) === peg$c213) {
+ s4 = peg$c213;
+ peg$currPos += 2;
+ } else {
+ s4 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e250); }
+ }
+ if (s4 !== peg$FAILED) {
+ s2 = [s2, s3, s4];
+ s1 = s2;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parsewhitespace() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 303;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = [];
+ if (peg$r12.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e252); }
+ }
+ if (s2 !== peg$FAILED) {
+ while (s2 !== peg$FAILED) {
+ s1.push(s2);
+ if (peg$r12.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e252); }
+ }
+ }
+ } else {
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s0 = input.substring(s0, peg$currPos);
+ } else {
+ s0 = s1;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+ function peg$parseterminal() {
+ var s0, s1, s2;
+
+ var key = peg$currPos * 305 + 304;
+ var cached = peg$resultsCache[key];
+
+ if (cached) {
+ peg$currPos = cached.nextPos;
+
+ return cached.result;
+ }
+
+ s0 = peg$currPos;
+ s1 = peg$currPos;
+ peg$silentFails++;
+ if (peg$r1.test(input.charAt(peg$currPos))) {
+ s2 = input.charAt(peg$currPos);
+ peg$currPos++;
+ } else {
+ s2 = peg$FAILED;
+ if (peg$silentFails === 0) { peg$fail(peg$e209); }
+ }
+ peg$silentFails--;
+ if (s2 === peg$FAILED) {
+ s1 = undefined;
+ } else {
+ peg$currPos = s1;
+ s1 = peg$FAILED;
+ }
+ if (s1 !== peg$FAILED) {
+ s2 = peg$parse_();
+ peg$savedPos = s0;
+ s0 = peg$f76(s2);
+ } else {
+ peg$currPos = s0;
+ s0 = peg$FAILED;
+ }
+
+ peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
+
+ return s0;
+ }
+
+
+ const OPEN_CURLY = String.fromCharCode(123);
+
+ const makeScope = (name, parent) => ({
+ name,
+ parent,
+ bindings: {},
+ types: {},
+ functions: {},
+ });
+ const pushScope = scope => {
+ // console.log('pushing scope at ',text());
+ scopes.push(scope);
+ return scope;
+ };
+ const popScope = scope => {
+ // console.log('popping scope at ',text());
+ if(!scope.parent) {
+ throw new Error('popped bad scope', scope, 'at', text());
+ }
+ return scope.parent;
+ };
+
+ const warn = (...args) => !options.quiet && console.warn(...args);
+
+ // Types (aka struct) scope
+ const addTypes = (scope, ...types) => {
+ types.forEach(([identifier, type]) => {
+ scope.types[identifier] = {
+ references: [type]
+ };
+ });
+ };
+ const addTypeReference = (scope, name, reference) => {
+ scope.types[name].references.push(reference);
+ };
+ const findTypeScope = (scope, typeName) => {
+ if(!scope) {
+ return null;
+ }
+ if(typeName in scope.types) {
+ return scope;
+ }
+ return findTypeScope(scope.parent, typeName);
+ };
+ const isDeclaredType = (scope, typeName) => findTypeScope(scope, typeName) !== null;
+
+ // Bindings (aka variables, parameters) scope
+ const createBindings = (scope, ...bindings) => {
+ bindings.forEach(([identifier, binding]) => {
+ const newBinding = scope.bindings[identifier] || { references: [] };
+ newBinding.initializer = binding;
+ newBinding.references.unshift(binding);
+ scope.bindings[identifier] = newBinding;
+ });
+ };
+ const addBindingReference = (scope, name, reference) => {
+ // In the case of "float a = 1, b = a;" we parse the final "a" before the
+ // parent declarator list is parsed. So we might need to add the final "a"
+ // to the scope first.
+ const foundScope = findBindingScope(scope, name);
+ if(foundScope) {
+ foundScope.bindings[name].references.push(reference);
+ } else {
+ createBindings(scope, [name, reference]);
+ }
+ };
+ const findBindingScope = (scope, name) => {
+ if(!scope) {
+ return null;
+ }
+ if(name in scope.bindings) {
+ return scope;
+ }
+ return findBindingScope(scope.parent, name);
+ };
+
+ // Function scope
+ const createFunction = (scope, name, declaration) => {
+ scope.functions[name] = { references: [declaration] };
+ };
+ const addFunctionReference = (scope, name, reference) => {
+ const global = findGlobalScope(scope);
+ if(name in global.functions) {
+ global.functions[name].references.push(reference);
+ } else {
+ createFunction(scope, name, reference);
+ }
+ };
+ const findGlobalScope = scope => scope.parent ? findGlobalScope(scope.parent) : scope;
+ const isDeclaredFunction = (scope, fnName) => fnName in findGlobalScope(scope).functions;
+
+ let scopes = [makeScope('global')];
+ let scope = scopes[0];
+
+ const node = (type, attrs) => ({
+ type,
+ ...attrs
+ });
+
+ // Filter out "empty" elements from an array
+ const xnil = (...args) => args.flat().filter(e =>
+ e !== undefined && e !== null && e !== '' && e.length !== 0
+ );
+
+ // Given an array of nodes with potential null empty values, convert to text.
+ // Kind of like $(rule) but filters out empty rules
+ const toText = (...args) => xnil(args).join('');
+
+ const ifOnly = arr => arr.length > 1 ? arr : arr[0];
+
+ // Remove empty elements and return value if only 1 element remains
+ const collapse = (...args) => ifOnly(xnil(args));
+
+ // Create a left associative tree of nodes
+ const leftAssociate = (...nodes) =>
+ nodes.flat().reduce((current, [operator, expr]) => ({
+ type: "binary",
+ operator: operator,
+ left: current,
+ right: expr
+ }));
+
+ // No longer needed?
+ // const without = (obj, ...keys) => Object.entries(obj).reduce((acc, [key, value]) => ({
+ // ...acc,
+ // ...(!keys.includes(key) && { [key]: value })
+ // }), {});
+
+ // Group the statements in a switch statement into cases / default arrays
+ const groupCases = (statements) => statements.reduce((cases, stmt) => {
+ if(stmt.type === 'case_label') {
+ return [
+ ...cases,
+ node(
+ 'switch_case',
+ {
+ statements: [],
+ case: stmt.case,
+ test: stmt.test,
+ colon: stmt.colon,
+ }
+ )
+ ];
+ } else if(stmt.type === 'default_label') {
+ return [
+ ...cases,
+ node(
+ 'default_case',
+ {
+ statements: [],
+ default: stmt.default,
+ colon: stmt.colon,
+ }
+ )
+ ];
+ // It would be nice to encode this in the grammar instead of a manual check
+ } else if(!cases.length) {
+ throw new Error('A switch statement body must start with a case or default label');
+ } else {
+ const tail = cases.slice(-1)[0];
+ return [...cases.slice(0, -1), {
+ ...tail,
+ statements: [
+ ...tail.statements,
+ stmt
+ ]
+ }];
+ }
+ }, []);
+
+
+ // From https://www.khronos.org/registry/OpenGL-Refpages/gl4/index.php
+ // excluding gl_ prefixed builtins, which don't appear to be functions
+ const builtIns = new Set([
+ 'abs',
+ 'acos',
+ 'acosh',
+ 'all',
+ 'any',
+ 'asin',
+ 'asinh',
+ 'atan',
+ 'atanh',
+ 'atomicAdd',
+ 'atomicAnd',
+ 'atomicCompSwap',
+ 'atomicCounter',
+ 'atomicCounterDecrement',
+ 'atomicCounterIncrement',
+ 'atomicExchange',
+ 'atomicMax',
+ 'atomicMin',
+ 'atomicOr',
+ 'atomicXor',
+ 'barrier',
+ 'bitCount',
+ 'bitfieldExtract',
+ 'bitfieldInsert',
+ 'bitfieldReverse',
+ 'ceil',
+ 'clamp',
+ 'cos',
+ 'cosh',
+ 'cross',
+ 'degrees',
+ 'determinant',
+ 'dFdx',
+ 'dFdxCoarse',
+ 'dFdxFine',
+ 'dFdy',
+ 'dFdyCoarse',
+ 'dFdyFine',
+ 'distance',
+ 'dot',
+ 'EmitStreamVertex',
+ 'EmitVertex',
+ 'EndPrimitive',
+ 'EndStreamPrimitive',
+ 'equal',
+ 'exp',
+ 'exp2',
+ 'faceforward',
+ 'findLSB',
+ 'findMSB',
+ 'floatBitsToInt',
+ 'floatBitsToUint',
+ 'floor',
+ 'fma',
+ 'fract',
+ 'frexp',
+ 'fwidth',
+ 'fwidthCoarse',
+ 'fwidthFine',
+ 'greaterThan',
+ 'greaterThanEqual',
+ 'groupMemoryBarrier',
+ 'imageAtomicAdd',
+ 'imageAtomicAnd',
+ 'imageAtomicCompSwap',
+ 'imageAtomicExchange',
+ 'imageAtomicMax',
+ 'imageAtomicMin',
+ 'imageAtomicOr',
+ 'imageAtomicXor',
+ 'imageLoad',
+ 'imageSamples',
+ 'imageSize',
+ 'imageStore',
+ 'imulExtended',
+ 'intBitsToFloat',
+ 'interpolateAtCentroid',
+ 'interpolateAtOffset',
+ 'interpolateAtSample',
+ 'inverse',
+ 'inversesqrt',
+ 'isinf',
+ 'isnan',
+ 'ldexp',
+ 'length',
+ 'lessThan',
+ 'lessThanEqual',
+ 'log',
+ 'log2',
+ 'matrixCompMult',
+ 'max',
+ 'memoryBarrier',
+ 'memoryBarrierAtomicCounter',
+ 'memoryBarrierBuffer',
+ 'memoryBarrierImage',
+ 'memoryBarrierShared',
+ 'min',
+ 'mix',
+ 'mod',
+ 'modf',
+ 'noise',
+ 'noise1',
+ 'noise2',
+ 'noise3',
+ 'noise4',
+ 'normalize',
+ 'not',
+ 'notEqual',
+ 'outerProduct',
+ 'packDouble2x32',
+ 'packHalf2x16',
+ 'packSnorm2x16',
+ 'packSnorm4x8',
+ 'packUnorm',
+ 'packUnorm2x16',
+ 'packUnorm4x8',
+ 'pow',
+ 'radians',
+ 'reflect',
+ 'refract',
+ 'round',
+ 'roundEven',
+ 'sign',
+ 'sin',
+ 'sinh',
+ 'smoothstep',
+ 'sqrt',
+ 'step',
+ 'tan',
+ 'tanh',
+ 'texelFetch',
+ 'texelFetchOffset',
+ 'texture',
+ 'textureGather',
+ 'textureGatherOffset',
+ 'textureGatherOffsets',
+ 'textureGrad',
+ 'textureGradOffset',
+ 'textureLod',
+ 'textureLodOffset',
+ 'textureOffset',
+ 'textureProj',
+ 'textureProjGrad',
+ 'textureProjGradOffset',
+ 'textureProjLod',
+ 'textureProjLodOffset',
+ 'textureProjOffset',
+ 'textureQueryLevels',
+ 'textureQueryLod',
+ 'textureSamples',
+ 'textureSize',
+ 'transpose',
+ 'trunc',
+ 'uaddCarry',
+ 'uintBitsToFloat',
+ 'umulExtended',
+ 'unpackDouble2x32',
+ 'unpackHalf2x16',
+ 'unpackSnorm2x16',
+ 'unpackSnorm4x8',
+ 'unpackUnorm',
+ 'unpackUnorm2x16',
+ 'unpackUnorm4x8',
+ 'usubBorrow',
+ // GLSL ES 1.00
+ 'texture2D', 'textureCube'
+ ]);
+
+
+ peg$result = peg$startRuleFunction();
+
+ if (peg$result !== peg$FAILED && peg$currPos === input.length) {
+ return peg$result;
+ } else {
+ if (peg$result !== peg$FAILED && peg$currPos < input.length) {
+ peg$fail(peg$endExpectation());
+ }
+
+ throw peg$buildStructuredError(
+ peg$maxFailExpected,
+ peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
+ peg$maxFailPos < input.length
+ ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
+ : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
+ );
+ }
+ }
+
+ var parser = {
+ SyntaxError: peg$SyntaxError,
+ parse: peg$parse
+ };
+
+ "use strict";
+ var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+ };
+ var generator_1 = __importDefault(generator);
+ var parser_1 = __importDefault(parser);
+ var dist = { generate: generator_1.default, parser: parser_1.default };
+
+ // Format is Key (Javascript function name), Value: GLSL Source
+ // SDFs from
+ // https://iquilezles.org/www/articles/distfunctions/distfunctions.htm
+ // Make sure to destruct the name in sculpt.js (search for DESTRUCT SDFs)
+ var sdfs = {
+ boxFrame: "float sdBoxFrame( vec3 p, vec3 b, float e )\n{\n p = abs(p )-b;\nvec3 q = abs(p+e)-e;\nreturn min(min(\n length(max(vec3(p.x,q.y,q.z),0.0))+min(max(p.x,max(q.y,q.z)),0.0),\n length(max(vec3(q.x,p.y,q.z),0.0))+min(max(q.x,max(p.y,q.z)),0.0)),\n length(max(vec3(q.x,q.y,p.z),0.0))+min(max(q.x,max(q.y,p.z)),0.0));\n}",
+ link: "float sdLink( vec3 p, float le, float r1, float r2 )\n{\n vec3 q = vec3( p.x, max(abs(p.y)-le,0.0), p.z );\n return length(vec2(length(q.xy)-r1,q.z)) - r2;\n}",
+ cappedTorus: "\nfloat sdCappedTorus(in vec3 p, in vec2 sc, in float ra, in float rb)\n{\n p.x = abs(p.x);\n float k = (sc.y*p.x>sc.x*p.y) ? dot(p.xy,sc) : length(p.xy);\n return sqrt( dot(p,p) + ra*ra - 2.0*ra*k ) - rb;\n}\n"
+ };
+
+ const name$1="estraverse";const description$1="ECMAScript JS AST traversal functions";const homepage$1="https://github.com/estools/estraverse";const main$1="estraverse.js";const version$1="4.3.0";const engines$1={node:">=4.0"};const maintainers$1=[{name:"Yusuke Suzuki",email:"utatane.tea@gmail.com",web:"http://github.com/Constellation"}];const repository$1={type:"git",url:"http://github.com/estools/estraverse.git"};const devDependencies$1={"babel-preset-env":"^1.6.1","babel-register":"^6.3.13",chai:"^2.1.1",espree:"^1.11.0",gulp:"^3.8.10","gulp-bump":"^0.2.2","gulp-filter":"^2.0.0","gulp-git":"^1.0.1","gulp-tag-version":"^1.3.0",jshint:"^2.5.6",mocha:"^2.1.0"};const license$1="BSD-2-Clause";const scripts$1={test:"npm run-script lint && npm run-script unit-test",lint:"jshint estraverse.js","unit-test":"mocha --compilers js:babel-register"};var require$$0 = {name:name$1,description:description$1,homepage:homepage$1,main:main$1,version:version$1,engines:engines$1,maintainers:maintainers$1,repository:repository$1,devDependencies:devDependencies$1,license:license$1,scripts:scripts$1};
+
+ /*
+ Copyright (C) 2012-2013 Yusuke Suzuki
+ Copyright (C) 2012 Ariya Hidayat
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ var estraverse = createCommonjsModule(function (module, exports) {
+ /*jslint vars:false, bitwise:true*/
+ /*jshint indent:4*/
+ /*global exports:true*/
+ (function clone(exports) {
+ 'use strict';
+
+ var Syntax,
+ VisitorOption,
+ VisitorKeys,
+ BREAK,
+ SKIP,
+ REMOVE;
+
+ function deepCopy(obj) {
+ var ret = {}, key, val;
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ val = obj[key];
+ if (typeof val === 'object' && val !== null) {
+ ret[key] = deepCopy(val);
+ } else {
+ ret[key] = val;
+ }
+ }
+ }
+ return ret;
+ }
+
+ // based on LLVM libc++ upper_bound / lower_bound
+ // MIT License
+
+ function upperBound(array, func) {
+ var diff, len, i, current;
+
+ len = array.length;
+ i = 0;
+
+ while (len) {
+ diff = len >>> 1;
+ current = i + diff;
+ if (func(array[current])) {
+ len = diff;
+ } else {
+ i = current + 1;
+ len -= diff + 1;
+ }
+ }
+ return i;
+ }
+
+ Syntax = {
+ AssignmentExpression: 'AssignmentExpression',
+ AssignmentPattern: 'AssignmentPattern',
+ ArrayExpression: 'ArrayExpression',
+ ArrayPattern: 'ArrayPattern',
+ ArrowFunctionExpression: 'ArrowFunctionExpression',
+ AwaitExpression: 'AwaitExpression', // CAUTION: It's deferred to ES7.
+ BlockStatement: 'BlockStatement',
+ BinaryExpression: 'BinaryExpression',
+ BreakStatement: 'BreakStatement',
+ CallExpression: 'CallExpression',
+ CatchClause: 'CatchClause',
+ ClassBody: 'ClassBody',
+ ClassDeclaration: 'ClassDeclaration',
+ ClassExpression: 'ClassExpression',
+ ComprehensionBlock: 'ComprehensionBlock', // CAUTION: It's deferred to ES7.
+ ComprehensionExpression: 'ComprehensionExpression', // CAUTION: It's deferred to ES7.
+ ConditionalExpression: 'ConditionalExpression',
+ ContinueStatement: 'ContinueStatement',
+ DebuggerStatement: 'DebuggerStatement',
+ DirectiveStatement: 'DirectiveStatement',
+ DoWhileStatement: 'DoWhileStatement',
+ EmptyStatement: 'EmptyStatement',
+ ExportAllDeclaration: 'ExportAllDeclaration',
+ ExportDefaultDeclaration: 'ExportDefaultDeclaration',
+ ExportNamedDeclaration: 'ExportNamedDeclaration',
+ ExportSpecifier: 'ExportSpecifier',
+ ExpressionStatement: 'ExpressionStatement',
+ ForStatement: 'ForStatement',
+ ForInStatement: 'ForInStatement',
+ ForOfStatement: 'ForOfStatement',
+ FunctionDeclaration: 'FunctionDeclaration',
+ FunctionExpression: 'FunctionExpression',
+ GeneratorExpression: 'GeneratorExpression', // CAUTION: It's deferred to ES7.
+ Identifier: 'Identifier',
+ IfStatement: 'IfStatement',
+ ImportExpression: 'ImportExpression',
+ ImportDeclaration: 'ImportDeclaration',
+ ImportDefaultSpecifier: 'ImportDefaultSpecifier',
+ ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
+ ImportSpecifier: 'ImportSpecifier',
+ Literal: 'Literal',
+ LabeledStatement: 'LabeledStatement',
+ LogicalExpression: 'LogicalExpression',
+ MemberExpression: 'MemberExpression',
+ MetaProperty: 'MetaProperty',
+ MethodDefinition: 'MethodDefinition',
+ ModuleSpecifier: 'ModuleSpecifier',
+ NewExpression: 'NewExpression',
+ ObjectExpression: 'ObjectExpression',
+ ObjectPattern: 'ObjectPattern',
+ Program: 'Program',
+ Property: 'Property',
+ RestElement: 'RestElement',
+ ReturnStatement: 'ReturnStatement',
+ SequenceExpression: 'SequenceExpression',
+ SpreadElement: 'SpreadElement',
+ Super: 'Super',
+ SwitchStatement: 'SwitchStatement',
+ SwitchCase: 'SwitchCase',
+ TaggedTemplateExpression: 'TaggedTemplateExpression',
+ TemplateElement: 'TemplateElement',
+ TemplateLiteral: 'TemplateLiteral',
+ ThisExpression: 'ThisExpression',
+ ThrowStatement: 'ThrowStatement',
+ TryStatement: 'TryStatement',
+ UnaryExpression: 'UnaryExpression',
+ UpdateExpression: 'UpdateExpression',
+ VariableDeclaration: 'VariableDeclaration',
+ VariableDeclarator: 'VariableDeclarator',
+ WhileStatement: 'WhileStatement',
+ WithStatement: 'WithStatement',
+ YieldExpression: 'YieldExpression'
+ };
+
+ VisitorKeys = {
+ AssignmentExpression: ['left', 'right'],
+ AssignmentPattern: ['left', 'right'],
+ ArrayExpression: ['elements'],
+ ArrayPattern: ['elements'],
+ ArrowFunctionExpression: ['params', 'body'],
+ AwaitExpression: ['argument'], // CAUTION: It's deferred to ES7.
+ BlockStatement: ['body'],
+ BinaryExpression: ['left', 'right'],
+ BreakStatement: ['label'],
+ CallExpression: ['callee', 'arguments'],
+ CatchClause: ['param', 'body'],
+ ClassBody: ['body'],
+ ClassDeclaration: ['id', 'superClass', 'body'],
+ ClassExpression: ['id', 'superClass', 'body'],
+ ComprehensionBlock: ['left', 'right'], // CAUTION: It's deferred to ES7.
+ ComprehensionExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.
+ ConditionalExpression: ['test', 'consequent', 'alternate'],
+ ContinueStatement: ['label'],
+ DebuggerStatement: [],
+ DirectiveStatement: [],
+ DoWhileStatement: ['body', 'test'],
+ EmptyStatement: [],
+ ExportAllDeclaration: ['source'],
+ ExportDefaultDeclaration: ['declaration'],
+ ExportNamedDeclaration: ['declaration', 'specifiers', 'source'],
+ ExportSpecifier: ['exported', 'local'],
+ ExpressionStatement: ['expression'],
+ ForStatement: ['init', 'test', 'update', 'body'],
+ ForInStatement: ['left', 'right', 'body'],
+ ForOfStatement: ['left', 'right', 'body'],
+ FunctionDeclaration: ['id', 'params', 'body'],
+ FunctionExpression: ['id', 'params', 'body'],
+ GeneratorExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.
+ Identifier: [],
+ IfStatement: ['test', 'consequent', 'alternate'],
+ ImportExpression: ['source'],
+ ImportDeclaration: ['specifiers', 'source'],
+ ImportDefaultSpecifier: ['local'],
+ ImportNamespaceSpecifier: ['local'],
+ ImportSpecifier: ['imported', 'local'],
+ Literal: [],
+ LabeledStatement: ['label', 'body'],
+ LogicalExpression: ['left', 'right'],
+ MemberExpression: ['object', 'property'],
+ MetaProperty: ['meta', 'property'],
+ MethodDefinition: ['key', 'value'],
+ ModuleSpecifier: [],
+ NewExpression: ['callee', 'arguments'],
+ ObjectExpression: ['properties'],
+ ObjectPattern: ['properties'],
+ Program: ['body'],
+ Property: ['key', 'value'],
+ RestElement: [ 'argument' ],
+ ReturnStatement: ['argument'],
+ SequenceExpression: ['expressions'],
+ SpreadElement: ['argument'],
+ Super: [],
+ SwitchStatement: ['discriminant', 'cases'],
+ SwitchCase: ['test', 'consequent'],
+ TaggedTemplateExpression: ['tag', 'quasi'],
+ TemplateElement: [],
+ TemplateLiteral: ['quasis', 'expressions'],
+ ThisExpression: [],
+ ThrowStatement: ['argument'],
+ TryStatement: ['block', 'handler', 'finalizer'],
+ UnaryExpression: ['argument'],
+ UpdateExpression: ['argument'],
+ VariableDeclaration: ['declarations'],
+ VariableDeclarator: ['id', 'init'],
+ WhileStatement: ['test', 'body'],
+ WithStatement: ['object', 'body'],
+ YieldExpression: ['argument']
+ };
+
+ // unique id
+ BREAK = {};
+ SKIP = {};
+ REMOVE = {};
+
+ VisitorOption = {
+ Break: BREAK,
+ Skip: SKIP,
+ Remove: REMOVE
+ };
+
+ function Reference(parent, key) {
+ this.parent = parent;
+ this.key = key;
+ }
+
+ Reference.prototype.replace = function replace(node) {
+ this.parent[this.key] = node;
+ };
+
+ Reference.prototype.remove = function remove() {
+ if (Array.isArray(this.parent)) {
+ this.parent.splice(this.key, 1);
+ return true;
+ } else {
+ this.replace(null);
+ return false;
+ }
+ };
+
+ function Element(node, path, wrap, ref) {
+ this.node = node;
+ this.path = path;
+ this.wrap = wrap;
+ this.ref = ref;
+ }
+
+ function Controller() { }
+
+ // API:
+ // return property path array from root to current node
+ Controller.prototype.path = function path() {
+ var i, iz, j, jz, result, element;
+
+ function addToPath(result, path) {
+ if (Array.isArray(path)) {
+ for (j = 0, jz = path.length; j < jz; ++j) {
+ result.push(path[j]);
+ }
+ } else {
+ result.push(path);
+ }
+ }
+
+ // root node
+ if (!this.__current.path) {
+ return null;
+ }
+
+ // first node is sentinel, second node is root element
+ result = [];
+ for (i = 2, iz = this.__leavelist.length; i < iz; ++i) {
+ element = this.__leavelist[i];
+ addToPath(result, element.path);
+ }
+ addToPath(result, this.__current.path);
+ return result;
+ };
+
+ // API:
+ // return type of current node
+ Controller.prototype.type = function () {
+ var node = this.current();
+ return node.type || this.__current.wrap;
+ };
+
+ // API:
+ // return array of parent elements
+ Controller.prototype.parents = function parents() {
+ var i, iz, result;
+
+ // first node is sentinel
+ result = [];
+ for (i = 1, iz = this.__leavelist.length; i < iz; ++i) {
+ result.push(this.__leavelist[i].node);
+ }
+
+ return result;
+ };
+
+ // API:
+ // return current node
+ Controller.prototype.current = function current() {
+ return this.__current.node;
+ };
+
+ Controller.prototype.__execute = function __execute(callback, element) {
+ var previous, result;
+
+ result = undefined;
+
+ previous = this.__current;
+ this.__current = element;
+ this.__state = null;
+ if (callback) {
+ result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node);
+ }
+ this.__current = previous;
+
+ return result;
+ };
+
+ // API:
+ // notify control skip / break
+ Controller.prototype.notify = function notify(flag) {
+ this.__state = flag;
+ };
+
+ // API:
+ // skip child nodes of current node
+ Controller.prototype.skip = function () {
+ this.notify(SKIP);
+ };
+
+ // API:
+ // break traversals
+ Controller.prototype['break'] = function () {
+ this.notify(BREAK);
+ };
+
+ // API:
+ // remove node
+ Controller.prototype.remove = function () {
+ this.notify(REMOVE);
+ };
+
+ Controller.prototype.__initialize = function(root, visitor) {
+ this.visitor = visitor;
+ this.root = root;
+ this.__worklist = [];
+ this.__leavelist = [];
+ this.__current = null;
+ this.__state = null;
+ this.__fallback = null;
+ if (visitor.fallback === 'iteration') {
+ this.__fallback = Object.keys;
+ } else if (typeof visitor.fallback === 'function') {
+ this.__fallback = visitor.fallback;
+ }
+
+ this.__keys = VisitorKeys;
+ if (visitor.keys) {
+ this.__keys = Object.assign(Object.create(this.__keys), visitor.keys);
+ }
+ };
+
+ function isNode(node) {
+ if (node == null) {
+ return false;
+ }
+ return typeof node === 'object' && typeof node.type === 'string';
+ }
+
+ function isProperty(nodeType, key) {
+ return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key;
+ }
+
+ Controller.prototype.traverse = function traverse(root, visitor) {
+ var worklist,
+ leavelist,
+ element,
+ node,
+ nodeType,
+ ret,
+ key,
+ current,
+ current2,
+ candidates,
+ candidate,
+ sentinel;
+
+ this.__initialize(root, visitor);
+
+ sentinel = {};
+
+ // reference
+ worklist = this.__worklist;
+ leavelist = this.__leavelist;
+
+ // initialize
+ worklist.push(new Element(root, null, null, null));
+ leavelist.push(new Element(null, null, null, null));
+
+ while (worklist.length) {
+ element = worklist.pop();
+
+ if (element === sentinel) {
+ element = leavelist.pop();
+
+ ret = this.__execute(visitor.leave, element);
+
+ if (this.__state === BREAK || ret === BREAK) {
+ return;
+ }
+ continue;
+ }
+
+ if (element.node) {
+
+ ret = this.__execute(visitor.enter, element);
+
+ if (this.__state === BREAK || ret === BREAK) {
+ return;
+ }
+
+ worklist.push(sentinel);
+ leavelist.push(element);
+
+ if (this.__state === SKIP || ret === SKIP) {
+ continue;
+ }
+
+ node = element.node;
+ nodeType = node.type || element.wrap;
+ candidates = this.__keys[nodeType];
+ if (!candidates) {
+ if (this.__fallback) {
+ candidates = this.__fallback(node);
+ } else {
+ throw new Error('Unknown node type ' + nodeType + '.');
+ }
+ }
+
+ current = candidates.length;
+ while ((current -= 1) >= 0) {
+ key = candidates[current];
+ candidate = node[key];
+ if (!candidate) {
+ continue;
+ }
+
+ if (Array.isArray(candidate)) {
+ current2 = candidate.length;
+ while ((current2 -= 1) >= 0) {
+ if (!candidate[current2]) {
+ continue;
+ }
+ if (isProperty(nodeType, candidates[current])) {
+ element = new Element(candidate[current2], [key, current2], 'Property', null);
+ } else if (isNode(candidate[current2])) {
+ element = new Element(candidate[current2], [key, current2], null, null);
+ } else {
+ continue;
+ }
+ worklist.push(element);
+ }
+ } else if (isNode(candidate)) {
+ worklist.push(new Element(candidate, key, null, null));
+ }
+ }
+ }
+ }
+ };
+
+ Controller.prototype.replace = function replace(root, visitor) {
+ var worklist,
+ leavelist,
+ node,
+ nodeType,
+ target,
+ element,
+ current,
+ current2,
+ candidates,
+ candidate,
+ sentinel,
+ outer,
+ key;
+
+ function removeElem(element) {
+ var i,
+ key,
+ nextElem,
+ parent;
+
+ if (element.ref.remove()) {
+ // When the reference is an element of an array.
+ key = element.ref.key;
+ parent = element.ref.parent;
+
+ // If removed from array, then decrease following items' keys.
+ i = worklist.length;
+ while (i--) {
+ nextElem = worklist[i];
+ if (nextElem.ref && nextElem.ref.parent === parent) {
+ if (nextElem.ref.key < key) {
+ break;
+ }
+ --nextElem.ref.key;
+ }
+ }
+ }
+ }
+
+ this.__initialize(root, visitor);
+
+ sentinel = {};
+
+ // reference
+ worklist = this.__worklist;
+ leavelist = this.__leavelist;
+
+ // initialize
+ outer = {
+ root: root
+ };
+ element = new Element(root, null, null, new Reference(outer, 'root'));
+ worklist.push(element);
+ leavelist.push(element);
+
+ while (worklist.length) {
+ element = worklist.pop();
+
+ if (element === sentinel) {
+ element = leavelist.pop();
+
+ target = this.__execute(visitor.leave, element);
+
+ // node may be replaced with null,
+ // so distinguish between undefined and null in this place
+ if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
+ // replace
+ element.ref.replace(target);
+ }
+
+ if (this.__state === REMOVE || target === REMOVE) {
+ removeElem(element);
+ }
+
+ if (this.__state === BREAK || target === BREAK) {
+ return outer.root;
+ }
+ continue;
+ }
+
+ target = this.__execute(visitor.enter, element);
+
+ // node may be replaced with null,
+ // so distinguish between undefined and null in this place
+ if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
+ // replace
+ element.ref.replace(target);
+ element.node = target;
+ }
+
+ if (this.__state === REMOVE || target === REMOVE) {
+ removeElem(element);
+ element.node = null;
+ }
+
+ if (this.__state === BREAK || target === BREAK) {
+ return outer.root;
+ }
+
+ // node may be null
+ node = element.node;
+ if (!node) {
+ continue;
+ }
+
+ worklist.push(sentinel);
+ leavelist.push(element);
+
+ if (this.__state === SKIP || target === SKIP) {
+ continue;
+ }
+
+ nodeType = node.type || element.wrap;
+ candidates = this.__keys[nodeType];
+ if (!candidates) {
+ if (this.__fallback) {
+ candidates = this.__fallback(node);
+ } else {
+ throw new Error('Unknown node type ' + nodeType + '.');
+ }
+ }
+
+ current = candidates.length;
+ while ((current -= 1) >= 0) {
+ key = candidates[current];
+ candidate = node[key];
+ if (!candidate) {
+ continue;
+ }
+
+ if (Array.isArray(candidate)) {
+ current2 = candidate.length;
+ while ((current2 -= 1) >= 0) {
+ if (!candidate[current2]) {
+ continue;
+ }
+ if (isProperty(nodeType, candidates[current])) {
+ element = new Element(candidate[current2], [key, current2], 'Property', new Reference(candidate, current2));
+ } else if (isNode(candidate[current2])) {
+ element = new Element(candidate[current2], [key, current2], null, new Reference(candidate, current2));
+ } else {
+ continue;
+ }
+ worklist.push(element);
+ }
+ } else if (isNode(candidate)) {
+ worklist.push(new Element(candidate, key, null, new Reference(node, key)));
+ }
+ }
+ }
+
+ return outer.root;
+ };
+
+ function traverse(root, visitor) {
+ var controller = new Controller();
+ return controller.traverse(root, visitor);
+ }
+
+ function replace(root, visitor) {
+ var controller = new Controller();
+ return controller.replace(root, visitor);
+ }
+
+ function extendCommentRange(comment, tokens) {
+ var target;
+
+ target = upperBound(tokens, function search(token) {
+ return token.range[0] > comment.range[0];
+ });
+
+ comment.extendedRange = [comment.range[0], comment.range[1]];
+
+ if (target !== tokens.length) {
+ comment.extendedRange[1] = tokens[target].range[0];
+ }
+
+ target -= 1;
+ if (target >= 0) {
+ comment.extendedRange[0] = tokens[target].range[1];
+ }
+
+ return comment;
+ }
+
+ function attachComments(tree, providedComments, tokens) {
+ // At first, we should calculate extended comment ranges.
+ var comments = [], comment, len, i, cursor;
+
+ if (!tree.range) {
+ throw new Error('attachComments needs range information');
+ }
+
+ // tokens array is empty, we attach comments to tree as 'leadingComments'
+ if (!tokens.length) {
+ if (providedComments.length) {
+ for (i = 0, len = providedComments.length; i < len; i += 1) {
+ comment = deepCopy(providedComments[i]);
+ comment.extendedRange = [0, tree.range[0]];
+ comments.push(comment);
+ }
+ tree.leadingComments = comments;
+ }
+ return tree;
+ }
+
+ for (i = 0, len = providedComments.length; i < len; i += 1) {
+ comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens));
+ }
+
+ // This is based on John Freeman's implementation.
+ cursor = 0;
+ traverse(tree, {
+ enter: function (node) {
+ var comment;
+
+ while (cursor < comments.length) {
+ comment = comments[cursor];
+ if (comment.extendedRange[1] > node.range[0]) {
+ break;
+ }
+
+ if (comment.extendedRange[1] === node.range[0]) {
+ if (!node.leadingComments) {
+ node.leadingComments = [];
+ }
+ node.leadingComments.push(comment);
+ comments.splice(cursor, 1);
+ } else {
+ cursor += 1;
+ }
+ }
+
+ // already out of owned node
+ if (cursor === comments.length) {
+ return VisitorOption.Break;
+ }
+
+ if (comments[cursor].extendedRange[0] > node.range[1]) {
+ return VisitorOption.Skip;
+ }
+ }
+ });
+
+ cursor = 0;
+ traverse(tree, {
+ leave: function (node) {
+ var comment;
+
+ while (cursor < comments.length) {
+ comment = comments[cursor];
+ if (node.range[1] < comment.extendedRange[0]) {
+ break;
+ }
+
+ if (node.range[1] === comment.extendedRange[0]) {
+ if (!node.trailingComments) {
+ node.trailingComments = [];
+ }
+ node.trailingComments.push(comment);
+ comments.splice(cursor, 1);
+ } else {
+ cursor += 1;
+ }
+ }
+
+ // already out of owned node
+ if (cursor === comments.length) {
+ return VisitorOption.Break;
+ }
+
+ if (comments[cursor].extendedRange[0] > node.range[1]) {
+ return VisitorOption.Skip;
+ }
+ }
+ });
+
+ return tree;
+ }
+
+ exports.version = require$$0.version;
+ exports.Syntax = Syntax;
+ exports.traverse = traverse;
+ exports.replace = replace;
+ exports.attachComments = attachComments;
+ exports.VisitorKeys = VisitorKeys;
+ exports.VisitorOption = VisitorOption;
+ exports.Controller = Controller;
+ exports.cloneEnvironment = function () { return clone({}); };
+
+ return exports;
+ }(exports));
+ /* vim: set sw=4 ts=4 et tw=80 : */
+ });
+
+ /*
+ Copyright (C) 2013 Yusuke Suzuki
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ var ast = createCommonjsModule(function (module) {
+ (function () {
+ 'use strict';
+
+ function isExpression(node) {
+ if (node == null) { return false; }
+ switch (node.type) {
+ case 'ArrayExpression':
+ case 'AssignmentExpression':
+ case 'BinaryExpression':
+ case 'CallExpression':
+ case 'ConditionalExpression':
+ case 'FunctionExpression':
+ case 'Identifier':
+ case 'Literal':
+ case 'LogicalExpression':
+ case 'MemberExpression':
+ case 'NewExpression':
+ case 'ObjectExpression':
+ case 'SequenceExpression':
+ case 'ThisExpression':
+ case 'UnaryExpression':
+ case 'UpdateExpression':
+ return true;
+ }
+ return false;
+ }
+
+ function isIterationStatement(node) {
+ if (node == null) { return false; }
+ switch (node.type) {
+ case 'DoWhileStatement':
+ case 'ForInStatement':
+ case 'ForStatement':
+ case 'WhileStatement':
+ return true;
+ }
+ return false;
+ }
+
+ function isStatement(node) {
+ if (node == null) { return false; }
+ switch (node.type) {
+ case 'BlockStatement':
+ case 'BreakStatement':
+ case 'ContinueStatement':
+ case 'DebuggerStatement':
+ case 'DoWhileStatement':
+ case 'EmptyStatement':
+ case 'ExpressionStatement':
+ case 'ForInStatement':
+ case 'ForStatement':
+ case 'IfStatement':
+ case 'LabeledStatement':
+ case 'ReturnStatement':
+ case 'SwitchStatement':
+ case 'ThrowStatement':
+ case 'TryStatement':
+ case 'VariableDeclaration':
+ case 'WhileStatement':
+ case 'WithStatement':
+ return true;
+ }
+ return false;
+ }
+
+ function isSourceElement(node) {
+ return isStatement(node) || node != null && node.type === 'FunctionDeclaration';
+ }
+
+ function trailingStatement(node) {
+ switch (node.type) {
+ case 'IfStatement':
+ if (node.alternate != null) {
+ return node.alternate;
+ }
+ return node.consequent;
+
+ case 'LabeledStatement':
+ case 'ForStatement':
+ case 'ForInStatement':
+ case 'WhileStatement':
+ case 'WithStatement':
+ return node.body;
+ }
+ return null;
+ }
+
+ function isProblematicIfStatement(node) {
+ var current;
+
+ if (node.type !== 'IfStatement') {
+ return false;
+ }
+ if (node.alternate == null) {
+ return false;
+ }
+ current = node.consequent;
+ do {
+ if (current.type === 'IfStatement') {
+ if (current.alternate == null) {
+ return true;
+ }
+ }
+ current = trailingStatement(current);
+ } while (current);
+
+ return false;
+ }
+
+ module.exports = {
+ isExpression: isExpression,
+ isStatement: isStatement,
+ isIterationStatement: isIterationStatement,
+ isSourceElement: isSourceElement,
+ isProblematicIfStatement: isProblematicIfStatement,
+
+ trailingStatement: trailingStatement
+ };
+ }());
+ /* vim: set sw=4 ts=4 et tw=80 : */
+ });
+
+ /*
+ Copyright (C) 2013-2014 Yusuke Suzuki
+ Copyright (C) 2014 Ivan Nikulin
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ var code = createCommonjsModule(function (module) {
+ (function () {
+ 'use strict';
+
+ var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch;
+
+ // See `tools/generate-identifier-regex.js`.
+ ES5Regex = {
+ // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierStart:
+ NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,
+ // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierPart:
+ NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/
+ };
+
+ ES6Regex = {
+ // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierStart:
+ NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
+ // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierPart:
+ NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
+ };
+
+ function isDecimalDigit(ch) {
+ return 0x30 <= ch && ch <= 0x39; // 0..9
+ }
+
+ function isHexDigit(ch) {
+ return 0x30 <= ch && ch <= 0x39 || // 0..9
+ 0x61 <= ch && ch <= 0x66 || // a..f
+ 0x41 <= ch && ch <= 0x46; // A..F
+ }
+
+ function isOctalDigit(ch) {
+ return ch >= 0x30 && ch <= 0x37; // 0..7
+ }
+
+ // 7.2 White Space
+
+ NON_ASCII_WHITESPACES = [
+ 0x1680,
+ 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A,
+ 0x202F, 0x205F,
+ 0x3000,
+ 0xFEFF
+ ];
+
+ function isWhiteSpace(ch) {
+ return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 ||
+ ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0;
+ }
+
+ // 7.3 Line Terminators
+
+ function isLineTerminator(ch) {
+ return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;
+ }
+
+ // 7.6 Identifier Names and Identifiers
+
+ function fromCodePoint(cp) {
+ if (cp <= 0xFFFF) { return String.fromCharCode(cp); }
+ var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800);
+ var cu2 = String.fromCharCode(((cp - 0x10000) % 0x400) + 0xDC00);
+ return cu1 + cu2;
+ }
+
+ IDENTIFIER_START = new Array(0x80);
+ for(ch = 0; ch < 0x80; ++ch) {
+ IDENTIFIER_START[ch] =
+ ch >= 0x61 && ch <= 0x7A || // a..z
+ ch >= 0x41 && ch <= 0x5A || // A..Z
+ ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore)
+ }
+
+ IDENTIFIER_PART = new Array(0x80);
+ for(ch = 0; ch < 0x80; ++ch) {
+ IDENTIFIER_PART[ch] =
+ ch >= 0x61 && ch <= 0x7A || // a..z
+ ch >= 0x41 && ch <= 0x5A || // A..Z
+ ch >= 0x30 && ch <= 0x39 || // 0..9
+ ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore)
+ }
+
+ function isIdentifierStartES5(ch) {
+ return ch < 0x80 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
+ }
+
+ function isIdentifierPartES5(ch) {
+ return ch < 0x80 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
+ }
+
+ function isIdentifierStartES6(ch) {
+ return ch < 0x80 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
+ }
+
+ function isIdentifierPartES6(ch) {
+ return ch < 0x80 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
+ }
+
+ module.exports = {
+ isDecimalDigit: isDecimalDigit,
+ isHexDigit: isHexDigit,
+ isOctalDigit: isOctalDigit,
+ isWhiteSpace: isWhiteSpace,
+ isLineTerminator: isLineTerminator,
+ isIdentifierStartES5: isIdentifierStartES5,
+ isIdentifierPartES5: isIdentifierPartES5,
+ isIdentifierStartES6: isIdentifierStartES6,
+ isIdentifierPartES6: isIdentifierPartES6
+ };
+ }());
+ /* vim: set sw=4 ts=4 et tw=80 : */
+ });
+
+ /*
+ Copyright (C) 2013 Yusuke Suzuki
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ var keyword = createCommonjsModule(function (module) {
+ (function () {
+ 'use strict';
+
+ var code$1 = code;
+
+ function isStrictModeReservedWordES6(id) {
+ switch (id) {
+ case 'implements':
+ case 'interface':
+ case 'package':
+ case 'private':
+ case 'protected':
+ case 'public':
+ case 'static':
+ case 'let':
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ function isKeywordES5(id, strict) {
+ // yield should not be treated as keyword under non-strict mode.
+ if (!strict && id === 'yield') {
+ return false;
+ }
+ return isKeywordES6(id, strict);
+ }
+
+ function isKeywordES6(id, strict) {
+ if (strict && isStrictModeReservedWordES6(id)) {
+ return true;
+ }
+
+ switch (id.length) {
+ case 2:
+ return (id === 'if') || (id === 'in') || (id === 'do');
+ case 3:
+ return (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try');
+ case 4:
+ return (id === 'this') || (id === 'else') || (id === 'case') ||
+ (id === 'void') || (id === 'with') || (id === 'enum');
+ case 5:
+ return (id === 'while') || (id === 'break') || (id === 'catch') ||
+ (id === 'throw') || (id === 'const') || (id === 'yield') ||
+ (id === 'class') || (id === 'super');
+ case 6:
+ return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
+ (id === 'switch') || (id === 'export') || (id === 'import');
+ case 7:
+ return (id === 'default') || (id === 'finally') || (id === 'extends');
+ case 8:
+ return (id === 'function') || (id === 'continue') || (id === 'debugger');
+ case 10:
+ return (id === 'instanceof');
+ default:
+ return false;
+ }
+ }
+
+ function isReservedWordES5(id, strict) {
+ return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict);
+ }
+
+ function isReservedWordES6(id, strict) {
+ return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict);
+ }
+
+ function isRestrictedWord(id) {
+ return id === 'eval' || id === 'arguments';
+ }
+
+ function isIdentifierNameES5(id) {
+ var i, iz, ch;
+
+ if (id.length === 0) { return false; }
+
+ ch = id.charCodeAt(0);
+ if (!code$1.isIdentifierStartES5(ch)) {
+ return false;
+ }
+
+ for (i = 1, iz = id.length; i < iz; ++i) {
+ ch = id.charCodeAt(i);
+ if (!code$1.isIdentifierPartES5(ch)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function decodeUtf16(lead, trail) {
+ return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
+ }
+
+ function isIdentifierNameES6(id) {
+ var i, iz, ch, lowCh, check;
+
+ if (id.length === 0) { return false; }
+
+ check = code$1.isIdentifierStartES6;
+ for (i = 0, iz = id.length; i < iz; ++i) {
+ ch = id.charCodeAt(i);
+ if (0xD800 <= ch && ch <= 0xDBFF) {
+ ++i;
+ if (i >= iz) { return false; }
+ lowCh = id.charCodeAt(i);
+ if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) {
+ return false;
+ }
+ ch = decodeUtf16(ch, lowCh);
+ }
+ if (!check(ch)) {
+ return false;
+ }
+ check = code$1.isIdentifierPartES6;
+ }
+ return true;
+ }
+
+ function isIdentifierES5(id, strict) {
+ return isIdentifierNameES5(id) && !isReservedWordES5(id, strict);
+ }
+
+ function isIdentifierES6(id, strict) {
+ return isIdentifierNameES6(id) && !isReservedWordES6(id, strict);
+ }
+
+ module.exports = {
+ isKeywordES5: isKeywordES5,
+ isKeywordES6: isKeywordES6,
+ isReservedWordES5: isReservedWordES5,
+ isReservedWordES6: isReservedWordES6,
+ isRestrictedWord: isRestrictedWord,
+ isIdentifierNameES5: isIdentifierNameES5,
+ isIdentifierNameES6: isIdentifierNameES6,
+ isIdentifierES5: isIdentifierES5,
+ isIdentifierES6: isIdentifierES6
+ };
+ }());
+ /* vim: set sw=4 ts=4 et tw=80 : */
+ });
+
+ /*
+ Copyright (C) 2013 Yusuke Suzuki
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ var utils = createCommonjsModule(function (module, exports) {
+ (function () {
+ 'use strict';
+
+ exports.ast = ast;
+ exports.code = code;
+ exports.keyword = keyword;
+ }());
+ /* vim: set sw=4 ts=4 et tw=80 : */
+ });
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
+
+ /**
+ * Encode an integer in the range of 0 to 63 to a single base 64 digit.
+ */
+ var encode$1 = function (number) {
+ if (0 <= number && number < intToCharMap.length) {
+ return intToCharMap[number];
+ }
+ throw new TypeError("Must be between 0 and 63: " + number);
+ };
+
+ /**
+ * Decode a single base 64 character code digit to an integer. Returns -1 on
+ * failure.
+ */
+ var decode$1 = function (charCode) {
+ var bigA = 65; // 'A'
+ var bigZ = 90; // 'Z'
+
+ var littleA = 97; // 'a'
+ var littleZ = 122; // 'z'
+
+ var zero = 48; // '0'
+ var nine = 57; // '9'
+
+ var plus = 43; // '+'
+ var slash = 47; // '/'
+
+ var littleOffset = 26;
+ var numberOffset = 52;
+
+ // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ if (bigA <= charCode && charCode <= bigZ) {
+ return (charCode - bigA);
+ }
+
+ // 26 - 51: abcdefghijklmnopqrstuvwxyz
+ if (littleA <= charCode && charCode <= littleZ) {
+ return (charCode - littleA + littleOffset);
+ }
+
+ // 52 - 61: 0123456789
+ if (zero <= charCode && charCode <= nine) {
+ return (charCode - zero + numberOffset);
+ }
+
+ // 62: +
+ if (charCode == plus) {
+ return 62;
+ }
+
+ // 63: /
+ if (charCode == slash) {
+ return 63;
+ }
+
+ // Invalid base64 digit.
+ return -1;
+ };
+
+ var base64 = {
+ encode: encode$1,
+ decode: decode$1
+ };
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ *
+ * Based on the Base 64 VLQ implementation in Closure Compiler:
+ * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
+ *
+ * Copyright 2011 The Closure Compiler Authors. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+
+ // A single base 64 digit can contain 6 bits of data. For the base 64 variable
+ // length quantities we use in the source map spec, the first bit is the sign,
+ // the next four bits are the actual value, and the 6th bit is the
+ // continuation bit. The continuation bit tells us whether there are more
+ // digits in this value following this digit.
+ //
+ // Continuation
+ // | Sign
+ // | |
+ // V V
+ // 101011
+
+ var VLQ_BASE_SHIFT = 5;
+
+ // binary: 100000
+ var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+
+ // binary: 011111
+ var VLQ_BASE_MASK = VLQ_BASE - 1;
+
+ // binary: 100000
+ var VLQ_CONTINUATION_BIT = VLQ_BASE;
+
+ /**
+ * Converts from a two-complement value to a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+ * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+ */
+ function toVLQSigned(aValue) {
+ return aValue < 0
+ ? ((-aValue) << 1) + 1
+ : (aValue << 1) + 0;
+ }
+
+ /**
+ * Converts to a two-complement value from a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
+ * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
+ */
+ function fromVLQSigned(aValue) {
+ var isNegative = (aValue & 1) === 1;
+ var shifted = aValue >> 1;
+ return isNegative
+ ? -shifted
+ : shifted;
+ }
+
+ /**
+ * Returns the base 64 VLQ encoded value.
+ */
+ var encode = function base64VLQ_encode(aValue) {
+ var encoded = "";
+ var digit;
+
+ var vlq = toVLQSigned(aValue);
+
+ do {
+ digit = vlq & VLQ_BASE_MASK;
+ vlq >>>= VLQ_BASE_SHIFT;
+ if (vlq > 0) {
+ // There are still more digits in this value, so we must make sure the
+ // continuation bit is marked.
+ digit |= VLQ_CONTINUATION_BIT;
+ }
+ encoded += base64.encode(digit);
+ } while (vlq > 0);
+
+ return encoded;
+ };
+
+ /**
+ * Decodes the next base 64 VLQ value from the given string and returns the
+ * value and the rest of the string via the out parameter.
+ */
+ var decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
+ var strLen = aStr.length;
+ var result = 0;
+ var shift = 0;
+ var continuation, digit;
+
+ do {
+ if (aIndex >= strLen) {
+ throw new Error("Expected more digits in base 64 VLQ value.");
+ }
+
+ digit = base64.decode(aStr.charCodeAt(aIndex++));
+ if (digit === -1) {
+ throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
+ }
+
+ continuation = !!(digit & VLQ_CONTINUATION_BIT);
+ digit &= VLQ_BASE_MASK;
+ result = result + (digit << shift);
+ shift += VLQ_BASE_SHIFT;
+ } while (continuation);
+
+ aOutParam.value = fromVLQSigned(result);
+ aOutParam.rest = aIndex;
+ };
+
+ var base64Vlq = {
+ encode: encode,
+ decode: decode
+ };
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+
+ var util = createCommonjsModule(function (module, exports) {
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ /**
+ * This is a helper function for getting values from parameter/options
+ * objects.
+ *
+ * @param args The object we are extracting values from
+ * @param name The name of the property we are getting.
+ * @param defaultValue An optional value to return if the property is missing
+ * from the object. If this is not specified and the property is missing, an
+ * error will be thrown.
+ */
+ function getArg(aArgs, aName, aDefaultValue) {
+ if (aName in aArgs) {
+ return aArgs[aName];
+ } else if (arguments.length === 3) {
+ return aDefaultValue;
+ } else {
+ throw new Error('"' + aName + '" is a required argument.');
+ }
+ }
+ exports.getArg = getArg;
+
+ var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
+ var dataUrlRegexp = /^data:.+\,.+$/;
+
+ function urlParse(aUrl) {
+ var match = aUrl.match(urlRegexp);
+ if (!match) {
+ return null;
+ }
+ return {
+ scheme: match[1],
+ auth: match[2],
+ host: match[3],
+ port: match[4],
+ path: match[5]
+ };
+ }
+ exports.urlParse = urlParse;
+
+ function urlGenerate(aParsedUrl) {
+ var url = '';
+ if (aParsedUrl.scheme) {
+ url += aParsedUrl.scheme + ':';
+ }
+ url += '//';
+ if (aParsedUrl.auth) {
+ url += aParsedUrl.auth + '@';
+ }
+ if (aParsedUrl.host) {
+ url += aParsedUrl.host;
+ }
+ if (aParsedUrl.port) {
+ url += ":" + aParsedUrl.port;
+ }
+ if (aParsedUrl.path) {
+ url += aParsedUrl.path;
+ }
+ return url;
+ }
+ exports.urlGenerate = urlGenerate;
+
+ /**
+ * Normalizes a path, or the path portion of a URL:
+ *
+ * - Replaces consecutive slashes with one slash.
+ * - Removes unnecessary '.' parts.
+ * - Removes unnecessary '/..' parts.
+ *
+ * Based on code in the Node.js 'path' core module.
+ *
+ * @param aPath The path or url to normalize.
+ */
+ function normalize(aPath) {
+ var path = aPath;
+ var url = urlParse(aPath);
+ if (url) {
+ if (!url.path) {
+ return aPath;
+ }
+ path = url.path;
+ }
+ var isAbsolute = exports.isAbsolute(path);
+
+ var parts = path.split(/\/+/);
+ for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
+ part = parts[i];
+ if (part === '.') {
+ parts.splice(i, 1);
+ } else if (part === '..') {
+ up++;
+ } else if (up > 0) {
+ if (part === '') {
+ // The first part is blank if the path is absolute. Trying to go
+ // above the root is a no-op. Therefore we can remove all '..' parts
+ // directly after the root.
+ parts.splice(i + 1, up);
+ up = 0;
+ } else {
+ parts.splice(i, 2);
+ up--;
+ }
+ }
+ }
+ path = parts.join('/');
+
+ if (path === '') {
+ path = isAbsolute ? '/' : '.';
+ }
+
+ if (url) {
+ url.path = path;
+ return urlGenerate(url);
+ }
+ return path;
+ }
+ exports.normalize = normalize;
+
+ /**
+ * Joins two paths/URLs.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be joined with the root.
+ *
+ * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
+ * scheme-relative URL: Then the scheme of aRoot, if any, is prepended
+ * first.
+ * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
+ * is updated with the result and aRoot is returned. Otherwise the result
+ * is returned.
+ * - If aPath is absolute, the result is aPath.
+ * - Otherwise the two paths are joined with a slash.
+ * - Joining for example 'http://' and 'www.example.com' is also supported.
+ */
+ function join(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+ if (aPath === "") {
+ aPath = ".";
+ }
+ var aPathUrl = urlParse(aPath);
+ var aRootUrl = urlParse(aRoot);
+ if (aRootUrl) {
+ aRoot = aRootUrl.path || '/';
+ }
+
+ // `join(foo, '//www.example.org')`
+ if (aPathUrl && !aPathUrl.scheme) {
+ if (aRootUrl) {
+ aPathUrl.scheme = aRootUrl.scheme;
+ }
+ return urlGenerate(aPathUrl);
+ }
+
+ if (aPathUrl || aPath.match(dataUrlRegexp)) {
+ return aPath;
+ }
+
+ // `join('http://', 'www.example.com')`
+ if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
+ aRootUrl.host = aPath;
+ return urlGenerate(aRootUrl);
+ }
+
+ var joined = aPath.charAt(0) === '/'
+ ? aPath
+ : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
+
+ if (aRootUrl) {
+ aRootUrl.path = joined;
+ return urlGenerate(aRootUrl);
+ }
+ return joined;
+ }
+ exports.join = join;
+
+ exports.isAbsolute = function (aPath) {
+ return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
+ };
+
+ /**
+ * Make a path relative to a URL or another path.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be made relative to aRoot.
+ */
+ function relative(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+
+ aRoot = aRoot.replace(/\/$/, '');
+
+ // It is possible for the path to be above the root. In this case, simply
+ // checking whether the root is a prefix of the path won't work. Instead, we
+ // need to remove components from the root one by one, until either we find
+ // a prefix that fits, or we run out of components to remove.
+ var level = 0;
+ while (aPath.indexOf(aRoot + '/') !== 0) {
+ var index = aRoot.lastIndexOf("/");
+ if (index < 0) {
+ return aPath;
+ }
+
+ // If the only part of the root that is left is the scheme (i.e. http://,
+ // file:///, etc.), one or more slashes (/), or simply nothing at all, we
+ // have exhausted all components, so the path is not relative to the root.
+ aRoot = aRoot.slice(0, index);
+ if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
+ return aPath;
+ }
+
+ ++level;
+ }
+
+ // Make sure we add a "../" for each component we removed from the root.
+ return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
+ }
+ exports.relative = relative;
+
+ var supportsNullProto = (function () {
+ var obj = Object.create(null);
+ return !('__proto__' in obj);
+ }());
+
+ function identity (s) {
+ return s;
+ }
+
+ /**
+ * Because behavior goes wacky when you set `__proto__` on objects, we
+ * have to prefix all the strings in our set with an arbitrary character.
+ *
+ * See https://github.com/mozilla/source-map/pull/31 and
+ * https://github.com/mozilla/source-map/issues/30
+ *
+ * @param String aStr
+ */
+ function toSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return '$' + aStr;
+ }
+
+ return aStr;
+ }
+ exports.toSetString = supportsNullProto ? identity : toSetString;
+
+ function fromSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return aStr.slice(1);
+ }
+
+ return aStr;
+ }
+ exports.fromSetString = supportsNullProto ? identity : fromSetString;
+
+ function isProtoString(s) {
+ if (!s) {
+ return false;
+ }
+
+ var length = s.length;
+
+ if (length < 9 /* "__proto__".length */) {
+ return false;
+ }
+
+ if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 2) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 4) !== 116 /* 't' */ ||
+ s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
+ s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
+ s.charCodeAt(length - 8) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 9) !== 95 /* '_' */) {
+ return false;
+ }
+
+ for (var i = length - 10; i >= 0; i--) {
+ if (s.charCodeAt(i) !== 36 /* '$' */) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Comparator between two mappings where the original positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same original source/line/column, but different generated
+ * line and column the same. Useful when searching for a mapping with a
+ * stubbed out mapping.
+ */
+ function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
+ var cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByOriginalPositions = compareByOriginalPositions;
+
+ /**
+ * Comparator between two mappings with deflated source and name indices where
+ * the generated positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same generated line and column, but different
+ * source/name/original line and column the same. Useful when searching for a
+ * mapping with a stubbed out mapping.
+ */
+ function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0 || onlyCompareGenerated) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+ function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 === null) {
+ return 1; // aStr2 !== null
+ }
+
+ if (aStr2 === null) {
+ return -1; // aStr1 !== null
+ }
+
+ if (aStr1 > aStr2) {
+ return 1;
+ }
+
+ return -1;
+ }
+
+ /**
+ * Comparator between two mappings with inflated source and name strings where
+ * the generated positions are compared.
+ */
+ function compareByGeneratedPositionsInflated(mappingA, mappingB) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
+
+ /**
+ * Strip any JSON XSSI avoidance prefix from the string (as documented
+ * in the source maps specification), and then parse the string as
+ * JSON.
+ */
+ function parseSourceMapInput(str) {
+ return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
+ }
+ exports.parseSourceMapInput = parseSourceMapInput;
+
+ /**
+ * Compute the URL of a source given the the source root, the source's
+ * URL, and the source map's URL.
+ */
+ function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+ sourceURL = sourceURL || '';
+
+ if (sourceRoot) {
+ // This follows what Chrome does.
+ if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
+ sourceRoot += '/';
+ }
+ // The spec says:
+ // Line 4: An optional source root, useful for relocating source
+ // files on a server or removing repeated values in the
+ // “sources” entry. This value is prepended to the individual
+ // entries in the “source” field.
+ sourceURL = sourceRoot + sourceURL;
+ }
+
+ // Historically, SourceMapConsumer did not take the sourceMapURL as
+ // a parameter. This mode is still somewhat supported, which is why
+ // this code block is conditional. However, it's preferable to pass
+ // the source map URL to SourceMapConsumer, so that this function
+ // can implement the source URL resolution algorithm as outlined in
+ // the spec. This block is basically the equivalent of:
+ // new URL(sourceURL, sourceMapURL).toString()
+ // ... except it avoids using URL, which wasn't available in the
+ // older releases of node still supported by this library.
+ //
+ // The spec says:
+ // If the sources are not absolute URLs after prepending of the
+ // “sourceRoot”, the sources are resolved relative to the
+ // SourceMap (like resolving script src in a html document).
+ if (sourceMapURL) {
+ var parsed = urlParse(sourceMapURL);
+ if (!parsed) {
+ throw new Error("sourceMapURL could not be parsed");
+ }
+ if (parsed.path) {
+ // Strip the last path component, but keep the "/".
+ var index = parsed.path.lastIndexOf('/');
+ if (index >= 0) {
+ parsed.path = parsed.path.substring(0, index + 1);
+ }
+ }
+ sourceURL = join(urlGenerate(parsed), sourceURL);
+ }
+
+ return normalize(sourceURL);
+ }
+ exports.computeSourceURL = computeSourceURL;
+ });
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+ var has = Object.prototype.hasOwnProperty;
+ var hasNativeMap = typeof Map !== "undefined";
+
+ /**
+ * A data structure which is a combination of an array and a set. Adding a new
+ * member is O(1), testing for membership is O(1), and finding the index of an
+ * element is O(1). Removing elements from the set is not supported. Only
+ * strings are supported for membership.
+ */
+ function ArraySet$2() {
+ this._array = [];
+ this._set = hasNativeMap ? new Map() : Object.create(null);
+ }
+
+ /**
+ * Static method for creating ArraySet instances from an existing array.
+ */
+ ArraySet$2.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
+ var set = new ArraySet$2();
+ for (var i = 0, len = aArray.length; i < len; i++) {
+ set.add(aArray[i], aAllowDuplicates);
+ }
+ return set;
+ };
+
+ /**
+ * Return how many unique items are in this ArraySet. If duplicates have been
+ * added, than those do not count towards the size.
+ *
+ * @returns Number
+ */
+ ArraySet$2.prototype.size = function ArraySet_size() {
+ return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
+ };
+
+ /**
+ * Add the given string to this set.
+ *
+ * @param String aStr
+ */
+ ArraySet$2.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
+ var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
+ var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
+ var idx = this._array.length;
+ if (!isDuplicate || aAllowDuplicates) {
+ this._array.push(aStr);
+ }
+ if (!isDuplicate) {
+ if (hasNativeMap) {
+ this._set.set(aStr, idx);
+ } else {
+ this._set[sStr] = idx;
+ }
+ }
+ };
+
+ /**
+ * Is the given string a member of this set?
+ *
+ * @param String aStr
+ */
+ ArraySet$2.prototype.has = function ArraySet_has(aStr) {
+ if (hasNativeMap) {
+ return this._set.has(aStr);
+ } else {
+ var sStr = util.toSetString(aStr);
+ return has.call(this._set, sStr);
+ }
+ };
+
+ /**
+ * What is the index of the given string in the array?
+ *
+ * @param String aStr
+ */
+ ArraySet$2.prototype.indexOf = function ArraySet_indexOf(aStr) {
+ if (hasNativeMap) {
+ var idx = this._set.get(aStr);
+ if (idx >= 0) {
+ return idx;
+ }
+ } else {
+ var sStr = util.toSetString(aStr);
+ if (has.call(this._set, sStr)) {
+ return this._set[sStr];
+ }
+ }
+
+ throw new Error('"' + aStr + '" is not in the set.');
+ };
+
+ /**
+ * What is the element at the given index?
+ *
+ * @param Number aIdx
+ */
+ ArraySet$2.prototype.at = function ArraySet_at(aIdx) {
+ if (aIdx >= 0 && aIdx < this._array.length) {
+ return this._array[aIdx];
+ }
+ throw new Error('No element indexed by ' + aIdx);
+ };
+
+ /**
+ * Returns the array representation of this set (which has the proper indices
+ * indicated by indexOf). Note that this is a copy of the internal array used
+ * for storing the members so that no one can mess with internal state.
+ */
+ ArraySet$2.prototype.toArray = function ArraySet_toArray() {
+ return this._array.slice();
+ };
+
+ var ArraySet_1 = ArraySet$2;
+
+ var arraySet = {
+ ArraySet: ArraySet_1
+ };
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+
+ /*
+ * Copyright 2014 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+
+ /**
+ * Determine whether mappingB is after mappingA with respect to generated
+ * position.
+ */
+ function generatedPositionAfter(mappingA, mappingB) {
+ // Optimized for most common case
+ var lineA = mappingA.generatedLine;
+ var lineB = mappingB.generatedLine;
+ var columnA = mappingA.generatedColumn;
+ var columnB = mappingB.generatedColumn;
+ return lineB > lineA || lineB == lineA && columnB >= columnA ||
+ util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
+ }
+
+ /**
+ * A data structure to provide a sorted view of accumulated mappings in a
+ * performance conscious manner. It trades a neglibable overhead in general
+ * case for a large speedup in case of mappings being added in order.
+ */
+ function MappingList$1() {
+ this._array = [];
+ this._sorted = true;
+ // Serves as infimum
+ this._last = {generatedLine: -1, generatedColumn: 0};
+ }
+
+ /**
+ * Iterate through internal items. This method takes the same arguments that
+ * `Array.prototype.forEach` takes.
+ *
+ * NOTE: The order of the mappings is NOT guaranteed.
+ */
+ MappingList$1.prototype.unsortedForEach =
+ function MappingList_forEach(aCallback, aThisArg) {
+ this._array.forEach(aCallback, aThisArg);
+ };
+
+ /**
+ * Add the given source mapping.
+ *
+ * @param Object aMapping
+ */
+ MappingList$1.prototype.add = function MappingList_add(aMapping) {
+ if (generatedPositionAfter(this._last, aMapping)) {
+ this._last = aMapping;
+ this._array.push(aMapping);
+ } else {
+ this._sorted = false;
+ this._array.push(aMapping);
+ }
+ };
+
+ /**
+ * Returns the flat, sorted array of mappings. The mappings are sorted by
+ * generated position.
+ *
+ * WARNING: This method returns internal data without copying, for
+ * performance. The return value must NOT be mutated, and should be treated as
+ * an immutable borrow. If you want to take ownership, you must make your own
+ * copy.
+ */
+ MappingList$1.prototype.toArray = function MappingList_toArray() {
+ if (!this._sorted) {
+ this._array.sort(util.compareByGeneratedPositionsInflated);
+ this._sorted = true;
+ }
+ return this._array;
+ };
+
+ var MappingList_1 = MappingList$1;
+
+ var mappingList = {
+ MappingList: MappingList_1
+ };
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+
+ var ArraySet$1 = arraySet.ArraySet;
+ var MappingList = mappingList.MappingList;
+
+ /**
+ * An instance of the SourceMapGenerator represents a source map which is
+ * being built incrementally. You may pass an object with the following
+ * properties:
+ *
+ * - file: The filename of the generated source.
+ * - sourceRoot: A root for all relative URLs in this source map.
+ */
+ function SourceMapGenerator$2(aArgs) {
+ if (!aArgs) {
+ aArgs = {};
+ }
+ this._file = util.getArg(aArgs, 'file', null);
+ this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
+ this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
+ this._sources = new ArraySet$1();
+ this._names = new ArraySet$1();
+ this._mappings = new MappingList();
+ this._sourcesContents = null;
+ }
+
+ SourceMapGenerator$2.prototype._version = 3;
+
+ /**
+ * Creates a new SourceMapGenerator based on a SourceMapConsumer
+ *
+ * @param aSourceMapConsumer The SourceMap.
+ */
+ SourceMapGenerator$2.fromSourceMap =
+ function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
+ var sourceRoot = aSourceMapConsumer.sourceRoot;
+ var generator = new SourceMapGenerator$2({
+ file: aSourceMapConsumer.file,
+ sourceRoot: sourceRoot
+ });
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ var newMapping = {
+ generated: {
+ line: mapping.generatedLine,
+ column: mapping.generatedColumn
+ }
+ };
+
+ if (mapping.source != null) {
+ newMapping.source = mapping.source;
+ if (sourceRoot != null) {
+ newMapping.source = util.relative(sourceRoot, newMapping.source);
+ }
+
+ newMapping.original = {
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ };
+
+ if (mapping.name != null) {
+ newMapping.name = mapping.name;
+ }
+ }
+
+ generator.addMapping(newMapping);
+ });
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var sourceRelative = sourceFile;
+ if (sourceRoot !== null) {
+ sourceRelative = util.relative(sourceRoot, sourceFile);
+ }
+
+ if (!generator._sources.has(sourceRelative)) {
+ generator._sources.add(sourceRelative);
+ }
+
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ generator.setSourceContent(sourceFile, content);
+ }
+ });
+ return generator;
+ };
+
+ /**
+ * Add a single mapping from original source line and column to the generated
+ * source's line and column for this source map being created. The mapping
+ * object should have the following properties:
+ *
+ * - generated: An object with the generated line and column positions.
+ * - original: An object with the original line and column positions.
+ * - source: The original source file (relative to the sourceRoot).
+ * - name: An optional original token name for this mapping.
+ */
+ SourceMapGenerator$2.prototype.addMapping =
+ function SourceMapGenerator_addMapping(aArgs) {
+ var generated = util.getArg(aArgs, 'generated');
+ var original = util.getArg(aArgs, 'original', null);
+ var source = util.getArg(aArgs, 'source', null);
+ var name = util.getArg(aArgs, 'name', null);
+
+ if (!this._skipValidation) {
+ this._validateMapping(generated, original, source, name);
+ }
+
+ if (source != null) {
+ source = String(source);
+ if (!this._sources.has(source)) {
+ this._sources.add(source);
+ }
+ }
+
+ if (name != null) {
+ name = String(name);
+ if (!this._names.has(name)) {
+ this._names.add(name);
+ }
+ }
+
+ this._mappings.add({
+ generatedLine: generated.line,
+ generatedColumn: generated.column,
+ originalLine: original != null && original.line,
+ originalColumn: original != null && original.column,
+ source: source,
+ name: name
+ });
+ };
+
+ /**
+ * Set the source content for a source file.
+ */
+ SourceMapGenerator$2.prototype.setSourceContent =
+ function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
+ var source = aSourceFile;
+ if (this._sourceRoot != null) {
+ source = util.relative(this._sourceRoot, source);
+ }
+
+ if (aSourceContent != null) {
+ // Add the source content to the _sourcesContents map.
+ // Create a new _sourcesContents map if the property is null.
+ if (!this._sourcesContents) {
+ this._sourcesContents = Object.create(null);
+ }
+ this._sourcesContents[util.toSetString(source)] = aSourceContent;
+ } else if (this._sourcesContents) {
+ // Remove the source file from the _sourcesContents map.
+ // If the _sourcesContents map is empty, set the property to null.
+ delete this._sourcesContents[util.toSetString(source)];
+ if (Object.keys(this._sourcesContents).length === 0) {
+ this._sourcesContents = null;
+ }
+ }
+ };
+
+ /**
+ * Applies the mappings of a sub-source-map for a specific source file to the
+ * source map being generated. Each mapping to the supplied source file is
+ * rewritten using the supplied source map. Note: The resolution for the
+ * resulting mappings is the minimium of this map and the supplied map.
+ *
+ * @param aSourceMapConsumer The source map to be applied.
+ * @param aSourceFile Optional. The filename of the source file.
+ * If omitted, SourceMapConsumer's file property will be used.
+ * @param aSourceMapPath Optional. The dirname of the path to the source map
+ * to be applied. If relative, it is relative to the SourceMapConsumer.
+ * This parameter is needed when the two source maps aren't in the same
+ * directory, and the source map to be applied contains relative source
+ * paths. If so, those relative source paths need to be rewritten
+ * relative to the SourceMapGenerator.
+ */
+ SourceMapGenerator$2.prototype.applySourceMap =
+ function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
+ var sourceFile = aSourceFile;
+ // If aSourceFile is omitted, we will use the file property of the SourceMap
+ if (aSourceFile == null) {
+ if (aSourceMapConsumer.file == null) {
+ throw new Error(
+ 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
+ 'or the source map\'s "file" property. Both were omitted.'
+ );
+ }
+ sourceFile = aSourceMapConsumer.file;
+ }
+ var sourceRoot = this._sourceRoot;
+ // Make "sourceFile" relative if an absolute Url is passed.
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ // Applying the SourceMap can add and remove items from the sources and
+ // the names array.
+ var newSources = new ArraySet$1();
+ var newNames = new ArraySet$1();
+
+ // Find mappings for the "sourceFile"
+ this._mappings.unsortedForEach(function (mapping) {
+ if (mapping.source === sourceFile && mapping.originalLine != null) {
+ // Check if it can be mapped by the source map, then update the mapping.
+ var original = aSourceMapConsumer.originalPositionFor({
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ });
+ if (original.source != null) {
+ // Copy mapping
+ mapping.source = original.source;
+ if (aSourceMapPath != null) {
+ mapping.source = util.join(aSourceMapPath, mapping.source);
+ }
+ if (sourceRoot != null) {
+ mapping.source = util.relative(sourceRoot, mapping.source);
+ }
+ mapping.originalLine = original.line;
+ mapping.originalColumn = original.column;
+ if (original.name != null) {
+ mapping.name = original.name;
+ }
+ }
+ }
+
+ var source = mapping.source;
+ if (source != null && !newSources.has(source)) {
+ newSources.add(source);
+ }
+
+ var name = mapping.name;
+ if (name != null && !newNames.has(name)) {
+ newNames.add(name);
+ }
+
+ }, this);
+ this._sources = newSources;
+ this._names = newNames;
+
+ // Copy sourcesContents of applied map.
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aSourceMapPath != null) {
+ sourceFile = util.join(aSourceMapPath, sourceFile);
+ }
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ this.setSourceContent(sourceFile, content);
+ }
+ }, this);
+ };
+
+ /**
+ * A mapping can have one of the three levels of data:
+ *
+ * 1. Just the generated position.
+ * 2. The Generated position, original position, and original source.
+ * 3. Generated and original position, original source, as well as a name
+ * token.
+ *
+ * To maintain consistency, we validate that any new mapping being added falls
+ * in to one of these categories.
+ */
+ SourceMapGenerator$2.prototype._validateMapping =
+ function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
+ aName) {
+ // When aOriginal is truthy but has empty values for .line and .column,
+ // it is most likely a programmer error. In this case we throw a very
+ // specific error message to try to guide them the right way.
+ // For example: https://github.com/Polymer/polymer-bundler/pull/519
+ if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
+ throw new Error(
+ 'original.line and original.column are not numbers -- you probably meant to omit ' +
+ 'the original mapping entirely and only map the generated position. If so, pass ' +
+ 'null for the original mapping instead of an object with empty or null values.'
+ );
+ }
+
+ if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && !aOriginal && !aSource && !aName) {
+ // Case 1.
+ return;
+ }
+ else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aOriginal && 'line' in aOriginal && 'column' in aOriginal
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && aOriginal.line > 0 && aOriginal.column >= 0
+ && aSource) {
+ // Cases 2 and 3.
+ return;
+ }
+ else {
+ throw new Error('Invalid mapping: ' + JSON.stringify({
+ generated: aGenerated,
+ source: aSource,
+ original: aOriginal,
+ name: aName
+ }));
+ }
+ };
+
+ /**
+ * Serialize the accumulated mappings in to the stream of base 64 VLQs
+ * specified by the source map format.
+ */
+ SourceMapGenerator$2.prototype._serializeMappings =
+ function SourceMapGenerator_serializeMappings() {
+ var previousGeneratedColumn = 0;
+ var previousGeneratedLine = 1;
+ var previousOriginalColumn = 0;
+ var previousOriginalLine = 0;
+ var previousName = 0;
+ var previousSource = 0;
+ var result = '';
+ var next;
+ var mapping;
+ var nameIdx;
+ var sourceIdx;
+
+ var mappings = this._mappings.toArray();
+ for (var i = 0, len = mappings.length; i < len; i++) {
+ mapping = mappings[i];
+ next = '';
+
+ if (mapping.generatedLine !== previousGeneratedLine) {
+ previousGeneratedColumn = 0;
+ while (mapping.generatedLine !== previousGeneratedLine) {
+ next += ';';
+ previousGeneratedLine++;
+ }
+ }
+ else {
+ if (i > 0) {
+ if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
+ continue;
+ }
+ next += ',';
+ }
+ }
+
+ next += base64Vlq.encode(mapping.generatedColumn
+ - previousGeneratedColumn);
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (mapping.source != null) {
+ sourceIdx = this._sources.indexOf(mapping.source);
+ next += base64Vlq.encode(sourceIdx - previousSource);
+ previousSource = sourceIdx;
+
+ // lines are stored 0-based in SourceMap spec version 3
+ next += base64Vlq.encode(mapping.originalLine - 1
+ - previousOriginalLine);
+ previousOriginalLine = mapping.originalLine - 1;
+
+ next += base64Vlq.encode(mapping.originalColumn
+ - previousOriginalColumn);
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (mapping.name != null) {
+ nameIdx = this._names.indexOf(mapping.name);
+ next += base64Vlq.encode(nameIdx - previousName);
+ previousName = nameIdx;
+ }
+ }
+
+ result += next;
+ }
+
+ return result;
+ };
+
+ SourceMapGenerator$2.prototype._generateSourcesContent =
+ function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
+ return aSources.map(function (source) {
+ if (!this._sourcesContents) {
+ return null;
+ }
+ if (aSourceRoot != null) {
+ source = util.relative(aSourceRoot, source);
+ }
+ var key = util.toSetString(source);
+ return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
+ ? this._sourcesContents[key]
+ : null;
+ }, this);
+ };
+
+ /**
+ * Externalize the source map.
+ */
+ SourceMapGenerator$2.prototype.toJSON =
+ function SourceMapGenerator_toJSON() {
+ var map = {
+ version: this._version,
+ sources: this._sources.toArray(),
+ names: this._names.toArray(),
+ mappings: this._serializeMappings()
+ };
+ if (this._file != null) {
+ map.file = this._file;
+ }
+ if (this._sourceRoot != null) {
+ map.sourceRoot = this._sourceRoot;
+ }
+ if (this._sourcesContents) {
+ map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
+ }
+
+ return map;
+ };
+
+ /**
+ * Render the source map being generated to a string.
+ */
+ SourceMapGenerator$2.prototype.toString =
+ function SourceMapGenerator_toString() {
+ return JSON.stringify(this.toJSON());
+ };
+
+ var SourceMapGenerator_1 = SourceMapGenerator$2;
+
+ var sourceMapGenerator = {
+ SourceMapGenerator: SourceMapGenerator_1
+ };
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+
+ var binarySearch = createCommonjsModule(function (module, exports) {
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ exports.GREATEST_LOWER_BOUND = 1;
+ exports.LEAST_UPPER_BOUND = 2;
+
+ /**
+ * Recursive implementation of binary search.
+ *
+ * @param aLow Indices here and lower do not contain the needle.
+ * @param aHigh Indices here and higher do not contain the needle.
+ * @param aNeedle The element being searched for.
+ * @param aHaystack The non-empty array being searched.
+ * @param aCompare Function which takes two elements and returns -1, 0, or 1.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ */
+ function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
+ // This function terminates when one of the following is true:
+ //
+ // 1. We find the exact element we are looking for.
+ //
+ // 2. We did not find the exact element, but we can return the index of
+ // the next-closest element.
+ //
+ // 3. We did not find the exact element, and there is no next-closest
+ // element than the one we are searching for, so we return -1.
+ var mid = Math.floor((aHigh - aLow) / 2) + aLow;
+ var cmp = aCompare(aNeedle, aHaystack[mid], true);
+ if (cmp === 0) {
+ // Found the element we are looking for.
+ return mid;
+ }
+ else if (cmp > 0) {
+ // Our needle is greater than aHaystack[mid].
+ if (aHigh - mid > 1) {
+ // The element is in the upper half.
+ return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // The exact needle element was not found in this haystack. Determine if
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return aHigh < aHaystack.length ? aHigh : -1;
+ } else {
+ return mid;
+ }
+ }
+ else {
+ // Our needle is less than aHaystack[mid].
+ if (mid - aLow > 1) {
+ // The element is in the lower half.
+ return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return mid;
+ } else {
+ return aLow < 0 ? -1 : aLow;
+ }
+ }
+ }
+
+ /**
+ * This is an implementation of binary search which will always try and return
+ * the index of the closest element if there is no exact hit. This is because
+ * mappings between original and generated line/col pairs are single points,
+ * and there is an implicit region between each of them, so a miss just means
+ * that you aren't on the very start of a region.
+ *
+ * @param aNeedle The element you are looking for.
+ * @param aHaystack The array that is being searched.
+ * @param aCompare A function which takes the needle and an element in the
+ * array and returns -1, 0, or 1 depending on whether the needle is less
+ * than, equal to, or greater than the element, respectively.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
+ */
+ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
+ if (aHaystack.length === 0) {
+ return -1;
+ }
+
+ var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
+ aCompare, aBias || exports.GREATEST_LOWER_BOUND);
+ if (index < 0) {
+ return -1;
+ }
+
+ // We have found either the exact element, or the next-closest element than
+ // the one we are searching for. However, there may be more than one such
+ // element. Make sure we always return the smallest of these.
+ while (index - 1 >= 0) {
+ if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
+ break;
+ }
+ --index;
+ }
+
+ return index;
+ };
+ });
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ // It turns out that some (most?) JavaScript engines don't self-host
+ // `Array.prototype.sort`. This makes sense because C++ will likely remain
+ // faster than JS when doing raw CPU-intensive sorting. However, when using a
+ // custom comparator function, calling back and forth between the VM's C++ and
+ // JIT'd JS is rather slow *and* loses JIT type information, resulting in
+ // worse generated code for the comparator function than would be optimal. In
+ // fact, when sorting with a comparator, these costs outweigh the benefits of
+ // sorting in C++. By using our own JS-implemented Quick Sort (below), we get
+ // a ~3500ms mean speed-up in `bench/bench.html`.
+
+ /**
+ * Swap the elements indexed by `x` and `y` in the array `ary`.
+ *
+ * @param {Array} ary
+ * The array.
+ * @param {Number} x
+ * The index of the first item.
+ * @param {Number} y
+ * The index of the second item.
+ */
+ function swap(ary, x, y) {
+ var temp = ary[x];
+ ary[x] = ary[y];
+ ary[y] = temp;
+ }
+
+ /**
+ * Returns a random integer within the range `low .. high` inclusive.
+ *
+ * @param {Number} low
+ * The lower bound on the range.
+ * @param {Number} high
+ * The upper bound on the range.
+ */
+ function randomIntInRange(low, high) {
+ return Math.round(low + (Math.random() * (high - low)));
+ }
+
+ /**
+ * The Quick Sort algorithm.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ * @param {Number} p
+ * Start index of the array
+ * @param {Number} r
+ * End index of the array
+ */
+ function doQuickSort(ary, comparator, p, r) {
+ // If our lower bound is less than our upper bound, we (1) partition the
+ // array into two pieces and (2) recurse on each half. If it is not, this is
+ // the empty array and our base case.
+
+ if (p < r) {
+ // (1) Partitioning.
+ //
+ // The partitioning chooses a pivot between `p` and `r` and moves all
+ // elements that are less than or equal to the pivot to the before it, and
+ // all the elements that are greater than it after it. The effect is that
+ // once partition is done, the pivot is in the exact place it will be when
+ // the array is put in sorted order, and it will not need to be moved
+ // again. This runs in O(n) time.
+
+ // Always choose a random pivot so that an input array which is reverse
+ // sorted does not cause O(n^2) running time.
+ var pivotIndex = randomIntInRange(p, r);
+ var i = p - 1;
+
+ swap(ary, pivotIndex, r);
+ var pivot = ary[r];
+
+ // Immediately after `j` is incremented in this loop, the following hold
+ // true:
+ //
+ // * Every element in `ary[p .. i]` is less than or equal to the pivot.
+ //
+ // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
+ for (var j = p; j < r; j++) {
+ if (comparator(ary[j], pivot) <= 0) {
+ i += 1;
+ swap(ary, i, j);
+ }
+ }
+
+ swap(ary, i + 1, j);
+ var q = i + 1;
+
+ // (2) Recurse on each half.
+
+ doQuickSort(ary, comparator, p, q - 1);
+ doQuickSort(ary, comparator, q + 1, r);
+ }
+ }
+
+ /**
+ * Sort the given array in-place with the given comparator function.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ */
+ var quickSort_1 = function (ary, comparator) {
+ doQuickSort(ary, comparator, 0, ary.length - 1);
+ };
+
+ var quickSort$1 = {
+ quickSort: quickSort_1
+ };
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+
+ var ArraySet = arraySet.ArraySet;
+
+ var quickSort = quickSort$1.quickSort;
+
+ function SourceMapConsumer$1(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ return sourceMap.sections != null
+ ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
+ : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
+ }
+
+ SourceMapConsumer$1.fromSourceMap = function(aSourceMap, aSourceMapURL) {
+ return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
+ };
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ SourceMapConsumer$1.prototype._version = 3;
+
+ // `__generatedMappings` and `__originalMappings` are arrays that hold the
+ // parsed mapping coordinates from the source map's "mappings" attribute. They
+ // are lazily instantiated, accessed via the `_generatedMappings` and
+ // `_originalMappings` getters respectively, and we only parse the mappings
+ // and create these arrays once queried for a source location. We jump through
+ // these hoops because there can be many thousands of mappings, and parsing
+ // them is expensive, so we only want to do it if we must.
+ //
+ // Each object in the arrays is of the form:
+ //
+ // {
+ // generatedLine: The line number in the generated code,
+ // generatedColumn: The column number in the generated code,
+ // source: The path to the original source file that generated this
+ // chunk of code,
+ // originalLine: The line number in the original source that
+ // corresponds to this chunk of generated code,
+ // originalColumn: The column number in the original source that
+ // corresponds to this chunk of generated code,
+ // name: The name of the original symbol which generated this chunk of
+ // code.
+ // }
+ //
+ // All properties except for `generatedLine` and `generatedColumn` can be
+ // `null`.
+ //
+ // `_generatedMappings` is ordered by the generated positions.
+ //
+ // `_originalMappings` is ordered by the original positions.
+
+ SourceMapConsumer$1.prototype.__generatedMappings = null;
+ Object.defineProperty(SourceMapConsumer$1.prototype, '_generatedMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__generatedMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappings;
+ }
+ });
+
+ SourceMapConsumer$1.prototype.__originalMappings = null;
+ Object.defineProperty(SourceMapConsumer$1.prototype, '_originalMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__originalMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__originalMappings;
+ }
+ });
+
+ SourceMapConsumer$1.prototype._charIsMappingSeparator =
+ function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
+ var c = aStr.charAt(index);
+ return c === ";" || c === ",";
+ };
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ SourceMapConsumer$1.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ throw new Error("Subclasses must implement _parseMappings");
+ };
+
+ SourceMapConsumer$1.GENERATED_ORDER = 1;
+ SourceMapConsumer$1.ORIGINAL_ORDER = 2;
+
+ SourceMapConsumer$1.GREATEST_LOWER_BOUND = 1;
+ SourceMapConsumer$1.LEAST_UPPER_BOUND = 2;
+
+ /**
+ * Iterate over each mapping between an original source/line/column and a
+ * generated line/column in this source map.
+ *
+ * @param Function aCallback
+ * The function that is called with each mapping.
+ * @param Object aContext
+ * Optional. If specified, this object will be the value of `this` every
+ * time that `aCallback` is called.
+ * @param aOrder
+ * Either `SourceMapConsumer.GENERATED_ORDER` or
+ * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
+ * iterate over the mappings sorted by the generated file's line/column
+ * order or the original's source/line/column order, respectively. Defaults to
+ * `SourceMapConsumer.GENERATED_ORDER`.
+ */
+ SourceMapConsumer$1.prototype.eachMapping =
+ function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
+ var context = aContext || null;
+ var order = aOrder || SourceMapConsumer$1.GENERATED_ORDER;
+
+ var mappings;
+ switch (order) {
+ case SourceMapConsumer$1.GENERATED_ORDER:
+ mappings = this._generatedMappings;
+ break;
+ case SourceMapConsumer$1.ORIGINAL_ORDER:
+ mappings = this._originalMappings;
+ break;
+ default:
+ throw new Error("Unknown order of iteration.");
+ }
+
+ var sourceRoot = this.sourceRoot;
+ mappings.map(function (mapping) {
+ var source = mapping.source === null ? null : this._sources.at(mapping.source);
+ source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
+ return {
+ source: source,
+ generatedLine: mapping.generatedLine,
+ generatedColumn: mapping.generatedColumn,
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: mapping.name === null ? null : this._names.at(mapping.name)
+ };
+ }, this).forEach(aCallback, context);
+ };
+
+ /**
+ * Returns all generated line and column information for the original source,
+ * line, and column provided. If no column is provided, returns all mappings
+ * corresponding to a either the line we are searching for or the next
+ * closest line that has any mappings. Otherwise, returns all mappings
+ * corresponding to the given line and either the column we are searching for
+ * or the next closest column that has any offsets.
+ *
+ * The only argument is an object with the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number is 1-based.
+ * - column: Optional. the column number in the original source.
+ * The column number is 0-based.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ SourceMapConsumer$1.prototype.allGeneratedPositionsFor =
+ function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
+ var line = util.getArg(aArgs, 'line');
+
+ // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
+ // returns the index of the closest mapping less than the needle. By
+ // setting needle.originalColumn to 0, we thus find the last mapping for
+ // the given line, provided such a mapping exists.
+ var needle = {
+ source: util.getArg(aArgs, 'source'),
+ originalLine: line,
+ originalColumn: util.getArg(aArgs, 'column', 0)
+ };
+
+ needle.source = this._findSourceIndex(needle.source);
+ if (needle.source < 0) {
+ return [];
+ }
+
+ var mappings = [];
+
+ var index = this._findMapping(needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ binarySearch.LEAST_UPPER_BOUND);
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (aArgs.column === undefined) {
+ var originalLine = mapping.originalLine;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we found. Since
+ // mappings are sorted, this is guaranteed to find all mappings for
+ // the line we found.
+ while (mapping && mapping.originalLine === originalLine) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ } else {
+ var originalColumn = mapping.originalColumn;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we were searching for.
+ // Since mappings are sorted, this is guaranteed to find all mappings for
+ // the line we are searching for.
+ while (mapping &&
+ mapping.originalLine === line &&
+ mapping.originalColumn == originalColumn) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ }
+ }
+
+ return mappings;
+ };
+
+ var SourceMapConsumer_1 = SourceMapConsumer$1;
+
+ /**
+ * A BasicSourceMapConsumer instance represents a parsed source map which we can
+ * query for information about the original file positions by giving it a file
+ * position in the generated source.
+ *
+ * The first parameter is the raw source map (either as a JSON string, or
+ * already parsed to an object). According to the spec, source maps have the
+ * following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - sources: An array of URLs to the original source files.
+ * - names: An array of identifiers which can be referrenced by individual mappings.
+ * - sourceRoot: Optional. The URL root from which all sources are relative.
+ * - sourcesContent: Optional. An array of contents of the original source files.
+ * - mappings: A string of base64 VLQs which contain the actual mappings.
+ * - file: Optional. The generated file this source map is associated with.
+ *
+ * Here is an example source map, taken from the source map spec[0]:
+ *
+ * {
+ * version : 3,
+ * file: "out.js",
+ * sourceRoot : "",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AA,AB;;ABCDE;"
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+ function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sources = util.getArg(sourceMap, 'sources');
+ // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
+ // requires the array) to play nice here.
+ var names = util.getArg(sourceMap, 'names', []);
+ var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
+ var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
+ var mappings = util.getArg(sourceMap, 'mappings');
+ var file = util.getArg(sourceMap, 'file', null);
+
+ // Once again, Sass deviates from the spec and supplies the version as a
+ // string rather than a number, so we use loose equality checking here.
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ if (sourceRoot) {
+ sourceRoot = util.normalize(sourceRoot);
+ }
+
+ sources = sources
+ .map(String)
+ // Some source maps produce relative source paths like "./foo.js" instead of
+ // "foo.js". Normalize these first so that future comparisons will succeed.
+ // See bugzil.la/1090768.
+ .map(util.normalize)
+ // Always ensure that absolute sources are internally stored relative to
+ // the source root, if the source root is absolute. Not doing this would
+ // be particularly problematic when the source root is a prefix of the
+ // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
+ .map(function (source) {
+ return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
+ ? util.relative(sourceRoot, source)
+ : source;
+ });
+
+ // Pass `true` below to allow duplicate names and sources. While source maps
+ // are intended to be compressed and deduplicated, the TypeScript compiler
+ // sometimes generates source maps with duplicates in them. See Github issue
+ // #72 and bugzil.la/889492.
+ this._names = ArraySet.fromArray(names.map(String), true);
+ this._sources = ArraySet.fromArray(sources, true);
+
+ this._absoluteSources = this._sources.toArray().map(function (s) {
+ return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
+ });
+
+ this.sourceRoot = sourceRoot;
+ this.sourcesContent = sourcesContent;
+ this._mappings = mappings;
+ this._sourceMapURL = aSourceMapURL;
+ this.file = file;
+ }
+
+ BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer$1.prototype);
+ BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer$1;
+
+ /**
+ * Utility function to find the index of a source. Returns -1 if not
+ * found.
+ */
+ BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ if (this._sources.has(relativeSource)) {
+ return this._sources.indexOf(relativeSource);
+ }
+
+ // Maybe aSource is an absolute URL as returned by |sources|. In
+ // this case we can't simply undo the transform.
+ var i;
+ for (i = 0; i < this._absoluteSources.length; ++i) {
+ if (this._absoluteSources[i] == aSource) {
+ return i;
+ }
+ }
+
+ return -1;
+ };
+
+ /**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @param String aSourceMapURL
+ * The URL at which the source map can be found (optional)
+ * @returns BasicSourceMapConsumer
+ */
+ BasicSourceMapConsumer.fromSourceMap =
+ function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
+ var smc = Object.create(BasicSourceMapConsumer.prototype);
+
+ var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
+ var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
+ smc.sourceRoot = aSourceMap._sourceRoot;
+ smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
+ smc.sourceRoot);
+ smc.file = aSourceMap._file;
+ smc._sourceMapURL = aSourceMapURL;
+ smc._absoluteSources = smc._sources.toArray().map(function (s) {
+ return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
+ });
+
+ // Because we are modifying the entries (by converting string sources and
+ // names to indices into the sources and names ArraySets), we have to make
+ // a copy of the entry or else bad things happen. Shared mutable state
+ // strikes again! See github issue #191.
+
+ var generatedMappings = aSourceMap._mappings.toArray().slice();
+ var destGeneratedMappings = smc.__generatedMappings = [];
+ var destOriginalMappings = smc.__originalMappings = [];
+
+ for (var i = 0, length = generatedMappings.length; i < length; i++) {
+ var srcMapping = generatedMappings[i];
+ var destMapping = new Mapping;
+ destMapping.generatedLine = srcMapping.generatedLine;
+ destMapping.generatedColumn = srcMapping.generatedColumn;
+
+ if (srcMapping.source) {
+ destMapping.source = sources.indexOf(srcMapping.source);
+ destMapping.originalLine = srcMapping.originalLine;
+ destMapping.originalColumn = srcMapping.originalColumn;
+
+ if (srcMapping.name) {
+ destMapping.name = names.indexOf(srcMapping.name);
+ }
+
+ destOriginalMappings.push(destMapping);
+ }
+
+ destGeneratedMappings.push(destMapping);
+ }
+
+ quickSort(smc.__originalMappings, util.compareByOriginalPositions);
+
+ return smc;
+ };
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ BasicSourceMapConsumer.prototype._version = 3;
+
+ /**
+ * The list of original sources.
+ */
+ Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ return this._absoluteSources.slice();
+ }
+ });
+
+ /**
+ * Provide the JIT with a nice shape / hidden class.
+ */
+ function Mapping() {
+ this.generatedLine = 0;
+ this.generatedColumn = 0;
+ this.source = null;
+ this.originalLine = null;
+ this.originalColumn = null;
+ this.name = null;
+ }
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ BasicSourceMapConsumer.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ var generatedLine = 1;
+ var previousGeneratedColumn = 0;
+ var previousOriginalLine = 0;
+ var previousOriginalColumn = 0;
+ var previousSource = 0;
+ var previousName = 0;
+ var length = aStr.length;
+ var index = 0;
+ var cachedSegments = {};
+ var temp = {};
+ var originalMappings = [];
+ var generatedMappings = [];
+ var mapping, str, segment, end, value;
+
+ while (index < length) {
+ if (aStr.charAt(index) === ';') {
+ generatedLine++;
+ index++;
+ previousGeneratedColumn = 0;
+ }
+ else if (aStr.charAt(index) === ',') {
+ index++;
+ }
+ else {
+ mapping = new Mapping();
+ mapping.generatedLine = generatedLine;
+
+ // Because each offset is encoded relative to the previous one,
+ // many segments often have the same encoding. We can exploit this
+ // fact by caching the parsed variable length fields of each segment,
+ // allowing us to avoid a second parse if we encounter the same
+ // segment again.
+ for (end = index; end < length; end++) {
+ if (this._charIsMappingSeparator(aStr, end)) {
+ break;
+ }
+ }
+ str = aStr.slice(index, end);
+
+ segment = cachedSegments[str];
+ if (segment) {
+ index += str.length;
+ } else {
+ segment = [];
+ while (index < end) {
+ base64Vlq.decode(aStr, index, temp);
+ value = temp.value;
+ index = temp.rest;
+ segment.push(value);
+ }
+
+ if (segment.length === 2) {
+ throw new Error('Found a source, but no line and column');
+ }
+
+ if (segment.length === 3) {
+ throw new Error('Found a source and line, but no column');
+ }
+
+ cachedSegments[str] = segment;
+ }
+
+ // Generated column.
+ mapping.generatedColumn = previousGeneratedColumn + segment[0];
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (segment.length > 1) {
+ // Original source.
+ mapping.source = previousSource + segment[1];
+ previousSource += segment[1];
+
+ // Original line.
+ mapping.originalLine = previousOriginalLine + segment[2];
+ previousOriginalLine = mapping.originalLine;
+ // Lines are stored 0-based
+ mapping.originalLine += 1;
+
+ // Original column.
+ mapping.originalColumn = previousOriginalColumn + segment[3];
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (segment.length > 4) {
+ // Original name.
+ mapping.name = previousName + segment[4];
+ previousName += segment[4];
+ }
+ }
+
+ generatedMappings.push(mapping);
+ if (typeof mapping.originalLine === 'number') {
+ originalMappings.push(mapping);
+ }
+ }
+ }
+
+ quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
+ this.__generatedMappings = generatedMappings;
+
+ quickSort(originalMappings, util.compareByOriginalPositions);
+ this.__originalMappings = originalMappings;
+ };
+
+ /**
+ * Find the mapping that best matches the hypothetical "needle" mapping that
+ * we are searching for in the given "haystack" of mappings.
+ */
+ BasicSourceMapConsumer.prototype._findMapping =
+ function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
+ aColumnName, aComparator, aBias) {
+ // To return the position we are searching for, we must first find the
+ // mapping for the given position and then return the opposite position it
+ // points to. Because the mappings are sorted, we can use binary search to
+ // find the best mapping.
+
+ if (aNeedle[aLineName] <= 0) {
+ throw new TypeError('Line must be greater than or equal to 1, got '
+ + aNeedle[aLineName]);
+ }
+ if (aNeedle[aColumnName] < 0) {
+ throw new TypeError('Column must be greater than or equal to 0, got '
+ + aNeedle[aColumnName]);
+ }
+
+ return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
+ };
+
+ /**
+ * Compute the last column for each generated mapping. The last column is
+ * inclusive.
+ */
+ BasicSourceMapConsumer.prototype.computeColumnSpans =
+ function SourceMapConsumer_computeColumnSpans() {
+ for (var index = 0; index < this._generatedMappings.length; ++index) {
+ var mapping = this._generatedMappings[index];
+
+ // Mappings do not contain a field for the last generated columnt. We
+ // can come up with an optimistic estimate, however, by assuming that
+ // mappings are contiguous (i.e. given two consecutive mappings, the
+ // first mapping ends where the second one starts).
+ if (index + 1 < this._generatedMappings.length) {
+ var nextMapping = this._generatedMappings[index + 1];
+
+ if (mapping.generatedLine === nextMapping.generatedLine) {
+ mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
+ continue;
+ }
+ }
+
+ // The last mapping for each line spans the entire line.
+ mapping.lastGeneratedColumn = Infinity;
+ }
+ };
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+ BasicSourceMapConsumer.prototype.originalPositionFor =
+ function SourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._generatedMappings,
+ "generatedLine",
+ "generatedColumn",
+ util.compareByGeneratedPositionsDeflated,
+ util.getArg(aArgs, 'bias', SourceMapConsumer$1.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._generatedMappings[index];
+
+ if (mapping.generatedLine === needle.generatedLine) {
+ var source = util.getArg(mapping, 'source', null);
+ if (source !== null) {
+ source = this._sources.at(source);
+ source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
+ }
+ var name = util.getArg(mapping, 'name', null);
+ if (name !== null) {
+ name = this._names.at(name);
+ }
+ return {
+ source: source,
+ line: util.getArg(mapping, 'originalLine', null),
+ column: util.getArg(mapping, 'originalColumn', null),
+ name: name
+ };
+ }
+ }
+
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ };
+
+ /**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+ BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function BasicSourceMapConsumer_hasContentsOfAllSources() {
+ if (!this.sourcesContent) {
+ return false;
+ }
+ return this.sourcesContent.length >= this._sources.size() &&
+ !this.sourcesContent.some(function (sc) { return sc == null; });
+ };
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+ BasicSourceMapConsumer.prototype.sourceContentFor =
+ function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ if (!this.sourcesContent) {
+ return null;
+ }
+
+ var index = this._findSourceIndex(aSource);
+ if (index >= 0) {
+ return this.sourcesContent[index];
+ }
+
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ var url;
+ if (this.sourceRoot != null
+ && (url = util.urlParse(this.sourceRoot))) {
+ // XXX: file:// URIs and absolute paths lead to unexpected behavior for
+ // many users. We can help them out when they expect file:// URIs to
+ // behave like it would if they were running a local HTTP server. See
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
+ var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
+ if (url.scheme == "file"
+ && this._sources.has(fileUriAbsPath)) {
+ return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
+ }
+
+ if ((!url.path || url.path == "/")
+ && this._sources.has("/" + relativeSource)) {
+ return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
+ }
+ }
+
+ // This function is used recursively from
+ // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
+ // don't want to throw if we can't find the source - we just want to
+ // return null, so we provide a flag to exit gracefully.
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + relativeSource + '" is not in the SourceMap.');
+ }
+ };
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ BasicSourceMapConsumer.prototype.generatedPositionFor =
+ function SourceMapConsumer_generatedPositionFor(aArgs) {
+ var source = util.getArg(aArgs, 'source');
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+
+ var needle = {
+ source: source,
+ originalLine: util.getArg(aArgs, 'line'),
+ originalColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ util.getArg(aArgs, 'bias', SourceMapConsumer$1.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (mapping.source === needle.source) {
+ return {
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ };
+ }
+ }
+
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ };
+
+ var BasicSourceMapConsumer_1 = BasicSourceMapConsumer;
+
+ /**
+ * An IndexedSourceMapConsumer instance represents a parsed source map which
+ * we can query for information. It differs from BasicSourceMapConsumer in
+ * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
+ * input.
+ *
+ * The first parameter is a raw source map (either as a JSON string, or already
+ * parsed to an object). According to the spec for indexed source maps, they
+ * have the following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - file: Optional. The generated file this source map is associated with.
+ * - sections: A list of section definitions.
+ *
+ * Each value under the "sections" field has two fields:
+ * - offset: The offset into the original specified at which this section
+ * begins to apply, defined as an object with a "line" and "column"
+ * field.
+ * - map: A source map definition. This source map could also be indexed,
+ * but doesn't have to be.
+ *
+ * Instead of the "map" field, it's also possible to have a "url" field
+ * specifying a URL to retrieve a source map from, but that's currently
+ * unsupported.
+ *
+ * Here's an example source map, taken from the source map spec[0], but
+ * modified to omit a section which uses the "url" field.
+ *
+ * {
+ * version : 3,
+ * file: "app.js",
+ * sections: [{
+ * offset: {line:100, column:10},
+ * map: {
+ * version : 3,
+ * file: "section.js",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AAAA,E;;ABCDE;"
+ * }
+ * }],
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
+ */
+ function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sections = util.getArg(sourceMap, 'sections');
+
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+
+ var lastOffset = {
+ line: -1,
+ column: 0
+ };
+ this._sections = sections.map(function (s) {
+ if (s.url) {
+ // The url field will require support for asynchronicity.
+ // See https://github.com/mozilla/source-map/issues/16
+ throw new Error('Support for url field in sections not implemented.');
+ }
+ var offset = util.getArg(s, 'offset');
+ var offsetLine = util.getArg(offset, 'line');
+ var offsetColumn = util.getArg(offset, 'column');
+
+ if (offsetLine < lastOffset.line ||
+ (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
+ throw new Error('Section offsets must be ordered and non-overlapping.');
+ }
+ lastOffset = offset;
+
+ return {
+ generatedOffset: {
+ // The offset fields are 0-based, but we use 1-based indices when
+ // encoding/decoding from VLQ.
+ generatedLine: offsetLine + 1,
+ generatedColumn: offsetColumn + 1
+ },
+ consumer: new SourceMapConsumer$1(util.getArg(s, 'map'), aSourceMapURL)
+ }
+ });
+ }
+
+ IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer$1.prototype);
+ IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer$1;
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ IndexedSourceMapConsumer.prototype._version = 3;
+
+ /**
+ * The list of original sources.
+ */
+ Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ var sources = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
+ sources.push(this._sections[i].consumer.sources[j]);
+ }
+ }
+ return sources;
+ }
+ });
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+ IndexedSourceMapConsumer.prototype.originalPositionFor =
+ function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ // Find the section containing the generated position we're trying to map
+ // to an original position.
+ var sectionIndex = binarySearch.search(needle, this._sections,
+ function(needle, section) {
+ var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ return (needle.generatedColumn -
+ section.generatedOffset.generatedColumn);
+ });
+ var section = this._sections[sectionIndex];
+
+ if (!section) {
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ }
+
+ return section.consumer.originalPositionFor({
+ line: needle.generatedLine -
+ (section.generatedOffset.generatedLine - 1),
+ column: needle.generatedColumn -
+ (section.generatedOffset.generatedLine === needle.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ bias: aArgs.bias
+ });
+ };
+
+ /**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+ IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function IndexedSourceMapConsumer_hasContentsOfAllSources() {
+ return this._sections.every(function (s) {
+ return s.consumer.hasContentsOfAllSources();
+ });
+ };
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+ IndexedSourceMapConsumer.prototype.sourceContentFor =
+ function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ var content = section.consumer.sourceContentFor(aSource, true);
+ if (content) {
+ return content;
+ }
+ }
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + aSource + '" is not in the SourceMap.');
+ }
+ };
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ IndexedSourceMapConsumer.prototype.generatedPositionFor =
+ function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ // Only consider this section if the requested source is in the list of
+ // sources of the consumer.
+ if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
+ continue;
+ }
+ var generatedPosition = section.consumer.generatedPositionFor(aArgs);
+ if (generatedPosition) {
+ var ret = {
+ line: generatedPosition.line +
+ (section.generatedOffset.generatedLine - 1),
+ column: generatedPosition.column +
+ (section.generatedOffset.generatedLine === generatedPosition.line
+ ? section.generatedOffset.generatedColumn - 1
+ : 0)
+ };
+ return ret;
+ }
+ }
+
+ return {
+ line: null,
+ column: null
+ };
+ };
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ IndexedSourceMapConsumer.prototype._parseMappings =
+ function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ this.__generatedMappings = [];
+ this.__originalMappings = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+ var sectionMappings = section.consumer._generatedMappings;
+ for (var j = 0; j < sectionMappings.length; j++) {
+ var mapping = sectionMappings[j];
+
+ var source = section.consumer._sources.at(mapping.source);
+ source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
+ this._sources.add(source);
+ source = this._sources.indexOf(source);
+
+ var name = null;
+ if (mapping.name) {
+ name = section.consumer._names.at(mapping.name);
+ this._names.add(name);
+ name = this._names.indexOf(name);
+ }
+
+ // The mappings coming from the consumer for the section have
+ // generated positions relative to the start of the section, so we
+ // need to offset them to be relative to the start of the concatenated
+ // generated file.
+ var adjustedMapping = {
+ source: source,
+ generatedLine: mapping.generatedLine +
+ (section.generatedOffset.generatedLine - 1),
+ generatedColumn: mapping.generatedColumn +
+ (section.generatedOffset.generatedLine === mapping.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: name
+ };
+
+ this.__generatedMappings.push(adjustedMapping);
+ if (typeof adjustedMapping.originalLine === 'number') {
+ this.__originalMappings.push(adjustedMapping);
+ }
+ }
+ }
+
+ quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
+ quickSort(this.__originalMappings, util.compareByOriginalPositions);
+ };
+
+ var IndexedSourceMapConsumer_1 = IndexedSourceMapConsumer;
+
+ var sourceMapConsumer = {
+ SourceMapConsumer: SourceMapConsumer_1,
+ BasicSourceMapConsumer: BasicSourceMapConsumer_1,
+ IndexedSourceMapConsumer: IndexedSourceMapConsumer_1
+ };
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var SourceMapGenerator$1 = sourceMapGenerator.SourceMapGenerator;
+
+
+ // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
+ // operating systems these days (capturing the result).
+ var REGEX_NEWLINE = /(\r?\n)/;
+
+ // Newline character code for charCodeAt() comparisons
+ var NEWLINE_CODE = 10;
+
+ // Private symbol for identifying `SourceNode`s when multiple versions of
+ // the source-map library are loaded. This MUST NOT CHANGE across
+ // versions!
+ var isSourceNode = "$$$isSourceNode$$$";
+
+ /**
+ * SourceNodes provide a way to abstract over interpolating/concatenating
+ * snippets of generated JavaScript source code while maintaining the line and
+ * column information associated with the original source code.
+ *
+ * @param aLine The original line number.
+ * @param aColumn The original column number.
+ * @param aSource The original source's filename.
+ * @param aChunks Optional. An array of strings which are snippets of
+ * generated JS, or other SourceNodes.
+ * @param aName The original identifier.
+ */
+ function SourceNode$1(aLine, aColumn, aSource, aChunks, aName) {
+ this.children = [];
+ this.sourceContents = {};
+ this.line = aLine == null ? null : aLine;
+ this.column = aColumn == null ? null : aColumn;
+ this.source = aSource == null ? null : aSource;
+ this.name = aName == null ? null : aName;
+ this[isSourceNode] = true;
+ if (aChunks != null) this.add(aChunks);
+ }
+
+ /**
+ * Creates a SourceNode from generated code and a SourceMapConsumer.
+ *
+ * @param aGeneratedCode The generated code
+ * @param aSourceMapConsumer The SourceMap for the generated code
+ * @param aRelativePath Optional. The path that relative sources in the
+ * SourceMapConsumer should be relative to.
+ */
+ SourceNode$1.fromStringWithSourceMap =
+ function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
+ // The SourceNode we want to fill with the generated code
+ // and the SourceMap
+ var node = new SourceNode$1();
+
+ // All even indices of this array are one line of the generated code,
+ // while all odd indices are the newlines between two adjacent lines
+ // (since `REGEX_NEWLINE` captures its match).
+ // Processed fragments are accessed by calling `shiftNextLine`.
+ var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
+ var remainingLinesIndex = 0;
+ var shiftNextLine = function() {
+ var lineContents = getNextLine();
+ // The last line of a file might not have a newline.
+ var newLine = getNextLine() || "";
+ return lineContents + newLine;
+
+ function getNextLine() {
+ return remainingLinesIndex < remainingLines.length ?
+ remainingLines[remainingLinesIndex++] : undefined;
+ }
+ };
+
+ // We need to remember the position of "remainingLines"
+ var lastGeneratedLine = 1, lastGeneratedColumn = 0;
+
+ // The generate SourceNodes we need a code range.
+ // To extract it current and last mapping is used.
+ // Here we store the last mapping.
+ var lastMapping = null;
+
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ if (lastMapping !== null) {
+ // We add the code from "lastMapping" to "mapping":
+ // First check if there is a new line in between.
+ if (lastGeneratedLine < mapping.generatedLine) {
+ // Associate first line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ lastGeneratedLine++;
+ lastGeneratedColumn = 0;
+ // The remaining code is added without mapping
+ } else {
+ // There is no new line in between.
+ // Associate the code between "lastGeneratedColumn" and
+ // "mapping.generatedColumn" with "lastMapping"
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ var code = nextLine.substr(0, mapping.generatedColumn -
+ lastGeneratedColumn);
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
+ lastGeneratedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ addMappingWithCode(lastMapping, code);
+ // No more remaining code, continue
+ lastMapping = mapping;
+ return;
+ }
+ }
+ // We add the generated code until the first mapping
+ // to the SourceNode without any mapping.
+ // Each line is added as separate string.
+ while (lastGeneratedLine < mapping.generatedLine) {
+ node.add(shiftNextLine());
+ lastGeneratedLine++;
+ }
+ if (lastGeneratedColumn < mapping.generatedColumn) {
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ node.add(nextLine.substr(0, mapping.generatedColumn));
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ }
+ lastMapping = mapping;
+ }, this);
+ // We have processed all mappings.
+ if (remainingLinesIndex < remainingLines.length) {
+ if (lastMapping) {
+ // Associate the remaining code in the current line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ }
+ // and add the remaining lines without any mapping
+ node.add(remainingLines.splice(remainingLinesIndex).join(""));
+ }
+
+ // Copy sourcesContent into SourceNode
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aRelativePath != null) {
+ sourceFile = util.join(aRelativePath, sourceFile);
+ }
+ node.setSourceContent(sourceFile, content);
+ }
+ });
+
+ return node;
+
+ function addMappingWithCode(mapping, code) {
+ if (mapping === null || mapping.source === undefined) {
+ node.add(code);
+ } else {
+ var source = aRelativePath
+ ? util.join(aRelativePath, mapping.source)
+ : mapping.source;
+ node.add(new SourceNode$1(mapping.originalLine,
+ mapping.originalColumn,
+ source,
+ code,
+ mapping.name));
+ }
+ }
+ };
+
+ /**
+ * Add a chunk of generated JS to this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ SourceNode$1.prototype.add = function SourceNode_add(aChunk) {
+ if (Array.isArray(aChunk)) {
+ aChunk.forEach(function (chunk) {
+ this.add(chunk);
+ }, this);
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ if (aChunk) {
+ this.children.push(aChunk);
+ }
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+ };
+
+ /**
+ * Add a chunk of generated JS to the beginning of this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ SourceNode$1.prototype.prepend = function SourceNode_prepend(aChunk) {
+ if (Array.isArray(aChunk)) {
+ for (var i = aChunk.length-1; i >= 0; i--) {
+ this.prepend(aChunk[i]);
+ }
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ this.children.unshift(aChunk);
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+ };
+
+ /**
+ * Walk over the tree of JS snippets in this node and its children. The
+ * walking function is called once for each snippet of JS and is passed that
+ * snippet and the its original associated source's line/column location.
+ *
+ * @param aFn The traversal function.
+ */
+ SourceNode$1.prototype.walk = function SourceNode_walk(aFn) {
+ var chunk;
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ chunk = this.children[i];
+ if (chunk[isSourceNode]) {
+ chunk.walk(aFn);
+ }
+ else {
+ if (chunk !== '') {
+ aFn(chunk, { source: this.source,
+ line: this.line,
+ column: this.column,
+ name: this.name });
+ }
+ }
+ }
+ };
+
+ /**
+ * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
+ * each of `this.children`.
+ *
+ * @param aSep The separator.
+ */
+ SourceNode$1.prototype.join = function SourceNode_join(aSep) {
+ var newChildren;
+ var i;
+ var len = this.children.length;
+ if (len > 0) {
+ newChildren = [];
+ for (i = 0; i < len-1; i++) {
+ newChildren.push(this.children[i]);
+ newChildren.push(aSep);
+ }
+ newChildren.push(this.children[i]);
+ this.children = newChildren;
+ }
+ return this;
+ };
+
+ /**
+ * Call String.prototype.replace on the very right-most source snippet. Useful
+ * for trimming whitespace from the end of a source node, etc.
+ *
+ * @param aPattern The pattern to replace.
+ * @param aReplacement The thing to replace the pattern with.
+ */
+ SourceNode$1.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
+ var lastChild = this.children[this.children.length - 1];
+ if (lastChild[isSourceNode]) {
+ lastChild.replaceRight(aPattern, aReplacement);
+ }
+ else if (typeof lastChild === 'string') {
+ this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
+ }
+ else {
+ this.children.push(''.replace(aPattern, aReplacement));
+ }
+ return this;
+ };
+
+ /**
+ * Set the source content for a source file. This will be added to the SourceMapGenerator
+ * in the sourcesContent field.
+ *
+ * @param aSourceFile The filename of the source file
+ * @param aSourceContent The content of the source file
+ */
+ SourceNode$1.prototype.setSourceContent =
+ function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
+ this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
+ };
+
+ /**
+ * Walk over the tree of SourceNodes. The walking function is called for each
+ * source file content and is passed the filename and source content.
+ *
+ * @param aFn The traversal function.
+ */
+ SourceNode$1.prototype.walkSourceContents =
+ function SourceNode_walkSourceContents(aFn) {
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ if (this.children[i][isSourceNode]) {
+ this.children[i].walkSourceContents(aFn);
+ }
+ }
+
+ var sources = Object.keys(this.sourceContents);
+ for (var i = 0, len = sources.length; i < len; i++) {
+ aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
+ }
+ };
+
+ /**
+ * Return the string representation of this source node. Walks over the tree
+ * and concatenates all the various snippets together to one string.
+ */
+ SourceNode$1.prototype.toString = function SourceNode_toString() {
+ var str = "";
+ this.walk(function (chunk) {
+ str += chunk;
+ });
+ return str;
+ };
+
+ /**
+ * Returns the string representation of this source node along with a source
+ * map.
+ */
+ SourceNode$1.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
+ var generated = {
+ code: "",
+ line: 1,
+ column: 0
+ };
+ var map = new SourceMapGenerator$1(aArgs);
+ var sourceMappingActive = false;
+ var lastOriginalSource = null;
+ var lastOriginalLine = null;
+ var lastOriginalColumn = null;
+ var lastOriginalName = null;
+ this.walk(function (chunk, original) {
+ generated.code += chunk;
+ if (original.source !== null
+ && original.line !== null
+ && original.column !== null) {
+ if(lastOriginalSource !== original.source
+ || lastOriginalLine !== original.line
+ || lastOriginalColumn !== original.column
+ || lastOriginalName !== original.name) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ lastOriginalSource = original.source;
+ lastOriginalLine = original.line;
+ lastOriginalColumn = original.column;
+ lastOriginalName = original.name;
+ sourceMappingActive = true;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ generated: {
+ line: generated.line,
+ column: generated.column
+ }
+ });
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ }
+ for (var idx = 0, length = chunk.length; idx < length; idx++) {
+ if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
+ generated.line++;
+ generated.column = 0;
+ // Mappings end at eol
+ if (idx + 1 === length) {
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ } else {
+ generated.column++;
+ }
+ }
+ });
+ this.walkSourceContents(function (sourceFile, sourceContent) {
+ map.setSourceContent(sourceFile, sourceContent);
+ });
+
+ return { code: generated.code, map: map };
+ };
+
+ var SourceNode_1 = SourceNode$1;
+
+ var sourceNode = {
+ SourceNode: SourceNode_1
+ };
+
+ /*
+ * Copyright 2009-2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE.txt or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var SourceMapGenerator = sourceMapGenerator.SourceMapGenerator;
+ var SourceMapConsumer = sourceMapConsumer.SourceMapConsumer;
+ var SourceNode = sourceNode.SourceNode;
+
+ var sourceMap = {
+ SourceMapGenerator: SourceMapGenerator,
+ SourceMapConsumer: SourceMapConsumer,
+ SourceNode: SourceNode
+ };
+
+ const name="escodegen";const description="ECMAScript code generator";const homepage="http://github.com/estools/escodegen";const main="escodegen.js";const bin={esgenerate:"./bin/esgenerate.js",escodegen:"./bin/escodegen.js"};const files=["LICENSE.BSD","README.md","bin","escodegen.js","package.json"];const version="1.14.1";const engines={node:">=4.0"};const maintainers=[{name:"Yusuke Suzuki",email:"utatane.tea@gmail.com",web:"http://github.com/Constellation"}];const repository={type:"git",url:"http://github.com/estools/escodegen.git"};const dependencies={estraverse:"^4.2.0",esutils:"^2.0.2",esprima:"^4.0.1",optionator:"^0.8.1"};const optionalDependencies={"source-map":"~0.6.1"};const devDependencies={acorn:"^7.1.0",bluebird:"^3.4.7","bower-registry-client":"^1.0.0",chai:"^3.5.0","commonjs-everywhere":"^0.9.7",gulp:"^3.8.10","gulp-eslint":"^3.0.1","gulp-mocha":"^3.0.1",semver:"^5.1.0"};const license="BSD-2-Clause";const scripts={test:"gulp travis","unit-test":"gulp test",lint:"gulp lint",release:"node tools/release.js","build-min":"./node_modules/.bin/cjsify -ma path: tools/entry-point.js > escodegen.browser.min.js",build:"./node_modules/.bin/cjsify -a path: tools/entry-point.js > escodegen.browser.js"};var require$$3 = {name:name,description:description,homepage:homepage,main:main,bin:bin,files:files,version:version,engines:engines,maintainers:maintainers,repository:repository,dependencies:dependencies,optionalDependencies:optionalDependencies,devDependencies:devDependencies,license:license,scripts:scripts};
+
+ /*
+ Copyright (C) 2012-2014 Yusuke Suzuki
+ Copyright (C) 2015 Ingvar Stepanyan
+ Copyright (C) 2014 Ivan Nikulin
+ Copyright (C) 2012-2013 Michael Ficarra
+ Copyright (C) 2012-2013 Mathias Bynens
+ Copyright (C) 2013 Irakli Gozalishvili
+ Copyright (C) 2012 Robert Gust-Bardon
+ Copyright (C) 2012 John Freeman
+ Copyright (C) 2011-2012 Ariya Hidayat
+ Copyright (C) 2012 Joost-Wim Boekesteijn
+ Copyright (C) 2012 Kris Kowal
+ Copyright (C) 2012 Arpad Borsos
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ var escodegen = createCommonjsModule(function (module, exports) {
+ /*global exports:true, require:true, global:true*/
+ (function () {
+ 'use strict';
+
+ var Syntax,
+ Precedence,
+ BinaryPrecedence,
+ SourceNode,
+ estraverse$1,
+ esutils,
+ base,
+ indent,
+ json,
+ renumber,
+ hexadecimal,
+ quotes,
+ escapeless,
+ newline,
+ space,
+ parentheses,
+ semicolons,
+ safeConcatenation,
+ directive,
+ extra,
+ parse,
+ sourceMap$1,
+ sourceCode,
+ preserveBlankLines,
+ FORMAT_MINIFY,
+ FORMAT_DEFAULTS;
+
+ estraverse$1 = estraverse;
+ esutils = utils;
+
+ Syntax = estraverse$1.Syntax;
+
+ // Generation is done by generateExpression.
+ function isExpression(node) {
+ return CodeGenerator.Expression.hasOwnProperty(node.type);
+ }
+
+ // Generation is done by generateStatement.
+ function isStatement(node) {
+ return CodeGenerator.Statement.hasOwnProperty(node.type);
+ }
+
+ Precedence = {
+ Sequence: 0,
+ Yield: 1,
+ Assignment: 1,
+ Conditional: 2,
+ ArrowFunction: 2,
+ LogicalOR: 3,
+ LogicalAND: 4,
+ BitwiseOR: 5,
+ BitwiseXOR: 6,
+ BitwiseAND: 7,
+ Equality: 8,
+ Relational: 9,
+ BitwiseSHIFT: 10,
+ Additive: 11,
+ Multiplicative: 12,
+ Exponentiation: 13,
+ Await: 14,
+ Unary: 14,
+ Postfix: 15,
+ Call: 16,
+ New: 17,
+ TaggedTemplate: 18,
+ Member: 19,
+ Primary: 20
+ };
+
+ BinaryPrecedence = {
+ '||': Precedence.LogicalOR,
+ '&&': Precedence.LogicalAND,
+ '|': Precedence.BitwiseOR,
+ '^': Precedence.BitwiseXOR,
+ '&': Precedence.BitwiseAND,
+ '==': Precedence.Equality,
+ '!=': Precedence.Equality,
+ '===': Precedence.Equality,
+ '!==': Precedence.Equality,
+ 'is': Precedence.Equality,
+ 'isnt': Precedence.Equality,
+ '<': Precedence.Relational,
+ '>': Precedence.Relational,
+ '<=': Precedence.Relational,
+ '>=': Precedence.Relational,
+ 'in': Precedence.Relational,
+ 'instanceof': Precedence.Relational,
+ '<<': Precedence.BitwiseSHIFT,
+ '>>': Precedence.BitwiseSHIFT,
+ '>>>': Precedence.BitwiseSHIFT,
+ '+': Precedence.Additive,
+ '-': Precedence.Additive,
+ '*': Precedence.Multiplicative,
+ '%': Precedence.Multiplicative,
+ '/': Precedence.Multiplicative,
+ '**': Precedence.Exponentiation
+ };
+
+ //Flags
+ var F_ALLOW_IN = 1,
+ F_ALLOW_CALL = 1 << 1,
+ F_ALLOW_UNPARATH_NEW = 1 << 2,
+ F_FUNC_BODY = 1 << 3,
+ F_DIRECTIVE_CTX = 1 << 4,
+ F_SEMICOLON_OPT = 1 << 5;
+
+ //Expression flag sets
+ //NOTE: Flag order:
+ // F_ALLOW_IN
+ // F_ALLOW_CALL
+ // F_ALLOW_UNPARATH_NEW
+ var E_FTT = F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,
+ E_TTF = F_ALLOW_IN | F_ALLOW_CALL,
+ E_TTT = F_ALLOW_IN | F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,
+ E_TFF = F_ALLOW_IN,
+ E_FFT = F_ALLOW_UNPARATH_NEW,
+ E_TFT = F_ALLOW_IN | F_ALLOW_UNPARATH_NEW;
+
+ //Statement flag sets
+ //NOTE: Flag order:
+ // F_ALLOW_IN
+ // F_FUNC_BODY
+ // F_DIRECTIVE_CTX
+ // F_SEMICOLON_OPT
+ var S_TFFF = F_ALLOW_IN,
+ S_TFFT = F_ALLOW_IN | F_SEMICOLON_OPT,
+ S_FFFF = 0x00,
+ S_TFTF = F_ALLOW_IN | F_DIRECTIVE_CTX,
+ S_TTFF = F_ALLOW_IN | F_FUNC_BODY;
+
+ function getDefaultOptions() {
+ // default options
+ return {
+ indent: null,
+ base: null,
+ parse: null,
+ comment: false,
+ format: {
+ indent: {
+ style: ' ',
+ base: 0,
+ adjustMultilineComment: false
+ },
+ newline: '\n',
+ space: ' ',
+ json: false,
+ renumber: false,
+ hexadecimal: false,
+ quotes: 'single',
+ escapeless: false,
+ compact: false,
+ parentheses: true,
+ semicolons: true,
+ safeConcatenation: false,
+ preserveBlankLines: false
+ },
+ moz: {
+ comprehensionExpressionStartsWithAssignment: false,
+ starlessGenerator: false
+ },
+ sourceMap: null,
+ sourceMapRoot: null,
+ sourceMapWithCode: false,
+ directive: false,
+ raw: true,
+ verbatim: null,
+ sourceCode: null
+ };
+ }
+
+ function stringRepeat(str, num) {
+ var result = '';
+
+ for (num |= 0; num > 0; num >>>= 1, str += str) {
+ if (num & 1) {
+ result += str;
+ }
+ }
+
+ return result;
+ }
+
+ function hasLineTerminator(str) {
+ return (/[\r\n]/g).test(str);
+ }
+
+ function endsWithLineTerminator(str) {
+ var len = str.length;
+ return len && esutils.code.isLineTerminator(str.charCodeAt(len - 1));
+ }
+
+ function merge(target, override) {
+ var key;
+ for (key in override) {
+ if (override.hasOwnProperty(key)) {
+ target[key] = override[key];
+ }
+ }
+ return target;
+ }
+
+ function updateDeeply(target, override) {
+ var key, val;
+
+ function isHashObject(target) {
+ return typeof target === 'object' && target instanceof Object && !(target instanceof RegExp);
+ }
+
+ for (key in override) {
+ if (override.hasOwnProperty(key)) {
+ val = override[key];
+ if (isHashObject(val)) {
+ if (isHashObject(target[key])) {
+ updateDeeply(target[key], val);
+ } else {
+ target[key] = updateDeeply({}, val);
+ }
+ } else {
+ target[key] = val;
+ }
+ }
+ }
+ return target;
+ }
+
+ function generateNumber(value) {
+ var result, point, temp, exponent, pos;
+
+ if (value !== value) {
+ throw new Error('Numeric literal whose value is NaN');
+ }
+ if (value < 0 || (value === 0 && 1 / value < 0)) {
+ throw new Error('Numeric literal whose value is negative');
+ }
+
+ if (value === 1 / 0) {
+ return json ? 'null' : renumber ? '1e400' : '1e+400';
+ }
+
+ result = '' + value;
+ if (!renumber || result.length < 3) {
+ return result;
+ }
+
+ point = result.indexOf('.');
+ if (!json && result.charCodeAt(0) === 0x30 /* 0 */ && point === 1) {
+ point = 0;
+ result = result.slice(1);
+ }
+ temp = result;
+ result = result.replace('e+', 'e');
+ exponent = 0;
+ if ((pos = temp.indexOf('e')) > 0) {
+ exponent = +temp.slice(pos + 1);
+ temp = temp.slice(0, pos);
+ }
+ if (point >= 0) {
+ exponent -= temp.length - point - 1;
+ temp = +(temp.slice(0, point) + temp.slice(point + 1)) + '';
+ }
+ pos = 0;
+ while (temp.charCodeAt(temp.length + pos - 1) === 0x30 /* 0 */) {
+ --pos;
+ }
+ if (pos !== 0) {
+ exponent -= pos;
+ temp = temp.slice(0, pos);
+ }
+ if (exponent !== 0) {
+ temp += 'e' + exponent;
+ }
+ if ((temp.length < result.length ||
+ (hexadecimal && value > 1e12 && Math.floor(value) === value && (temp = '0x' + value.toString(16)).length < result.length)) &&
+ +temp === value) {
+ result = temp;
+ }
+
+ return result;
+ }
+
+ // Generate valid RegExp expression.
+ // This function is based on https://github.com/Constellation/iv Engine
+
+ function escapeRegExpCharacter(ch, previousIsBackslash) {
+ // not handling '\' and handling \u2028 or \u2029 to unicode escape sequence
+ if ((ch & ~1) === 0x2028) {
+ return (previousIsBackslash ? 'u' : '\\u') + ((ch === 0x2028) ? '2028' : '2029');
+ } else if (ch === 10 || ch === 13) { // \n, \r
+ return (previousIsBackslash ? '' : '\\') + ((ch === 10) ? 'n' : 'r');
+ }
+ return String.fromCharCode(ch);
+ }
+
+ function generateRegExp(reg) {
+ var match, result, flags, i, iz, ch, characterInBrack, previousIsBackslash;
+
+ result = reg.toString();
+
+ if (reg.source) {
+ // extract flag from toString result
+ match = result.match(/\/([^/]*)$/);
+ if (!match) {
+ return result;
+ }
+
+ flags = match[1];
+ result = '';
+
+ characterInBrack = false;
+ previousIsBackslash = false;
+ for (i = 0, iz = reg.source.length; i < iz; ++i) {
+ ch = reg.source.charCodeAt(i);
+
+ if (!previousIsBackslash) {
+ if (characterInBrack) {
+ if (ch === 93) { // ]
+ characterInBrack = false;
+ }
+ } else {
+ if (ch === 47) { // /
+ result += '\\';
+ } else if (ch === 91) { // [
+ characterInBrack = true;
+ }
+ }
+ result += escapeRegExpCharacter(ch, previousIsBackslash);
+ previousIsBackslash = ch === 92; // \
+ } else {
+ // if new RegExp("\\\n') is provided, create /\n/
+ result += escapeRegExpCharacter(ch, previousIsBackslash);
+ // prevent like /\\[/]/
+ previousIsBackslash = false;
+ }
+ }
+
+ return '/' + result + '/' + flags;
+ }
+
+ return result;
+ }
+
+ function escapeAllowedCharacter(code, next) {
+ var hex;
+
+ if (code === 0x08 /* \b */) {
+ return '\\b';
+ }
+
+ if (code === 0x0C /* \f */) {
+ return '\\f';
+ }
+
+ if (code === 0x09 /* \t */) {
+ return '\\t';
+ }
+
+ hex = code.toString(16).toUpperCase();
+ if (json || code > 0xFF) {
+ return '\\u' + '0000'.slice(hex.length) + hex;
+ } else if (code === 0x0000 && !esutils.code.isDecimalDigit(next)) {
+ return '\\0';
+ } else if (code === 0x000B /* \v */) { // '\v'
+ return '\\x0B';
+ } else {
+ return '\\x' + '00'.slice(hex.length) + hex;
+ }
+ }
+
+ function escapeDisallowedCharacter(code) {
+ if (code === 0x5C /* \ */) {
+ return '\\\\';
+ }
+
+ if (code === 0x0A /* \n */) {
+ return '\\n';
+ }
+
+ if (code === 0x0D /* \r */) {
+ return '\\r';
+ }
+
+ if (code === 0x2028) {
+ return '\\u2028';
+ }
+
+ if (code === 0x2029) {
+ return '\\u2029';
+ }
+
+ throw new Error('Incorrectly classified character');
+ }
+
+ function escapeDirective(str) {
+ var i, iz, code, quote;
+
+ quote = quotes === 'double' ? '"' : '\'';
+ for (i = 0, iz = str.length; i < iz; ++i) {
+ code = str.charCodeAt(i);
+ if (code === 0x27 /* ' */) {
+ quote = '"';
+ break;
+ } else if (code === 0x22 /* " */) {
+ quote = '\'';
+ break;
+ } else if (code === 0x5C /* \ */) {
+ ++i;
+ }
+ }
+
+ return quote + str + quote;
+ }
+
+ function escapeString(str) {
+ var result = '', i, len, code, singleQuotes = 0, doubleQuotes = 0, single, quote;
+
+ for (i = 0, len = str.length; i < len; ++i) {
+ code = str.charCodeAt(i);
+ if (code === 0x27 /* ' */) {
+ ++singleQuotes;
+ } else if (code === 0x22 /* " */) {
+ ++doubleQuotes;
+ } else if (code === 0x2F /* / */ && json) {
+ result += '\\';
+ } else if (esutils.code.isLineTerminator(code) || code === 0x5C /* \ */) {
+ result += escapeDisallowedCharacter(code);
+ continue;
+ } else if (!esutils.code.isIdentifierPartES5(code) && (json && code < 0x20 /* SP */ || !json && !escapeless && (code < 0x20 /* SP */ || code > 0x7E /* ~ */))) {
+ result += escapeAllowedCharacter(code, str.charCodeAt(i + 1));
+ continue;
+ }
+ result += String.fromCharCode(code);
+ }
+
+ single = !(quotes === 'double' || (quotes === 'auto' && doubleQuotes < singleQuotes));
+ quote = single ? '\'' : '"';
+
+ if (!(single ? singleQuotes : doubleQuotes)) {
+ return quote + result + quote;
+ }
+
+ str = result;
+ result = quote;
+
+ for (i = 0, len = str.length; i < len; ++i) {
+ code = str.charCodeAt(i);
+ if ((code === 0x27 /* ' */ && single) || (code === 0x22 /* " */ && !single)) {
+ result += '\\';
+ }
+ result += String.fromCharCode(code);
+ }
+
+ return result + quote;
+ }
+
+ /**
+ * flatten an array to a string, where the array can contain
+ * either strings or nested arrays
+ */
+ function flattenToString(arr) {
+ var i, iz, elem, result = '';
+ for (i = 0, iz = arr.length; i < iz; ++i) {
+ elem = arr[i];
+ result += Array.isArray(elem) ? flattenToString(elem) : elem;
+ }
+ return result;
+ }
+
+ /**
+ * convert generated to a SourceNode when source maps are enabled.
+ */
+ function toSourceNodeWhenNeeded(generated, node) {
+ if (!sourceMap$1) {
+ // with no source maps, generated is either an
+ // array or a string. if an array, flatten it.
+ // if a string, just return it
+ if (Array.isArray(generated)) {
+ return flattenToString(generated);
+ } else {
+ return generated;
+ }
+ }
+ if (node == null) {
+ if (generated instanceof SourceNode) {
+ return generated;
+ } else {
+ node = {};
+ }
+ }
+ if (node.loc == null) {
+ return new SourceNode(null, null, sourceMap$1, generated, node.name || null);
+ }
+ return new SourceNode(node.loc.start.line, node.loc.start.column, (sourceMap$1 === true ? node.loc.source || null : sourceMap$1), generated, node.name || null);
+ }
+
+ function noEmptySpace() {
+ return (space) ? space : ' ';
+ }
+
+ function join(left, right) {
+ var leftSource,
+ rightSource,
+ leftCharCode,
+ rightCharCode;
+
+ leftSource = toSourceNodeWhenNeeded(left).toString();
+ if (leftSource.length === 0) {
+ return [right];
+ }
+
+ rightSource = toSourceNodeWhenNeeded(right).toString();
+ if (rightSource.length === 0) {
+ return [left];
+ }
+
+ leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
+ rightCharCode = rightSource.charCodeAt(0);
+
+ if ((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode ||
+ esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode) ||
+ leftCharCode === 0x2F /* / */ && rightCharCode === 0x69 /* i */) { // infix word operators all start with `i`
+ return [left, noEmptySpace(), right];
+ } else if (esutils.code.isWhiteSpace(leftCharCode) || esutils.code.isLineTerminator(leftCharCode) ||
+ esutils.code.isWhiteSpace(rightCharCode) || esutils.code.isLineTerminator(rightCharCode)) {
+ return [left, right];
+ }
+ return [left, space, right];
+ }
+
+ function addIndent(stmt) {
+ return [base, stmt];
+ }
+
+ function withIndent(fn) {
+ var previousBase;
+ previousBase = base;
+ base += indent;
+ fn(base);
+ base = previousBase;
+ }
+
+ function calculateSpaces(str) {
+ var i;
+ for (i = str.length - 1; i >= 0; --i) {
+ if (esutils.code.isLineTerminator(str.charCodeAt(i))) {
+ break;
+ }
+ }
+ return (str.length - 1) - i;
+ }
+
+ function adjustMultilineComment(value, specialBase) {
+ var array, i, len, line, j, spaces, previousBase, sn;
+
+ array = value.split(/\r\n|[\r\n]/);
+ spaces = Number.MAX_VALUE;
+
+ // first line doesn't have indentation
+ for (i = 1, len = array.length; i < len; ++i) {
+ line = array[i];
+ j = 0;
+ while (j < line.length && esutils.code.isWhiteSpace(line.charCodeAt(j))) {
+ ++j;
+ }
+ if (spaces > j) {
+ spaces = j;
+ }
+ }
+
+ if (typeof specialBase !== 'undefined') {
+ // pattern like
+ // {
+ // var t = 20; /*
+ // * this is comment
+ // */
+ // }
+ previousBase = base;
+ if (array[1][spaces] === '*') {
+ specialBase += ' ';
+ }
+ base = specialBase;
+ } else {
+ if (spaces & 1) {
+ // /*
+ // *
+ // */
+ // If spaces are odd number, above pattern is considered.
+ // We waste 1 space.
+ --spaces;
+ }
+ previousBase = base;
+ }
+
+ for (i = 1, len = array.length; i < len; ++i) {
+ sn = toSourceNodeWhenNeeded(addIndent(array[i].slice(spaces)));
+ array[i] = sourceMap$1 ? sn.join('') : sn;
+ }
+
+ base = previousBase;
+
+ return array.join('\n');
+ }
+
+ function generateComment(comment, specialBase) {
+ if (comment.type === 'Line') {
+ if (endsWithLineTerminator(comment.value)) {
+ return '//' + comment.value;
+ } else {
+ // Always use LineTerminator
+ var result = '//' + comment.value;
+ if (!preserveBlankLines) {
+ result += '\n';
+ }
+ return result;
+ }
+ }
+ if (extra.format.indent.adjustMultilineComment && /[\n\r]/.test(comment.value)) {
+ return adjustMultilineComment('/*' + comment.value + '*/', specialBase);
+ }
+ return '/*' + comment.value + '*/';
+ }
+
+ function addComments(stmt, result) {
+ var i, len, comment, save, tailingToStatement, specialBase, fragment,
+ extRange, range, prevRange, prefix, infix, suffix, count;
+
+ if (stmt.leadingComments && stmt.leadingComments.length > 0) {
+ save = result;
+
+ if (preserveBlankLines) {
+ comment = stmt.leadingComments[0];
+ result = [];
+
+ extRange = comment.extendedRange;
+ range = comment.range;
+
+ prefix = sourceCode.substring(extRange[0], range[0]);
+ count = (prefix.match(/\n/g) || []).length;
+ if (count > 0) {
+ result.push(stringRepeat('\n', count));
+ result.push(addIndent(generateComment(comment)));
+ } else {
+ result.push(prefix);
+ result.push(generateComment(comment));
+ }
+
+ prevRange = range;
+
+ for (i = 1, len = stmt.leadingComments.length; i < len; i++) {
+ comment = stmt.leadingComments[i];
+ range = comment.range;
+
+ infix = sourceCode.substring(prevRange[1], range[0]);
+ count = (infix.match(/\n/g) || []).length;
+ result.push(stringRepeat('\n', count));
+ result.push(addIndent(generateComment(comment)));
+
+ prevRange = range;
+ }
+
+ suffix = sourceCode.substring(range[1], extRange[1]);
+ count = (suffix.match(/\n/g) || []).length;
+ result.push(stringRepeat('\n', count));
+ } else {
+ comment = stmt.leadingComments[0];
+ result = [];
+ if (safeConcatenation && stmt.type === Syntax.Program && stmt.body.length === 0) {
+ result.push('\n');
+ }
+ result.push(generateComment(comment));
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push('\n');
+ }
+
+ for (i = 1, len = stmt.leadingComments.length; i < len; ++i) {
+ comment = stmt.leadingComments[i];
+ fragment = [generateComment(comment)];
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ fragment.push('\n');
+ }
+ result.push(addIndent(fragment));
+ }
+ }
+
+ result.push(addIndent(save));
+ }
+
+ if (stmt.trailingComments) {
+
+ if (preserveBlankLines) {
+ comment = stmt.trailingComments[0];
+ extRange = comment.extendedRange;
+ range = comment.range;
+
+ prefix = sourceCode.substring(extRange[0], range[0]);
+ count = (prefix.match(/\n/g) || []).length;
+
+ if (count > 0) {
+ result.push(stringRepeat('\n', count));
+ result.push(addIndent(generateComment(comment)));
+ } else {
+ result.push(prefix);
+ result.push(generateComment(comment));
+ }
+ } else {
+ tailingToStatement = !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());
+ specialBase = stringRepeat(' ', calculateSpaces(toSourceNodeWhenNeeded([base, result, indent]).toString()));
+ for (i = 0, len = stmt.trailingComments.length; i < len; ++i) {
+ comment = stmt.trailingComments[i];
+ if (tailingToStatement) {
+ // We assume target like following script
+ //
+ // var t = 20; /**
+ // * This is comment of t
+ // */
+ if (i === 0) {
+ // first case
+ result = [result, indent];
+ } else {
+ result = [result, specialBase];
+ }
+ result.push(generateComment(comment, specialBase));
+ } else {
+ result = [result, addIndent(generateComment(comment))];
+ }
+ if (i !== len - 1 && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result = [result, '\n'];
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+
+ function generateBlankLines(start, end, result) {
+ var j, newlineCount = 0;
+
+ for (j = start; j < end; j++) {
+ if (sourceCode[j] === '\n') {
+ newlineCount++;
+ }
+ }
+
+ for (j = 1; j < newlineCount; j++) {
+ result.push(newline);
+ }
+ }
+
+ function parenthesize(text, current, should) {
+ if (current < should) {
+ return ['(', text, ')'];
+ }
+ return text;
+ }
+
+ function generateVerbatimString(string) {
+ var i, iz, result;
+ result = string.split(/\r\n|\n/);
+ for (i = 1, iz = result.length; i < iz; i++) {
+ result[i] = newline + base + result[i];
+ }
+ return result;
+ }
+
+ function generateVerbatim(expr, precedence) {
+ var verbatim, result, prec;
+ verbatim = expr[extra.verbatim];
+
+ if (typeof verbatim === 'string') {
+ result = parenthesize(generateVerbatimString(verbatim), Precedence.Sequence, precedence);
+ } else {
+ // verbatim is object
+ result = generateVerbatimString(verbatim.content);
+ prec = (verbatim.precedence != null) ? verbatim.precedence : Precedence.Sequence;
+ result = parenthesize(result, prec, precedence);
+ }
+
+ return toSourceNodeWhenNeeded(result, expr);
+ }
+
+ function CodeGenerator() {
+ }
+
+ // Helpers.
+
+ CodeGenerator.prototype.maybeBlock = function(stmt, flags) {
+ var result, noLeadingComment, that = this;
+
+ noLeadingComment = !extra.comment || !stmt.leadingComments;
+
+ if (stmt.type === Syntax.BlockStatement && noLeadingComment) {
+ return [space, this.generateStatement(stmt, flags)];
+ }
+
+ if (stmt.type === Syntax.EmptyStatement && noLeadingComment) {
+ return ';';
+ }
+
+ withIndent(function () {
+ result = [
+ newline,
+ addIndent(that.generateStatement(stmt, flags))
+ ];
+ });
+
+ return result;
+ };
+
+ CodeGenerator.prototype.maybeBlockSuffix = function (stmt, result) {
+ var ends = endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());
+ if (stmt.type === Syntax.BlockStatement && (!extra.comment || !stmt.leadingComments) && !ends) {
+ return [result, space];
+ }
+ if (ends) {
+ return [result, base];
+ }
+ return [result, newline, base];
+ };
+
+ function generateIdentifier(node) {
+ return toSourceNodeWhenNeeded(node.name, node);
+ }
+
+ function generateAsyncPrefix(node, spaceRequired) {
+ return node.async ? 'async' + (spaceRequired ? noEmptySpace() : space) : '';
+ }
+
+ function generateStarSuffix(node) {
+ var isGenerator = node.generator && !extra.moz.starlessGenerator;
+ return isGenerator ? '*' + space : '';
+ }
+
+ function generateMethodPrefix(prop) {
+ var func = prop.value, prefix = '';
+ if (func.async) {
+ prefix += generateAsyncPrefix(func, !prop.computed);
+ }
+ if (func.generator) {
+ // avoid space before method name
+ prefix += generateStarSuffix(func) ? '*' : '';
+ }
+ return prefix;
+ }
+
+ CodeGenerator.prototype.generatePattern = function (node, precedence, flags) {
+ if (node.type === Syntax.Identifier) {
+ return generateIdentifier(node);
+ }
+ return this.generateExpression(node, precedence, flags);
+ };
+
+ CodeGenerator.prototype.generateFunctionParams = function (node) {
+ var i, iz, result, hasDefault;
+
+ hasDefault = false;
+
+ if (node.type === Syntax.ArrowFunctionExpression &&
+ !node.rest && (!node.defaults || node.defaults.length === 0) &&
+ node.params.length === 1 && node.params[0].type === Syntax.Identifier) {
+ // arg => { } case
+ result = [generateAsyncPrefix(node, true), generateIdentifier(node.params[0])];
+ } else {
+ result = node.type === Syntax.ArrowFunctionExpression ? [generateAsyncPrefix(node, false)] : [];
+ result.push('(');
+ if (node.defaults) {
+ hasDefault = true;
+ }
+ for (i = 0, iz = node.params.length; i < iz; ++i) {
+ if (hasDefault && node.defaults[i]) {
+ // Handle default values.
+ result.push(this.generateAssignment(node.params[i], node.defaults[i], '=', Precedence.Assignment, E_TTT));
+ } else {
+ result.push(this.generatePattern(node.params[i], Precedence.Assignment, E_TTT));
+ }
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+
+ if (node.rest) {
+ if (node.params.length) {
+ result.push(',' + space);
+ }
+ result.push('...');
+ result.push(generateIdentifier(node.rest));
+ }
+
+ result.push(')');
+ }
+
+ return result;
+ };
+
+ CodeGenerator.prototype.generateFunctionBody = function (node) {
+ var result, expr;
+
+ result = this.generateFunctionParams(node);
+
+ if (node.type === Syntax.ArrowFunctionExpression) {
+ result.push(space);
+ result.push('=>');
+ }
+
+ if (node.expression) {
+ result.push(space);
+ expr = this.generateExpression(node.body, Precedence.Assignment, E_TTT);
+ if (expr.toString().charAt(0) === '{') {
+ expr = ['(', expr, ')'];
+ }
+ result.push(expr);
+ } else {
+ result.push(this.maybeBlock(node.body, S_TTFF));
+ }
+
+ return result;
+ };
+
+ CodeGenerator.prototype.generateIterationForStatement = function (operator, stmt, flags) {
+ var result = ['for' + (stmt.await ? noEmptySpace() + 'await' : '') + space + '('], that = this;
+ withIndent(function () {
+ if (stmt.left.type === Syntax.VariableDeclaration) {
+ withIndent(function () {
+ result.push(stmt.left.kind + noEmptySpace());
+ result.push(that.generateStatement(stmt.left.declarations[0], S_FFFF));
+ });
+ } else {
+ result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT));
+ }
+
+ result = join(result, operator);
+ result = [join(
+ result,
+ that.generateExpression(stmt.right, Precedence.Assignment, E_TTT)
+ ), ')'];
+ });
+ result.push(this.maybeBlock(stmt.body, flags));
+ return result;
+ };
+
+ CodeGenerator.prototype.generatePropertyKey = function (expr, computed) {
+ var result = [];
+
+ if (computed) {
+ result.push('[');
+ }
+
+ result.push(this.generateExpression(expr, Precedence.Sequence, E_TTT));
+
+ if (computed) {
+ result.push(']');
+ }
+
+ return result;
+ };
+
+ CodeGenerator.prototype.generateAssignment = function (left, right, operator, precedence, flags) {
+ if (Precedence.Assignment < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+
+ return parenthesize(
+ [
+ this.generateExpression(left, Precedence.Call, flags),
+ space + operator + space,
+ this.generateExpression(right, Precedence.Assignment, flags)
+ ],
+ Precedence.Assignment,
+ precedence
+ );
+ };
+
+ CodeGenerator.prototype.semicolon = function (flags) {
+ if (!semicolons && flags & F_SEMICOLON_OPT) {
+ return '';
+ }
+ return ';';
+ };
+
+ // Statements.
+
+ CodeGenerator.Statement = {
+
+ BlockStatement: function (stmt, flags) {
+ var range, content, result = ['{', newline], that = this;
+
+ withIndent(function () {
+ // handle functions without any code
+ if (stmt.body.length === 0 && preserveBlankLines) {
+ range = stmt.range;
+ if (range[1] - range[0] > 2) {
+ content = sourceCode.substring(range[0] + 1, range[1] - 1);
+ if (content[0] === '\n') {
+ result = ['{'];
+ }
+ result.push(content);
+ }
+ }
+
+ var i, iz, fragment, bodyFlags;
+ bodyFlags = S_TFFF;
+ if (flags & F_FUNC_BODY) {
+ bodyFlags |= F_DIRECTIVE_CTX;
+ }
+
+ for (i = 0, iz = stmt.body.length; i < iz; ++i) {
+ if (preserveBlankLines) {
+ // handle spaces before the first line
+ if (i === 0) {
+ if (stmt.body[0].leadingComments) {
+ range = stmt.body[0].leadingComments[0].extendedRange;
+ content = sourceCode.substring(range[0], range[1]);
+ if (content[0] === '\n') {
+ result = ['{'];
+ }
+ }
+ if (!stmt.body[0].leadingComments) {
+ generateBlankLines(stmt.range[0], stmt.body[0].range[0], result);
+ }
+ }
+
+ // handle spaces between lines
+ if (i > 0) {
+ if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) {
+ generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);
+ }
+ }
+ }
+
+ if (i === iz - 1) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+
+ if (stmt.body[i].leadingComments && preserveBlankLines) {
+ fragment = that.generateStatement(stmt.body[i], bodyFlags);
+ } else {
+ fragment = addIndent(that.generateStatement(stmt.body[i], bodyFlags));
+ }
+
+ result.push(fragment);
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ if (preserveBlankLines && i < iz - 1) {
+ // don't add a new line if there are leading coments
+ // in the next statement
+ if (!stmt.body[i + 1].leadingComments) {
+ result.push(newline);
+ }
+ } else {
+ result.push(newline);
+ }
+ }
+
+ if (preserveBlankLines) {
+ // handle spaces after the last line
+ if (i === iz - 1) {
+ if (!stmt.body[i].trailingComments) {
+ generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);
+ }
+ }
+ }
+ }
+ });
+
+ result.push(addIndent('}'));
+ return result;
+ },
+
+ BreakStatement: function (stmt, flags) {
+ if (stmt.label) {
+ return 'break ' + stmt.label.name + this.semicolon(flags);
+ }
+ return 'break' + this.semicolon(flags);
+ },
+
+ ContinueStatement: function (stmt, flags) {
+ if (stmt.label) {
+ return 'continue ' + stmt.label.name + this.semicolon(flags);
+ }
+ return 'continue' + this.semicolon(flags);
+ },
+
+ ClassBody: function (stmt, flags) {
+ var result = [ '{', newline], that = this;
+
+ withIndent(function (indent) {
+ var i, iz;
+
+ for (i = 0, iz = stmt.body.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(stmt.body[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(newline);
+ }
+ }
+ });
+
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base);
+ result.push('}');
+ return result;
+ },
+
+ ClassDeclaration: function (stmt, flags) {
+ var result, fragment;
+ result = ['class'];
+ if (stmt.id) {
+ result = join(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT));
+ }
+ if (stmt.superClass) {
+ fragment = join('extends', this.generateExpression(stmt.superClass, Precedence.Unary, E_TTT));
+ result = join(result, fragment);
+ }
+ result.push(space);
+ result.push(this.generateStatement(stmt.body, S_TFFT));
+ return result;
+ },
+
+ DirectiveStatement: function (stmt, flags) {
+ if (extra.raw && stmt.raw) {
+ return stmt.raw + this.semicolon(flags);
+ }
+ return escapeDirective(stmt.directive) + this.semicolon(flags);
+ },
+
+ DoWhileStatement: function (stmt, flags) {
+ // Because `do 42 while (cond)` is Syntax Error. We need semicolon.
+ var result = join('do', this.maybeBlock(stmt.body, S_TFFF));
+ result = this.maybeBlockSuffix(stmt.body, result);
+ return join(result, [
+ 'while' + space + '(',
+ this.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
+ ')' + this.semicolon(flags)
+ ]);
+ },
+
+ CatchClause: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ var guard;
+
+ if (stmt.param) {
+ result = [
+ 'catch' + space + '(',
+ that.generateExpression(stmt.param, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+
+ if (stmt.guard) {
+ guard = that.generateExpression(stmt.guard, Precedence.Sequence, E_TTT);
+ result.splice(2, 0, ' if ', guard);
+ }
+ } else {
+ result = ['catch'];
+ }
+ });
+ result.push(this.maybeBlock(stmt.body, S_TFFF));
+ return result;
+ },
+
+ DebuggerStatement: function (stmt, flags) {
+ return 'debugger' + this.semicolon(flags);
+ },
+
+ EmptyStatement: function (stmt, flags) {
+ return ';';
+ },
+
+ ExportDefaultDeclaration: function (stmt, flags) {
+ var result = [ 'export' ], bodyFlags;
+
+ bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF;
+
+ // export default HoistableDeclaration[Default]
+ // export default AssignmentExpression[In] ;
+ result = join(result, 'default');
+ if (isStatement(stmt.declaration)) {
+ result = join(result, this.generateStatement(stmt.declaration, bodyFlags));
+ } else {
+ result = join(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags));
+ }
+ return result;
+ },
+
+ ExportNamedDeclaration: function (stmt, flags) {
+ var result = [ 'export' ], bodyFlags, that = this;
+
+ bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF;
+
+ // export VariableStatement
+ // export Declaration[Default]
+ if (stmt.declaration) {
+ return join(result, this.generateStatement(stmt.declaration, bodyFlags));
+ }
+
+ // export ExportClause[NoReference] FromClause ;
+ // export ExportClause ;
+ if (stmt.specifiers) {
+ if (stmt.specifiers.length === 0) {
+ result = join(result, '{' + space + '}');
+ } else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) {
+ result = join(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT));
+ } else {
+ result = join(result, '{');
+ withIndent(function (indent) {
+ var i, iz;
+ result.push(newline);
+ for (i = 0, iz = stmt.specifiers.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + newline);
+ }
+ }
+ });
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base + '}');
+ }
+
+ if (stmt.source) {
+ result = join(result, [
+ 'from' + space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ]);
+ } else {
+ result.push(this.semicolon(flags));
+ }
+ }
+ return result;
+ },
+
+ ExportAllDeclaration: function (stmt, flags) {
+ // export * FromClause ;
+ return [
+ 'export' + space,
+ '*' + space,
+ 'from' + space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ];
+ },
+
+ ExpressionStatement: function (stmt, flags) {
+ var result, fragment;
+
+ function isClassPrefixed(fragment) {
+ var code;
+ if (fragment.slice(0, 5) !== 'class') {
+ return false;
+ }
+ code = fragment.charCodeAt(5);
+ return code === 0x7B /* '{' */ || esutils.code.isWhiteSpace(code) || esutils.code.isLineTerminator(code);
+ }
+
+ function isFunctionPrefixed(fragment) {
+ var code;
+ if (fragment.slice(0, 8) !== 'function') {
+ return false;
+ }
+ code = fragment.charCodeAt(8);
+ return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code);
+ }
+
+ function isAsyncPrefixed(fragment) {
+ var code, i, iz;
+ if (fragment.slice(0, 5) !== 'async') {
+ return false;
+ }
+ if (!esutils.code.isWhiteSpace(fragment.charCodeAt(5))) {
+ return false;
+ }
+ for (i = 6, iz = fragment.length; i < iz; ++i) {
+ if (!esutils.code.isWhiteSpace(fragment.charCodeAt(i))) {
+ break;
+ }
+ }
+ if (i === iz) {
+ return false;
+ }
+ if (fragment.slice(i, i + 8) !== 'function') {
+ return false;
+ }
+ code = fragment.charCodeAt(i + 8);
+ return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code);
+ }
+
+ result = [this.generateExpression(stmt.expression, Precedence.Sequence, E_TTT)];
+ // 12.4 '{', 'function', 'class' is not allowed in this position.
+ // wrap expression with parentheses
+ fragment = toSourceNodeWhenNeeded(result).toString();
+ if (fragment.charCodeAt(0) === 0x7B /* '{' */ || // ObjectExpression
+ isClassPrefixed(fragment) ||
+ isFunctionPrefixed(fragment) ||
+ isAsyncPrefixed(fragment) ||
+ (directive && (flags & F_DIRECTIVE_CTX) && stmt.expression.type === Syntax.Literal && typeof stmt.expression.value === 'string')) {
+ result = ['(', result, ')' + this.semicolon(flags)];
+ } else {
+ result.push(this.semicolon(flags));
+ }
+ return result;
+ },
+
+ ImportDeclaration: function (stmt, flags) {
+ // ES6: 15.2.1 valid import declarations:
+ // - import ImportClause FromClause ;
+ // - import ModuleSpecifier ;
+ var result, cursor, that = this;
+
+ // If no ImportClause is present,
+ // this should be `import ModuleSpecifier` so skip `from`
+ // ModuleSpecifier is StringLiteral.
+ if (stmt.specifiers.length === 0) {
+ // import ModuleSpecifier ;
+ return [
+ 'import',
+ space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ];
+ }
+
+ // import ImportClause FromClause ;
+ result = [
+ 'import'
+ ];
+ cursor = 0;
+
+ // ImportedBinding
+ if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) {
+ result = join(result, [
+ this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
+ ]);
+ ++cursor;
+ }
+
+ if (stmt.specifiers[cursor]) {
+ if (cursor !== 0) {
+ result.push(',');
+ }
+
+ if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) {
+ // NameSpaceImport
+ result = join(result, [
+ space,
+ this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
+ ]);
+ } else {
+ // NamedImports
+ result.push(space + '{');
+
+ if ((stmt.specifiers.length - cursor) === 1) {
+ // import { ... } from "...";
+ result.push(space);
+ result.push(this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT));
+ result.push(space + '}' + space);
+ } else {
+ // import {
+ // ...,
+ // ...,
+ // } from "...";
+ withIndent(function (indent) {
+ var i, iz;
+ result.push(newline);
+ for (i = cursor, iz = stmt.specifiers.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + newline);
+ }
+ }
+ });
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base + '}' + space);
+ }
+ }
+ }
+
+ result = join(result, [
+ 'from' + space,
+ // ModuleSpecifier
+ this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
+ this.semicolon(flags)
+ ]);
+ return result;
+ },
+
+ VariableDeclarator: function (stmt, flags) {
+ var itemFlags = (flags & F_ALLOW_IN) ? E_TTT : E_FTT;
+ if (stmt.init) {
+ return [
+ this.generateExpression(stmt.id, Precedence.Assignment, itemFlags),
+ space,
+ '=',
+ space,
+ this.generateExpression(stmt.init, Precedence.Assignment, itemFlags)
+ ];
+ }
+ return this.generatePattern(stmt.id, Precedence.Assignment, itemFlags);
+ },
+
+ VariableDeclaration: function (stmt, flags) {
+ // VariableDeclarator is typed as Statement,
+ // but joined with comma (not LineTerminator).
+ // So if comment is attached to target node, we should specialize.
+ var result, i, iz, node, bodyFlags, that = this;
+
+ result = [ stmt.kind ];
+
+ bodyFlags = (flags & F_ALLOW_IN) ? S_TFFF : S_FFFF;
+
+ function block() {
+ node = stmt.declarations[0];
+ if (extra.comment && node.leadingComments) {
+ result.push('\n');
+ result.push(addIndent(that.generateStatement(node, bodyFlags)));
+ } else {
+ result.push(noEmptySpace());
+ result.push(that.generateStatement(node, bodyFlags));
+ }
+
+ for (i = 1, iz = stmt.declarations.length; i < iz; ++i) {
+ node = stmt.declarations[i];
+ if (extra.comment && node.leadingComments) {
+ result.push(',' + newline);
+ result.push(addIndent(that.generateStatement(node, bodyFlags)));
+ } else {
+ result.push(',' + space);
+ result.push(that.generateStatement(node, bodyFlags));
+ }
+ }
+ }
+
+ if (stmt.declarations.length > 1) {
+ withIndent(block);
+ } else {
+ block();
+ }
+
+ result.push(this.semicolon(flags));
+
+ return result;
+ },
+
+ ThrowStatement: function (stmt, flags) {
+ return [join(
+ 'throw',
+ this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
+ ), this.semicolon(flags)];
+ },
+
+ TryStatement: function (stmt, flags) {
+ var result, i, iz, guardedHandlers;
+
+ result = ['try', this.maybeBlock(stmt.block, S_TFFF)];
+ result = this.maybeBlockSuffix(stmt.block, result);
+
+ if (stmt.handlers) {
+ // old interface
+ for (i = 0, iz = stmt.handlers.length; i < iz; ++i) {
+ result = join(result, this.generateStatement(stmt.handlers[i], S_TFFF));
+ if (stmt.finalizer || i + 1 !== iz) {
+ result = this.maybeBlockSuffix(stmt.handlers[i].body, result);
+ }
+ }
+ } else {
+ guardedHandlers = stmt.guardedHandlers || [];
+
+ for (i = 0, iz = guardedHandlers.length; i < iz; ++i) {
+ result = join(result, this.generateStatement(guardedHandlers[i], S_TFFF));
+ if (stmt.finalizer || i + 1 !== iz) {
+ result = this.maybeBlockSuffix(guardedHandlers[i].body, result);
+ }
+ }
+
+ // new interface
+ if (stmt.handler) {
+ if (Array.isArray(stmt.handler)) {
+ for (i = 0, iz = stmt.handler.length; i < iz; ++i) {
+ result = join(result, this.generateStatement(stmt.handler[i], S_TFFF));
+ if (stmt.finalizer || i + 1 !== iz) {
+ result = this.maybeBlockSuffix(stmt.handler[i].body, result);
+ }
+ }
+ } else {
+ result = join(result, this.generateStatement(stmt.handler, S_TFFF));
+ if (stmt.finalizer) {
+ result = this.maybeBlockSuffix(stmt.handler.body, result);
+ }
+ }
+ }
+ }
+ if (stmt.finalizer) {
+ result = join(result, ['finally', this.maybeBlock(stmt.finalizer, S_TFFF)]);
+ }
+ return result;
+ },
+
+ SwitchStatement: function (stmt, flags) {
+ var result, fragment, i, iz, bodyFlags, that = this;
+ withIndent(function () {
+ result = [
+ 'switch' + space + '(',
+ that.generateExpression(stmt.discriminant, Precedence.Sequence, E_TTT),
+ ')' + space + '{' + newline
+ ];
+ });
+ if (stmt.cases) {
+ bodyFlags = S_TFFF;
+ for (i = 0, iz = stmt.cases.length; i < iz; ++i) {
+ if (i === iz - 1) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+ fragment = addIndent(this.generateStatement(stmt.cases[i], bodyFlags));
+ result.push(fragment);
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ result.push(newline);
+ }
+ }
+ }
+ result.push(addIndent('}'));
+ return result;
+ },
+
+ SwitchCase: function (stmt, flags) {
+ var result, fragment, i, iz, bodyFlags, that = this;
+ withIndent(function () {
+ if (stmt.test) {
+ result = [
+ join('case', that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)),
+ ':'
+ ];
+ } else {
+ result = ['default:'];
+ }
+
+ i = 0;
+ iz = stmt.consequent.length;
+ if (iz && stmt.consequent[0].type === Syntax.BlockStatement) {
+ fragment = that.maybeBlock(stmt.consequent[0], S_TFFF);
+ result.push(fragment);
+ i = 1;
+ }
+
+ if (i !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+
+ bodyFlags = S_TFFF;
+ for (; i < iz; ++i) {
+ if (i === iz - 1 && flags & F_SEMICOLON_OPT) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+ fragment = addIndent(that.generateStatement(stmt.consequent[i], bodyFlags));
+ result.push(fragment);
+ if (i + 1 !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ result.push(newline);
+ }
+ }
+ });
+ return result;
+ },
+
+ IfStatement: function (stmt, flags) {
+ var result, bodyFlags, semicolonOptional, that = this;
+ withIndent(function () {
+ result = [
+ 'if' + space + '(',
+ that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+ });
+ semicolonOptional = flags & F_SEMICOLON_OPT;
+ bodyFlags = S_TFFF;
+ if (semicolonOptional) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+ if (stmt.alternate) {
+ result.push(this.maybeBlock(stmt.consequent, S_TFFF));
+ result = this.maybeBlockSuffix(stmt.consequent, result);
+ if (stmt.alternate.type === Syntax.IfStatement) {
+ result = join(result, ['else ', this.generateStatement(stmt.alternate, bodyFlags)]);
+ } else {
+ result = join(result, join('else', this.maybeBlock(stmt.alternate, bodyFlags)));
+ }
+ } else {
+ result.push(this.maybeBlock(stmt.consequent, bodyFlags));
+ }
+ return result;
+ },
+
+ ForStatement: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ result = ['for' + space + '('];
+ if (stmt.init) {
+ if (stmt.init.type === Syntax.VariableDeclaration) {
+ result.push(that.generateStatement(stmt.init, S_FFFF));
+ } else {
+ // F_ALLOW_IN becomes false.
+ result.push(that.generateExpression(stmt.init, Precedence.Sequence, E_FTT));
+ result.push(';');
+ }
+ } else {
+ result.push(';');
+ }
+
+ if (stmt.test) {
+ result.push(space);
+ result.push(that.generateExpression(stmt.test, Precedence.Sequence, E_TTT));
+ result.push(';');
+ } else {
+ result.push(';');
+ }
+
+ if (stmt.update) {
+ result.push(space);
+ result.push(that.generateExpression(stmt.update, Precedence.Sequence, E_TTT));
+ result.push(')');
+ } else {
+ result.push(')');
+ }
+ });
+
+ result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
+ return result;
+ },
+
+ ForInStatement: function (stmt, flags) {
+ return this.generateIterationForStatement('in', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);
+ },
+
+ ForOfStatement: function (stmt, flags) {
+ return this.generateIterationForStatement('of', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);
+ },
+
+ LabeledStatement: function (stmt, flags) {
+ return [stmt.label.name + ':', this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)];
+ },
+
+ Program: function (stmt, flags) {
+ var result, fragment, i, iz, bodyFlags;
+ iz = stmt.body.length;
+ result = [safeConcatenation && iz > 0 ? '\n' : ''];
+ bodyFlags = S_TFTF;
+ for (i = 0; i < iz; ++i) {
+ if (!safeConcatenation && i === iz - 1) {
+ bodyFlags |= F_SEMICOLON_OPT;
+ }
+
+ if (preserveBlankLines) {
+ // handle spaces before the first line
+ if (i === 0) {
+ if (!stmt.body[0].leadingComments) {
+ generateBlankLines(stmt.range[0], stmt.body[i].range[0], result);
+ }
+ }
+
+ // handle spaces between lines
+ if (i > 0) {
+ if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) {
+ generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);
+ }
+ }
+ }
+
+ fragment = addIndent(this.generateStatement(stmt.body[i], bodyFlags));
+ result.push(fragment);
+ if (i + 1 < iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ if (preserveBlankLines) {
+ if (!stmt.body[i + 1].leadingComments) {
+ result.push(newline);
+ }
+ } else {
+ result.push(newline);
+ }
+ }
+
+ if (preserveBlankLines) {
+ // handle spaces after the last line
+ if (i === iz - 1) {
+ if (!stmt.body[i].trailingComments) {
+ generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);
+ }
+ }
+ }
+ }
+ return result;
+ },
+
+ FunctionDeclaration: function (stmt, flags) {
+ return [
+ generateAsyncPrefix(stmt, true),
+ 'function',
+ generateStarSuffix(stmt) || noEmptySpace(),
+ stmt.id ? generateIdentifier(stmt.id) : '',
+ this.generateFunctionBody(stmt)
+ ];
+ },
+
+ ReturnStatement: function (stmt, flags) {
+ if (stmt.argument) {
+ return [join(
+ 'return',
+ this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
+ ), this.semicolon(flags)];
+ }
+ return ['return' + this.semicolon(flags)];
+ },
+
+ WhileStatement: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ result = [
+ 'while' + space + '(',
+ that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+ });
+ result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
+ return result;
+ },
+
+ WithStatement: function (stmt, flags) {
+ var result, that = this;
+ withIndent(function () {
+ result = [
+ 'with' + space + '(',
+ that.generateExpression(stmt.object, Precedence.Sequence, E_TTT),
+ ')'
+ ];
+ });
+ result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));
+ return result;
+ }
+
+ };
+
+ merge(CodeGenerator.prototype, CodeGenerator.Statement);
+
+ // Expressions.
+
+ CodeGenerator.Expression = {
+
+ SequenceExpression: function (expr, precedence, flags) {
+ var result, i, iz;
+ if (Precedence.Sequence < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+ result = [];
+ for (i = 0, iz = expr.expressions.length; i < iz; ++i) {
+ result.push(this.generateExpression(expr.expressions[i], Precedence.Assignment, flags));
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+ return parenthesize(result, Precedence.Sequence, precedence);
+ },
+
+ AssignmentExpression: function (expr, precedence, flags) {
+ return this.generateAssignment(expr.left, expr.right, expr.operator, precedence, flags);
+ },
+
+ ArrowFunctionExpression: function (expr, precedence, flags) {
+ return parenthesize(this.generateFunctionBody(expr), Precedence.ArrowFunction, precedence);
+ },
+
+ ConditionalExpression: function (expr, precedence, flags) {
+ if (Precedence.Conditional < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+ return parenthesize(
+ [
+ this.generateExpression(expr.test, Precedence.LogicalOR, flags),
+ space + '?' + space,
+ this.generateExpression(expr.consequent, Precedence.Assignment, flags),
+ space + ':' + space,
+ this.generateExpression(expr.alternate, Precedence.Assignment, flags)
+ ],
+ Precedence.Conditional,
+ precedence
+ );
+ },
+
+ LogicalExpression: function (expr, precedence, flags) {
+ return this.BinaryExpression(expr, precedence, flags);
+ },
+
+ BinaryExpression: function (expr, precedence, flags) {
+ var result, leftPrecedence, rightPrecedence, currentPrecedence, fragment, leftSource;
+ currentPrecedence = BinaryPrecedence[expr.operator];
+ leftPrecedence = expr.operator === '**' ? Precedence.Postfix : currentPrecedence;
+ rightPrecedence = expr.operator === '**' ? currentPrecedence : currentPrecedence + 1;
+
+ if (currentPrecedence < precedence) {
+ flags |= F_ALLOW_IN;
+ }
+
+ fragment = this.generateExpression(expr.left, leftPrecedence, flags);
+
+ leftSource = fragment.toString();
+
+ if (leftSource.charCodeAt(leftSource.length - 1) === 0x2F /* / */ && esutils.code.isIdentifierPartES5(expr.operator.charCodeAt(0))) {
+ result = [fragment, noEmptySpace(), expr.operator];
+ } else {
+ result = join(fragment, expr.operator);
+ }
+
+ fragment = this.generateExpression(expr.right, rightPrecedence, flags);
+
+ if (expr.operator === '/' && fragment.toString().charAt(0) === '/' ||
+ expr.operator.slice(-1) === '<' && fragment.toString().slice(0, 3) === '!--') {
+ // If '/' concats with '/' or `<` concats with `!--`, it is interpreted as comment start
+ result.push(noEmptySpace());
+ result.push(fragment);
+ } else {
+ result = join(result, fragment);
+ }
+
+ if (expr.operator === 'in' && !(flags & F_ALLOW_IN)) {
+ return ['(', result, ')'];
+ }
+ return parenthesize(result, currentPrecedence, precedence);
+ },
+
+ CallExpression: function (expr, precedence, flags) {
+ var result, i, iz;
+ // F_ALLOW_UNPARATH_NEW becomes false.
+ result = [this.generateExpression(expr.callee, Precedence.Call, E_TTF)];
+ result.push('(');
+ for (i = 0, iz = expr['arguments'].length; i < iz; ++i) {
+ result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+ result.push(')');
+
+ if (!(flags & F_ALLOW_CALL)) {
+ return ['(', result, ')'];
+ }
+ return parenthesize(result, Precedence.Call, precedence);
+ },
+
+ NewExpression: function (expr, precedence, flags) {
+ var result, length, i, iz, itemFlags;
+ length = expr['arguments'].length;
+
+ // F_ALLOW_CALL becomes false.
+ // F_ALLOW_UNPARATH_NEW may become false.
+ itemFlags = (flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0) ? E_TFT : E_TFF;
+
+ result = join(
+ 'new',
+ this.generateExpression(expr.callee, Precedence.New, itemFlags)
+ );
+
+ if (!(flags & F_ALLOW_UNPARATH_NEW) || parentheses || length > 0) {
+ result.push('(');
+ for (i = 0, iz = length; i < iz; ++i) {
+ result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + space);
+ }
+ }
+ result.push(')');
+ }
+
+ return parenthesize(result, Precedence.New, precedence);
+ },
+
+ MemberExpression: function (expr, precedence, flags) {
+ var result, fragment;
+
+ // F_ALLOW_UNPARATH_NEW becomes false.
+ result = [this.generateExpression(expr.object, Precedence.Call, (flags & F_ALLOW_CALL) ? E_TTF : E_TFF)];
+
+ if (expr.computed) {
+ result.push('[');
+ result.push(this.generateExpression(expr.property, Precedence.Sequence, flags & F_ALLOW_CALL ? E_TTT : E_TFT));
+ result.push(']');
+ } else {
+ if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') {
+ fragment = toSourceNodeWhenNeeded(result).toString();
+ // When the following conditions are all true,
+ // 1. No floating point
+ // 2. Don't have exponents
+ // 3. The last character is a decimal digit
+ // 4. Not hexadecimal OR octal number literal
+ // we should add a floating point.
+ if (
+ fragment.indexOf('.') < 0 &&
+ !/[eExX]/.test(fragment) &&
+ esutils.code.isDecimalDigit(fragment.charCodeAt(fragment.length - 1)) &&
+ !(fragment.length >= 2 && fragment.charCodeAt(0) === 48) // '0'
+ ) {
+ result.push(' ');
+ }
+ }
+ result.push('.');
+ result.push(generateIdentifier(expr.property));
+ }
+
+ return parenthesize(result, Precedence.Member, precedence);
+ },
+
+ MetaProperty: function (expr, precedence, flags) {
+ var result;
+ result = [];
+ result.push(typeof expr.meta === "string" ? expr.meta : generateIdentifier(expr.meta));
+ result.push('.');
+ result.push(typeof expr.property === "string" ? expr.property : generateIdentifier(expr.property));
+ return parenthesize(result, Precedence.Member, precedence);
+ },
+
+ UnaryExpression: function (expr, precedence, flags) {
+ var result, fragment, rightCharCode, leftSource, leftCharCode;
+ fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT);
+
+ if (space === '') {
+ result = join(expr.operator, fragment);
+ } else {
+ result = [expr.operator];
+ if (expr.operator.length > 2) {
+ // delete, void, typeof
+ // get `typeof []`, not `typeof[]`
+ result = join(result, fragment);
+ } else {
+ // Prevent inserting spaces between operator and argument if it is unnecessary
+ // like, `!cond`
+ leftSource = toSourceNodeWhenNeeded(result).toString();
+ leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
+ rightCharCode = fragment.toString().charCodeAt(0);
+
+ if (((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode) ||
+ (esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode))) {
+ result.push(noEmptySpace());
+ result.push(fragment);
+ } else {
+ result.push(fragment);
+ }
+ }
+ }
+ return parenthesize(result, Precedence.Unary, precedence);
+ },
+
+ YieldExpression: function (expr, precedence, flags) {
+ var result;
+ if (expr.delegate) {
+ result = 'yield*';
+ } else {
+ result = 'yield';
+ }
+ if (expr.argument) {
+ result = join(
+ result,
+ this.generateExpression(expr.argument, Precedence.Yield, E_TTT)
+ );
+ }
+ return parenthesize(result, Precedence.Yield, precedence);
+ },
+
+ AwaitExpression: function (expr, precedence, flags) {
+ var result = join(
+ expr.all ? 'await*' : 'await',
+ this.generateExpression(expr.argument, Precedence.Await, E_TTT)
+ );
+ return parenthesize(result, Precedence.Await, precedence);
+ },
+
+ UpdateExpression: function (expr, precedence, flags) {
+ if (expr.prefix) {
+ return parenthesize(
+ [
+ expr.operator,
+ this.generateExpression(expr.argument, Precedence.Unary, E_TTT)
+ ],
+ Precedence.Unary,
+ precedence
+ );
+ }
+ return parenthesize(
+ [
+ this.generateExpression(expr.argument, Precedence.Postfix, E_TTT),
+ expr.operator
+ ],
+ Precedence.Postfix,
+ precedence
+ );
+ },
+
+ FunctionExpression: function (expr, precedence, flags) {
+ var result = [
+ generateAsyncPrefix(expr, true),
+ 'function'
+ ];
+ if (expr.id) {
+ result.push(generateStarSuffix(expr) || noEmptySpace());
+ result.push(generateIdentifier(expr.id));
+ } else {
+ result.push(generateStarSuffix(expr) || space);
+ }
+ result.push(this.generateFunctionBody(expr));
+ return result;
+ },
+
+ ArrayPattern: function (expr, precedence, flags) {
+ return this.ArrayExpression(expr, precedence, flags, true);
+ },
+
+ ArrayExpression: function (expr, precedence, flags, isPattern) {
+ var result, multiline, that = this;
+ if (!expr.elements.length) {
+ return '[]';
+ }
+ multiline = isPattern ? false : expr.elements.length > 1;
+ result = ['[', multiline ? newline : ''];
+ withIndent(function (indent) {
+ var i, iz;
+ for (i = 0, iz = expr.elements.length; i < iz; ++i) {
+ if (!expr.elements[i]) {
+ if (multiline) {
+ result.push(indent);
+ }
+ if (i + 1 === iz) {
+ result.push(',');
+ }
+ } else {
+ result.push(multiline ? indent : '');
+ result.push(that.generateExpression(expr.elements[i], Precedence.Assignment, E_TTT));
+ }
+ if (i + 1 < iz) {
+ result.push(',' + (multiline ? newline : space));
+ }
+ }
+ });
+ if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(multiline ? base : '');
+ result.push(']');
+ return result;
+ },
+
+ RestElement: function(expr, precedence, flags) {
+ return '...' + this.generatePattern(expr.argument);
+ },
+
+ ClassExpression: function (expr, precedence, flags) {
+ var result, fragment;
+ result = ['class'];
+ if (expr.id) {
+ result = join(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT));
+ }
+ if (expr.superClass) {
+ fragment = join('extends', this.generateExpression(expr.superClass, Precedence.Unary, E_TTT));
+ result = join(result, fragment);
+ }
+ result.push(space);
+ result.push(this.generateStatement(expr.body, S_TFFT));
+ return result;
+ },
+
+ MethodDefinition: function (expr, precedence, flags) {
+ var result, fragment;
+ if (expr['static']) {
+ result = ['static' + space];
+ } else {
+ result = [];
+ }
+ if (expr.kind === 'get' || expr.kind === 'set') {
+ fragment = [
+ join(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),
+ this.generateFunctionBody(expr.value)
+ ];
+ } else {
+ fragment = [
+ generateMethodPrefix(expr),
+ this.generatePropertyKey(expr.key, expr.computed),
+ this.generateFunctionBody(expr.value)
+ ];
+ }
+ return join(result, fragment);
+ },
+
+ Property: function (expr, precedence, flags) {
+ if (expr.kind === 'get' || expr.kind === 'set') {
+ return [
+ expr.kind, noEmptySpace(),
+ this.generatePropertyKey(expr.key, expr.computed),
+ this.generateFunctionBody(expr.value)
+ ];
+ }
+
+ if (expr.shorthand) {
+ if (expr.value.type === "AssignmentPattern") {
+ return this.AssignmentPattern(expr.value, Precedence.Sequence, E_TTT);
+ }
+ return this.generatePropertyKey(expr.key, expr.computed);
+ }
+
+ if (expr.method) {
+ return [
+ generateMethodPrefix(expr),
+ this.generatePropertyKey(expr.key, expr.computed),
+ this.generateFunctionBody(expr.value)
+ ];
+ }
+
+ return [
+ this.generatePropertyKey(expr.key, expr.computed),
+ ':' + space,
+ this.generateExpression(expr.value, Precedence.Assignment, E_TTT)
+ ];
+ },
+
+ ObjectExpression: function (expr, precedence, flags) {
+ var multiline, result, fragment, that = this;
+
+ if (!expr.properties.length) {
+ return '{}';
+ }
+ multiline = expr.properties.length > 1;
+
+ withIndent(function () {
+ fragment = that.generateExpression(expr.properties[0], Precedence.Sequence, E_TTT);
+ });
+
+ if (!multiline) {
+ // issues 4
+ // Do not transform from
+ // dejavu.Class.declare({
+ // method2: function () {}
+ // });
+ // to
+ // dejavu.Class.declare({method2: function () {
+ // }});
+ if (!hasLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {
+ return [ '{', space, fragment, space, '}' ];
+ }
+ }
+
+ withIndent(function (indent) {
+ var i, iz;
+ result = [ '{', newline, indent, fragment ];
+
+ if (multiline) {
+ result.push(',' + newline);
+ for (i = 1, iz = expr.properties.length; i < iz; ++i) {
+ result.push(indent);
+ result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + newline);
+ }
+ }
+ }
+ });
+
+ if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(base);
+ result.push('}');
+ return result;
+ },
+
+ AssignmentPattern: function(expr, precedence, flags) {
+ return this.generateAssignment(expr.left, expr.right, '=', precedence, flags);
+ },
+
+ ObjectPattern: function (expr, precedence, flags) {
+ var result, i, iz, multiline, property, that = this;
+ if (!expr.properties.length) {
+ return '{}';
+ }
+
+ multiline = false;
+ if (expr.properties.length === 1) {
+ property = expr.properties[0];
+ if (property.value.type !== Syntax.Identifier) {
+ multiline = true;
+ }
+ } else {
+ for (i = 0, iz = expr.properties.length; i < iz; ++i) {
+ property = expr.properties[i];
+ if (!property.shorthand) {
+ multiline = true;
+ break;
+ }
+ }
+ }
+ result = ['{', multiline ? newline : '' ];
+
+ withIndent(function (indent) {
+ var i, iz;
+ for (i = 0, iz = expr.properties.length; i < iz; ++i) {
+ result.push(multiline ? indent : '');
+ result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));
+ if (i + 1 < iz) {
+ result.push(',' + (multiline ? newline : space));
+ }
+ }
+ });
+
+ if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {
+ result.push(newline);
+ }
+ result.push(multiline ? base : '');
+ result.push('}');
+ return result;
+ },
+
+ ThisExpression: function (expr, precedence, flags) {
+ return 'this';
+ },
+
+ Super: function (expr, precedence, flags) {
+ return 'super';
+ },
+
+ Identifier: function (expr, precedence, flags) {
+ return generateIdentifier(expr);
+ },
+
+ ImportDefaultSpecifier: function (expr, precedence, flags) {
+ return generateIdentifier(expr.id || expr.local);
+ },
+
+ ImportNamespaceSpecifier: function (expr, precedence, flags) {
+ var result = ['*'];
+ var id = expr.id || expr.local;
+ if (id) {
+ result.push(space + 'as' + noEmptySpace() + generateIdentifier(id));
+ }
+ return result;
+ },
+
+ ImportSpecifier: function (expr, precedence, flags) {
+ var imported = expr.imported;
+ var result = [ imported.name ];
+ var local = expr.local;
+ if (local && local.name !== imported.name) {
+ result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(local));
+ }
+ return result;
+ },
+
+ ExportSpecifier: function (expr, precedence, flags) {
+ var local = expr.local;
+ var result = [ local.name ];
+ var exported = expr.exported;
+ if (exported && exported.name !== local.name) {
+ result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(exported));
+ }
+ return result;
+ },
+
+ Literal: function (expr, precedence, flags) {
+ var raw;
+ if (expr.hasOwnProperty('raw') && parse && extra.raw) {
+ try {
+ raw = parse(expr.raw).body[0].expression;
+ if (raw.type === Syntax.Literal) {
+ if (raw.value === expr.value) {
+ return expr.raw;
+ }
+ }
+ } catch (e) {
+ // not use raw property
+ }
+ }
+
+ if (expr.regex) {
+ return '/' + expr.regex.pattern + '/' + expr.regex.flags;
+ }
+
+ if (expr.value === null) {
+ return 'null';
+ }
+
+ if (typeof expr.value === 'string') {
+ return escapeString(expr.value);
+ }
+
+ if (typeof expr.value === 'number') {
+ return generateNumber(expr.value);
+ }
+
+ if (typeof expr.value === 'boolean') {
+ return expr.value ? 'true' : 'false';
+ }
+
+ return generateRegExp(expr.value);
+ },
+
+ GeneratorExpression: function (expr, precedence, flags) {
+ return this.ComprehensionExpression(expr, precedence, flags);
+ },
+
+ ComprehensionExpression: function (expr, precedence, flags) {
+ // GeneratorExpression should be parenthesized with (...), ComprehensionExpression with [...]
+ // Due to https://bugzilla.mozilla.org/show_bug.cgi?id=883468 position of expr.body can differ in Spidermonkey and ES6
+
+ var result, i, iz, fragment, that = this;
+ result = (expr.type === Syntax.GeneratorExpression) ? ['('] : ['['];
+
+ if (extra.moz.comprehensionExpressionStartsWithAssignment) {
+ fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
+ result.push(fragment);
+ }
+
+ if (expr.blocks) {
+ withIndent(function () {
+ for (i = 0, iz = expr.blocks.length; i < iz; ++i) {
+ fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT);
+ if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) {
+ result = join(result, fragment);
+ } else {
+ result.push(fragment);
+ }
+ }
+ });
+ }
+
+ if (expr.filter) {
+ result = join(result, 'if' + space);
+ fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT);
+ result = join(result, [ '(', fragment, ')' ]);
+ }
+
+ if (!extra.moz.comprehensionExpressionStartsWithAssignment) {
+ fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
+
+ result = join(result, fragment);
+ }
+
+ result.push((expr.type === Syntax.GeneratorExpression) ? ')' : ']');
+ return result;
+ },
+
+ ComprehensionBlock: function (expr, precedence, flags) {
+ var fragment;
+ if (expr.left.type === Syntax.VariableDeclaration) {
+ fragment = [
+ expr.left.kind, noEmptySpace(),
+ this.generateStatement(expr.left.declarations[0], S_FFFF)
+ ];
+ } else {
+ fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT);
+ }
+
+ fragment = join(fragment, expr.of ? 'of' : 'in');
+ fragment = join(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT));
+
+ return [ 'for' + space + '(', fragment, ')' ];
+ },
+
+ SpreadElement: function (expr, precedence, flags) {
+ return [
+ '...',
+ this.generateExpression(expr.argument, Precedence.Assignment, E_TTT)
+ ];
+ },
+
+ TaggedTemplateExpression: function (expr, precedence, flags) {
+ var itemFlags = E_TTF;
+ if (!(flags & F_ALLOW_CALL)) {
+ itemFlags = E_TFF;
+ }
+ var result = [
+ this.generateExpression(expr.tag, Precedence.Call, itemFlags),
+ this.generateExpression(expr.quasi, Precedence.Primary, E_FFT)
+ ];
+ return parenthesize(result, Precedence.TaggedTemplate, precedence);
+ },
+
+ TemplateElement: function (expr, precedence, flags) {
+ // Don't use "cooked". Since tagged template can use raw template
+ // representation. So if we do so, it breaks the script semantics.
+ return expr.value.raw;
+ },
+
+ TemplateLiteral: function (expr, precedence, flags) {
+ var result, i, iz;
+ result = [ '`' ];
+ for (i = 0, iz = expr.quasis.length; i < iz; ++i) {
+ result.push(this.generateExpression(expr.quasis[i], Precedence.Primary, E_TTT));
+ if (i + 1 < iz) {
+ result.push('${' + space);
+ result.push(this.generateExpression(expr.expressions[i], Precedence.Sequence, E_TTT));
+ result.push(space + '}');
+ }
+ }
+ result.push('`');
+ return result;
+ },
+
+ ModuleSpecifier: function (expr, precedence, flags) {
+ return this.Literal(expr, precedence, flags);
+ },
+
+ ImportExpression: function(expr, precedence, flag) {
+ return parenthesize([
+ 'import(',
+ this.generateExpression(expr.source, Precedence.Assignment, E_TTT),
+ ')'
+ ], Precedence.Call, precedence);
+ },
+
+ };
+
+ merge(CodeGenerator.prototype, CodeGenerator.Expression);
+
+ CodeGenerator.prototype.generateExpression = function (expr, precedence, flags) {
+ var result, type;
+
+ type = expr.type || Syntax.Property;
+
+ if (extra.verbatim && expr.hasOwnProperty(extra.verbatim)) {
+ return generateVerbatim(expr, precedence);
+ }
+
+ result = this[type](expr, precedence, flags);
+
+
+ if (extra.comment) {
+ result = addComments(expr, result);
+ }
+ return toSourceNodeWhenNeeded(result, expr);
+ };
+
+ CodeGenerator.prototype.generateStatement = function (stmt, flags) {
+ var result,
+ fragment;
+
+ result = this[stmt.type](stmt, flags);
+
+ // Attach comments
+
+ if (extra.comment) {
+ result = addComments(stmt, result);
+ }
+
+ fragment = toSourceNodeWhenNeeded(result).toString();
+ if (stmt.type === Syntax.Program && !safeConcatenation && newline === '' && fragment.charAt(fragment.length - 1) === '\n') {
+ result = sourceMap$1 ? toSourceNodeWhenNeeded(result).replaceRight(/\s+$/, '') : fragment.replace(/\s+$/, '');
+ }
+
+ return toSourceNodeWhenNeeded(result, stmt);
+ };
+
+ function generateInternal(node) {
+ var codegen;
+
+ codegen = new CodeGenerator();
+ if (isStatement(node)) {
+ return codegen.generateStatement(node, S_TFFF);
+ }
+
+ if (isExpression(node)) {
+ return codegen.generateExpression(node, Precedence.Sequence, E_TTT);
+ }
+
+ throw new Error('Unknown node type: ' + node.type);
+ }
+
+ function generate(node, options) {
+ var defaultOptions = getDefaultOptions(), result, pair;
+
+ if (options != null) {
+ // Obsolete options
+ //
+ // `options.indent`
+ // `options.base`
+ //
+ // Instead of them, we can use `option.format.indent`.
+ if (typeof options.indent === 'string') {
+ defaultOptions.format.indent.style = options.indent;
+ }
+ if (typeof options.base === 'number') {
+ defaultOptions.format.indent.base = options.base;
+ }
+ options = updateDeeply(defaultOptions, options);
+ indent = options.format.indent.style;
+ if (typeof options.base === 'string') {
+ base = options.base;
+ } else {
+ base = stringRepeat(indent, options.format.indent.base);
+ }
+ } else {
+ options = defaultOptions;
+ indent = options.format.indent.style;
+ base = stringRepeat(indent, options.format.indent.base);
+ }
+ json = options.format.json;
+ renumber = options.format.renumber;
+ hexadecimal = json ? false : options.format.hexadecimal;
+ quotes = json ? 'double' : options.format.quotes;
+ escapeless = options.format.escapeless;
+ newline = options.format.newline;
+ space = options.format.space;
+ if (options.format.compact) {
+ newline = space = indent = base = '';
+ }
+ parentheses = options.format.parentheses;
+ semicolons = options.format.semicolons;
+ safeConcatenation = options.format.safeConcatenation;
+ directive = options.directive;
+ parse = json ? null : options.parse;
+ sourceMap$1 = options.sourceMap;
+ sourceCode = options.sourceCode;
+ preserveBlankLines = options.format.preserveBlankLines && sourceCode !== null;
+ extra = options;
+
+ if (sourceMap$1) {
+ if (!exports.browser) {
+ // We assume environment is node.js
+ // And prevent from including source-map by browserify
+ SourceNode = sourceMap.SourceNode;
+ } else {
+ SourceNode = commonjsGlobal.sourceMap.SourceNode;
+ }
+ }
+
+ result = generateInternal(node);
+
+ if (!sourceMap$1) {
+ pair = {code: result.toString(), map: null};
+ return options.sourceMapWithCode ? pair : pair.code;
+ }
+
+
+ pair = result.toStringWithSourceMap({
+ file: options.file,
+ sourceRoot: options.sourceMapRoot
+ });
+
+ if (options.sourceContent) {
+ pair.map.setSourceContent(options.sourceMap,
+ options.sourceContent);
+ }
+
+ if (options.sourceMapWithCode) {
+ return pair;
+ }
+
+ return pair.map.toString();
+ }
+
+ FORMAT_MINIFY = {
+ indent: {
+ style: '',
+ base: 0
+ },
+ renumber: true,
+ hexadecimal: true,
+ quotes: 'auto',
+ escapeless: true,
+ compact: true,
+ parentheses: false,
+ semicolons: false
+ };
+
+ FORMAT_DEFAULTS = getDefaultOptions().format;
+
+ exports.version = require$$3.version;
+ exports.generate = generate;
+ exports.attachComments = estraverse$1.attachComments;
+ exports.Precedence = updateDeeply({}, Precedence);
+ exports.browser = false;
+ exports.FORMAT_MINIFY = FORMAT_MINIFY;
+ exports.FORMAT_DEFAULTS = FORMAT_DEFAULTS;
+ }());
+ /* vim: set sw=4 ts=4 et tw=80 : */
+ });
+
+ var esprima = createCommonjsModule(function (module, exports) {
+ (function webpackUniversalModuleDefinition(root, factory) {
+ /* istanbul ignore next */
+ if('object' === 'object' && 'object' === 'object')
+ module.exports = factory();
+ else if(typeof undefined === 'function' && undefined.amd)
+ undefined([], factory);
+ /* istanbul ignore next */
+ else if('object' === 'object')
+ exports["esprima"] = factory();
+ else
+ root["esprima"] = factory();
+ })(commonjsGlobal, function() {
+ return /******/ (function(modules) { // webpackBootstrap
+ /******/ // The module cache
+ /******/ var installedModules = {};
+
+ /******/ // The require function
+ /******/ function __webpack_require__(moduleId) {
+
+ /******/ // Check if module is in cache
+ /* istanbul ignore if */
+ /******/ if(installedModules[moduleId])
+ /******/ return installedModules[moduleId].exports;
+
+ /******/ // Create a new module (and put it into the cache)
+ /******/ var module = installedModules[moduleId] = {
+ /******/ exports: {},
+ /******/ id: moduleId,
+ /******/ loaded: false
+ /******/ };
+
+ /******/ // Execute the module function
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+ /******/ // Flag the module as loaded
+ /******/ module.loaded = true;
+
+ /******/ // Return the exports of the module
+ /******/ return module.exports;
+ /******/ }
+
+
+ /******/ // expose the modules object (__webpack_modules__)
+ /******/ __webpack_require__.m = modules;
+
+ /******/ // expose the module cache
+ /******/ __webpack_require__.c = installedModules;
+
+ /******/ // __webpack_public_path__
+ /******/ __webpack_require__.p = "";
+
+ /******/ // Load entry module and return exports
+ /******/ return __webpack_require__(0);
+ /******/ })
+ /************************************************************************/
+ /******/ ([
+ /* 0 */
+ /***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ /*
+ Copyright JS Foundation and other contributors, https://js.foundation/
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var comment_handler_1 = __webpack_require__(1);
+ var jsx_parser_1 = __webpack_require__(3);
+ var parser_1 = __webpack_require__(8);
+ var tokenizer_1 = __webpack_require__(15);
+ function parse(code, options, delegate) {
+ var commentHandler = null;
+ var proxyDelegate = function (node, metadata) {
+ if (delegate) {
+ delegate(node, metadata);
+ }
+ if (commentHandler) {
+ commentHandler.visit(node, metadata);
+ }
+ };
+ var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null;
+ var collectComment = false;
+ if (options) {
+ collectComment = (typeof options.comment === 'boolean' && options.comment);
+ var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment);
+ if (collectComment || attachComment) {
+ commentHandler = new comment_handler_1.CommentHandler();
+ commentHandler.attach = attachComment;
+ options.comment = true;
+ parserDelegate = proxyDelegate;
+ }
+ }
+ var isModule = false;
+ if (options && typeof options.sourceType === 'string') {
+ isModule = (options.sourceType === 'module');
+ }
+ var parser;
+ if (options && typeof options.jsx === 'boolean' && options.jsx) {
+ parser = new jsx_parser_1.JSXParser(code, options, parserDelegate);
+ }
+ else {
+ parser = new parser_1.Parser(code, options, parserDelegate);
+ }
+ var program = isModule ? parser.parseModule() : parser.parseScript();
+ var ast = program;
+ if (collectComment && commentHandler) {
+ ast.comments = commentHandler.comments;
+ }
+ if (parser.config.tokens) {
+ ast.tokens = parser.tokens;
+ }
+ if (parser.config.tolerant) {
+ ast.errors = parser.errorHandler.errors;
+ }
+ return ast;
+ }
+ exports.parse = parse;
+ function parseModule(code, options, delegate) {
+ var parsingOptions = options || {};
+ parsingOptions.sourceType = 'module';
+ return parse(code, parsingOptions, delegate);
+ }
+ exports.parseModule = parseModule;
+ function parseScript(code, options, delegate) {
+ var parsingOptions = options || {};
+ parsingOptions.sourceType = 'script';
+ return parse(code, parsingOptions, delegate);
+ }
+ exports.parseScript = parseScript;
+ function tokenize(code, options, delegate) {
+ var tokenizer = new tokenizer_1.Tokenizer(code, options);
+ var tokens;
+ tokens = [];
+ try {
+ while (true) {
+ var token = tokenizer.getNextToken();
+ if (!token) {
+ break;
+ }
+ if (delegate) {
+ token = delegate(token);
+ }
+ tokens.push(token);
+ }
+ }
+ catch (e) {
+ tokenizer.errorHandler.tolerate(e);
+ }
+ if (tokenizer.errorHandler.tolerant) {
+ tokens.errors = tokenizer.errors();
+ }
+ return tokens;
+ }
+ exports.tokenize = tokenize;
+ var syntax_1 = __webpack_require__(2);
+ exports.Syntax = syntax_1.Syntax;
+ // Sync with *.json manifests.
+ exports.version = '4.0.1';
+
+
+ /***/ },
+ /* 1 */
+ /***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var syntax_1 = __webpack_require__(2);
+ var CommentHandler = (function () {
+ function CommentHandler() {
+ this.attach = false;
+ this.comments = [];
+ this.stack = [];
+ this.leading = [];
+ this.trailing = [];
+ }
+ CommentHandler.prototype.insertInnerComments = function (node, metadata) {
+ // innnerComments for properties empty block
+ // `function a() {/** comments **\/}`
+ if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) {
+ var innerComments = [];
+ for (var i = this.leading.length - 1; i >= 0; --i) {
+ var entry = this.leading[i];
+ if (metadata.end.offset >= entry.start) {
+ innerComments.unshift(entry.comment);
+ this.leading.splice(i, 1);
+ this.trailing.splice(i, 1);
+ }
+ }
+ if (innerComments.length) {
+ node.innerComments = innerComments;
+ }
+ }
+ };
+ CommentHandler.prototype.findTrailingComments = function (metadata) {
+ var trailingComments = [];
+ if (this.trailing.length > 0) {
+ for (var i = this.trailing.length - 1; i >= 0; --i) {
+ var entry_1 = this.trailing[i];
+ if (entry_1.start >= metadata.end.offset) {
+ trailingComments.unshift(entry_1.comment);
+ }
+ }
+ this.trailing.length = 0;
+ return trailingComments;
+ }
+ var entry = this.stack[this.stack.length - 1];
+ if (entry && entry.node.trailingComments) {
+ var firstComment = entry.node.trailingComments[0];
+ if (firstComment && firstComment.range[0] >= metadata.end.offset) {
+ trailingComments = entry.node.trailingComments;
+ delete entry.node.trailingComments;
+ }
+ }
+ return trailingComments;
+ };
+ CommentHandler.prototype.findLeadingComments = function (metadata) {
+ var leadingComments = [];
+ var target;
+ while (this.stack.length > 0) {
+ var entry = this.stack[this.stack.length - 1];
+ if (entry && entry.start >= metadata.start.offset) {
+ target = entry.node;
+ this.stack.pop();
+ }
+ else {
+ break;
+ }
+ }
+ if (target) {
+ var count = target.leadingComments ? target.leadingComments.length : 0;
+ for (var i = count - 1; i >= 0; --i) {
+ var comment = target.leadingComments[i];
+ if (comment.range[1] <= metadata.start.offset) {
+ leadingComments.unshift(comment);
+ target.leadingComments.splice(i, 1);
+ }
+ }
+ if (target.leadingComments && target.leadingComments.length === 0) {
+ delete target.leadingComments;
+ }
+ return leadingComments;
+ }
+ for (var i = this.leading.length - 1; i >= 0; --i) {
+ var entry = this.leading[i];
+ if (entry.start <= metadata.start.offset) {
+ leadingComments.unshift(entry.comment);
+ this.leading.splice(i, 1);
+ }
+ }
+ return leadingComments;
+ };
+ CommentHandler.prototype.visitNode = function (node, metadata) {
+ if (node.type === syntax_1.Syntax.Program && node.body.length > 0) {
+ return;
+ }
+ this.insertInnerComments(node, metadata);
+ var trailingComments = this.findTrailingComments(metadata);
+ var leadingComments = this.findLeadingComments(metadata);
+ if (leadingComments.length > 0) {
+ node.leadingComments = leadingComments;
+ }
+ if (trailingComments.length > 0) {
+ node.trailingComments = trailingComments;
+ }
+ this.stack.push({
+ node: node,
+ start: metadata.start.offset
+ });
+ };
+ CommentHandler.prototype.visitComment = function (node, metadata) {
+ var type = (node.type[0] === 'L') ? 'Line' : 'Block';
+ var comment = {
+ type: type,
+ value: node.value
+ };
+ if (node.range) {
+ comment.range = node.range;
+ }
+ if (node.loc) {
+ comment.loc = node.loc;
+ }
+ this.comments.push(comment);
+ if (this.attach) {
+ var entry = {
+ comment: {
+ type: type,
+ value: node.value,
+ range: [metadata.start.offset, metadata.end.offset]
+ },
+ start: metadata.start.offset
+ };
+ if (node.loc) {
+ entry.comment.loc = node.loc;
+ }
+ node.type = type;
+ this.leading.push(entry);
+ this.trailing.push(entry);
+ }
+ };
+ CommentHandler.prototype.visit = function (node, metadata) {
+ if (node.type === 'LineComment') {
+ this.visitComment(node, metadata);
+ }
+ else if (node.type === 'BlockComment') {
+ this.visitComment(node, metadata);
+ }
+ else if (this.attach) {
+ this.visitNode(node, metadata);
+ }
+ };
+ return CommentHandler;
+ }());
+ exports.CommentHandler = CommentHandler;
+
+
+ /***/ },
+ /* 2 */
+ /***/ function(module, exports) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.Syntax = {
+ AssignmentExpression: 'AssignmentExpression',
+ AssignmentPattern: 'AssignmentPattern',
+ ArrayExpression: 'ArrayExpression',
+ ArrayPattern: 'ArrayPattern',
+ ArrowFunctionExpression: 'ArrowFunctionExpression',
+ AwaitExpression: 'AwaitExpression',
+ BlockStatement: 'BlockStatement',
+ BinaryExpression: 'BinaryExpression',
+ BreakStatement: 'BreakStatement',
+ CallExpression: 'CallExpression',
+ CatchClause: 'CatchClause',
+ ClassBody: 'ClassBody',
+ ClassDeclaration: 'ClassDeclaration',
+ ClassExpression: 'ClassExpression',
+ ConditionalExpression: 'ConditionalExpression',
+ ContinueStatement: 'ContinueStatement',
+ DoWhileStatement: 'DoWhileStatement',
+ DebuggerStatement: 'DebuggerStatement',
+ EmptyStatement: 'EmptyStatement',
+ ExportAllDeclaration: 'ExportAllDeclaration',
+ ExportDefaultDeclaration: 'ExportDefaultDeclaration',
+ ExportNamedDeclaration: 'ExportNamedDeclaration',
+ ExportSpecifier: 'ExportSpecifier',
+ ExpressionStatement: 'ExpressionStatement',
+ ForStatement: 'ForStatement',
+ ForOfStatement: 'ForOfStatement',
+ ForInStatement: 'ForInStatement',
+ FunctionDeclaration: 'FunctionDeclaration',
+ FunctionExpression: 'FunctionExpression',
+ Identifier: 'Identifier',
+ IfStatement: 'IfStatement',
+ ImportDeclaration: 'ImportDeclaration',
+ ImportDefaultSpecifier: 'ImportDefaultSpecifier',
+ ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
+ ImportSpecifier: 'ImportSpecifier',
+ Literal: 'Literal',
+ LabeledStatement: 'LabeledStatement',
+ LogicalExpression: 'LogicalExpression',
+ MemberExpression: 'MemberExpression',
+ MetaProperty: 'MetaProperty',
+ MethodDefinition: 'MethodDefinition',
+ NewExpression: 'NewExpression',
+ ObjectExpression: 'ObjectExpression',
+ ObjectPattern: 'ObjectPattern',
+ Program: 'Program',
+ Property: 'Property',
+ RestElement: 'RestElement',
+ ReturnStatement: 'ReturnStatement',
+ SequenceExpression: 'SequenceExpression',
+ SpreadElement: 'SpreadElement',
+ Super: 'Super',
+ SwitchCase: 'SwitchCase',
+ SwitchStatement: 'SwitchStatement',
+ TaggedTemplateExpression: 'TaggedTemplateExpression',
+ TemplateElement: 'TemplateElement',
+ TemplateLiteral: 'TemplateLiteral',
+ ThisExpression: 'ThisExpression',
+ ThrowStatement: 'ThrowStatement',
+ TryStatement: 'TryStatement',
+ UnaryExpression: 'UnaryExpression',
+ UpdateExpression: 'UpdateExpression',
+ VariableDeclaration: 'VariableDeclaration',
+ VariableDeclarator: 'VariableDeclarator',
+ WhileStatement: 'WhileStatement',
+ WithStatement: 'WithStatement',
+ YieldExpression: 'YieldExpression'
+ };
+
+
+ /***/ },
+ /* 3 */
+ /***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ /* istanbul ignore next */
+ var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+ })();
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var character_1 = __webpack_require__(4);
+ var JSXNode = __webpack_require__(5);
+ var jsx_syntax_1 = __webpack_require__(6);
+ var Node = __webpack_require__(7);
+ var parser_1 = __webpack_require__(8);
+ var token_1 = __webpack_require__(13);
+ var xhtml_entities_1 = __webpack_require__(14);
+ token_1.TokenName[100 /* Identifier */] = 'JSXIdentifier';
+ token_1.TokenName[101 /* Text */] = 'JSXText';
+ // Fully qualified element name, e.g. returns "svg:path"
+ function getQualifiedElementName(elementName) {
+ var qualifiedName;
+ switch (elementName.type) {
+ case jsx_syntax_1.JSXSyntax.JSXIdentifier:
+ var id = elementName;
+ qualifiedName = id.name;
+ break;
+ case jsx_syntax_1.JSXSyntax.JSXNamespacedName:
+ var ns = elementName;
+ qualifiedName = getQualifiedElementName(ns.namespace) + ':' +
+ getQualifiedElementName(ns.name);
+ break;
+ case jsx_syntax_1.JSXSyntax.JSXMemberExpression:
+ var expr = elementName;
+ qualifiedName = getQualifiedElementName(expr.object) + '.' +
+ getQualifiedElementName(expr.property);
+ break;
+ /* istanbul ignore next */
+ default:
+ break;
+ }
+ return qualifiedName;
+ }
+ var JSXParser = (function (_super) {
+ __extends(JSXParser, _super);
+ function JSXParser(code, options, delegate) {
+ return _super.call(this, code, options, delegate) || this;
+ }
+ JSXParser.prototype.parsePrimaryExpression = function () {
+ return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this);
+ };
+ JSXParser.prototype.startJSX = function () {
+ // Unwind the scanner before the lookahead token.
+ this.scanner.index = this.startMarker.index;
+ this.scanner.lineNumber = this.startMarker.line;
+ this.scanner.lineStart = this.startMarker.index - this.startMarker.column;
+ };
+ JSXParser.prototype.finishJSX = function () {
+ // Prime the next lookahead.
+ this.nextToken();
+ };
+ JSXParser.prototype.reenterJSX = function () {
+ this.startJSX();
+ this.expectJSX('}');
+ // Pop the closing '}' added from the lookahead.
+ if (this.config.tokens) {
+ this.tokens.pop();
+ }
+ };
+ JSXParser.prototype.createJSXNode = function () {
+ this.collectComments();
+ return {
+ index: this.scanner.index,
+ line: this.scanner.lineNumber,
+ column: this.scanner.index - this.scanner.lineStart
+ };
+ };
+ JSXParser.prototype.createJSXChildNode = function () {
+ return {
+ index: this.scanner.index,
+ line: this.scanner.lineNumber,
+ column: this.scanner.index - this.scanner.lineStart
+ };
+ };
+ JSXParser.prototype.scanXHTMLEntity = function (quote) {
+ var result = '&';
+ var valid = true;
+ var terminated = false;
+ var numeric = false;
+ var hex = false;
+ while (!this.scanner.eof() && valid && !terminated) {
+ var ch = this.scanner.source[this.scanner.index];
+ if (ch === quote) {
+ break;
+ }
+ terminated = (ch === ';');
+ result += ch;
+ ++this.scanner.index;
+ if (!terminated) {
+ switch (result.length) {
+ case 2:
+ // e.g. '{'
+ numeric = (ch === '#');
+ break;
+ case 3:
+ if (numeric) {
+ // e.g. 'A'
+ hex = (ch === 'x');
+ valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0));
+ numeric = numeric && !hex;
+ }
+ break;
+ default:
+ valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0)));
+ valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0)));
+ break;
+ }
+ }
+ }
+ if (valid && terminated && result.length > 2) {
+ // e.g. 'A' becomes just '#x41'
+ var str = result.substr(1, result.length - 2);
+ if (numeric && str.length > 1) {
+ result = String.fromCharCode(parseInt(str.substr(1), 10));
+ }
+ else if (hex && str.length > 2) {
+ result = String.fromCharCode(parseInt('0' + str.substr(1), 16));
+ }
+ else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) {
+ result = xhtml_entities_1.XHTMLEntities[str];
+ }
+ }
+ return result;
+ };
+ // Scan the next JSX token. This replaces Scanner#lex when in JSX mode.
+ JSXParser.prototype.lexJSX = function () {
+ var cp = this.scanner.source.charCodeAt(this.scanner.index);
+ // < > / : = { }
+ if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) {
+ var value = this.scanner.source[this.scanner.index++];
+ return {
+ type: 7 /* Punctuator */,
+ value: value,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: this.scanner.index - 1,
+ end: this.scanner.index
+ };
+ }
+ // " '
+ if (cp === 34 || cp === 39) {
+ var start = this.scanner.index;
+ var quote = this.scanner.source[this.scanner.index++];
+ var str = '';
+ while (!this.scanner.eof()) {
+ var ch = this.scanner.source[this.scanner.index++];
+ if (ch === quote) {
+ break;
+ }
+ else if (ch === '&') {
+ str += this.scanXHTMLEntity(quote);
+ }
+ else {
+ str += ch;
+ }
+ }
+ return {
+ type: 8 /* StringLiteral */,
+ value: str,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: start,
+ end: this.scanner.index
+ };
+ }
+ // ... or .
+ if (cp === 46) {
+ var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1);
+ var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2);
+ var value = (n1 === 46 && n2 === 46) ? '...' : '.';
+ var start = this.scanner.index;
+ this.scanner.index += value.length;
+ return {
+ type: 7 /* Punctuator */,
+ value: value,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: start,
+ end: this.scanner.index
+ };
+ }
+ // `
+ if (cp === 96) {
+ // Only placeholder, since it will be rescanned as a real assignment expression.
+ return {
+ type: 10 /* Template */,
+ value: '',
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: this.scanner.index,
+ end: this.scanner.index
+ };
+ }
+ // Identifer can not contain backslash (char code 92).
+ if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) {
+ var start = this.scanner.index;
+ ++this.scanner.index;
+ while (!this.scanner.eof()) {
+ var ch = this.scanner.source.charCodeAt(this.scanner.index);
+ if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) {
+ ++this.scanner.index;
+ }
+ else if (ch === 45) {
+ // Hyphen (char code 45) can be part of an identifier.
+ ++this.scanner.index;
+ }
+ else {
+ break;
+ }
+ }
+ var id = this.scanner.source.slice(start, this.scanner.index);
+ return {
+ type: 100 /* Identifier */,
+ value: id,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: start,
+ end: this.scanner.index
+ };
+ }
+ return this.scanner.lex();
+ };
+ JSXParser.prototype.nextJSXToken = function () {
+ this.collectComments();
+ this.startMarker.index = this.scanner.index;
+ this.startMarker.line = this.scanner.lineNumber;
+ this.startMarker.column = this.scanner.index - this.scanner.lineStart;
+ var token = this.lexJSX();
+ this.lastMarker.index = this.scanner.index;
+ this.lastMarker.line = this.scanner.lineNumber;
+ this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
+ if (this.config.tokens) {
+ this.tokens.push(this.convertToken(token));
+ }
+ return token;
+ };
+ JSXParser.prototype.nextJSXText = function () {
+ this.startMarker.index = this.scanner.index;
+ this.startMarker.line = this.scanner.lineNumber;
+ this.startMarker.column = this.scanner.index - this.scanner.lineStart;
+ var start = this.scanner.index;
+ var text = '';
+ while (!this.scanner.eof()) {
+ var ch = this.scanner.source[this.scanner.index];
+ if (ch === '{' || ch === '<') {
+ break;
+ }
+ ++this.scanner.index;
+ text += ch;
+ if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
+ ++this.scanner.lineNumber;
+ if (ch === '\r' && this.scanner.source[this.scanner.index] === '\n') {
+ ++this.scanner.index;
+ }
+ this.scanner.lineStart = this.scanner.index;
+ }
+ }
+ this.lastMarker.index = this.scanner.index;
+ this.lastMarker.line = this.scanner.lineNumber;
+ this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
+ var token = {
+ type: 101 /* Text */,
+ value: text,
+ lineNumber: this.scanner.lineNumber,
+ lineStart: this.scanner.lineStart,
+ start: start,
+ end: this.scanner.index
+ };
+ if ((text.length > 0) && this.config.tokens) {
+ this.tokens.push(this.convertToken(token));
+ }
+ return token;
+ };
+ JSXParser.prototype.peekJSXToken = function () {
+ var state = this.scanner.saveState();
+ this.scanner.scanComments();
+ var next = this.lexJSX();
+ this.scanner.restoreState(state);
+ return next;
+ };
+ // Expect the next JSX token to match the specified punctuator.
+ // If not, an exception will be thrown.
+ JSXParser.prototype.expectJSX = function (value) {
+ var token = this.nextJSXToken();
+ if (token.type !== 7 /* Punctuator */ || token.value !== value) {
+ this.throwUnexpectedToken(token);
+ }
+ };
+ // Return true if the next JSX token matches the specified punctuator.
+ JSXParser.prototype.matchJSX = function (value) {
+ var next = this.peekJSXToken();
+ return next.type === 7 /* Punctuator */ && next.value === value;
+ };
+ JSXParser.prototype.parseJSXIdentifier = function () {
+ var node = this.createJSXNode();
+ var token = this.nextJSXToken();
+ if (token.type !== 100 /* Identifier */) {
+ this.throwUnexpectedToken(token);
+ }
+ return this.finalize(node, new JSXNode.JSXIdentifier(token.value));
+ };
+ JSXParser.prototype.parseJSXElementName = function () {
+ var node = this.createJSXNode();
+ var elementName = this.parseJSXIdentifier();
+ if (this.matchJSX(':')) {
+ var namespace = elementName;
+ this.expectJSX(':');
+ var name_1 = this.parseJSXIdentifier();
+ elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1));
+ }
+ else if (this.matchJSX('.')) {
+ while (this.matchJSX('.')) {
+ var object = elementName;
+ this.expectJSX('.');
+ var property = this.parseJSXIdentifier();
+ elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property));
+ }
+ }
+ return elementName;
+ };
+ JSXParser.prototype.parseJSXAttributeName = function () {
+ var node = this.createJSXNode();
+ var attributeName;
+ var identifier = this.parseJSXIdentifier();
+ if (this.matchJSX(':')) {
+ var namespace = identifier;
+ this.expectJSX(':');
+ var name_2 = this.parseJSXIdentifier();
+ attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2));
+ }
+ else {
+ attributeName = identifier;
+ }
+ return attributeName;
+ };
+ JSXParser.prototype.parseJSXStringLiteralAttribute = function () {
+ var node = this.createJSXNode();
+ var token = this.nextJSXToken();
+ if (token.type !== 8 /* StringLiteral */) {
+ this.throwUnexpectedToken(token);
+ }
+ var raw = this.getTokenRaw(token);
+ return this.finalize(node, new Node.Literal(token.value, raw));
+ };
+ JSXParser.prototype.parseJSXExpressionAttribute = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('{');
+ this.finishJSX();
+ if (this.match('}')) {
+ this.tolerateError('JSX attributes must only be assigned a non-empty expression');
+ }
+ var expression = this.parseAssignmentExpression();
+ this.reenterJSX();
+ return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
+ };
+ JSXParser.prototype.parseJSXAttributeValue = function () {
+ return this.matchJSX('{') ? this.parseJSXExpressionAttribute() :
+ this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute();
+ };
+ JSXParser.prototype.parseJSXNameValueAttribute = function () {
+ var node = this.createJSXNode();
+ var name = this.parseJSXAttributeName();
+ var value = null;
+ if (this.matchJSX('=')) {
+ this.expectJSX('=');
+ value = this.parseJSXAttributeValue();
+ }
+ return this.finalize(node, new JSXNode.JSXAttribute(name, value));
+ };
+ JSXParser.prototype.parseJSXSpreadAttribute = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('{');
+ this.expectJSX('...');
+ this.finishJSX();
+ var argument = this.parseAssignmentExpression();
+ this.reenterJSX();
+ return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument));
+ };
+ JSXParser.prototype.parseJSXAttributes = function () {
+ var attributes = [];
+ while (!this.matchJSX('/') && !this.matchJSX('>')) {
+ var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() :
+ this.parseJSXNameValueAttribute();
+ attributes.push(attribute);
+ }
+ return attributes;
+ };
+ JSXParser.prototype.parseJSXOpeningElement = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('<');
+ var name = this.parseJSXElementName();
+ var attributes = this.parseJSXAttributes();
+ var selfClosing = this.matchJSX('/');
+ if (selfClosing) {
+ this.expectJSX('/');
+ }
+ this.expectJSX('>');
+ return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
+ };
+ JSXParser.prototype.parseJSXBoundaryElement = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('<');
+ if (this.matchJSX('/')) {
+ this.expectJSX('/');
+ var name_3 = this.parseJSXElementName();
+ this.expectJSX('>');
+ return this.finalize(node, new JSXNode.JSXClosingElement(name_3));
+ }
+ var name = this.parseJSXElementName();
+ var attributes = this.parseJSXAttributes();
+ var selfClosing = this.matchJSX('/');
+ if (selfClosing) {
+ this.expectJSX('/');
+ }
+ this.expectJSX('>');
+ return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
+ };
+ JSXParser.prototype.parseJSXEmptyExpression = function () {
+ var node = this.createJSXChildNode();
+ this.collectComments();
+ this.lastMarker.index = this.scanner.index;
+ this.lastMarker.line = this.scanner.lineNumber;
+ this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
+ return this.finalize(node, new JSXNode.JSXEmptyExpression());
+ };
+ JSXParser.prototype.parseJSXExpressionContainer = function () {
+ var node = this.createJSXNode();
+ this.expectJSX('{');
+ var expression;
+ if (this.matchJSX('}')) {
+ expression = this.parseJSXEmptyExpression();
+ this.expectJSX('}');
+ }
+ else {
+ this.finishJSX();
+ expression = this.parseAssignmentExpression();
+ this.reenterJSX();
+ }
+ return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
+ };
+ JSXParser.prototype.parseJSXChildren = function () {
+ var children = [];
+ while (!this.scanner.eof()) {
+ var node = this.createJSXChildNode();
+ var token = this.nextJSXText();
+ if (token.start < token.end) {
+ var raw = this.getTokenRaw(token);
+ var child = this.finalize(node, new JSXNode.JSXText(token.value, raw));
+ children.push(child);
+ }
+ if (this.scanner.source[this.scanner.index] === '{') {
+ var container = this.parseJSXExpressionContainer();
+ children.push(container);
+ }
+ else {
+ break;
+ }
+ }
+ return children;
+ };
+ JSXParser.prototype.parseComplexJSXElement = function (el) {
+ var stack = [];
+ while (!this.scanner.eof()) {
+ el.children = el.children.concat(this.parseJSXChildren());
+ var node = this.createJSXChildNode();
+ var element = this.parseJSXBoundaryElement();
+ if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) {
+ var opening = element;
+ if (opening.selfClosing) {
+ var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null));
+ el.children.push(child);
+ }
+ else {
+ stack.push(el);
+ el = { node: node, opening: opening, closing: null, children: [] };
+ }
+ }
+ if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) {
+ el.closing = element;
+ var open_1 = getQualifiedElementName(el.opening.name);
+ var close_1 = getQualifiedElementName(el.closing.name);
+ if (open_1 !== close_1) {
+ this.tolerateError('Expected corresponding JSX closing tag for %0', open_1);
+ }
+ if (stack.length > 0) {
+ var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing));
+ el = stack[stack.length - 1];
+ el.children.push(child);
+ stack.pop();
+ }
+ else {
+ break;
+ }
+ }
+ }
+ return el;
+ };
+ JSXParser.prototype.parseJSXElement = function () {
+ var node = this.createJSXNode();
+ var opening = this.parseJSXOpeningElement();
+ var children = [];
+ var closing = null;
+ if (!opening.selfClosing) {
+ var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children });
+ children = el.children;
+ closing = el.closing;
+ }
+ return this.finalize(node, new JSXNode.JSXElement(opening, children, closing));
+ };
+ JSXParser.prototype.parseJSXRoot = function () {
+ // Pop the opening '<' added from the lookahead.
+ if (this.config.tokens) {
+ this.tokens.pop();
+ }
+ this.startJSX();
+ var element = this.parseJSXElement();
+ this.finishJSX();
+ return element;
+ };
+ JSXParser.prototype.isStartOfExpression = function () {
+ return _super.prototype.isStartOfExpression.call(this) || this.match('<');
+ };
+ return JSXParser;
+ }(parser_1.Parser));
+ exports.JSXParser = JSXParser;
+
+
+ /***/ },
+ /* 4 */
+ /***/ function(module, exports) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // See also tools/generate-unicode-regex.js.
+ var Regex = {
+ // Unicode v8.0.0 NonAsciiIdentifierStart:
+ NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
+ // Unicode v8.0.0 NonAsciiIdentifierPart:
+ NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
+ };
+ exports.Character = {
+ /* tslint:disable:no-bitwise */
+ fromCodePoint: function (cp) {
+ return (cp < 0x10000) ? String.fromCharCode(cp) :
+ String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) +
+ String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023));
+ },
+ // https://tc39.github.io/ecma262/#sec-white-space
+ isWhiteSpace: function (cp) {
+ return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) ||
+ (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0);
+ },
+ // https://tc39.github.io/ecma262/#sec-line-terminators
+ isLineTerminator: function (cp) {
+ return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029);
+ },
+ // https://tc39.github.io/ecma262/#sec-names-and-keywords
+ isIdentifierStart: function (cp) {
+ return (cp === 0x24) || (cp === 0x5F) ||
+ (cp >= 0x41 && cp <= 0x5A) ||
+ (cp >= 0x61 && cp <= 0x7A) ||
+ (cp === 0x5C) ||
+ ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp)));
+ },
+ isIdentifierPart: function (cp) {
+ return (cp === 0x24) || (cp === 0x5F) ||
+ (cp >= 0x41 && cp <= 0x5A) ||
+ (cp >= 0x61 && cp <= 0x7A) ||
+ (cp >= 0x30 && cp <= 0x39) ||
+ (cp === 0x5C) ||
+ ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp)));
+ },
+ // https://tc39.github.io/ecma262/#sec-literals-numeric-literals
+ isDecimalDigit: function (cp) {
+ return (cp >= 0x30 && cp <= 0x39); // 0..9
+ },
+ isHexDigit: function (cp) {
+ return (cp >= 0x30 && cp <= 0x39) ||
+ (cp >= 0x41 && cp <= 0x46) ||
+ (cp >= 0x61 && cp <= 0x66); // a..f
+ },
+ isOctalDigit: function (cp) {
+ return (cp >= 0x30 && cp <= 0x37); // 0..7
+ }
+ };
+
+
+ /***/ },
+ /* 5 */
+ /***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var jsx_syntax_1 = __webpack_require__(6);
+ /* tslint:disable:max-classes-per-file */
+ var JSXClosingElement = (function () {
+ function JSXClosingElement(name) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement;
+ this.name = name;
+ }
+ return JSXClosingElement;
+ }());
+ exports.JSXClosingElement = JSXClosingElement;
+ var JSXElement = (function () {
+ function JSXElement(openingElement, children, closingElement) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXElement;
+ this.openingElement = openingElement;
+ this.children = children;
+ this.closingElement = closingElement;
+ }
+ return JSXElement;
+ }());
+ exports.JSXElement = JSXElement;
+ var JSXEmptyExpression = (function () {
+ function JSXEmptyExpression() {
+ this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression;
+ }
+ return JSXEmptyExpression;
+ }());
+ exports.JSXEmptyExpression = JSXEmptyExpression;
+ var JSXExpressionContainer = (function () {
+ function JSXExpressionContainer(expression) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer;
+ this.expression = expression;
+ }
+ return JSXExpressionContainer;
+ }());
+ exports.JSXExpressionContainer = JSXExpressionContainer;
+ var JSXIdentifier = (function () {
+ function JSXIdentifier(name) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier;
+ this.name = name;
+ }
+ return JSXIdentifier;
+ }());
+ exports.JSXIdentifier = JSXIdentifier;
+ var JSXMemberExpression = (function () {
+ function JSXMemberExpression(object, property) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression;
+ this.object = object;
+ this.property = property;
+ }
+ return JSXMemberExpression;
+ }());
+ exports.JSXMemberExpression = JSXMemberExpression;
+ var JSXAttribute = (function () {
+ function JSXAttribute(name, value) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXAttribute;
+ this.name = name;
+ this.value = value;
+ }
+ return JSXAttribute;
+ }());
+ exports.JSXAttribute = JSXAttribute;
+ var JSXNamespacedName = (function () {
+ function JSXNamespacedName(namespace, name) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName;
+ this.namespace = namespace;
+ this.name = name;
+ }
+ return JSXNamespacedName;
+ }());
+ exports.JSXNamespacedName = JSXNamespacedName;
+ var JSXOpeningElement = (function () {
+ function JSXOpeningElement(name, selfClosing, attributes) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement;
+ this.name = name;
+ this.selfClosing = selfClosing;
+ this.attributes = attributes;
+ }
+ return JSXOpeningElement;
+ }());
+ exports.JSXOpeningElement = JSXOpeningElement;
+ var JSXSpreadAttribute = (function () {
+ function JSXSpreadAttribute(argument) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute;
+ this.argument = argument;
+ }
+ return JSXSpreadAttribute;
+ }());
+ exports.JSXSpreadAttribute = JSXSpreadAttribute;
+ var JSXText = (function () {
+ function JSXText(value, raw) {
+ this.type = jsx_syntax_1.JSXSyntax.JSXText;
+ this.value = value;
+ this.raw = raw;
+ }
+ return JSXText;
+ }());
+ exports.JSXText = JSXText;
+
+
+ /***/ },
+ /* 6 */
+ /***/ function(module, exports) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.JSXSyntax = {
+ JSXAttribute: 'JSXAttribute',
+ JSXClosingElement: 'JSXClosingElement',
+ JSXElement: 'JSXElement',
+ JSXEmptyExpression: 'JSXEmptyExpression',
+ JSXExpressionContainer: 'JSXExpressionContainer',
+ JSXIdentifier: 'JSXIdentifier',
+ JSXMemberExpression: 'JSXMemberExpression',
+ JSXNamespacedName: 'JSXNamespacedName',
+ JSXOpeningElement: 'JSXOpeningElement',
+ JSXSpreadAttribute: 'JSXSpreadAttribute',
+ JSXText: 'JSXText'
+ };
+
+
+ /***/ },
+ /* 7 */
+ /***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var syntax_1 = __webpack_require__(2);
+ /* tslint:disable:max-classes-per-file */
+ var ArrayExpression = (function () {
+ function ArrayExpression(elements) {
+ this.type = syntax_1.Syntax.ArrayExpression;
+ this.elements = elements;
+ }
+ return ArrayExpression;
+ }());
+ exports.ArrayExpression = ArrayExpression;
+ var ArrayPattern = (function () {
+ function ArrayPattern(elements) {
+ this.type = syntax_1.Syntax.ArrayPattern;
+ this.elements = elements;
+ }
+ return ArrayPattern;
+ }());
+ exports.ArrayPattern = ArrayPattern;
+ var ArrowFunctionExpression = (function () {
+ function ArrowFunctionExpression(params, body, expression) {
+ this.type = syntax_1.Syntax.ArrowFunctionExpression;
+ this.id = null;
+ this.params = params;
+ this.body = body;
+ this.generator = false;
+ this.expression = expression;
+ this.async = false;
+ }
+ return ArrowFunctionExpression;
+ }());
+ exports.ArrowFunctionExpression = ArrowFunctionExpression;
+ var AssignmentExpression = (function () {
+ function AssignmentExpression(operator, left, right) {
+ this.type = syntax_1.Syntax.AssignmentExpression;
+ this.operator = operator;
+ this.left = left;
+ this.right = right;
+ }
+ return AssignmentExpression;
+ }());
+ exports.AssignmentExpression = AssignmentExpression;
+ var AssignmentPattern = (function () {
+ function AssignmentPattern(left, right) {
+ this.type = syntax_1.Syntax.AssignmentPattern;
+ this.left = left;
+ this.right = right;
+ }
+ return AssignmentPattern;
+ }());
+ exports.AssignmentPattern = AssignmentPattern;
+ var AsyncArrowFunctionExpression = (function () {
+ function AsyncArrowFunctionExpression(params, body, expression) {
+ this.type = syntax_1.Syntax.ArrowFunctionExpression;
+ this.id = null;
+ this.params = params;
+ this.body = body;
+ this.generator = false;
+ this.expression = expression;
+ this.async = true;
+ }
+ return AsyncArrowFunctionExpression;
+ }());
+ exports.AsyncArrowFunctionExpression = AsyncArrowFunctionExpression;
+ var AsyncFunctionDeclaration = (function () {
+ function AsyncFunctionDeclaration(id, params, body) {
+ this.type = syntax_1.Syntax.FunctionDeclaration;
+ this.id = id;
+ this.params = params;
+ this.body = body;
+ this.generator = false;
+ this.expression = false;
+ this.async = true;
+ }
+ return AsyncFunctionDeclaration;
+ }());
+ exports.AsyncFunctionDeclaration = AsyncFunctionDeclaration;
+ var AsyncFunctionExpression = (function () {
+ function AsyncFunctionExpression(id, params, body) {
+ this.type = syntax_1.Syntax.FunctionExpression;
+ this.id = id;
+ this.params = params;
+ this.body = body;
+ this.generator = false;
+ this.expression = false;
+ this.async = true;
+ }
+ return AsyncFunctionExpression;
+ }());
+ exports.AsyncFunctionExpression = AsyncFunctionExpression;
+ var AwaitExpression = (function () {
+ function AwaitExpression(argument) {
+ this.type = syntax_1.Syntax.AwaitExpression;
+ this.argument = argument;
+ }
+ return AwaitExpression;
+ }());
+ exports.AwaitExpression = AwaitExpression;
+ var BinaryExpression = (function () {
+ function BinaryExpression(operator, left, right) {
+ var logical = (operator === '||' || operator === '&&');
+ this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression;
+ this.operator = operator;
+ this.left = left;
+ this.right = right;
+ }
+ return BinaryExpression;
+ }());
+ exports.BinaryExpression = BinaryExpression;
+ var BlockStatement = (function () {
+ function BlockStatement(body) {
+ this.type = syntax_1.Syntax.BlockStatement;
+ this.body = body;
+ }
+ return BlockStatement;
+ }());
+ exports.BlockStatement = BlockStatement;
+ var BreakStatement = (function () {
+ function BreakStatement(label) {
+ this.type = syntax_1.Syntax.BreakStatement;
+ this.label = label;
+ }
+ return BreakStatement;
+ }());
+ exports.BreakStatement = BreakStatement;
+ var CallExpression = (function () {
+ function CallExpression(callee, args) {
+ this.type = syntax_1.Syntax.CallExpression;
+ this.callee = callee;
+ this.arguments = args;
+ }
+ return CallExpression;
+ }());
+ exports.CallExpression = CallExpression;
+ var CatchClause = (function () {
+ function CatchClause(param, body) {
+ this.type = syntax_1.Syntax.CatchClause;
+ this.param = param;
+ this.body = body;
+ }
+ return CatchClause;
+ }());
+ exports.CatchClause = CatchClause;
+ var ClassBody = (function () {
+ function ClassBody(body) {
+ this.type = syntax_1.Syntax.ClassBody;
+ this.body = body;
+ }
+ return ClassBody;
+ }());
+ exports.ClassBody = ClassBody;
+ var ClassDeclaration = (function () {
+ function ClassDeclaration(id, superClass, body) {
+ this.type = syntax_1.Syntax.ClassDeclaration;
+ this.id = id;
+ this.superClass = superClass;
+ this.body = body;
+ }
+ return ClassDeclaration;
+ }());
+ exports.ClassDeclaration = ClassDeclaration;
+ var ClassExpression = (function () {
+ function ClassExpression(id, superClass, body) {
+ this.type = syntax_1.Syntax.ClassExpression;
+ this.id = id;
+ this.superClass = superClass;
+ this.body = body;
+ }
+ return ClassExpression;
+ }());
+ exports.ClassExpression = ClassExpression;
+ var ComputedMemberExpression = (function () {
+ function ComputedMemberExpression(object, property) {
+ this.type = syntax_1.Syntax.MemberExpression;
+ this.computed = true;
+ this.object = object;
+ this.property = property;
+ }
+ return ComputedMemberExpression;
+ }());
+ exports.ComputedMemberExpression = ComputedMemberExpression;
+ var ConditionalExpression = (function () {
+ function ConditionalExpression(test, consequent, alternate) {
+ this.type = syntax_1.Syntax.ConditionalExpression;
+ this.test = test;
+ this.consequent = consequent;
+ this.alternate = alternate;
+ }
+ return ConditionalExpression;
+ }());
+ exports.ConditionalExpression = ConditionalExpression;
+ var ContinueStatement = (function () {
+ function ContinueStatement(label) {
+ this.type = syntax_1.Syntax.ContinueStatement;
+ this.label = label;
+ }
+ return ContinueStatement;
+ }());
+ exports.ContinueStatement = ContinueStatement;
+ var DebuggerStatement = (function () {
+ function DebuggerStatement() {
+ this.type = syntax_1.Syntax.DebuggerStatement;
+ }
+ return DebuggerStatement;
+ }());
+ exports.DebuggerStatement = DebuggerStatement;
+ var Directive = (function () {
+ function Directive(expression, directive) {
+ this.type = syntax_1.Syntax.ExpressionStatement;
+ this.expression = expression;
+ this.directive = directive;
+ }
+ return Directive;
+ }());
+ exports.Directive = Directive;
+ var DoWhileStatement = (function () {
+ function DoWhileStatement(body, test) {
+ this.type = syntax_1.Syntax.DoWhileStatement;
+ this.body = body;
+ this.test = test;
+ }
+ return DoWhileStatement;
+ }());
+ exports.DoWhileStatement = DoWhileStatement;
+ var EmptyStatement = (function () {
+ function EmptyStatement() {
+ this.type = syntax_1.Syntax.EmptyStatement;
+ }
+ return EmptyStatement;
+ }());
+ exports.EmptyStatement = EmptyStatement;
+ var ExportAllDeclaration = (function () {
+ function ExportAllDeclaration(source) {
+ this.type = syntax_1.Syntax.ExportAllDeclaration;
+ this.source = source;
+ }
+ return ExportAllDeclaration;
+ }());
+ exports.ExportAllDeclaration = ExportAllDeclaration;
+ var ExportDefaultDeclaration = (function () {
+ function ExportDefaultDeclaration(declaration) {
+ this.type = syntax_1.Syntax.ExportDefaultDeclaration;
+ this.declaration = declaration;
+ }
+ return ExportDefaultDeclaration;
+ }());
+ exports.ExportDefaultDeclaration = ExportDefaultDeclaration;
+ var ExportNamedDeclaration = (function () {
+ function ExportNamedDeclaration(declaration, specifiers, source) {
+ this.type = syntax_1.Syntax.ExportNamedDeclaration;
+ this.declaration = declaration;
+ this.specifiers = specifiers;
+ this.source = source;
+ }
+ return ExportNamedDeclaration;
+ }());
+ exports.ExportNamedDeclaration = ExportNamedDeclaration;
+ var ExportSpecifier = (function () {
+ function ExportSpecifier(local, exported) {
+ this.type = syntax_1.Syntax.ExportSpecifier;
+ this.exported = exported;
+ this.local = local;
+ }
+ return ExportSpecifier;
+ }());
+ exports.ExportSpecifier = ExportSpecifier;
+ var ExpressionStatement = (function () {
+ function ExpressionStatement(expression) {
+ this.type = syntax_1.Syntax.ExpressionStatement;
+ this.expression = expression;
+ }
+ return ExpressionStatement;
+ }());
+ exports.ExpressionStatement = ExpressionStatement;
+ var ForInStatement = (function () {
+ function ForInStatement(left, right, body) {
+ this.type = syntax_1.Syntax.ForInStatement;
+ this.left = left;
+ this.right = right;
+ this.body = body;
+ this.each = false;
+ }
+ return ForInStatement;
+ }());
+ exports.ForInStatement = ForInStatement;
+ var ForOfStatement = (function () {
+ function ForOfStatement(left, right, body) {
+ this.type = syntax_1.Syntax.ForOfStatement;
+ this.left = left;
+ this.right = right;
+ this.body = body;
+ }
+ return ForOfStatement;
+ }());
+ exports.ForOfStatement = ForOfStatement;
+ var ForStatement = (function () {
+ function ForStatement(init, test, update, body) {
+ this.type = syntax_1.Syntax.ForStatement;
+ this.init = init;
+ this.test = test;
+ this.update = update;
+ this.body = body;
+ }
+ return ForStatement;
+ }());
+ exports.ForStatement = ForStatement;
+ var FunctionDeclaration = (function () {
+ function FunctionDeclaration(id, params, body, generator) {
+ this.type = syntax_1.Syntax.FunctionDeclaration;
+ this.id = id;
+ this.params = params;
+ this.body = body;
+ this.generator = generator;
+ this.expression = false;
+ this.async = false;
+ }
+ return FunctionDeclaration;
+ }());
+ exports.FunctionDeclaration = FunctionDeclaration;
+ var FunctionExpression = (function () {
+ function FunctionExpression(id, params, body, generator) {
+ this.type = syntax_1.Syntax.FunctionExpression;
+ this.id = id;
+ this.params = params;
+ this.body = body;
+ this.generator = generator;
+ this.expression = false;
+ this.async = false;
+ }
+ return FunctionExpression;
+ }());
+ exports.FunctionExpression = FunctionExpression;
+ var Identifier = (function () {
+ function Identifier(name) {
+ this.type = syntax_1.Syntax.Identifier;
+ this.name = name;
+ }
+ return Identifier;
+ }());
+ exports.Identifier = Identifier;
+ var IfStatement = (function () {
+ function IfStatement(test, consequent, alternate) {
+ this.type = syntax_1.Syntax.IfStatement;
+ this.test = test;
+ this.consequent = consequent;
+ this.alternate = alternate;
+ }
+ return IfStatement;
+ }());
+ exports.IfStatement = IfStatement;
+ var ImportDeclaration = (function () {
+ function ImportDeclaration(specifiers, source) {
+ this.type = syntax_1.Syntax.ImportDeclaration;
+ this.specifiers = specifiers;
+ this.source = source;
+ }
+ return ImportDeclaration;
+ }());
+ exports.ImportDeclaration = ImportDeclaration;
+ var ImportDefaultSpecifier = (function () {
+ function ImportDefaultSpecifier(local) {
+ this.type = syntax_1.Syntax.ImportDefaultSpecifier;
+ this.local = local;
+ }
+ return ImportDefaultSpecifier;
+ }());
+ exports.ImportDefaultSpecifier = ImportDefaultSpecifier;
+ var ImportNamespaceSpecifier = (function () {
+ function ImportNamespaceSpecifier(local) {
+ this.type = syntax_1.Syntax.ImportNamespaceSpecifier;
+ this.local = local;
+ }
+ return ImportNamespaceSpecifier;
+ }());
+ exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier;
+ var ImportSpecifier = (function () {
+ function ImportSpecifier(local, imported) {
+ this.type = syntax_1.Syntax.ImportSpecifier;
+ this.local = local;
+ this.imported = imported;
+ }
+ return ImportSpecifier;
+ }());
+ exports.ImportSpecifier = ImportSpecifier;
+ var LabeledStatement = (function () {
+ function LabeledStatement(label, body) {
+ this.type = syntax_1.Syntax.LabeledStatement;
+ this.label = label;
+ this.body = body;
+ }
+ return LabeledStatement;
+ }());
+ exports.LabeledStatement = LabeledStatement;
+ var Literal = (function () {
+ function Literal(value, raw) {
+ this.type = syntax_1.Syntax.Literal;
+ this.value = value;
+ this.raw = raw;
+ }
+ return Literal;
+ }());
+ exports.Literal = Literal;
+ var MetaProperty = (function () {
+ function MetaProperty(meta, property) {
+ this.type = syntax_1.Syntax.MetaProperty;
+ this.meta = meta;
+ this.property = property;
+ }
+ return MetaProperty;
+ }());
+ exports.MetaProperty = MetaProperty;
+ var MethodDefinition = (function () {
+ function MethodDefinition(key, computed, value, kind, isStatic) {
+ this.type = syntax_1.Syntax.MethodDefinition;
+ this.key = key;
+ this.computed = computed;
+ this.value = value;
+ this.kind = kind;
+ this.static = isStatic;
+ }
+ return MethodDefinition;
+ }());
+ exports.MethodDefinition = MethodDefinition;
+ var Module = (function () {
+ function Module(body) {
+ this.type = syntax_1.Syntax.Program;
+ this.body = body;
+ this.sourceType = 'module';
+ }
+ return Module;
+ }());
+ exports.Module = Module;
+ var NewExpression = (function () {
+ function NewExpression(callee, args) {
+ this.type = syntax_1.Syntax.NewExpression;
+ this.callee = callee;
+ this.arguments = args;
+ }
+ return NewExpression;
+ }());
+ exports.NewExpression = NewExpression;
+ var ObjectExpression = (function () {
+ function ObjectExpression(properties) {
+ this.type = syntax_1.Syntax.ObjectExpression;
+ this.properties = properties;
+ }
+ return ObjectExpression;
+ }());
+ exports.ObjectExpression = ObjectExpression;
+ var ObjectPattern = (function () {
+ function ObjectPattern(properties) {
+ this.type = syntax_1.Syntax.ObjectPattern;
+ this.properties = properties;
+ }
+ return ObjectPattern;
+ }());
+ exports.ObjectPattern = ObjectPattern;
+ var Property = (function () {
+ function Property(kind, key, computed, value, method, shorthand) {
+ this.type = syntax_1.Syntax.Property;
+ this.key = key;
+ this.computed = computed;
+ this.value = value;
+ this.kind = kind;
+ this.method = method;
+ this.shorthand = shorthand;
+ }
+ return Property;
+ }());
+ exports.Property = Property;
+ var RegexLiteral = (function () {
+ function RegexLiteral(value, raw, pattern, flags) {
+ this.type = syntax_1.Syntax.Literal;
+ this.value = value;
+ this.raw = raw;
+ this.regex = { pattern: pattern, flags: flags };
+ }
+ return RegexLiteral;
+ }());
+ exports.RegexLiteral = RegexLiteral;
+ var RestElement = (function () {
+ function RestElement(argument) {
+ this.type = syntax_1.Syntax.RestElement;
+ this.argument = argument;
+ }
+ return RestElement;
+ }());
+ exports.RestElement = RestElement;
+ var ReturnStatement = (function () {
+ function ReturnStatement(argument) {
+ this.type = syntax_1.Syntax.ReturnStatement;
+ this.argument = argument;
+ }
+ return ReturnStatement;
+ }());
+ exports.ReturnStatement = ReturnStatement;
+ var Script = (function () {
+ function Script(body) {
+ this.type = syntax_1.Syntax.Program;
+ this.body = body;
+ this.sourceType = 'script';
+ }
+ return Script;
+ }());
+ exports.Script = Script;
+ var SequenceExpression = (function () {
+ function SequenceExpression(expressions) {
+ this.type = syntax_1.Syntax.SequenceExpression;
+ this.expressions = expressions;
+ }
+ return SequenceExpression;
+ }());
+ exports.SequenceExpression = SequenceExpression;
+ var SpreadElement = (function () {
+ function SpreadElement(argument) {
+ this.type = syntax_1.Syntax.SpreadElement;
+ this.argument = argument;
+ }
+ return SpreadElement;
+ }());
+ exports.SpreadElement = SpreadElement;
+ var StaticMemberExpression = (function () {
+ function StaticMemberExpression(object, property) {
+ this.type = syntax_1.Syntax.MemberExpression;
+ this.computed = false;
+ this.object = object;
+ this.property = property;
+ }
+ return StaticMemberExpression;
+ }());
+ exports.StaticMemberExpression = StaticMemberExpression;
+ var Super = (function () {
+ function Super() {
+ this.type = syntax_1.Syntax.Super;
+ }
+ return Super;
+ }());
+ exports.Super = Super;
+ var SwitchCase = (function () {
+ function SwitchCase(test, consequent) {
+ this.type = syntax_1.Syntax.SwitchCase;
+ this.test = test;
+ this.consequent = consequent;
+ }
+ return SwitchCase;
+ }());
+ exports.SwitchCase = SwitchCase;
+ var SwitchStatement = (function () {
+ function SwitchStatement(discriminant, cases) {
+ this.type = syntax_1.Syntax.SwitchStatement;
+ this.discriminant = discriminant;
+ this.cases = cases;
+ }
+ return SwitchStatement;
+ }());
+ exports.SwitchStatement = SwitchStatement;
+ var TaggedTemplateExpression = (function () {
+ function TaggedTemplateExpression(tag, quasi) {
+ this.type = syntax_1.Syntax.TaggedTemplateExpression;
+ this.tag = tag;
+ this.quasi = quasi;
+ }
+ return TaggedTemplateExpression;
+ }());
+ exports.TaggedTemplateExpression = TaggedTemplateExpression;
+ var TemplateElement = (function () {
+ function TemplateElement(value, tail) {
+ this.type = syntax_1.Syntax.TemplateElement;
+ this.value = value;
+ this.tail = tail;
+ }
+ return TemplateElement;
+ }());
+ exports.TemplateElement = TemplateElement;
+ var TemplateLiteral = (function () {
+ function TemplateLiteral(quasis, expressions) {
+ this.type = syntax_1.Syntax.TemplateLiteral;
+ this.quasis = quasis;
+ this.expressions = expressions;
+ }
+ return TemplateLiteral;
+ }());
+ exports.TemplateLiteral = TemplateLiteral;
+ var ThisExpression = (function () {
+ function ThisExpression() {
+ this.type = syntax_1.Syntax.ThisExpression;
+ }
+ return ThisExpression;
+ }());
+ exports.ThisExpression = ThisExpression;
+ var ThrowStatement = (function () {
+ function ThrowStatement(argument) {
+ this.type = syntax_1.Syntax.ThrowStatement;
+ this.argument = argument;
+ }
+ return ThrowStatement;
+ }());
+ exports.ThrowStatement = ThrowStatement;
+ var TryStatement = (function () {
+ function TryStatement(block, handler, finalizer) {
+ this.type = syntax_1.Syntax.TryStatement;
+ this.block = block;
+ this.handler = handler;
+ this.finalizer = finalizer;
+ }
+ return TryStatement;
+ }());
+ exports.TryStatement = TryStatement;
+ var UnaryExpression = (function () {
+ function UnaryExpression(operator, argument) {
+ this.type = syntax_1.Syntax.UnaryExpression;
+ this.operator = operator;
+ this.argument = argument;
+ this.prefix = true;
+ }
+ return UnaryExpression;
+ }());
+ exports.UnaryExpression = UnaryExpression;
+ var UpdateExpression = (function () {
+ function UpdateExpression(operator, argument, prefix) {
+ this.type = syntax_1.Syntax.UpdateExpression;
+ this.operator = operator;
+ this.argument = argument;
+ this.prefix = prefix;
+ }
+ return UpdateExpression;
+ }());
+ exports.UpdateExpression = UpdateExpression;
+ var VariableDeclaration = (function () {
+ function VariableDeclaration(declarations, kind) {
+ this.type = syntax_1.Syntax.VariableDeclaration;
+ this.declarations = declarations;
+ this.kind = kind;
+ }
+ return VariableDeclaration;
+ }());
+ exports.VariableDeclaration = VariableDeclaration;
+ var VariableDeclarator = (function () {
+ function VariableDeclarator(id, init) {
+ this.type = syntax_1.Syntax.VariableDeclarator;
+ this.id = id;
+ this.init = init;
+ }
+ return VariableDeclarator;
+ }());
+ exports.VariableDeclarator = VariableDeclarator;
+ var WhileStatement = (function () {
+ function WhileStatement(test, body) {
+ this.type = syntax_1.Syntax.WhileStatement;
+ this.test = test;
+ this.body = body;
+ }
+ return WhileStatement;
+ }());
+ exports.WhileStatement = WhileStatement;
+ var WithStatement = (function () {
+ function WithStatement(object, body) {
+ this.type = syntax_1.Syntax.WithStatement;
+ this.object = object;
+ this.body = body;
+ }
+ return WithStatement;
+ }());
+ exports.WithStatement = WithStatement;
+ var YieldExpression = (function () {
+ function YieldExpression(argument, delegate) {
+ this.type = syntax_1.Syntax.YieldExpression;
+ this.argument = argument;
+ this.delegate = delegate;
+ }
+ return YieldExpression;
+ }());
+ exports.YieldExpression = YieldExpression;
+
+
+ /***/ },
+ /* 8 */
+ /***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var assert_1 = __webpack_require__(9);
+ var error_handler_1 = __webpack_require__(10);
+ var messages_1 = __webpack_require__(11);
+ var Node = __webpack_require__(7);
+ var scanner_1 = __webpack_require__(12);
+ var syntax_1 = __webpack_require__(2);
+ var token_1 = __webpack_require__(13);
+ var ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder';
+ var Parser = (function () {
+ function Parser(code, options, delegate) {
+ if (options === void 0) { options = {}; }
+ this.config = {
+ range: (typeof options.range === 'boolean') && options.range,
+ loc: (typeof options.loc === 'boolean') && options.loc,
+ source: null,
+ tokens: (typeof options.tokens === 'boolean') && options.tokens,
+ comment: (typeof options.comment === 'boolean') && options.comment,
+ tolerant: (typeof options.tolerant === 'boolean') && options.tolerant
+ };
+ if (this.config.loc && options.source && options.source !== null) {
+ this.config.source = String(options.source);
+ }
+ this.delegate = delegate;
+ this.errorHandler = new error_handler_1.ErrorHandler();
+ this.errorHandler.tolerant = this.config.tolerant;
+ this.scanner = new scanner_1.Scanner(code, this.errorHandler);
+ this.scanner.trackComment = this.config.comment;
+ this.operatorPrecedence = {
+ ')': 0,
+ ';': 0,
+ ',': 0,
+ '=': 0,
+ ']': 0,
+ '||': 1,
+ '&&': 2,
+ '|': 3,
+ '^': 4,
+ '&': 5,
+ '==': 6,
+ '!=': 6,
+ '===': 6,
+ '!==': 6,
+ '<': 7,
+ '>': 7,
+ '<=': 7,
+ '>=': 7,
+ '<<': 8,
+ '>>': 8,
+ '>>>': 8,
+ '+': 9,
+ '-': 9,
+ '*': 11,
+ '/': 11,
+ '%': 11
+ };
+ this.lookahead = {
+ type: 2 /* EOF */,
+ value: '',
+ lineNumber: this.scanner.lineNumber,
+ lineStart: 0,
+ start: 0,
+ end: 0
+ };
+ this.hasLineTerminator = false;
+ this.context = {
+ isModule: false,
+ await: false,
+ allowIn: true,
+ allowStrictDirective: true,
+ allowYield: true,
+ firstCoverInitializedNameError: null,
+ isAssignmentTarget: false,
+ isBindingElement: false,
+ inFunctionBody: false,
+ inIteration: false,
+ inSwitch: false,
+ labelSet: {},
+ strict: false
+ };
+ this.tokens = [];
+ this.startMarker = {
+ index: 0,
+ line: this.scanner.lineNumber,
+ column: 0
+ };
+ this.lastMarker = {
+ index: 0,
+ line: this.scanner.lineNumber,
+ column: 0
+ };
+ this.nextToken();
+ this.lastMarker = {
+ index: this.scanner.index,
+ line: this.scanner.lineNumber,
+ column: this.scanner.index - this.scanner.lineStart
+ };
+ }
+ Parser.prototype.throwError = function (messageFormat) {
+ var values = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ values[_i - 1] = arguments[_i];
+ }
+ var args = Array.prototype.slice.call(arguments, 1);
+ var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
+ assert_1.assert(idx < args.length, 'Message reference must be in range');
+ return args[idx];
+ });
+ var index = this.lastMarker.index;
+ var line = this.lastMarker.line;
+ var column = this.lastMarker.column + 1;
+ throw this.errorHandler.createError(index, line, column, msg);
+ };
+ Parser.prototype.tolerateError = function (messageFormat) {
+ var values = [];
+ for (var _i = 1; _i < arguments.length; _i++) {
+ values[_i - 1] = arguments[_i];
+ }
+ var args = Array.prototype.slice.call(arguments, 1);
+ var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
+ assert_1.assert(idx < args.length, 'Message reference must be in range');
+ return args[idx];
+ });
+ var index = this.lastMarker.index;
+ var line = this.scanner.lineNumber;
+ var column = this.lastMarker.column + 1;
+ this.errorHandler.tolerateError(index, line, column, msg);
+ };
+ // Throw an exception because of the token.
+ Parser.prototype.unexpectedTokenError = function (token, message) {
+ var msg = message || messages_1.Messages.UnexpectedToken;
+ var value;
+ if (token) {
+ if (!message) {
+ msg = (token.type === 2 /* EOF */) ? messages_1.Messages.UnexpectedEOS :
+ (token.type === 3 /* Identifier */) ? messages_1.Messages.UnexpectedIdentifier :
+ (token.type === 6 /* NumericLiteral */) ? messages_1.Messages.UnexpectedNumber :
+ (token.type === 8 /* StringLiteral */) ? messages_1.Messages.UnexpectedString :
+ (token.type === 10 /* Template */) ? messages_1.Messages.UnexpectedTemplate :
+ messages_1.Messages.UnexpectedToken;
+ if (token.type === 4 /* Keyword */) {
+ if (this.scanner.isFutureReservedWord(token.value)) {
+ msg = messages_1.Messages.UnexpectedReserved;
+ }
+ else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) {
+ msg = messages_1.Messages.StrictReservedWord;
+ }
+ }
+ }
+ value = token.value;
+ }
+ else {
+ value = 'ILLEGAL';
+ }
+ msg = msg.replace('%0', value);
+ if (token && typeof token.lineNumber === 'number') {
+ var index = token.start;
+ var line = token.lineNumber;
+ var lastMarkerLineStart = this.lastMarker.index - this.lastMarker.column;
+ var column = token.start - lastMarkerLineStart + 1;
+ return this.errorHandler.createError(index, line, column, msg);
+ }
+ else {
+ var index = this.lastMarker.index;
+ var line = this.lastMarker.line;
+ var column = this.lastMarker.column + 1;
+ return this.errorHandler.createError(index, line, column, msg);
+ }
+ };
+ Parser.prototype.throwUnexpectedToken = function (token, message) {
+ throw this.unexpectedTokenError(token, message);
+ };
+ Parser.prototype.tolerateUnexpectedToken = function (token, message) {
+ this.errorHandler.tolerate(this.unexpectedTokenError(token, message));
+ };
+ Parser.prototype.collectComments = function () {
+ if (!this.config.comment) {
+ this.scanner.scanComments();
+ }
+ else {
+ var comments = this.scanner.scanComments();
+ if (comments.length > 0 && this.delegate) {
+ for (var i = 0; i < comments.length; ++i) {
+ var e = comments[i];
+ var node = void 0;
+ node = {
+ type: e.multiLine ? 'BlockComment' : 'LineComment',
+ value: this.scanner.source.slice(e.slice[0], e.slice[1])
+ };
+ if (this.config.range) {
+ node.range = e.range;
+ }
+ if (this.config.loc) {
+ node.loc = e.loc;
+ }
+ var metadata = {
+ start: {
+ line: e.loc.start.line,
+ column: e.loc.start.column,
+ offset: e.range[0]
+ },
+ end: {
+ line: e.loc.end.line,
+ column: e.loc.end.column,
+ offset: e.range[1]
+ }
+ };
+ this.delegate(node, metadata);
+ }
+ }
+ }
+ };
+ // From internal representation to an external structure
+ Parser.prototype.getTokenRaw = function (token) {
+ return this.scanner.source.slice(token.start, token.end);
+ };
+ Parser.prototype.convertToken = function (token) {
+ var t = {
+ type: token_1.TokenName[token.type],
+ value: this.getTokenRaw(token)
+ };
+ if (this.config.range) {
+ t.range = [token.start, token.end];
+ }
+ if (this.config.loc) {
+ t.loc = {
+ start: {
+ line: this.startMarker.line,
+ column: this.startMarker.column
+ },
+ end: {
+ line: this.scanner.lineNumber,
+ column: this.scanner.index - this.scanner.lineStart
+ }
+ };
+ }
+ if (token.type === 9 /* RegularExpression */) {
+ var pattern = token.pattern;
+ var flags = token.flags;
+ t.regex = { pattern: pattern, flags: flags };
+ }
+ return t;
+ };
+ Parser.prototype.nextToken = function () {
+ var token = this.lookahead;
+ this.lastMarker.index = this.scanner.index;
+ this.lastMarker.line = this.scanner.lineNumber;
+ this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
+ this.collectComments();
+ if (this.scanner.index !== this.startMarker.index) {
+ this.startMarker.index = this.scanner.index;
+ this.startMarker.line = this.scanner.lineNumber;
+ this.startMarker.column = this.scanner.index - this.scanner.lineStart;
+ }
+ var next = this.scanner.lex();
+ this.hasLineTerminator = (token.lineNumber !== next.lineNumber);
+ if (next && this.context.strict && next.type === 3 /* Identifier */) {
+ if (this.scanner.isStrictModeReservedWord(next.value)) {
+ next.type = 4 /* Keyword */;
+ }
+ }
+ this.lookahead = next;
+ if (this.config.tokens && next.type !== 2 /* EOF */) {
+ this.tokens.push(this.convertToken(next));
+ }
+ return token;
+ };
+ Parser.prototype.nextRegexToken = function () {
+ this.collectComments();
+ var token = this.scanner.scanRegExp();
+ if (this.config.tokens) {
+ // Pop the previous token, '/' or '/='
+ // This is added from the lookahead token.
+ this.tokens.pop();
+ this.tokens.push(this.convertToken(token));
+ }
+ // Prime the next lookahead.
+ this.lookahead = token;
+ this.nextToken();
+ return token;
+ };
+ Parser.prototype.createNode = function () {
+ return {
+ index: this.startMarker.index,
+ line: this.startMarker.line,
+ column: this.startMarker.column
+ };
+ };
+ Parser.prototype.startNode = function (token, lastLineStart) {
+ if (lastLineStart === void 0) { lastLineStart = 0; }
+ var column = token.start - token.lineStart;
+ var line = token.lineNumber;
+ if (column < 0) {
+ column += lastLineStart;
+ line--;
+ }
+ return {
+ index: token.start,
+ line: line,
+ column: column
+ };
+ };
+ Parser.prototype.finalize = function (marker, node) {
+ if (this.config.range) {
+ node.range = [marker.index, this.lastMarker.index];
+ }
+ if (this.config.loc) {
+ node.loc = {
+ start: {
+ line: marker.line,
+ column: marker.column,
+ },
+ end: {
+ line: this.lastMarker.line,
+ column: this.lastMarker.column
+ }
+ };
+ if (this.config.source) {
+ node.loc.source = this.config.source;
+ }
+ }
+ if (this.delegate) {
+ var metadata = {
+ start: {
+ line: marker.line,
+ column: marker.column,
+ offset: marker.index
+ },
+ end: {
+ line: this.lastMarker.line,
+ column: this.lastMarker.column,
+ offset: this.lastMarker.index
+ }
+ };
+ this.delegate(node, metadata);
+ }
+ return node;
+ };
+ // Expect the next token to match the specified punctuator.
+ // If not, an exception will be thrown.
+ Parser.prototype.expect = function (value) {
+ var token = this.nextToken();
+ if (token.type !== 7 /* Punctuator */ || token.value !== value) {
+ this.throwUnexpectedToken(token);
+ }
+ };
+ // Quietly expect a comma when in tolerant mode, otherwise delegates to expect().
+ Parser.prototype.expectCommaSeparator = function () {
+ if (this.config.tolerant) {
+ var token = this.lookahead;
+ if (token.type === 7 /* Punctuator */ && token.value === ',') {
+ this.nextToken();
+ }
+ else if (token.type === 7 /* Punctuator */ && token.value === ';') {
+ this.nextToken();
+ this.tolerateUnexpectedToken(token);
+ }
+ else {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken);
+ }
+ }
+ else {
+ this.expect(',');
+ }
+ };
+ // Expect the next token to match the specified keyword.
+ // If not, an exception will be thrown.
+ Parser.prototype.expectKeyword = function (keyword) {
+ var token = this.nextToken();
+ if (token.type !== 4 /* Keyword */ || token.value !== keyword) {
+ this.throwUnexpectedToken(token);
+ }
+ };
+ // Return true if the next token matches the specified punctuator.
+ Parser.prototype.match = function (value) {
+ return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value;
+ };
+ // Return true if the next token matches the specified keyword
+ Parser.prototype.matchKeyword = function (keyword) {
+ return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword;
+ };
+ // Return true if the next token matches the specified contextual keyword
+ // (where an identifier is sometimes a keyword depending on the context)
+ Parser.prototype.matchContextualKeyword = function (keyword) {
+ return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword;
+ };
+ // Return true if the next token is an assignment operator
+ Parser.prototype.matchAssign = function () {
+ if (this.lookahead.type !== 7 /* Punctuator */) {
+ return false;
+ }
+ var op = this.lookahead.value;
+ return op === '=' ||
+ op === '*=' ||
+ op === '**=' ||
+ op === '/=' ||
+ op === '%=' ||
+ op === '+=' ||
+ op === '-=' ||
+ op === '<<=' ||
+ op === '>>=' ||
+ op === '>>>=' ||
+ op === '&=' ||
+ op === '^=' ||
+ op === '|=';
+ };
+ // Cover grammar support.
+ //
+ // When an assignment expression position starts with an left parenthesis, the determination of the type
+ // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead)
+ // or the first comma. This situation also defers the determination of all the expressions nested in the pair.
+ //
+ // There are three productions that can be parsed in a parentheses pair that needs to be determined
+ // after the outermost pair is closed. They are:
+ //
+ // 1. AssignmentExpression
+ // 2. BindingElements
+ // 3. AssignmentTargets
+ //
+ // In order to avoid exponential backtracking, we use two flags to denote if the production can be
+ // binding element or assignment target.
+ //
+ // The three productions have the relationship:
+ //
+ // BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression
+ //
+ // with a single exception that CoverInitializedName when used directly in an Expression, generates
+ // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the
+ // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair.
+ //
+ // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not
+ // effect the current flags. This means the production the parser parses is only used as an expression. Therefore
+ // the CoverInitializedName check is conducted.
+ //
+ // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates
+ // the flags outside of the parser. This means the production the parser parses is used as a part of a potential
+ // pattern. The CoverInitializedName check is deferred.
+ Parser.prototype.isolateCoverGrammar = function (parseFunction) {
+ var previousIsBindingElement = this.context.isBindingElement;
+ var previousIsAssignmentTarget = this.context.isAssignmentTarget;
+ var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
+ this.context.isBindingElement = true;
+ this.context.isAssignmentTarget = true;
+ this.context.firstCoverInitializedNameError = null;
+ var result = parseFunction.call(this);
+ if (this.context.firstCoverInitializedNameError !== null) {
+ this.throwUnexpectedToken(this.context.firstCoverInitializedNameError);
+ }
+ this.context.isBindingElement = previousIsBindingElement;
+ this.context.isAssignmentTarget = previousIsAssignmentTarget;
+ this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError;
+ return result;
+ };
+ Parser.prototype.inheritCoverGrammar = function (parseFunction) {
+ var previousIsBindingElement = this.context.isBindingElement;
+ var previousIsAssignmentTarget = this.context.isAssignmentTarget;
+ var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
+ this.context.isBindingElement = true;
+ this.context.isAssignmentTarget = true;
+ this.context.firstCoverInitializedNameError = null;
+ var result = parseFunction.call(this);
+ this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement;
+ this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget;
+ this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError;
+ return result;
+ };
+ Parser.prototype.consumeSemicolon = function () {
+ if (this.match(';')) {
+ this.nextToken();
+ }
+ else if (!this.hasLineTerminator) {
+ if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ this.lastMarker.index = this.startMarker.index;
+ this.lastMarker.line = this.startMarker.line;
+ this.lastMarker.column = this.startMarker.column;
+ }
+ };
+ // https://tc39.github.io/ecma262/#sec-primary-expression
+ Parser.prototype.parsePrimaryExpression = function () {
+ var node = this.createNode();
+ var expr;
+ var token, raw;
+ switch (this.lookahead.type) {
+ case 3 /* Identifier */:
+ if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') {
+ this.tolerateUnexpectedToken(this.lookahead);
+ }
+ expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value));
+ break;
+ case 6 /* NumericLiteral */:
+ case 8 /* StringLiteral */:
+ if (this.context.strict && this.lookahead.octal) {
+ this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral);
+ }
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ token = this.nextToken();
+ raw = this.getTokenRaw(token);
+ expr = this.finalize(node, new Node.Literal(token.value, raw));
+ break;
+ case 1 /* BooleanLiteral */:
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ token = this.nextToken();
+ raw = this.getTokenRaw(token);
+ expr = this.finalize(node, new Node.Literal(token.value === 'true', raw));
+ break;
+ case 5 /* NullLiteral */:
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ token = this.nextToken();
+ raw = this.getTokenRaw(token);
+ expr = this.finalize(node, new Node.Literal(null, raw));
+ break;
+ case 10 /* Template */:
+ expr = this.parseTemplateLiteral();
+ break;
+ case 7 /* Punctuator */:
+ switch (this.lookahead.value) {
+ case '(':
+ this.context.isBindingElement = false;
+ expr = this.inheritCoverGrammar(this.parseGroupExpression);
+ break;
+ case '[':
+ expr = this.inheritCoverGrammar(this.parseArrayInitializer);
+ break;
+ case '{':
+ expr = this.inheritCoverGrammar(this.parseObjectInitializer);
+ break;
+ case '/':
+ case '/=':
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ this.scanner.index = this.startMarker.index;
+ token = this.nextRegexToken();
+ raw = this.getTokenRaw(token);
+ expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags));
+ break;
+ default:
+ expr = this.throwUnexpectedToken(this.nextToken());
+ }
+ break;
+ case 4 /* Keyword */:
+ if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) {
+ expr = this.parseIdentifierName();
+ }
+ else if (!this.context.strict && this.matchKeyword('let')) {
+ expr = this.finalize(node, new Node.Identifier(this.nextToken().value));
+ }
+ else {
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ if (this.matchKeyword('function')) {
+ expr = this.parseFunctionExpression();
+ }
+ else if (this.matchKeyword('this')) {
+ this.nextToken();
+ expr = this.finalize(node, new Node.ThisExpression());
+ }
+ else if (this.matchKeyword('class')) {
+ expr = this.parseClassExpression();
+ }
+ else {
+ expr = this.throwUnexpectedToken(this.nextToken());
+ }
+ }
+ break;
+ default:
+ expr = this.throwUnexpectedToken(this.nextToken());
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-array-initializer
+ Parser.prototype.parseSpreadElement = function () {
+ var node = this.createNode();
+ this.expect('...');
+ var arg = this.inheritCoverGrammar(this.parseAssignmentExpression);
+ return this.finalize(node, new Node.SpreadElement(arg));
+ };
+ Parser.prototype.parseArrayInitializer = function () {
+ var node = this.createNode();
+ var elements = [];
+ this.expect('[');
+ while (!this.match(']')) {
+ if (this.match(',')) {
+ this.nextToken();
+ elements.push(null);
+ }
+ else if (this.match('...')) {
+ var element = this.parseSpreadElement();
+ if (!this.match(']')) {
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ this.expect(',');
+ }
+ elements.push(element);
+ }
+ else {
+ elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
+ if (!this.match(']')) {
+ this.expect(',');
+ }
+ }
+ }
+ this.expect(']');
+ return this.finalize(node, new Node.ArrayExpression(elements));
+ };
+ // https://tc39.github.io/ecma262/#sec-object-initializer
+ Parser.prototype.parsePropertyMethod = function (params) {
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var previousStrict = this.context.strict;
+ var previousAllowStrictDirective = this.context.allowStrictDirective;
+ this.context.allowStrictDirective = params.simple;
+ var body = this.isolateCoverGrammar(this.parseFunctionSourceElements);
+ if (this.context.strict && params.firstRestricted) {
+ this.tolerateUnexpectedToken(params.firstRestricted, params.message);
+ }
+ if (this.context.strict && params.stricted) {
+ this.tolerateUnexpectedToken(params.stricted, params.message);
+ }
+ this.context.strict = previousStrict;
+ this.context.allowStrictDirective = previousAllowStrictDirective;
+ return body;
+ };
+ Parser.prototype.parsePropertyMethodFunction = function () {
+ var isGenerator = false;
+ var node = this.createNode();
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = true;
+ var params = this.parseFormalParameters();
+ var method = this.parsePropertyMethod(params);
+ this.context.allowYield = previousAllowYield;
+ return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
+ };
+ Parser.prototype.parsePropertyMethodAsyncFunction = function () {
+ var node = this.createNode();
+ var previousAllowYield = this.context.allowYield;
+ var previousAwait = this.context.await;
+ this.context.allowYield = false;
+ this.context.await = true;
+ var params = this.parseFormalParameters();
+ var method = this.parsePropertyMethod(params);
+ this.context.allowYield = previousAllowYield;
+ this.context.await = previousAwait;
+ return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method));
+ };
+ Parser.prototype.parseObjectPropertyKey = function () {
+ var node = this.createNode();
+ var token = this.nextToken();
+ var key;
+ switch (token.type) {
+ case 8 /* StringLiteral */:
+ case 6 /* NumericLiteral */:
+ if (this.context.strict && token.octal) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral);
+ }
+ var raw = this.getTokenRaw(token);
+ key = this.finalize(node, new Node.Literal(token.value, raw));
+ break;
+ case 3 /* Identifier */:
+ case 1 /* BooleanLiteral */:
+ case 5 /* NullLiteral */:
+ case 4 /* Keyword */:
+ key = this.finalize(node, new Node.Identifier(token.value));
+ break;
+ case 7 /* Punctuator */:
+ if (token.value === '[') {
+ key = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ this.expect(']');
+ }
+ else {
+ key = this.throwUnexpectedToken(token);
+ }
+ break;
+ default:
+ key = this.throwUnexpectedToken(token);
+ }
+ return key;
+ };
+ Parser.prototype.isPropertyKey = function (key, value) {
+ return (key.type === syntax_1.Syntax.Identifier && key.name === value) ||
+ (key.type === syntax_1.Syntax.Literal && key.value === value);
+ };
+ Parser.prototype.parseObjectProperty = function (hasProto) {
+ var node = this.createNode();
+ var token = this.lookahead;
+ var kind;
+ var key = null;
+ var value = null;
+ var computed = false;
+ var method = false;
+ var shorthand = false;
+ var isAsync = false;
+ if (token.type === 3 /* Identifier */) {
+ var id = token.value;
+ this.nextToken();
+ computed = this.match('[');
+ isAsync = !this.hasLineTerminator && (id === 'async') &&
+ !this.match(':') && !this.match('(') && !this.match('*') && !this.match(',');
+ key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id));
+ }
+ else if (this.match('*')) {
+ this.nextToken();
+ }
+ else {
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ }
+ var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
+ if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) {
+ kind = 'get';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ this.context.allowYield = false;
+ value = this.parseGetterMethod();
+ }
+ else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) {
+ kind = 'set';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ value = this.parseSetterMethod();
+ }
+ else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
+ kind = 'init';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ value = this.parseGeneratorMethod();
+ method = true;
+ }
+ else {
+ if (!key) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ kind = 'init';
+ if (this.match(':') && !isAsync) {
+ if (!computed && this.isPropertyKey(key, '__proto__')) {
+ if (hasProto.value) {
+ this.tolerateError(messages_1.Messages.DuplicateProtoProperty);
+ }
+ hasProto.value = true;
+ }
+ this.nextToken();
+ value = this.inheritCoverGrammar(this.parseAssignmentExpression);
+ }
+ else if (this.match('(')) {
+ value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
+ method = true;
+ }
+ else if (token.type === 3 /* Identifier */) {
+ var id = this.finalize(node, new Node.Identifier(token.value));
+ if (this.match('=')) {
+ this.context.firstCoverInitializedNameError = this.lookahead;
+ this.nextToken();
+ shorthand = true;
+ var init = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ value = this.finalize(node, new Node.AssignmentPattern(id, init));
+ }
+ else {
+ shorthand = true;
+ value = id;
+ }
+ }
+ else {
+ this.throwUnexpectedToken(this.nextToken());
+ }
+ }
+ return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand));
+ };
+ Parser.prototype.parseObjectInitializer = function () {
+ var node = this.createNode();
+ this.expect('{');
+ var properties = [];
+ var hasProto = { value: false };
+ while (!this.match('}')) {
+ properties.push(this.parseObjectProperty(hasProto));
+ if (!this.match('}')) {
+ this.expectCommaSeparator();
+ }
+ }
+ this.expect('}');
+ return this.finalize(node, new Node.ObjectExpression(properties));
+ };
+ // https://tc39.github.io/ecma262/#sec-template-literals
+ Parser.prototype.parseTemplateHead = function () {
+ assert_1.assert(this.lookahead.head, 'Template literal must start with a template head');
+ var node = this.createNode();
+ var token = this.nextToken();
+ var raw = token.value;
+ var cooked = token.cooked;
+ return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
+ };
+ Parser.prototype.parseTemplateElement = function () {
+ if (this.lookahead.type !== 10 /* Template */) {
+ this.throwUnexpectedToken();
+ }
+ var node = this.createNode();
+ var token = this.nextToken();
+ var raw = token.value;
+ var cooked = token.cooked;
+ return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
+ };
+ Parser.prototype.parseTemplateLiteral = function () {
+ var node = this.createNode();
+ var expressions = [];
+ var quasis = [];
+ var quasi = this.parseTemplateHead();
+ quasis.push(quasi);
+ while (!quasi.tail) {
+ expressions.push(this.parseExpression());
+ quasi = this.parseTemplateElement();
+ quasis.push(quasi);
+ }
+ return this.finalize(node, new Node.TemplateLiteral(quasis, expressions));
+ };
+ // https://tc39.github.io/ecma262/#sec-grouping-operator
+ Parser.prototype.reinterpretExpressionAsPattern = function (expr) {
+ switch (expr.type) {
+ case syntax_1.Syntax.Identifier:
+ case syntax_1.Syntax.MemberExpression:
+ case syntax_1.Syntax.RestElement:
+ case syntax_1.Syntax.AssignmentPattern:
+ break;
+ case syntax_1.Syntax.SpreadElement:
+ expr.type = syntax_1.Syntax.RestElement;
+ this.reinterpretExpressionAsPattern(expr.argument);
+ break;
+ case syntax_1.Syntax.ArrayExpression:
+ expr.type = syntax_1.Syntax.ArrayPattern;
+ for (var i = 0; i < expr.elements.length; i++) {
+ if (expr.elements[i] !== null) {
+ this.reinterpretExpressionAsPattern(expr.elements[i]);
+ }
+ }
+ break;
+ case syntax_1.Syntax.ObjectExpression:
+ expr.type = syntax_1.Syntax.ObjectPattern;
+ for (var i = 0; i < expr.properties.length; i++) {
+ this.reinterpretExpressionAsPattern(expr.properties[i].value);
+ }
+ break;
+ case syntax_1.Syntax.AssignmentExpression:
+ expr.type = syntax_1.Syntax.AssignmentPattern;
+ delete expr.operator;
+ this.reinterpretExpressionAsPattern(expr.left);
+ break;
+ default:
+ // Allow other node type for tolerant parsing.
+ break;
+ }
+ };
+ Parser.prototype.parseGroupExpression = function () {
+ var expr;
+ this.expect('(');
+ if (this.match(')')) {
+ this.nextToken();
+ if (!this.match('=>')) {
+ this.expect('=>');
+ }
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: [],
+ async: false
+ };
+ }
+ else {
+ var startToken = this.lookahead;
+ var params = [];
+ if (this.match('...')) {
+ expr = this.parseRestElement(params);
+ this.expect(')');
+ if (!this.match('=>')) {
+ this.expect('=>');
+ }
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: [expr],
+ async: false
+ };
+ }
+ else {
+ var arrow = false;
+ this.context.isBindingElement = true;
+ expr = this.inheritCoverGrammar(this.parseAssignmentExpression);
+ if (this.match(',')) {
+ var expressions = [];
+ this.context.isAssignmentTarget = false;
+ expressions.push(expr);
+ while (this.lookahead.type !== 2 /* EOF */) {
+ if (!this.match(',')) {
+ break;
+ }
+ this.nextToken();
+ if (this.match(')')) {
+ this.nextToken();
+ for (var i = 0; i < expressions.length; i++) {
+ this.reinterpretExpressionAsPattern(expressions[i]);
+ }
+ arrow = true;
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: expressions,
+ async: false
+ };
+ }
+ else if (this.match('...')) {
+ if (!this.context.isBindingElement) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ expressions.push(this.parseRestElement(params));
+ this.expect(')');
+ if (!this.match('=>')) {
+ this.expect('=>');
+ }
+ this.context.isBindingElement = false;
+ for (var i = 0; i < expressions.length; i++) {
+ this.reinterpretExpressionAsPattern(expressions[i]);
+ }
+ arrow = true;
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: expressions,
+ async: false
+ };
+ }
+ else {
+ expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
+ }
+ if (arrow) {
+ break;
+ }
+ }
+ if (!arrow) {
+ expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
+ }
+ }
+ if (!arrow) {
+ this.expect(')');
+ if (this.match('=>')) {
+ if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') {
+ arrow = true;
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: [expr],
+ async: false
+ };
+ }
+ if (!arrow) {
+ if (!this.context.isBindingElement) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ if (expr.type === syntax_1.Syntax.SequenceExpression) {
+ for (var i = 0; i < expr.expressions.length; i++) {
+ this.reinterpretExpressionAsPattern(expr.expressions[i]);
+ }
+ }
+ else {
+ this.reinterpretExpressionAsPattern(expr);
+ }
+ var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]);
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: parameters,
+ async: false
+ };
+ }
+ }
+ this.context.isBindingElement = false;
+ }
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions
+ Parser.prototype.parseArguments = function () {
+ this.expect('(');
+ var args = [];
+ if (!this.match(')')) {
+ while (true) {
+ var expr = this.match('...') ? this.parseSpreadElement() :
+ this.isolateCoverGrammar(this.parseAssignmentExpression);
+ args.push(expr);
+ if (this.match(')')) {
+ break;
+ }
+ this.expectCommaSeparator();
+ if (this.match(')')) {
+ break;
+ }
+ }
+ }
+ this.expect(')');
+ return args;
+ };
+ Parser.prototype.isIdentifierName = function (token) {
+ return token.type === 3 /* Identifier */ ||
+ token.type === 4 /* Keyword */ ||
+ token.type === 1 /* BooleanLiteral */ ||
+ token.type === 5 /* NullLiteral */;
+ };
+ Parser.prototype.parseIdentifierName = function () {
+ var node = this.createNode();
+ var token = this.nextToken();
+ if (!this.isIdentifierName(token)) {
+ this.throwUnexpectedToken(token);
+ }
+ return this.finalize(node, new Node.Identifier(token.value));
+ };
+ Parser.prototype.parseNewExpression = function () {
+ var node = this.createNode();
+ var id = this.parseIdentifierName();
+ assert_1.assert(id.name === 'new', 'New expression must start with `new`');
+ var expr;
+ if (this.match('.')) {
+ this.nextToken();
+ if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') {
+ var property = this.parseIdentifierName();
+ expr = new Node.MetaProperty(id, property);
+ }
+ else {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ }
+ else {
+ var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression);
+ var args = this.match('(') ? this.parseArguments() : [];
+ expr = new Node.NewExpression(callee, args);
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ return this.finalize(node, expr);
+ };
+ Parser.prototype.parseAsyncArgument = function () {
+ var arg = this.parseAssignmentExpression();
+ this.context.firstCoverInitializedNameError = null;
+ return arg;
+ };
+ Parser.prototype.parseAsyncArguments = function () {
+ this.expect('(');
+ var args = [];
+ if (!this.match(')')) {
+ while (true) {
+ var expr = this.match('...') ? this.parseSpreadElement() :
+ this.isolateCoverGrammar(this.parseAsyncArgument);
+ args.push(expr);
+ if (this.match(')')) {
+ break;
+ }
+ this.expectCommaSeparator();
+ if (this.match(')')) {
+ break;
+ }
+ }
+ }
+ this.expect(')');
+ return args;
+ };
+ Parser.prototype.parseLeftHandSideExpressionAllowCall = function () {
+ var startToken = this.lookahead;
+ var maybeAsync = this.matchContextualKeyword('async');
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = true;
+ var expr;
+ if (this.matchKeyword('super') && this.context.inFunctionBody) {
+ expr = this.createNode();
+ this.nextToken();
+ expr = this.finalize(expr, new Node.Super());
+ if (!this.match('(') && !this.match('.') && !this.match('[')) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ }
+ else {
+ expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
+ }
+ while (true) {
+ if (this.match('.')) {
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = true;
+ this.expect('.');
+ var property = this.parseIdentifierName();
+ expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property));
+ }
+ else if (this.match('(')) {
+ var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber);
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = false;
+ var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments();
+ expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args));
+ if (asyncArrow && this.match('=>')) {
+ for (var i = 0; i < args.length; ++i) {
+ this.reinterpretExpressionAsPattern(args[i]);
+ }
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: args,
+ async: true
+ };
+ }
+ }
+ else if (this.match('[')) {
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = true;
+ this.expect('[');
+ var property = this.isolateCoverGrammar(this.parseExpression);
+ this.expect(']');
+ expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property));
+ }
+ else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
+ var quasi = this.parseTemplateLiteral();
+ expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi));
+ }
+ else {
+ break;
+ }
+ }
+ this.context.allowIn = previousAllowIn;
+ return expr;
+ };
+ Parser.prototype.parseSuper = function () {
+ var node = this.createNode();
+ this.expectKeyword('super');
+ if (!this.match('[') && !this.match('.')) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ return this.finalize(node, new Node.Super());
+ };
+ Parser.prototype.parseLeftHandSideExpression = function () {
+ assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.');
+ var node = this.startNode(this.lookahead);
+ var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() :
+ this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
+ while (true) {
+ if (this.match('[')) {
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = true;
+ this.expect('[');
+ var property = this.isolateCoverGrammar(this.parseExpression);
+ this.expect(']');
+ expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property));
+ }
+ else if (this.match('.')) {
+ this.context.isBindingElement = false;
+ this.context.isAssignmentTarget = true;
+ this.expect('.');
+ var property = this.parseIdentifierName();
+ expr = this.finalize(node, new Node.StaticMemberExpression(expr, property));
+ }
+ else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
+ var quasi = this.parseTemplateLiteral();
+ expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi));
+ }
+ else {
+ break;
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-update-expressions
+ Parser.prototype.parseUpdateExpression = function () {
+ var expr;
+ var startToken = this.lookahead;
+ if (this.match('++') || this.match('--')) {
+ var node = this.startNode(startToken);
+ var token = this.nextToken();
+ expr = this.inheritCoverGrammar(this.parseUnaryExpression);
+ if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
+ this.tolerateError(messages_1.Messages.StrictLHSPrefix);
+ }
+ if (!this.context.isAssignmentTarget) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
+ }
+ var prefix = true;
+ expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix));
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ else {
+ expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
+ if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) {
+ if (this.match('++') || this.match('--')) {
+ if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
+ this.tolerateError(messages_1.Messages.StrictLHSPostfix);
+ }
+ if (!this.context.isAssignmentTarget) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
+ }
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var operator = this.nextToken().value;
+ var prefix = false;
+ expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix));
+ }
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-unary-operators
+ Parser.prototype.parseAwaitExpression = function () {
+ var node = this.createNode();
+ this.nextToken();
+ var argument = this.parseUnaryExpression();
+ return this.finalize(node, new Node.AwaitExpression(argument));
+ };
+ Parser.prototype.parseUnaryExpression = function () {
+ var expr;
+ if (this.match('+') || this.match('-') || this.match('~') || this.match('!') ||
+ this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) {
+ var node = this.startNode(this.lookahead);
+ var token = this.nextToken();
+ expr = this.inheritCoverGrammar(this.parseUnaryExpression);
+ expr = this.finalize(node, new Node.UnaryExpression(token.value, expr));
+ if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) {
+ this.tolerateError(messages_1.Messages.StrictDelete);
+ }
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ else if (this.context.await && this.matchContextualKeyword('await')) {
+ expr = this.parseAwaitExpression();
+ }
+ else {
+ expr = this.parseUpdateExpression();
+ }
+ return expr;
+ };
+ Parser.prototype.parseExponentiationExpression = function () {
+ var startToken = this.lookahead;
+ var expr = this.inheritCoverGrammar(this.parseUnaryExpression);
+ if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) {
+ this.nextToken();
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var left = expr;
+ var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
+ expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right));
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-exp-operator
+ // https://tc39.github.io/ecma262/#sec-multiplicative-operators
+ // https://tc39.github.io/ecma262/#sec-additive-operators
+ // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators
+ // https://tc39.github.io/ecma262/#sec-relational-operators
+ // https://tc39.github.io/ecma262/#sec-equality-operators
+ // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators
+ // https://tc39.github.io/ecma262/#sec-binary-logical-operators
+ Parser.prototype.binaryPrecedence = function (token) {
+ var op = token.value;
+ var precedence;
+ if (token.type === 7 /* Punctuator */) {
+ precedence = this.operatorPrecedence[op] || 0;
+ }
+ else if (token.type === 4 /* Keyword */) {
+ precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0;
+ }
+ else {
+ precedence = 0;
+ }
+ return precedence;
+ };
+ Parser.prototype.parseBinaryExpression = function () {
+ var startToken = this.lookahead;
+ var expr = this.inheritCoverGrammar(this.parseExponentiationExpression);
+ var token = this.lookahead;
+ var prec = this.binaryPrecedence(token);
+ if (prec > 0) {
+ this.nextToken();
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var markers = [startToken, this.lookahead];
+ var left = expr;
+ var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
+ var stack = [left, token.value, right];
+ var precedences = [prec];
+ while (true) {
+ prec = this.binaryPrecedence(this.lookahead);
+ if (prec <= 0) {
+ break;
+ }
+ // Reduce: make a binary expression from the three topmost entries.
+ while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) {
+ right = stack.pop();
+ var operator = stack.pop();
+ precedences.pop();
+ left = stack.pop();
+ markers.pop();
+ var node = this.startNode(markers[markers.length - 1]);
+ stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right)));
+ }
+ // Shift.
+ stack.push(this.nextToken().value);
+ precedences.push(prec);
+ markers.push(this.lookahead);
+ stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression));
+ }
+ // Final reduce to clean-up the stack.
+ var i = stack.length - 1;
+ expr = stack[i];
+ var lastMarker = markers.pop();
+ while (i > 1) {
+ var marker = markers.pop();
+ var lastLineStart = lastMarker && lastMarker.lineStart;
+ var node = this.startNode(marker, lastLineStart);
+ var operator = stack[i - 1];
+ expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr));
+ i -= 2;
+ lastMarker = marker;
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-conditional-operator
+ Parser.prototype.parseConditionalExpression = function () {
+ var startToken = this.lookahead;
+ var expr = this.inheritCoverGrammar(this.parseBinaryExpression);
+ if (this.match('?')) {
+ this.nextToken();
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = true;
+ var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ this.context.allowIn = previousAllowIn;
+ this.expect(':');
+ var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate));
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-assignment-operators
+ Parser.prototype.checkPatternParam = function (options, param) {
+ switch (param.type) {
+ case syntax_1.Syntax.Identifier:
+ this.validateParam(options, param, param.name);
+ break;
+ case syntax_1.Syntax.RestElement:
+ this.checkPatternParam(options, param.argument);
+ break;
+ case syntax_1.Syntax.AssignmentPattern:
+ this.checkPatternParam(options, param.left);
+ break;
+ case syntax_1.Syntax.ArrayPattern:
+ for (var i = 0; i < param.elements.length; i++) {
+ if (param.elements[i] !== null) {
+ this.checkPatternParam(options, param.elements[i]);
+ }
+ }
+ break;
+ case syntax_1.Syntax.ObjectPattern:
+ for (var i = 0; i < param.properties.length; i++) {
+ this.checkPatternParam(options, param.properties[i].value);
+ }
+ break;
+ default:
+ break;
+ }
+ options.simple = options.simple && (param instanceof Node.Identifier);
+ };
+ Parser.prototype.reinterpretAsCoverFormalsList = function (expr) {
+ var params = [expr];
+ var options;
+ var asyncArrow = false;
+ switch (expr.type) {
+ case syntax_1.Syntax.Identifier:
+ break;
+ case ArrowParameterPlaceHolder:
+ params = expr.params;
+ asyncArrow = expr.async;
+ break;
+ default:
+ return null;
+ }
+ options = {
+ simple: true,
+ paramSet: {}
+ };
+ for (var i = 0; i < params.length; ++i) {
+ var param = params[i];
+ if (param.type === syntax_1.Syntax.AssignmentPattern) {
+ if (param.right.type === syntax_1.Syntax.YieldExpression) {
+ if (param.right.argument) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ param.right.type = syntax_1.Syntax.Identifier;
+ param.right.name = 'yield';
+ delete param.right.argument;
+ delete param.right.delegate;
+ }
+ }
+ else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ this.checkPatternParam(options, param);
+ params[i] = param;
+ }
+ if (this.context.strict || !this.context.allowYield) {
+ for (var i = 0; i < params.length; ++i) {
+ var param = params[i];
+ if (param.type === syntax_1.Syntax.YieldExpression) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ }
+ }
+ if (options.message === messages_1.Messages.StrictParamDupe) {
+ var token = this.context.strict ? options.stricted : options.firstRestricted;
+ this.throwUnexpectedToken(token, options.message);
+ }
+ return {
+ simple: options.simple,
+ params: params,
+ stricted: options.stricted,
+ firstRestricted: options.firstRestricted,
+ message: options.message
+ };
+ };
+ Parser.prototype.parseAssignmentExpression = function () {
+ var expr;
+ if (!this.context.allowYield && this.matchKeyword('yield')) {
+ expr = this.parseYieldExpression();
+ }
+ else {
+ var startToken = this.lookahead;
+ var token = startToken;
+ expr = this.parseConditionalExpression();
+ if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') {
+ if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) {
+ var arg = this.parsePrimaryExpression();
+ this.reinterpretExpressionAsPattern(arg);
+ expr = {
+ type: ArrowParameterPlaceHolder,
+ params: [arg],
+ async: true
+ };
+ }
+ }
+ if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) {
+ // https://tc39.github.io/ecma262/#sec-arrow-function-definitions
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ var isAsync = expr.async;
+ var list = this.reinterpretAsCoverFormalsList(expr);
+ if (list) {
+ if (this.hasLineTerminator) {
+ this.tolerateUnexpectedToken(this.lookahead);
+ }
+ this.context.firstCoverInitializedNameError = null;
+ var previousStrict = this.context.strict;
+ var previousAllowStrictDirective = this.context.allowStrictDirective;
+ this.context.allowStrictDirective = list.simple;
+ var previousAllowYield = this.context.allowYield;
+ var previousAwait = this.context.await;
+ this.context.allowYield = true;
+ this.context.await = isAsync;
+ var node = this.startNode(startToken);
+ this.expect('=>');
+ var body = void 0;
+ if (this.match('{')) {
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = true;
+ body = this.parseFunctionSourceElements();
+ this.context.allowIn = previousAllowIn;
+ }
+ else {
+ body = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ }
+ var expression = body.type !== syntax_1.Syntax.BlockStatement;
+ if (this.context.strict && list.firstRestricted) {
+ this.throwUnexpectedToken(list.firstRestricted, list.message);
+ }
+ if (this.context.strict && list.stricted) {
+ this.tolerateUnexpectedToken(list.stricted, list.message);
+ }
+ expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) :
+ this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression));
+ this.context.strict = previousStrict;
+ this.context.allowStrictDirective = previousAllowStrictDirective;
+ this.context.allowYield = previousAllowYield;
+ this.context.await = previousAwait;
+ }
+ }
+ else {
+ if (this.matchAssign()) {
+ if (!this.context.isAssignmentTarget) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
+ }
+ if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) {
+ var id = expr;
+ if (this.scanner.isRestrictedWord(id.name)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment);
+ }
+ if (this.scanner.isStrictModeReservedWord(id.name)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
+ }
+ }
+ if (!this.match('=')) {
+ this.context.isAssignmentTarget = false;
+ this.context.isBindingElement = false;
+ }
+ else {
+ this.reinterpretExpressionAsPattern(expr);
+ }
+ token = this.nextToken();
+ var operator = token.value;
+ var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right));
+ this.context.firstCoverInitializedNameError = null;
+ }
+ }
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-comma-operator
+ Parser.prototype.parseExpression = function () {
+ var startToken = this.lookahead;
+ var expr = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ if (this.match(',')) {
+ var expressions = [];
+ expressions.push(expr);
+ while (this.lookahead.type !== 2 /* EOF */) {
+ if (!this.match(',')) {
+ break;
+ }
+ this.nextToken();
+ expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
+ }
+ expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
+ }
+ return expr;
+ };
+ // https://tc39.github.io/ecma262/#sec-block
+ Parser.prototype.parseStatementListItem = function () {
+ var statement;
+ this.context.isAssignmentTarget = true;
+ this.context.isBindingElement = true;
+ if (this.lookahead.type === 4 /* Keyword */) {
+ switch (this.lookahead.value) {
+ case 'export':
+ if (!this.context.isModule) {
+ this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration);
+ }
+ statement = this.parseExportDeclaration();
+ break;
+ case 'import':
+ if (!this.context.isModule) {
+ this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration);
+ }
+ statement = this.parseImportDeclaration();
+ break;
+ case 'const':
+ statement = this.parseLexicalDeclaration({ inFor: false });
+ break;
+ case 'function':
+ statement = this.parseFunctionDeclaration();
+ break;
+ case 'class':
+ statement = this.parseClassDeclaration();
+ break;
+ case 'let':
+ statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement();
+ break;
+ default:
+ statement = this.parseStatement();
+ break;
+ }
+ }
+ else {
+ statement = this.parseStatement();
+ }
+ return statement;
+ };
+ Parser.prototype.parseBlock = function () {
+ var node = this.createNode();
+ this.expect('{');
+ var block = [];
+ while (true) {
+ if (this.match('}')) {
+ break;
+ }
+ block.push(this.parseStatementListItem());
+ }
+ this.expect('}');
+ return this.finalize(node, new Node.BlockStatement(block));
+ };
+ // https://tc39.github.io/ecma262/#sec-let-and-const-declarations
+ Parser.prototype.parseLexicalBinding = function (kind, options) {
+ var node = this.createNode();
+ var params = [];
+ var id = this.parsePattern(params, kind);
+ if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
+ if (this.scanner.isRestrictedWord(id.name)) {
+ this.tolerateError(messages_1.Messages.StrictVarName);
+ }
+ }
+ var init = null;
+ if (kind === 'const') {
+ if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) {
+ if (this.match('=')) {
+ this.nextToken();
+ init = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ }
+ else {
+ this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const');
+ }
+ }
+ }
+ else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) {
+ this.expect('=');
+ init = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ }
+ return this.finalize(node, new Node.VariableDeclarator(id, init));
+ };
+ Parser.prototype.parseBindingList = function (kind, options) {
+ var list = [this.parseLexicalBinding(kind, options)];
+ while (this.match(',')) {
+ this.nextToken();
+ list.push(this.parseLexicalBinding(kind, options));
+ }
+ return list;
+ };
+ Parser.prototype.isLexicalDeclaration = function () {
+ var state = this.scanner.saveState();
+ this.scanner.scanComments();
+ var next = this.scanner.lex();
+ this.scanner.restoreState(state);
+ return (next.type === 3 /* Identifier */) ||
+ (next.type === 7 /* Punctuator */ && next.value === '[') ||
+ (next.type === 7 /* Punctuator */ && next.value === '{') ||
+ (next.type === 4 /* Keyword */ && next.value === 'let') ||
+ (next.type === 4 /* Keyword */ && next.value === 'yield');
+ };
+ Parser.prototype.parseLexicalDeclaration = function (options) {
+ var node = this.createNode();
+ var kind = this.nextToken().value;
+ assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const');
+ var declarations = this.parseBindingList(kind, options);
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.VariableDeclaration(declarations, kind));
+ };
+ // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns
+ Parser.prototype.parseBindingRestElement = function (params, kind) {
+ var node = this.createNode();
+ this.expect('...');
+ var arg = this.parsePattern(params, kind);
+ return this.finalize(node, new Node.RestElement(arg));
+ };
+ Parser.prototype.parseArrayPattern = function (params, kind) {
+ var node = this.createNode();
+ this.expect('[');
+ var elements = [];
+ while (!this.match(']')) {
+ if (this.match(',')) {
+ this.nextToken();
+ elements.push(null);
+ }
+ else {
+ if (this.match('...')) {
+ elements.push(this.parseBindingRestElement(params, kind));
+ break;
+ }
+ else {
+ elements.push(this.parsePatternWithDefault(params, kind));
+ }
+ if (!this.match(']')) {
+ this.expect(',');
+ }
+ }
+ }
+ this.expect(']');
+ return this.finalize(node, new Node.ArrayPattern(elements));
+ };
+ Parser.prototype.parsePropertyPattern = function (params, kind) {
+ var node = this.createNode();
+ var computed = false;
+ var shorthand = false;
+ var method = false;
+ var key;
+ var value;
+ if (this.lookahead.type === 3 /* Identifier */) {
+ var keyToken = this.lookahead;
+ key = this.parseVariableIdentifier();
+ var init = this.finalize(node, new Node.Identifier(keyToken.value));
+ if (this.match('=')) {
+ params.push(keyToken);
+ shorthand = true;
+ this.nextToken();
+ var expr = this.parseAssignmentExpression();
+ value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr));
+ }
+ else if (!this.match(':')) {
+ params.push(keyToken);
+ shorthand = true;
+ value = init;
+ }
+ else {
+ this.expect(':');
+ value = this.parsePatternWithDefault(params, kind);
+ }
+ }
+ else {
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ this.expect(':');
+ value = this.parsePatternWithDefault(params, kind);
+ }
+ return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand));
+ };
+ Parser.prototype.parseObjectPattern = function (params, kind) {
+ var node = this.createNode();
+ var properties = [];
+ this.expect('{');
+ while (!this.match('}')) {
+ properties.push(this.parsePropertyPattern(params, kind));
+ if (!this.match('}')) {
+ this.expect(',');
+ }
+ }
+ this.expect('}');
+ return this.finalize(node, new Node.ObjectPattern(properties));
+ };
+ Parser.prototype.parsePattern = function (params, kind) {
+ var pattern;
+ if (this.match('[')) {
+ pattern = this.parseArrayPattern(params, kind);
+ }
+ else if (this.match('{')) {
+ pattern = this.parseObjectPattern(params, kind);
+ }
+ else {
+ if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) {
+ this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding);
+ }
+ params.push(this.lookahead);
+ pattern = this.parseVariableIdentifier(kind);
+ }
+ return pattern;
+ };
+ Parser.prototype.parsePatternWithDefault = function (params, kind) {
+ var startToken = this.lookahead;
+ var pattern = this.parsePattern(params, kind);
+ if (this.match('=')) {
+ this.nextToken();
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = true;
+ var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ this.context.allowYield = previousAllowYield;
+ pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right));
+ }
+ return pattern;
+ };
+ // https://tc39.github.io/ecma262/#sec-variable-statement
+ Parser.prototype.parseVariableIdentifier = function (kind) {
+ var node = this.createNode();
+ var token = this.nextToken();
+ if (token.type === 4 /* Keyword */ && token.value === 'yield') {
+ if (this.context.strict) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
+ }
+ else if (!this.context.allowYield) {
+ this.throwUnexpectedToken(token);
+ }
+ }
+ else if (token.type !== 3 /* Identifier */) {
+ if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
+ }
+ else {
+ if (this.context.strict || token.value !== 'let' || kind !== 'var') {
+ this.throwUnexpectedToken(token);
+ }
+ }
+ }
+ else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') {
+ this.tolerateUnexpectedToken(token);
+ }
+ return this.finalize(node, new Node.Identifier(token.value));
+ };
+ Parser.prototype.parseVariableDeclaration = function (options) {
+ var node = this.createNode();
+ var params = [];
+ var id = this.parsePattern(params, 'var');
+ if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
+ if (this.scanner.isRestrictedWord(id.name)) {
+ this.tolerateError(messages_1.Messages.StrictVarName);
+ }
+ }
+ var init = null;
+ if (this.match('=')) {
+ this.nextToken();
+ init = this.isolateCoverGrammar(this.parseAssignmentExpression);
+ }
+ else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) {
+ this.expect('=');
+ }
+ return this.finalize(node, new Node.VariableDeclarator(id, init));
+ };
+ Parser.prototype.parseVariableDeclarationList = function (options) {
+ var opt = { inFor: options.inFor };
+ var list = [];
+ list.push(this.parseVariableDeclaration(opt));
+ while (this.match(',')) {
+ this.nextToken();
+ list.push(this.parseVariableDeclaration(opt));
+ }
+ return list;
+ };
+ Parser.prototype.parseVariableStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('var');
+ var declarations = this.parseVariableDeclarationList({ inFor: false });
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.VariableDeclaration(declarations, 'var'));
+ };
+ // https://tc39.github.io/ecma262/#sec-empty-statement
+ Parser.prototype.parseEmptyStatement = function () {
+ var node = this.createNode();
+ this.expect(';');
+ return this.finalize(node, new Node.EmptyStatement());
+ };
+ // https://tc39.github.io/ecma262/#sec-expression-statement
+ Parser.prototype.parseExpressionStatement = function () {
+ var node = this.createNode();
+ var expr = this.parseExpression();
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.ExpressionStatement(expr));
+ };
+ // https://tc39.github.io/ecma262/#sec-if-statement
+ Parser.prototype.parseIfClause = function () {
+ if (this.context.strict && this.matchKeyword('function')) {
+ this.tolerateError(messages_1.Messages.StrictFunction);
+ }
+ return this.parseStatement();
+ };
+ Parser.prototype.parseIfStatement = function () {
+ var node = this.createNode();
+ var consequent;
+ var alternate = null;
+ this.expectKeyword('if');
+ this.expect('(');
+ var test = this.parseExpression();
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ consequent = this.finalize(this.createNode(), new Node.EmptyStatement());
+ }
+ else {
+ this.expect(')');
+ consequent = this.parseIfClause();
+ if (this.matchKeyword('else')) {
+ this.nextToken();
+ alternate = this.parseIfClause();
+ }
+ }
+ return this.finalize(node, new Node.IfStatement(test, consequent, alternate));
+ };
+ // https://tc39.github.io/ecma262/#sec-do-while-statement
+ Parser.prototype.parseDoWhileStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('do');
+ var previousInIteration = this.context.inIteration;
+ this.context.inIteration = true;
+ var body = this.parseStatement();
+ this.context.inIteration = previousInIteration;
+ this.expectKeyword('while');
+ this.expect('(');
+ var test = this.parseExpression();
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ }
+ else {
+ this.expect(')');
+ if (this.match(';')) {
+ this.nextToken();
+ }
+ }
+ return this.finalize(node, new Node.DoWhileStatement(body, test));
+ };
+ // https://tc39.github.io/ecma262/#sec-while-statement
+ Parser.prototype.parseWhileStatement = function () {
+ var node = this.createNode();
+ var body;
+ this.expectKeyword('while');
+ this.expect('(');
+ var test = this.parseExpression();
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ body = this.finalize(this.createNode(), new Node.EmptyStatement());
+ }
+ else {
+ this.expect(')');
+ var previousInIteration = this.context.inIteration;
+ this.context.inIteration = true;
+ body = this.parseStatement();
+ this.context.inIteration = previousInIteration;
+ }
+ return this.finalize(node, new Node.WhileStatement(test, body));
+ };
+ // https://tc39.github.io/ecma262/#sec-for-statement
+ // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements
+ Parser.prototype.parseForStatement = function () {
+ var init = null;
+ var test = null;
+ var update = null;
+ var forIn = true;
+ var left, right;
+ var node = this.createNode();
+ this.expectKeyword('for');
+ this.expect('(');
+ if (this.match(';')) {
+ this.nextToken();
+ }
+ else {
+ if (this.matchKeyword('var')) {
+ init = this.createNode();
+ this.nextToken();
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = false;
+ var declarations = this.parseVariableDeclarationList({ inFor: true });
+ this.context.allowIn = previousAllowIn;
+ if (declarations.length === 1 && this.matchKeyword('in')) {
+ var decl = declarations[0];
+ if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) {
+ this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in');
+ }
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
+ this.nextToken();
+ left = init;
+ right = this.parseExpression();
+ init = null;
+ }
+ else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
+ this.nextToken();
+ left = init;
+ right = this.parseAssignmentExpression();
+ init = null;
+ forIn = false;
+ }
+ else {
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
+ this.expect(';');
+ }
+ }
+ else if (this.matchKeyword('const') || this.matchKeyword('let')) {
+ init = this.createNode();
+ var kind = this.nextToken().value;
+ if (!this.context.strict && this.lookahead.value === 'in') {
+ init = this.finalize(init, new Node.Identifier(kind));
+ this.nextToken();
+ left = init;
+ right = this.parseExpression();
+ init = null;
+ }
+ else {
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = false;
+ var declarations = this.parseBindingList(kind, { inFor: true });
+ this.context.allowIn = previousAllowIn;
+ if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) {
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
+ this.nextToken();
+ left = init;
+ right = this.parseExpression();
+ init = null;
+ }
+ else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
+ this.nextToken();
+ left = init;
+ right = this.parseAssignmentExpression();
+ init = null;
+ forIn = false;
+ }
+ else {
+ this.consumeSemicolon();
+ init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
+ }
+ }
+ }
+ else {
+ var initStartToken = this.lookahead;
+ var previousAllowIn = this.context.allowIn;
+ this.context.allowIn = false;
+ init = this.inheritCoverGrammar(this.parseAssignmentExpression);
+ this.context.allowIn = previousAllowIn;
+ if (this.matchKeyword('in')) {
+ if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInForIn);
+ }
+ this.nextToken();
+ this.reinterpretExpressionAsPattern(init);
+ left = init;
+ right = this.parseExpression();
+ init = null;
+ }
+ else if (this.matchContextualKeyword('of')) {
+ if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
+ this.tolerateError(messages_1.Messages.InvalidLHSInForLoop);
+ }
+ this.nextToken();
+ this.reinterpretExpressionAsPattern(init);
+ left = init;
+ right = this.parseAssignmentExpression();
+ init = null;
+ forIn = false;
+ }
+ else {
+ if (this.match(',')) {
+ var initSeq = [init];
+ while (this.match(',')) {
+ this.nextToken();
+ initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
+ }
+ init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq));
+ }
+ this.expect(';');
+ }
+ }
+ }
+ if (typeof left === 'undefined') {
+ if (!this.match(';')) {
+ test = this.parseExpression();
+ }
+ this.expect(';');
+ if (!this.match(')')) {
+ update = this.parseExpression();
+ }
+ }
+ var body;
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ body = this.finalize(this.createNode(), new Node.EmptyStatement());
+ }
+ else {
+ this.expect(')');
+ var previousInIteration = this.context.inIteration;
+ this.context.inIteration = true;
+ body = this.isolateCoverGrammar(this.parseStatement);
+ this.context.inIteration = previousInIteration;
+ }
+ return (typeof left === 'undefined') ?
+ this.finalize(node, new Node.ForStatement(init, test, update, body)) :
+ forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) :
+ this.finalize(node, new Node.ForOfStatement(left, right, body));
+ };
+ // https://tc39.github.io/ecma262/#sec-continue-statement
+ Parser.prototype.parseContinueStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('continue');
+ var label = null;
+ if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
+ var id = this.parseVariableIdentifier();
+ label = id;
+ var key = '$' + id.name;
+ if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
+ this.throwError(messages_1.Messages.UnknownLabel, id.name);
+ }
+ }
+ this.consumeSemicolon();
+ if (label === null && !this.context.inIteration) {
+ this.throwError(messages_1.Messages.IllegalContinue);
+ }
+ return this.finalize(node, new Node.ContinueStatement(label));
+ };
+ // https://tc39.github.io/ecma262/#sec-break-statement
+ Parser.prototype.parseBreakStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('break');
+ var label = null;
+ if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
+ var id = this.parseVariableIdentifier();
+ var key = '$' + id.name;
+ if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
+ this.throwError(messages_1.Messages.UnknownLabel, id.name);
+ }
+ label = id;
+ }
+ this.consumeSemicolon();
+ if (label === null && !this.context.inIteration && !this.context.inSwitch) {
+ this.throwError(messages_1.Messages.IllegalBreak);
+ }
+ return this.finalize(node, new Node.BreakStatement(label));
+ };
+ // https://tc39.github.io/ecma262/#sec-return-statement
+ Parser.prototype.parseReturnStatement = function () {
+ if (!this.context.inFunctionBody) {
+ this.tolerateError(messages_1.Messages.IllegalReturn);
+ }
+ var node = this.createNode();
+ this.expectKeyword('return');
+ var hasArgument = (!this.match(';') && !this.match('}') &&
+ !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */) ||
+ this.lookahead.type === 8 /* StringLiteral */ ||
+ this.lookahead.type === 10 /* Template */;
+ var argument = hasArgument ? this.parseExpression() : null;
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.ReturnStatement(argument));
+ };
+ // https://tc39.github.io/ecma262/#sec-with-statement
+ Parser.prototype.parseWithStatement = function () {
+ if (this.context.strict) {
+ this.tolerateError(messages_1.Messages.StrictModeWith);
+ }
+ var node = this.createNode();
+ var body;
+ this.expectKeyword('with');
+ this.expect('(');
+ var object = this.parseExpression();
+ if (!this.match(')') && this.config.tolerant) {
+ this.tolerateUnexpectedToken(this.nextToken());
+ body = this.finalize(this.createNode(), new Node.EmptyStatement());
+ }
+ else {
+ this.expect(')');
+ body = this.parseStatement();
+ }
+ return this.finalize(node, new Node.WithStatement(object, body));
+ };
+ // https://tc39.github.io/ecma262/#sec-switch-statement
+ Parser.prototype.parseSwitchCase = function () {
+ var node = this.createNode();
+ var test;
+ if (this.matchKeyword('default')) {
+ this.nextToken();
+ test = null;
+ }
+ else {
+ this.expectKeyword('case');
+ test = this.parseExpression();
+ }
+ this.expect(':');
+ var consequent = [];
+ while (true) {
+ if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) {
+ break;
+ }
+ consequent.push(this.parseStatementListItem());
+ }
+ return this.finalize(node, new Node.SwitchCase(test, consequent));
+ };
+ Parser.prototype.parseSwitchStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('switch');
+ this.expect('(');
+ var discriminant = this.parseExpression();
+ this.expect(')');
+ var previousInSwitch = this.context.inSwitch;
+ this.context.inSwitch = true;
+ var cases = [];
+ var defaultFound = false;
+ this.expect('{');
+ while (true) {
+ if (this.match('}')) {
+ break;
+ }
+ var clause = this.parseSwitchCase();
+ if (clause.test === null) {
+ if (defaultFound) {
+ this.throwError(messages_1.Messages.MultipleDefaultsInSwitch);
+ }
+ defaultFound = true;
+ }
+ cases.push(clause);
+ }
+ this.expect('}');
+ this.context.inSwitch = previousInSwitch;
+ return this.finalize(node, new Node.SwitchStatement(discriminant, cases));
+ };
+ // https://tc39.github.io/ecma262/#sec-labelled-statements
+ Parser.prototype.parseLabelledStatement = function () {
+ var node = this.createNode();
+ var expr = this.parseExpression();
+ var statement;
+ if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) {
+ this.nextToken();
+ var id = expr;
+ var key = '$' + id.name;
+ if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
+ this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name);
+ }
+ this.context.labelSet[key] = true;
+ var body = void 0;
+ if (this.matchKeyword('class')) {
+ this.tolerateUnexpectedToken(this.lookahead);
+ body = this.parseClassDeclaration();
+ }
+ else if (this.matchKeyword('function')) {
+ var token = this.lookahead;
+ var declaration = this.parseFunctionDeclaration();
+ if (this.context.strict) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction);
+ }
+ else if (declaration.generator) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext);
+ }
+ body = declaration;
+ }
+ else {
+ body = this.parseStatement();
+ }
+ delete this.context.labelSet[key];
+ statement = new Node.LabeledStatement(id, body);
+ }
+ else {
+ this.consumeSemicolon();
+ statement = new Node.ExpressionStatement(expr);
+ }
+ return this.finalize(node, statement);
+ };
+ // https://tc39.github.io/ecma262/#sec-throw-statement
+ Parser.prototype.parseThrowStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('throw');
+ if (this.hasLineTerminator) {
+ this.throwError(messages_1.Messages.NewlineAfterThrow);
+ }
+ var argument = this.parseExpression();
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.ThrowStatement(argument));
+ };
+ // https://tc39.github.io/ecma262/#sec-try-statement
+ Parser.prototype.parseCatchClause = function () {
+ var node = this.createNode();
+ this.expectKeyword('catch');
+ this.expect('(');
+ if (this.match(')')) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ var params = [];
+ var param = this.parsePattern(params);
+ var paramMap = {};
+ for (var i = 0; i < params.length; i++) {
+ var key = '$' + params[i].value;
+ if (Object.prototype.hasOwnProperty.call(paramMap, key)) {
+ this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value);
+ }
+ paramMap[key] = true;
+ }
+ if (this.context.strict && param.type === syntax_1.Syntax.Identifier) {
+ if (this.scanner.isRestrictedWord(param.name)) {
+ this.tolerateError(messages_1.Messages.StrictCatchVariable);
+ }
+ }
+ this.expect(')');
+ var body = this.parseBlock();
+ return this.finalize(node, new Node.CatchClause(param, body));
+ };
+ Parser.prototype.parseFinallyClause = function () {
+ this.expectKeyword('finally');
+ return this.parseBlock();
+ };
+ Parser.prototype.parseTryStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('try');
+ var block = this.parseBlock();
+ var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null;
+ var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null;
+ if (!handler && !finalizer) {
+ this.throwError(messages_1.Messages.NoCatchOrFinally);
+ }
+ return this.finalize(node, new Node.TryStatement(block, handler, finalizer));
+ };
+ // https://tc39.github.io/ecma262/#sec-debugger-statement
+ Parser.prototype.parseDebuggerStatement = function () {
+ var node = this.createNode();
+ this.expectKeyword('debugger');
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.DebuggerStatement());
+ };
+ // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations
+ Parser.prototype.parseStatement = function () {
+ var statement;
+ switch (this.lookahead.type) {
+ case 1 /* BooleanLiteral */:
+ case 5 /* NullLiteral */:
+ case 6 /* NumericLiteral */:
+ case 8 /* StringLiteral */:
+ case 10 /* Template */:
+ case 9 /* RegularExpression */:
+ statement = this.parseExpressionStatement();
+ break;
+ case 7 /* Punctuator */:
+ var value = this.lookahead.value;
+ if (value === '{') {
+ statement = this.parseBlock();
+ }
+ else if (value === '(') {
+ statement = this.parseExpressionStatement();
+ }
+ else if (value === ';') {
+ statement = this.parseEmptyStatement();
+ }
+ else {
+ statement = this.parseExpressionStatement();
+ }
+ break;
+ case 3 /* Identifier */:
+ statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement();
+ break;
+ case 4 /* Keyword */:
+ switch (this.lookahead.value) {
+ case 'break':
+ statement = this.parseBreakStatement();
+ break;
+ case 'continue':
+ statement = this.parseContinueStatement();
+ break;
+ case 'debugger':
+ statement = this.parseDebuggerStatement();
+ break;
+ case 'do':
+ statement = this.parseDoWhileStatement();
+ break;
+ case 'for':
+ statement = this.parseForStatement();
+ break;
+ case 'function':
+ statement = this.parseFunctionDeclaration();
+ break;
+ case 'if':
+ statement = this.parseIfStatement();
+ break;
+ case 'return':
+ statement = this.parseReturnStatement();
+ break;
+ case 'switch':
+ statement = this.parseSwitchStatement();
+ break;
+ case 'throw':
+ statement = this.parseThrowStatement();
+ break;
+ case 'try':
+ statement = this.parseTryStatement();
+ break;
+ case 'var':
+ statement = this.parseVariableStatement();
+ break;
+ case 'while':
+ statement = this.parseWhileStatement();
+ break;
+ case 'with':
+ statement = this.parseWithStatement();
+ break;
+ default:
+ statement = this.parseExpressionStatement();
+ break;
+ }
+ break;
+ default:
+ statement = this.throwUnexpectedToken(this.lookahead);
+ }
+ return statement;
+ };
+ // https://tc39.github.io/ecma262/#sec-function-definitions
+ Parser.prototype.parseFunctionSourceElements = function () {
+ var node = this.createNode();
+ this.expect('{');
+ var body = this.parseDirectivePrologues();
+ var previousLabelSet = this.context.labelSet;
+ var previousInIteration = this.context.inIteration;
+ var previousInSwitch = this.context.inSwitch;
+ var previousInFunctionBody = this.context.inFunctionBody;
+ this.context.labelSet = {};
+ this.context.inIteration = false;
+ this.context.inSwitch = false;
+ this.context.inFunctionBody = true;
+ while (this.lookahead.type !== 2 /* EOF */) {
+ if (this.match('}')) {
+ break;
+ }
+ body.push(this.parseStatementListItem());
+ }
+ this.expect('}');
+ this.context.labelSet = previousLabelSet;
+ this.context.inIteration = previousInIteration;
+ this.context.inSwitch = previousInSwitch;
+ this.context.inFunctionBody = previousInFunctionBody;
+ return this.finalize(node, new Node.BlockStatement(body));
+ };
+ Parser.prototype.validateParam = function (options, param, name) {
+ var key = '$' + name;
+ if (this.context.strict) {
+ if (this.scanner.isRestrictedWord(name)) {
+ options.stricted = param;
+ options.message = messages_1.Messages.StrictParamName;
+ }
+ if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
+ options.stricted = param;
+ options.message = messages_1.Messages.StrictParamDupe;
+ }
+ }
+ else if (!options.firstRestricted) {
+ if (this.scanner.isRestrictedWord(name)) {
+ options.firstRestricted = param;
+ options.message = messages_1.Messages.StrictParamName;
+ }
+ else if (this.scanner.isStrictModeReservedWord(name)) {
+ options.firstRestricted = param;
+ options.message = messages_1.Messages.StrictReservedWord;
+ }
+ else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
+ options.stricted = param;
+ options.message = messages_1.Messages.StrictParamDupe;
+ }
+ }
+ /* istanbul ignore next */
+ if (typeof Object.defineProperty === 'function') {
+ Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true });
+ }
+ else {
+ options.paramSet[key] = true;
+ }
+ };
+ Parser.prototype.parseRestElement = function (params) {
+ var node = this.createNode();
+ this.expect('...');
+ var arg = this.parsePattern(params);
+ if (this.match('=')) {
+ this.throwError(messages_1.Messages.DefaultRestParameter);
+ }
+ if (!this.match(')')) {
+ this.throwError(messages_1.Messages.ParameterAfterRestParameter);
+ }
+ return this.finalize(node, new Node.RestElement(arg));
+ };
+ Parser.prototype.parseFormalParameter = function (options) {
+ var params = [];
+ var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params);
+ for (var i = 0; i < params.length; i++) {
+ this.validateParam(options, params[i], params[i].value);
+ }
+ options.simple = options.simple && (param instanceof Node.Identifier);
+ options.params.push(param);
+ };
+ Parser.prototype.parseFormalParameters = function (firstRestricted) {
+ var options;
+ options = {
+ simple: true,
+ params: [],
+ firstRestricted: firstRestricted
+ };
+ this.expect('(');
+ if (!this.match(')')) {
+ options.paramSet = {};
+ while (this.lookahead.type !== 2 /* EOF */) {
+ this.parseFormalParameter(options);
+ if (this.match(')')) {
+ break;
+ }
+ this.expect(',');
+ if (this.match(')')) {
+ break;
+ }
+ }
+ }
+ this.expect(')');
+ return {
+ simple: options.simple,
+ params: options.params,
+ stricted: options.stricted,
+ firstRestricted: options.firstRestricted,
+ message: options.message
+ };
+ };
+ Parser.prototype.matchAsyncFunction = function () {
+ var match = this.matchContextualKeyword('async');
+ if (match) {
+ var state = this.scanner.saveState();
+ this.scanner.scanComments();
+ var next = this.scanner.lex();
+ this.scanner.restoreState(state);
+ match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function');
+ }
+ return match;
+ };
+ Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) {
+ var node = this.createNode();
+ var isAsync = this.matchContextualKeyword('async');
+ if (isAsync) {
+ this.nextToken();
+ }
+ this.expectKeyword('function');
+ var isGenerator = isAsync ? false : this.match('*');
+ if (isGenerator) {
+ this.nextToken();
+ }
+ var message;
+ var id = null;
+ var firstRestricted = null;
+ if (!identifierIsOptional || !this.match('(')) {
+ var token = this.lookahead;
+ id = this.parseVariableIdentifier();
+ if (this.context.strict) {
+ if (this.scanner.isRestrictedWord(token.value)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
+ }
+ }
+ else {
+ if (this.scanner.isRestrictedWord(token.value)) {
+ firstRestricted = token;
+ message = messages_1.Messages.StrictFunctionName;
+ }
+ else if (this.scanner.isStrictModeReservedWord(token.value)) {
+ firstRestricted = token;
+ message = messages_1.Messages.StrictReservedWord;
+ }
+ }
+ }
+ var previousAllowAwait = this.context.await;
+ var previousAllowYield = this.context.allowYield;
+ this.context.await = isAsync;
+ this.context.allowYield = !isGenerator;
+ var formalParameters = this.parseFormalParameters(firstRestricted);
+ var params = formalParameters.params;
+ var stricted = formalParameters.stricted;
+ firstRestricted = formalParameters.firstRestricted;
+ if (formalParameters.message) {
+ message = formalParameters.message;
+ }
+ var previousStrict = this.context.strict;
+ var previousAllowStrictDirective = this.context.allowStrictDirective;
+ this.context.allowStrictDirective = formalParameters.simple;
+ var body = this.parseFunctionSourceElements();
+ if (this.context.strict && firstRestricted) {
+ this.throwUnexpectedToken(firstRestricted, message);
+ }
+ if (this.context.strict && stricted) {
+ this.tolerateUnexpectedToken(stricted, message);
+ }
+ this.context.strict = previousStrict;
+ this.context.allowStrictDirective = previousAllowStrictDirective;
+ this.context.await = previousAllowAwait;
+ this.context.allowYield = previousAllowYield;
+ return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) :
+ this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator));
+ };
+ Parser.prototype.parseFunctionExpression = function () {
+ var node = this.createNode();
+ var isAsync = this.matchContextualKeyword('async');
+ if (isAsync) {
+ this.nextToken();
+ }
+ this.expectKeyword('function');
+ var isGenerator = isAsync ? false : this.match('*');
+ if (isGenerator) {
+ this.nextToken();
+ }
+ var message;
+ var id = null;
+ var firstRestricted;
+ var previousAllowAwait = this.context.await;
+ var previousAllowYield = this.context.allowYield;
+ this.context.await = isAsync;
+ this.context.allowYield = !isGenerator;
+ if (!this.match('(')) {
+ var token = this.lookahead;
+ id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier();
+ if (this.context.strict) {
+ if (this.scanner.isRestrictedWord(token.value)) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
+ }
+ }
+ else {
+ if (this.scanner.isRestrictedWord(token.value)) {
+ firstRestricted = token;
+ message = messages_1.Messages.StrictFunctionName;
+ }
+ else if (this.scanner.isStrictModeReservedWord(token.value)) {
+ firstRestricted = token;
+ message = messages_1.Messages.StrictReservedWord;
+ }
+ }
+ }
+ var formalParameters = this.parseFormalParameters(firstRestricted);
+ var params = formalParameters.params;
+ var stricted = formalParameters.stricted;
+ firstRestricted = formalParameters.firstRestricted;
+ if (formalParameters.message) {
+ message = formalParameters.message;
+ }
+ var previousStrict = this.context.strict;
+ var previousAllowStrictDirective = this.context.allowStrictDirective;
+ this.context.allowStrictDirective = formalParameters.simple;
+ var body = this.parseFunctionSourceElements();
+ if (this.context.strict && firstRestricted) {
+ this.throwUnexpectedToken(firstRestricted, message);
+ }
+ if (this.context.strict && stricted) {
+ this.tolerateUnexpectedToken(stricted, message);
+ }
+ this.context.strict = previousStrict;
+ this.context.allowStrictDirective = previousAllowStrictDirective;
+ this.context.await = previousAllowAwait;
+ this.context.allowYield = previousAllowYield;
+ return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) :
+ this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator));
+ };
+ // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive
+ Parser.prototype.parseDirective = function () {
+ var token = this.lookahead;
+ var node = this.createNode();
+ var expr = this.parseExpression();
+ var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null;
+ this.consumeSemicolon();
+ return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr));
+ };
+ Parser.prototype.parseDirectivePrologues = function () {
+ var firstRestricted = null;
+ var body = [];
+ while (true) {
+ var token = this.lookahead;
+ if (token.type !== 8 /* StringLiteral */) {
+ break;
+ }
+ var statement = this.parseDirective();
+ body.push(statement);
+ var directive = statement.directive;
+ if (typeof directive !== 'string') {
+ break;
+ }
+ if (directive === 'use strict') {
+ this.context.strict = true;
+ if (firstRestricted) {
+ this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral);
+ }
+ if (!this.context.allowStrictDirective) {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective);
+ }
+ }
+ else {
+ if (!firstRestricted && token.octal) {
+ firstRestricted = token;
+ }
+ }
+ }
+ return body;
+ };
+ // https://tc39.github.io/ecma262/#sec-method-definitions
+ Parser.prototype.qualifiedPropertyName = function (token) {
+ switch (token.type) {
+ case 3 /* Identifier */:
+ case 8 /* StringLiteral */:
+ case 1 /* BooleanLiteral */:
+ case 5 /* NullLiteral */:
+ case 6 /* NumericLiteral */:
+ case 4 /* Keyword */:
+ return true;
+ case 7 /* Punctuator */:
+ return token.value === '[';
+ default:
+ break;
+ }
+ return false;
+ };
+ Parser.prototype.parseGetterMethod = function () {
+ var node = this.createNode();
+ var isGenerator = false;
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = !isGenerator;
+ var formalParameters = this.parseFormalParameters();
+ if (formalParameters.params.length > 0) {
+ this.tolerateError(messages_1.Messages.BadGetterArity);
+ }
+ var method = this.parsePropertyMethod(formalParameters);
+ this.context.allowYield = previousAllowYield;
+ return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
+ };
+ Parser.prototype.parseSetterMethod = function () {
+ var node = this.createNode();
+ var isGenerator = false;
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = !isGenerator;
+ var formalParameters = this.parseFormalParameters();
+ if (formalParameters.params.length !== 1) {
+ this.tolerateError(messages_1.Messages.BadSetterArity);
+ }
+ else if (formalParameters.params[0] instanceof Node.RestElement) {
+ this.tolerateError(messages_1.Messages.BadSetterRestParameter);
+ }
+ var method = this.parsePropertyMethod(formalParameters);
+ this.context.allowYield = previousAllowYield;
+ return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
+ };
+ Parser.prototype.parseGeneratorMethod = function () {
+ var node = this.createNode();
+ var isGenerator = true;
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = true;
+ var params = this.parseFormalParameters();
+ this.context.allowYield = false;
+ var method = this.parsePropertyMethod(params);
+ this.context.allowYield = previousAllowYield;
+ return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
+ };
+ // https://tc39.github.io/ecma262/#sec-generator-function-definitions
+ Parser.prototype.isStartOfExpression = function () {
+ var start = true;
+ var value = this.lookahead.value;
+ switch (this.lookahead.type) {
+ case 7 /* Punctuator */:
+ start = (value === '[') || (value === '(') || (value === '{') ||
+ (value === '+') || (value === '-') ||
+ (value === '!') || (value === '~') ||
+ (value === '++') || (value === '--') ||
+ (value === '/') || (value === '/='); // regular expression literal
+ break;
+ case 4 /* Keyword */:
+ start = (value === 'class') || (value === 'delete') ||
+ (value === 'function') || (value === 'let') || (value === 'new') ||
+ (value === 'super') || (value === 'this') || (value === 'typeof') ||
+ (value === 'void') || (value === 'yield');
+ break;
+ default:
+ break;
+ }
+ return start;
+ };
+ Parser.prototype.parseYieldExpression = function () {
+ var node = this.createNode();
+ this.expectKeyword('yield');
+ var argument = null;
+ var delegate = false;
+ if (!this.hasLineTerminator) {
+ var previousAllowYield = this.context.allowYield;
+ this.context.allowYield = false;
+ delegate = this.match('*');
+ if (delegate) {
+ this.nextToken();
+ argument = this.parseAssignmentExpression();
+ }
+ else if (this.isStartOfExpression()) {
+ argument = this.parseAssignmentExpression();
+ }
+ this.context.allowYield = previousAllowYield;
+ }
+ return this.finalize(node, new Node.YieldExpression(argument, delegate));
+ };
+ // https://tc39.github.io/ecma262/#sec-class-definitions
+ Parser.prototype.parseClassElement = function (hasConstructor) {
+ var token = this.lookahead;
+ var node = this.createNode();
+ var kind = '';
+ var key = null;
+ var value = null;
+ var computed = false;
+ var method = false;
+ var isStatic = false;
+ var isAsync = false;
+ if (this.match('*')) {
+ this.nextToken();
+ }
+ else {
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ var id = key;
+ if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) {
+ token = this.lookahead;
+ isStatic = true;
+ computed = this.match('[');
+ if (this.match('*')) {
+ this.nextToken();
+ }
+ else {
+ key = this.parseObjectPropertyKey();
+ }
+ }
+ if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) {
+ var punctuator = this.lookahead.value;
+ if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') {
+ isAsync = true;
+ token = this.lookahead;
+ key = this.parseObjectPropertyKey();
+ if (token.type === 3 /* Identifier */ && token.value === 'constructor') {
+ this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync);
+ }
+ }
+ }
+ }
+ var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
+ if (token.type === 3 /* Identifier */) {
+ if (token.value === 'get' && lookaheadPropertyKey) {
+ kind = 'get';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ this.context.allowYield = false;
+ value = this.parseGetterMethod();
+ }
+ else if (token.value === 'set' && lookaheadPropertyKey) {
+ kind = 'set';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ value = this.parseSetterMethod();
+ }
+ }
+ else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
+ kind = 'init';
+ computed = this.match('[');
+ key = this.parseObjectPropertyKey();
+ value = this.parseGeneratorMethod();
+ method = true;
+ }
+ if (!kind && key && this.match('(')) {
+ kind = 'init';
+ value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
+ method = true;
+ }
+ if (!kind) {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ if (kind === 'init') {
+ kind = 'method';
+ }
+ if (!computed) {
+ if (isStatic && this.isPropertyKey(key, 'prototype')) {
+ this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype);
+ }
+ if (!isStatic && this.isPropertyKey(key, 'constructor')) {
+ if (kind !== 'method' || !method || (value && value.generator)) {
+ this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod);
+ }
+ if (hasConstructor.value) {
+ this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor);
+ }
+ else {
+ hasConstructor.value = true;
+ }
+ kind = 'constructor';
+ }
+ }
+ return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic));
+ };
+ Parser.prototype.parseClassElementList = function () {
+ var body = [];
+ var hasConstructor = { value: false };
+ this.expect('{');
+ while (!this.match('}')) {
+ if (this.match(';')) {
+ this.nextToken();
+ }
+ else {
+ body.push(this.parseClassElement(hasConstructor));
+ }
+ }
+ this.expect('}');
+ return body;
+ };
+ Parser.prototype.parseClassBody = function () {
+ var node = this.createNode();
+ var elementList = this.parseClassElementList();
+ return this.finalize(node, new Node.ClassBody(elementList));
+ };
+ Parser.prototype.parseClassDeclaration = function (identifierIsOptional) {
+ var node = this.createNode();
+ var previousStrict = this.context.strict;
+ this.context.strict = true;
+ this.expectKeyword('class');
+ var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier();
+ var superClass = null;
+ if (this.matchKeyword('extends')) {
+ this.nextToken();
+ superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
+ }
+ var classBody = this.parseClassBody();
+ this.context.strict = previousStrict;
+ return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody));
+ };
+ Parser.prototype.parseClassExpression = function () {
+ var node = this.createNode();
+ var previousStrict = this.context.strict;
+ this.context.strict = true;
+ this.expectKeyword('class');
+ var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null;
+ var superClass = null;
+ if (this.matchKeyword('extends')) {
+ this.nextToken();
+ superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
+ }
+ var classBody = this.parseClassBody();
+ this.context.strict = previousStrict;
+ return this.finalize(node, new Node.ClassExpression(id, superClass, classBody));
+ };
+ // https://tc39.github.io/ecma262/#sec-scripts
+ // https://tc39.github.io/ecma262/#sec-modules
+ Parser.prototype.parseModule = function () {
+ this.context.strict = true;
+ this.context.isModule = true;
+ this.scanner.isModule = true;
+ var node = this.createNode();
+ var body = this.parseDirectivePrologues();
+ while (this.lookahead.type !== 2 /* EOF */) {
+ body.push(this.parseStatementListItem());
+ }
+ return this.finalize(node, new Node.Module(body));
+ };
+ Parser.prototype.parseScript = function () {
+ var node = this.createNode();
+ var body = this.parseDirectivePrologues();
+ while (this.lookahead.type !== 2 /* EOF */) {
+ body.push(this.parseStatementListItem());
+ }
+ return this.finalize(node, new Node.Script(body));
+ };
+ // https://tc39.github.io/ecma262/#sec-imports
+ Parser.prototype.parseModuleSpecifier = function () {
+ var node = this.createNode();
+ if (this.lookahead.type !== 8 /* StringLiteral */) {
+ this.throwError(messages_1.Messages.InvalidModuleSpecifier);
+ }
+ var token = this.nextToken();
+ var raw = this.getTokenRaw(token);
+ return this.finalize(node, new Node.Literal(token.value, raw));
+ };
+ // import {} ...;
+ Parser.prototype.parseImportSpecifier = function () {
+ var node = this.createNode();
+ var imported;
+ var local;
+ if (this.lookahead.type === 3 /* Identifier */) {
+ imported = this.parseVariableIdentifier();
+ local = imported;
+ if (this.matchContextualKeyword('as')) {
+ this.nextToken();
+ local = this.parseVariableIdentifier();
+ }
+ }
+ else {
+ imported = this.parseIdentifierName();
+ local = imported;
+ if (this.matchContextualKeyword('as')) {
+ this.nextToken();
+ local = this.parseVariableIdentifier();
+ }
+ else {
+ this.throwUnexpectedToken(this.nextToken());
+ }
+ }
+ return this.finalize(node, new Node.ImportSpecifier(local, imported));
+ };
+ // {foo, bar as bas}
+ Parser.prototype.parseNamedImports = function () {
+ this.expect('{');
+ var specifiers = [];
+ while (!this.match('}')) {
+ specifiers.push(this.parseImportSpecifier());
+ if (!this.match('}')) {
+ this.expect(',');
+ }
+ }
+ this.expect('}');
+ return specifiers;
+ };
+ // import ...;
+ Parser.prototype.parseImportDefaultSpecifier = function () {
+ var node = this.createNode();
+ var local = this.parseIdentifierName();
+ return this.finalize(node, new Node.ImportDefaultSpecifier(local));
+ };
+ // import <* as foo> ...;
+ Parser.prototype.parseImportNamespaceSpecifier = function () {
+ var node = this.createNode();
+ this.expect('*');
+ if (!this.matchContextualKeyword('as')) {
+ this.throwError(messages_1.Messages.NoAsAfterImportNamespace);
+ }
+ this.nextToken();
+ var local = this.parseIdentifierName();
+ return this.finalize(node, new Node.ImportNamespaceSpecifier(local));
+ };
+ Parser.prototype.parseImportDeclaration = function () {
+ if (this.context.inFunctionBody) {
+ this.throwError(messages_1.Messages.IllegalImportDeclaration);
+ }
+ var node = this.createNode();
+ this.expectKeyword('import');
+ var src;
+ var specifiers = [];
+ if (this.lookahead.type === 8 /* StringLiteral */) {
+ // import 'foo';
+ src = this.parseModuleSpecifier();
+ }
+ else {
+ if (this.match('{')) {
+ // import {bar}
+ specifiers = specifiers.concat(this.parseNamedImports());
+ }
+ else if (this.match('*')) {
+ // import * as foo
+ specifiers.push(this.parseImportNamespaceSpecifier());
+ }
+ else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) {
+ // import foo
+ specifiers.push(this.parseImportDefaultSpecifier());
+ if (this.match(',')) {
+ this.nextToken();
+ if (this.match('*')) {
+ // import foo, * as foo
+ specifiers.push(this.parseImportNamespaceSpecifier());
+ }
+ else if (this.match('{')) {
+ // import foo, {bar}
+ specifiers = specifiers.concat(this.parseNamedImports());
+ }
+ else {
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ }
+ }
+ else {
+ this.throwUnexpectedToken(this.nextToken());
+ }
+ if (!this.matchContextualKeyword('from')) {
+ var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
+ this.throwError(message, this.lookahead.value);
+ }
+ this.nextToken();
+ src = this.parseModuleSpecifier();
+ }
+ this.consumeSemicolon();
+ return this.finalize(node, new Node.ImportDeclaration(specifiers, src));
+ };
+ // https://tc39.github.io/ecma262/#sec-exports
+ Parser.prototype.parseExportSpecifier = function () {
+ var node = this.createNode();
+ var local = this.parseIdentifierName();
+ var exported = local;
+ if (this.matchContextualKeyword('as')) {
+ this.nextToken();
+ exported = this.parseIdentifierName();
+ }
+ return this.finalize(node, new Node.ExportSpecifier(local, exported));
+ };
+ Parser.prototype.parseExportDeclaration = function () {
+ if (this.context.inFunctionBody) {
+ this.throwError(messages_1.Messages.IllegalExportDeclaration);
+ }
+ var node = this.createNode();
+ this.expectKeyword('export');
+ var exportDeclaration;
+ if (this.matchKeyword('default')) {
+ // export default ...
+ this.nextToken();
+ if (this.matchKeyword('function')) {
+ // export default function foo () {}
+ // export default function () {}
+ var declaration = this.parseFunctionDeclaration(true);
+ exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
+ }
+ else if (this.matchKeyword('class')) {
+ // export default class foo {}
+ var declaration = this.parseClassDeclaration(true);
+ exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
+ }
+ else if (this.matchContextualKeyword('async')) {
+ // export default async function f () {}
+ // export default async function () {}
+ // export default async x => x
+ var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression();
+ exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
+ }
+ else {
+ if (this.matchContextualKeyword('from')) {
+ this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value);
+ }
+ // export default {};
+ // export default [];
+ // export default (1 + 2);
+ var declaration = this.match('{') ? this.parseObjectInitializer() :
+ this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression();
+ this.consumeSemicolon();
+ exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
+ }
+ }
+ else if (this.match('*')) {
+ // export * from 'foo';
+ this.nextToken();
+ if (!this.matchContextualKeyword('from')) {
+ var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
+ this.throwError(message, this.lookahead.value);
+ }
+ this.nextToken();
+ var src = this.parseModuleSpecifier();
+ this.consumeSemicolon();
+ exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src));
+ }
+ else if (this.lookahead.type === 4 /* Keyword */) {
+ // export var f = 1;
+ var declaration = void 0;
+ switch (this.lookahead.value) {
+ case 'let':
+ case 'const':
+ declaration = this.parseLexicalDeclaration({ inFor: false });
+ break;
+ case 'var':
+ case 'class':
+ case 'function':
+ declaration = this.parseStatementListItem();
+ break;
+ default:
+ this.throwUnexpectedToken(this.lookahead);
+ }
+ exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
+ }
+ else if (this.matchAsyncFunction()) {
+ var declaration = this.parseFunctionDeclaration();
+ exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
+ }
+ else {
+ var specifiers = [];
+ var source = null;
+ var isExportFromIdentifier = false;
+ this.expect('{');
+ while (!this.match('}')) {
+ isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default');
+ specifiers.push(this.parseExportSpecifier());
+ if (!this.match('}')) {
+ this.expect(',');
+ }
+ }
+ this.expect('}');
+ if (this.matchContextualKeyword('from')) {
+ // export {default} from 'foo';
+ // export {foo} from 'foo';
+ this.nextToken();
+ source = this.parseModuleSpecifier();
+ this.consumeSemicolon();
+ }
+ else if (isExportFromIdentifier) {
+ // export {default}; // missing fromClause
+ var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
+ this.throwError(message, this.lookahead.value);
+ }
+ else {
+ // export {foo};
+ this.consumeSemicolon();
+ }
+ exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source));
+ }
+ return exportDeclaration;
+ };
+ return Parser;
+ }());
+ exports.Parser = Parser;
+
+
+ /***/ },
+ /* 9 */
+ /***/ function(module, exports) {
+
+ "use strict";
+ // Ensure the condition is true, otherwise throw an error.
+ // This is only to have a better contract semantic, i.e. another safety net
+ // to catch a logic error. The condition shall be fulfilled in normal case.
+ // Do NOT use this to enforce a certain condition on any user input.
+ Object.defineProperty(exports, "__esModule", { value: true });
+ function assert(condition, message) {
+ /* istanbul ignore if */
+ if (!condition) {
+ throw new Error('ASSERT: ' + message);
+ }
+ }
+ exports.assert = assert;
+
+
+ /***/ },
+ /* 10 */
+ /***/ function(module, exports) {
+
+ "use strict";
+ /* tslint:disable:max-classes-per-file */
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var ErrorHandler = (function () {
+ function ErrorHandler() {
+ this.errors = [];
+ this.tolerant = false;
+ }
+ ErrorHandler.prototype.recordError = function (error) {
+ this.errors.push(error);
+ };
+ ErrorHandler.prototype.tolerate = function (error) {
+ if (this.tolerant) {
+ this.recordError(error);
+ }
+ else {
+ throw error;
+ }
+ };
+ ErrorHandler.prototype.constructError = function (msg, column) {
+ var error = new Error(msg);
+ try {
+ throw error;
+ }
+ catch (base) {
+ /* istanbul ignore else */
+ if (Object.create && Object.defineProperty) {
+ error = Object.create(base);
+ Object.defineProperty(error, 'column', { value: column });
+ }
+ }
+ /* istanbul ignore next */
+ return error;
+ };
+ ErrorHandler.prototype.createError = function (index, line, col, description) {
+ var msg = 'Line ' + line + ': ' + description;
+ var error = this.constructError(msg, col);
+ error.index = index;
+ error.lineNumber = line;
+ error.description = description;
+ return error;
+ };
+ ErrorHandler.prototype.throwError = function (index, line, col, description) {
+ throw this.createError(index, line, col, description);
+ };
+ ErrorHandler.prototype.tolerateError = function (index, line, col, description) {
+ var error = this.createError(index, line, col, description);
+ if (this.tolerant) {
+ this.recordError(error);
+ }
+ else {
+ throw error;
+ }
+ };
+ return ErrorHandler;
+ }());
+ exports.ErrorHandler = ErrorHandler;
+
+
+ /***/ },
+ /* 11 */
+ /***/ function(module, exports) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ // Error messages should be identical to V8.
+ exports.Messages = {
+ BadGetterArity: 'Getter must not have any formal parameters',
+ BadSetterArity: 'Setter must have exactly one formal parameter',
+ BadSetterRestParameter: 'Setter function argument must not be a rest parameter',
+ ConstructorIsAsync: 'Class constructor may not be an async method',
+ ConstructorSpecialMethod: 'Class constructor may not be an accessor',
+ DeclarationMissingInitializer: 'Missing initializer in %0 declaration',
+ DefaultRestParameter: 'Unexpected token =',
+ DuplicateBinding: 'Duplicate binding %0',
+ DuplicateConstructor: 'A class may only have one constructor',
+ DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',
+ ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer',
+ GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts',
+ IllegalBreak: 'Illegal break statement',
+ IllegalContinue: 'Illegal continue statement',
+ IllegalExportDeclaration: 'Unexpected token',
+ IllegalImportDeclaration: 'Unexpected token',
+ IllegalLanguageModeDirective: 'Illegal \'use strict\' directive in function with non-simple parameter list',
+ IllegalReturn: 'Illegal return statement',
+ InvalidEscapedReservedWord: 'Keyword must not contain escaped characters',
+ InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence',
+ InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
+ InvalidLHSInForIn: 'Invalid left-hand side in for-in',
+ InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',
+ InvalidModuleSpecifier: 'Unexpected token',
+ InvalidRegExp: 'Invalid regular expression',
+ LetInLexicalBinding: 'let is disallowed as a lexically bound name',
+ MissingFromClause: 'Unexpected token',
+ MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
+ NewlineAfterThrow: 'Illegal newline after throw',
+ NoAsAfterImportNamespace: 'Unexpected token',
+ NoCatchOrFinally: 'Missing catch or finally after try',
+ ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',
+ Redeclaration: '%0 \'%1\' has already been declared',
+ StaticPrototype: 'Classes may not have static property named prototype',
+ StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
+ StrictDelete: 'Delete of an unqualified identifier in strict mode.',
+ StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block',
+ StrictFunctionName: 'Function name may not be eval or arguments in strict mode',
+ StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',
+ StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
+ StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
+ StrictModeWith: 'Strict mode code may not include a with statement',
+ StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',
+ StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
+ StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',
+ StrictReservedWord: 'Use of future reserved word in strict mode',
+ StrictVarName: 'Variable name may not be eval or arguments in strict mode',
+ TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',
+ UnexpectedEOS: 'Unexpected end of input',
+ UnexpectedIdentifier: 'Unexpected identifier',
+ UnexpectedNumber: 'Unexpected number',
+ UnexpectedReserved: 'Unexpected reserved word',
+ UnexpectedString: 'Unexpected string',
+ UnexpectedTemplate: 'Unexpected quasi %0',
+ UnexpectedToken: 'Unexpected token %0',
+ UnexpectedTokenIllegal: 'Unexpected token ILLEGAL',
+ UnknownLabel: 'Undefined label \'%0\'',
+ UnterminatedRegExp: 'Invalid regular expression: missing /'
+ };
+
+
+ /***/ },
+ /* 12 */
+ /***/ function(module, exports, __webpack_require__) {
+
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ var assert_1 = __webpack_require__(9);
+ var character_1 = __webpack_require__(4);
+ var messages_1 = __webpack_require__(11);
+ function hexValue(ch) {
+ return '0123456789abcdef'.indexOf(ch.toLowerCase());
+ }
+ function octalValue(ch) {
+ return '01234567'.indexOf(ch);
+ }
+ var Scanner = (function () {
+ function Scanner(code, handler) {
+ this.source = code;
+ this.errorHandler = handler;
+ this.trackComment = false;
+ this.isModule = false;
+ this.length = code.length;
+ this.index = 0;
+ this.lineNumber = (code.length > 0) ? 1 : 0;
+ this.lineStart = 0;
+ this.curlyStack = [];
+ }
+ Scanner.prototype.saveState = function () {
+ return {
+ index: this.index,
+ lineNumber: this.lineNumber,
+ lineStart: this.lineStart
+ };
+ };
+ Scanner.prototype.restoreState = function (state) {
+ this.index = state.index;
+ this.lineNumber = state.lineNumber;
+ this.lineStart = state.lineStart;
+ };
+ Scanner.prototype.eof = function () {
+ return this.index >= this.length;
+ };
+ Scanner.prototype.throwUnexpectedToken = function (message) {
+ if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
+ return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
+ };
+ Scanner.prototype.tolerateUnexpectedToken = function (message) {
+ if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
+ this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
+ };
+ // https://tc39.github.io/ecma262/#sec-comments
+ Scanner.prototype.skipSingleLineComment = function (offset) {
+ var comments = [];
+ var start, loc;
+ if (this.trackComment) {
+ comments = [];
+ start = this.index - offset;
+ loc = {
+ start: {
+ line: this.lineNumber,
+ column: this.index - this.lineStart - offset
+ },
+ end: {}
+ };
+ }
+ while (!this.eof()) {
+ var ch = this.source.charCodeAt(this.index);
+ ++this.index;
+ if (character_1.Character.isLineTerminator(ch)) {
+ if (this.trackComment) {
+ loc.end = {
+ line: this.lineNumber,
+ column: this.index - this.lineStart - 1
+ };
+ var entry = {
+ multiLine: false,
+ slice: [start + offset, this.index - 1],
+ range: [start, this.index - 1],
+ loc: loc
+ };
+ comments.push(entry);
+ }
+ if (ch === 13 && this.source.charCodeAt(this.index) === 10) {
+ ++this.index;
+ }
+ ++this.lineNumber;
+ this.lineStart = this.index;
+ return comments;
+ }
+ }
+ if (this.trackComment) {
+ loc.end = {
+ line: this.lineNumber,
+ column: this.index - this.lineStart
+ };
+ var entry = {
+ multiLine: false,
+ slice: [start + offset, this.index],
+ range: [start, this.index],
+ loc: loc
+ };
+ comments.push(entry);
+ }
+ return comments;
+ };
+ Scanner.prototype.skipMultiLineComment = function () {
+ var comments = [];
+ var start, loc;
+ if (this.trackComment) {
+ comments = [];
+ start = this.index - 2;
+ loc = {
+ start: {
+ line: this.lineNumber,
+ column: this.index - this.lineStart - 2
+ },
+ end: {}
+ };
+ }
+ while (!this.eof()) {
+ var ch = this.source.charCodeAt(this.index);
+ if (character_1.Character.isLineTerminator(ch)) {
+ if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) {
+ ++this.index;
+ }
+ ++this.lineNumber;
+ ++this.index;
+ this.lineStart = this.index;
+ }
+ else if (ch === 0x2A) {
+ // Block comment ends with '*/'.
+ if (this.source.charCodeAt(this.index + 1) === 0x2F) {
+ this.index += 2;
+ if (this.trackComment) {
+ loc.end = {
+ line: this.lineNumber,
+ column: this.index - this.lineStart
+ };
+ var entry = {
+ multiLine: true,
+ slice: [start + 2, this.index - 2],
+ range: [start, this.index],
+ loc: loc
+ };
+ comments.push(entry);
+ }
+ return comments;
+ }
+ ++this.index;
+ }
+ else {
+ ++this.index;
+ }
+ }
+ // Ran off the end of the file - the whole thing is a comment
+ if (this.trackComment) {
+ loc.end = {
+ line: this.lineNumber,
+ column: this.index - this.lineStart
+ };
+ var entry = {
+ multiLine: true,
+ slice: [start + 2, this.index],
+ range: [start, this.index],
+ loc: loc
+ };
+ comments.push(entry);
+ }
+ this.tolerateUnexpectedToken();
+ return comments;
+ };
+ Scanner.prototype.scanComments = function () {
+ var comments;
+ if (this.trackComment) {
+ comments = [];
+ }
+ var start = (this.index === 0);
+ while (!this.eof()) {
+ var ch = this.source.charCodeAt(this.index);
+ if (character_1.Character.isWhiteSpace(ch)) {
+ ++this.index;
+ }
+ else if (character_1.Character.isLineTerminator(ch)) {
+ ++this.index;
+ if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) {
+ ++this.index;
+ }
+ ++this.lineNumber;
+ this.lineStart = this.index;
+ start = true;
+ }
+ else if (ch === 0x2F) {
+ ch = this.source.charCodeAt(this.index + 1);
+ if (ch === 0x2F) {
+ this.index += 2;
+ var comment = this.skipSingleLineComment(2);
+ if (this.trackComment) {
+ comments = comments.concat(comment);
+ }
+ start = true;
+ }
+ else if (ch === 0x2A) {
+ this.index += 2;
+ var comment = this.skipMultiLineComment();
+ if (this.trackComment) {
+ comments = comments.concat(comment);
+ }
+ }
+ else {
+ break;
+ }
+ }
+ else if (start && ch === 0x2D) {
+ // U+003E is '>'
+ if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) {
+ // '-->' is a single-line comment
+ this.index += 3;
+ var comment = this.skipSingleLineComment(3);
+ if (this.trackComment) {
+ comments = comments.concat(comment);
+ }
+ }
+ else {
+ break;
+ }
+ }
+ else if (ch === 0x3C && !this.isModule) {
+ if (this.source.slice(this.index + 1, this.index + 4) === '!--') {
+ this.index += 4; // ` (0,0,1,1,0,0)
+ optimize() {
+
+ // times or values may be shared with other tracks, so overwriting is unsafe
+ const times = AnimationUtils.arraySlice( this.times ),
+ values = AnimationUtils.arraySlice( this.values ),
+ stride = this.getValueSize(),
+
+ smoothInterpolation = this.getInterpolation() === InterpolateSmooth,
+
+ lastIndex = times.length - 1;
+
+ let writeIndex = 1;
+
+ for ( let i = 1; i < lastIndex; ++ i ) {
+
+ let keep = false;
+
+ const time = times[ i ];
+ const timeNext = times[ i + 1 ];
+
+ // remove adjacent keyframes scheduled at the same time
+
+ if ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {
+
+ if ( ! smoothInterpolation ) {
+
+ // remove unnecessary keyframes same as their neighbors
+
+ const offset = i * stride,
+ offsetP = offset - stride,
+ offsetN = offset + stride;
+
+ for ( let j = 0; j !== stride; ++ j ) {
+
+ const value = values[ offset + j ];
+
+ if ( value !== values[ offsetP + j ] ||
+ value !== values[ offsetN + j ] ) {
+
+ keep = true;
+ break;
+
+ }
+
+ }
+
+ } else {
+
+ keep = true;
+
+ }
+
+ }
+
+ // in-place compaction
+
+ if ( keep ) {
+
+ if ( i !== writeIndex ) {
+
+ times[ writeIndex ] = times[ i ];
+
+ const readOffset = i * stride,
+ writeOffset = writeIndex * stride;
+
+ for ( let j = 0; j !== stride; ++ j ) {
+
+ values[ writeOffset + j ] = values[ readOffset + j ];
+
+ }
+
+ }
+
+ ++ writeIndex;
+
+ }
+
+ }
+
+ // flush last keyframe (compaction looks ahead)
+
+ if ( lastIndex > 0 ) {
+
+ times[ writeIndex ] = times[ lastIndex ];
+
+ for ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {
+
+ values[ writeOffset + j ] = values[ readOffset + j ];
+
+ }
+
+ ++ writeIndex;
+
+ }
+
+ if ( writeIndex !== times.length ) {
+
+ this.times = AnimationUtils.arraySlice( times, 0, writeIndex );
+ this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );
+
+ } else {
+
+ this.times = times;
+ this.values = values;
+
+ }
+
+ return this;
+
+ }
+
+ clone() {
+
+ const times = AnimationUtils.arraySlice( this.times, 0 );
+ const values = AnimationUtils.arraySlice( this.values, 0 );
+
+ const TypedKeyframeTrack = this.constructor;
+ const track = new TypedKeyframeTrack( this.name, times, values );
+
+ // Interpolant argument to constructor is not saved, so copy the factory method directly.
+ track.createInterpolant = this.createInterpolant;
+
+ return track;
+
+ }
+
+ }
+
+ KeyframeTrack.prototype.TimeBufferType = Float32Array;
+ KeyframeTrack.prototype.ValueBufferType = Float32Array;
+ KeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;
+
+ /**
+ * A Track of Boolean keyframe values.
+ */
+ class BooleanKeyframeTrack extends KeyframeTrack {}
+
+ BooleanKeyframeTrack.prototype.ValueTypeName = 'bool';
+ BooleanKeyframeTrack.prototype.ValueBufferType = Array;
+ BooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;
+ BooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;
+ BooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;
+
+ /**
+ * A Track of keyframe values that represent color.
+ */
+ class ColorKeyframeTrack extends KeyframeTrack {}
+
+ ColorKeyframeTrack.prototype.ValueTypeName = 'color';
+
+ /**
+ * A Track of numeric keyframe values.
+ */
+ class NumberKeyframeTrack extends KeyframeTrack {}
+
+ NumberKeyframeTrack.prototype.ValueTypeName = 'number';
+
+ /**
+ * Spherical linear unit quaternion interpolant.
+ */
+
+ class QuaternionLinearInterpolant extends Interpolant {
+
+ constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
+
+ super( parameterPositions, sampleValues, sampleSize, resultBuffer );
+
+ }
+
+ interpolate_( i1, t0, t, t1 ) {
+
+ const result = this.resultBuffer,
+ values = this.sampleValues,
+ stride = this.valueSize,
+
+ alpha = ( t - t0 ) / ( t1 - t0 );
+
+ let offset = i1 * stride;
+
+ for ( let end = offset + stride; offset !== end; offset += 4 ) {
+
+ Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );
+
+ }
+
+ return result;
+
+ }
+
+ }
+
+ /**
+ * A Track of quaternion keyframe values.
+ */
+ class QuaternionKeyframeTrack extends KeyframeTrack {
+
+ InterpolantFactoryMethodLinear( result ) {
+
+ return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );
+
+ }
+
+ }
+
+ QuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';
+ // ValueBufferType is inherited
+ QuaternionKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;
+ QuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;
+
+ /**
+ * A Track that interpolates Strings
+ */
+ class StringKeyframeTrack extends KeyframeTrack {}
+
+ StringKeyframeTrack.prototype.ValueTypeName = 'string';
+ StringKeyframeTrack.prototype.ValueBufferType = Array;
+ StringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;
+ StringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;
+ StringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;
+
+ /**
+ * A Track of vectored keyframe values.
+ */
+ class VectorKeyframeTrack extends KeyframeTrack {}
+
+ VectorKeyframeTrack.prototype.ValueTypeName = 'vector';
+
+ class AnimationClip {
+
+ constructor( name, duration = - 1, tracks, blendMode = NormalAnimationBlendMode ) {
+
+ this.name = name;
+ this.tracks = tracks;
+ this.duration = duration;
+ this.blendMode = blendMode;
+
+ this.uuid = generateUUID();
+
+ // this means it should figure out its duration by scanning the tracks
+ if ( this.duration < 0 ) {
+
+ this.resetDuration();
+
+ }
+
+ }
+
+
+ static parse( json ) {
+
+ const tracks = [],
+ jsonTracks = json.tracks,
+ frameTime = 1.0 / ( json.fps || 1.0 );
+
+ for ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {
+
+ tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );
+
+ }
+
+ const clip = new this( json.name, json.duration, tracks, json.blendMode );
+ clip.uuid = json.uuid;
+
+ return clip;
+
+ }
+
+ static toJSON( clip ) {
+
+ const tracks = [],
+ clipTracks = clip.tracks;
+
+ const json = {
+
+ 'name': clip.name,
+ 'duration': clip.duration,
+ 'tracks': tracks,
+ 'uuid': clip.uuid,
+ 'blendMode': clip.blendMode
+
+ };
+
+ for ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {
+
+ tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );
+
+ }
+
+ return json;
+
+ }
+
+ static CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {
+
+ const numMorphTargets = morphTargetSequence.length;
+ const tracks = [];
+
+ for ( let i = 0; i < numMorphTargets; i ++ ) {
+
+ let times = [];
+ let values = [];
+
+ times.push(
+ ( i + numMorphTargets - 1 ) % numMorphTargets,
+ i,
+ ( i + 1 ) % numMorphTargets );
+
+ values.push( 0, 1, 0 );
+
+ const order = AnimationUtils.getKeyframeOrder( times );
+ times = AnimationUtils.sortedArray( times, 1, order );
+ values = AnimationUtils.sortedArray( values, 1, order );
+
+ // if there is a key at the first frame, duplicate it as the
+ // last frame as well for perfect loop.
+ if ( ! noLoop && times[ 0 ] === 0 ) {
+
+ times.push( numMorphTargets );
+ values.push( values[ 0 ] );
+
+ }
+
+ tracks.push(
+ new NumberKeyframeTrack(
+ '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',
+ times, values
+ ).scale( 1.0 / fps ) );
+
+ }
+
+ return new this( name, - 1, tracks );
+
+ }
+
+ static findByName( objectOrClipArray, name ) {
+
+ let clipArray = objectOrClipArray;
+
+ if ( ! Array.isArray( objectOrClipArray ) ) {
+
+ const o = objectOrClipArray;
+ clipArray = o.geometry && o.geometry.animations || o.animations;
+
+ }
+
+ for ( let i = 0; i < clipArray.length; i ++ ) {
+
+ if ( clipArray[ i ].name === name ) {
+
+ return clipArray[ i ];
+
+ }
+
+ }
+
+ return null;
+
+ }
+
+ static CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {
+
+ const animationToMorphTargets = {};
+
+ // tested with https://regex101.com/ on trick sequences
+ // such flamingo_flyA_003, flamingo_run1_003, crdeath0059
+ const pattern = /^([\w-]*?)([\d]+)$/;
+
+ // sort morph target names into animation groups based
+ // patterns like Walk_001, Walk_002, Run_001, Run_002
+ for ( let i = 0, il = morphTargets.length; i < il; i ++ ) {
+
+ const morphTarget = morphTargets[ i ];
+ const parts = morphTarget.name.match( pattern );
+
+ if ( parts && parts.length > 1 ) {
+
+ const name = parts[ 1 ];
+
+ let animationMorphTargets = animationToMorphTargets[ name ];
+
+ if ( ! animationMorphTargets ) {
+
+ animationToMorphTargets[ name ] = animationMorphTargets = [];
+
+ }
+
+ animationMorphTargets.push( morphTarget );
+
+ }
+
+ }
+
+ const clips = [];
+
+ for ( const name in animationToMorphTargets ) {
+
+ clips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );
+
+ }
+
+ return clips;
+
+ }
+
+ // parse the animation.hierarchy format
+ static parseAnimation( animation, bones ) {
+
+ if ( ! animation ) {
+
+ console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );
+ return null;
+
+ }
+
+ const addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {
+
+ // only return track if there are actually keys.
+ if ( animationKeys.length !== 0 ) {
+
+ const times = [];
+ const values = [];
+
+ AnimationUtils.flattenJSON( animationKeys, times, values, propertyName );
+
+ // empty keys are filtered out, so check again
+ if ( times.length !== 0 ) {
+
+ destTracks.push( new trackType( trackName, times, values ) );
+
+ }
+
+ }
+
+ };
+
+ const tracks = [];
+
+ const clipName = animation.name || 'default';
+ const fps = animation.fps || 30;
+ const blendMode = animation.blendMode;
+
+ // automatic length determination in AnimationClip.
+ let duration = animation.length || - 1;
+
+ const hierarchyTracks = animation.hierarchy || [];
+
+ for ( let h = 0; h < hierarchyTracks.length; h ++ ) {
+
+ const animationKeys = hierarchyTracks[ h ].keys;
+
+ // skip empty tracks
+ if ( ! animationKeys || animationKeys.length === 0 ) continue;
+
+ // process morph targets
+ if ( animationKeys[ 0 ].morphTargets ) {
+
+ // figure out all morph targets used in this track
+ const morphTargetNames = {};
+
+ let k;
+
+ for ( k = 0; k < animationKeys.length; k ++ ) {
+
+ if ( animationKeys[ k ].morphTargets ) {
+
+ for ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {
+
+ morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;
+
+ }
+
+ }
+
+ }
+
+ // create a track for each morph target with all zero
+ // morphTargetInfluences except for the keys in which
+ // the morphTarget is named.
+ for ( const morphTargetName in morphTargetNames ) {
+
+ const times = [];
+ const values = [];
+
+ for ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {
+
+ const animationKey = animationKeys[ k ];
+
+ times.push( animationKey.time );
+ values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );
+
+ }
+
+ tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );
+
+ }
+
+ duration = morphTargetNames.length * fps;
+
+ } else {
+
+ // ...assume skeletal animation
+
+ const boneName = '.bones[' + bones[ h ].name + ']';
+
+ addNonemptyTrack(
+ VectorKeyframeTrack, boneName + '.position',
+ animationKeys, 'pos', tracks );
+
+ addNonemptyTrack(
+ QuaternionKeyframeTrack, boneName + '.quaternion',
+ animationKeys, 'rot', tracks );
+
+ addNonemptyTrack(
+ VectorKeyframeTrack, boneName + '.scale',
+ animationKeys, 'scl', tracks );
+
+ }
+
+ }
+
+ if ( tracks.length === 0 ) {
+
+ return null;
+
+ }
+
+ const clip = new this( clipName, duration, tracks, blendMode );
+
+ return clip;
+
+ }
+
+ resetDuration() {
+
+ const tracks = this.tracks;
+ let duration = 0;
+
+ for ( let i = 0, n = tracks.length; i !== n; ++ i ) {
+
+ const track = this.tracks[ i ];
+
+ duration = Math.max( duration, track.times[ track.times.length - 1 ] );
+
+ }
+
+ this.duration = duration;
+
+ return this;
+
+ }
+
+ trim() {
+
+ for ( let i = 0; i < this.tracks.length; i ++ ) {
+
+ this.tracks[ i ].trim( 0, this.duration );
+
+ }
+
+ return this;
+
+ }
+
+ validate() {
+
+ let valid = true;
+
+ for ( let i = 0; i < this.tracks.length; i ++ ) {
+
+ valid = valid && this.tracks[ i ].validate();
+
+ }
+
+ return valid;
+
+ }
+
+ optimize() {
+
+ for ( let i = 0; i < this.tracks.length; i ++ ) {
+
+ this.tracks[ i ].optimize();
+
+ }
+
+ return this;
+
+ }
+
+ clone() {
+
+ const tracks = [];
+
+ for ( let i = 0; i < this.tracks.length; i ++ ) {
+
+ tracks.push( this.tracks[ i ].clone() );
+
+ }
+
+ return new this.constructor( this.name, this.duration, tracks, this.blendMode );
+
+ }
+
+ toJSON() {
+
+ return this.constructor.toJSON( this );
+
+ }
+
+ }
+
+ function getTrackTypeForValueTypeName( typeName ) {
+
+ switch ( typeName.toLowerCase() ) {
+
+ case 'scalar':
+ case 'double':
+ case 'float':
+ case 'number':
+ case 'integer':
+
+ return NumberKeyframeTrack;
+
+ case 'vector':
+ case 'vector2':
+ case 'vector3':
+ case 'vector4':
+
+ return VectorKeyframeTrack;
+
+ case 'color':
+
+ return ColorKeyframeTrack;
+
+ case 'quaternion':
+
+ return QuaternionKeyframeTrack;
+
+ case 'bool':
+ case 'boolean':
+
+ return BooleanKeyframeTrack;
+
+ case 'string':
+
+ return StringKeyframeTrack;
+
+ }
+
+ throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );
+
+ }
+
+ function parseKeyframeTrack( json ) {
+
+ if ( json.type === undefined ) {
+
+ throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );
+
+ }
+
+ const trackType = getTrackTypeForValueTypeName( json.type );
+
+ if ( json.times === undefined ) {
+
+ const times = [], values = [];
+
+ AnimationUtils.flattenJSON( json.keys, times, values, 'value' );
+
+ json.times = times;
+ json.values = values;
+
+ }
+
+ // derived classes can define a static parse method
+ if ( trackType.parse !== undefined ) {
+
+ return trackType.parse( json );
+
+ } else {
+
+ // by default, we assume a constructor compatible with the base
+ return new trackType( json.name, json.times, json.values, json.interpolation );
+
+ }
+
+ }
+
+ const Cache = {
+
+ enabled: false,
+
+ files: {},
+
+ add: function ( key, file ) {
+
+ if ( this.enabled === false ) return;
+
+ // console.log( 'THREE.Cache', 'Adding key:', key );
+
+ this.files[ key ] = file;
+
+ },
+
+ get: function ( key ) {
+
+ if ( this.enabled === false ) return;
+
+ // console.log( 'THREE.Cache', 'Checking key:', key );
+
+ return this.files[ key ];
+
+ },
+
+ remove: function ( key ) {
+
+ delete this.files[ key ];
+
+ },
+
+ clear: function () {
+
+ this.files = {};
+
+ }
+
+ };
+
+ class LoadingManager {
+
+ constructor( onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ let isLoading = false;
+ let itemsLoaded = 0;
+ let itemsTotal = 0;
+ let urlModifier = undefined;
+ const handlers = [];
+
+ // Refer to #5689 for the reason why we don't set .onStart
+ // in the constructor
+
+ this.onStart = undefined;
+ this.onLoad = onLoad;
+ this.onProgress = onProgress;
+ this.onError = onError;
+
+ this.itemStart = function ( url ) {
+
+ itemsTotal ++;
+
+ if ( isLoading === false ) {
+
+ if ( scope.onStart !== undefined ) {
+
+ scope.onStart( url, itemsLoaded, itemsTotal );
+
+ }
+
+ }
+
+ isLoading = true;
+
+ };
+
+ this.itemEnd = function ( url ) {
+
+ itemsLoaded ++;
+
+ if ( scope.onProgress !== undefined ) {
+
+ scope.onProgress( url, itemsLoaded, itemsTotal );
+
+ }
+
+ if ( itemsLoaded === itemsTotal ) {
+
+ isLoading = false;
+
+ if ( scope.onLoad !== undefined ) {
+
+ scope.onLoad();
+
+ }
+
+ }
+
+ };
+
+ this.itemError = function ( url ) {
+
+ if ( scope.onError !== undefined ) {
+
+ scope.onError( url );
+
+ }
+
+ };
+
+ this.resolveURL = function ( url ) {
+
+ if ( urlModifier ) {
+
+ return urlModifier( url );
+
+ }
+
+ return url;
+
+ };
+
+ this.setURLModifier = function ( transform ) {
+
+ urlModifier = transform;
+
+ return this;
+
+ };
+
+ this.addHandler = function ( regex, loader ) {
+
+ handlers.push( regex, loader );
+
+ return this;
+
+ };
+
+ this.removeHandler = function ( regex ) {
+
+ const index = handlers.indexOf( regex );
+
+ if ( index !== - 1 ) {
+
+ handlers.splice( index, 2 );
+
+ }
+
+ return this;
+
+ };
+
+ this.getHandler = function ( file ) {
+
+ for ( let i = 0, l = handlers.length; i < l; i += 2 ) {
+
+ const regex = handlers[ i ];
+ const loader = handlers[ i + 1 ];
+
+ if ( regex.global ) regex.lastIndex = 0; // see #17920
+
+ if ( regex.test( file ) ) {
+
+ return loader;
+
+ }
+
+ }
+
+ return null;
+
+ };
+
+ }
+
+ }
+
+ const DefaultLoadingManager = new LoadingManager();
+
+ class Loader {
+
+ constructor( manager ) {
+
+ this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
+
+ this.crossOrigin = 'anonymous';
+ this.withCredentials = false;
+ this.path = '';
+ this.resourcePath = '';
+ this.requestHeader = {};
+
+ }
+
+ load( /* url, onLoad, onProgress, onError */ ) {}
+
+ loadAsync( url, onProgress ) {
+
+ const scope = this;
+
+ return new Promise( function ( resolve, reject ) {
+
+ scope.load( url, resolve, onProgress, reject );
+
+ } );
+
+ }
+
+ parse( /* data */ ) {}
+
+ setCrossOrigin( crossOrigin ) {
+
+ this.crossOrigin = crossOrigin;
+ return this;
+
+ }
+
+ setWithCredentials( value ) {
+
+ this.withCredentials = value;
+ return this;
+
+ }
+
+ setPath( path ) {
+
+ this.path = path;
+ return this;
+
+ }
+
+ setResourcePath( resourcePath ) {
+
+ this.resourcePath = resourcePath;
+ return this;
+
+ }
+
+ setRequestHeader( requestHeader ) {
+
+ this.requestHeader = requestHeader;
+ return this;
+
+ }
+
+ }
+
+ const loading = {};
+
+ class FileLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ if ( url === undefined ) url = '';
+
+ if ( this.path !== undefined ) url = this.path + url;
+
+ url = this.manager.resolveURL( url );
+
+ const cached = Cache.get( url );
+
+ if ( cached !== undefined ) {
+
+ this.manager.itemStart( url );
+
+ setTimeout( () => {
+
+ if ( onLoad ) onLoad( cached );
+
+ this.manager.itemEnd( url );
+
+ }, 0 );
+
+ return cached;
+
+ }
+
+ // Check if request is duplicate
+
+ if ( loading[ url ] !== undefined ) {
+
+ loading[ url ].push( {
+
+ onLoad: onLoad,
+ onProgress: onProgress,
+ onError: onError
+
+ } );
+
+ return;
+
+ }
+
+ // Initialise array for duplicate requests
+ loading[ url ] = [];
+
+ loading[ url ].push( {
+ onLoad: onLoad,
+ onProgress: onProgress,
+ onError: onError,
+ } );
+
+ // create request
+ const req = new Request( url, {
+ headers: new Headers( this.requestHeader ),
+ credentials: this.withCredentials ? 'include' : 'same-origin',
+ // An abort controller could be added within a future PR
+ } );
+
+ // record states ( avoid data race )
+ const mimeType = this.mimeType;
+ const responseType = this.responseType;
+
+ // start the fetch
+ fetch( req )
+ .then( response => {
+
+ if ( response.status === 200 || response.status === 0 ) {
+
+ // Some browsers return HTTP Status 0 when using non-http protocol
+ // e.g. 'file://' or 'data://'. Handle as success.
+
+ if ( response.status === 0 ) {
+
+ console.warn( 'THREE.FileLoader: HTTP Status 0 received.' );
+
+ }
+
+ // Workaround: Checking if response.body === undefined for Alipay browser #23548
+
+ if ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {
+
+ return response;
+
+ }
+
+ const callbacks = loading[ url ];
+ const reader = response.body.getReader();
+ const contentLength = response.headers.get( 'Content-Length' );
+ const total = contentLength ? parseInt( contentLength ) : 0;
+ const lengthComputable = total !== 0;
+ let loaded = 0;
+
+ // periodically read data into the new stream tracking while download progress
+ const stream = new ReadableStream( {
+ start( controller ) {
+
+ readData();
+
+ function readData() {
+
+ reader.read().then( ( { done, value } ) => {
+
+ if ( done ) {
+
+ controller.close();
+
+ } else {
+
+ loaded += value.byteLength;
+
+ const event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );
+ for ( let i = 0, il = callbacks.length; i < il; i ++ ) {
+
+ const callback = callbacks[ i ];
+ if ( callback.onProgress ) callback.onProgress( event );
+
+ }
+
+ controller.enqueue( value );
+ readData();
+
+ }
+
+ } );
+
+ }
+
+ }
+
+ } );
+
+ return new Response( stream );
+
+ } else {
+
+ throw Error( `fetch for "${response.url}" responded with ${response.status}: ${response.statusText}` );
+
+ }
+
+ } )
+ .then( response => {
+
+ switch ( responseType ) {
+
+ case 'arraybuffer':
+
+ return response.arrayBuffer();
+
+ case 'blob':
+
+ return response.blob();
+
+ case 'document':
+
+ return response.text()
+ .then( text => {
+
+ const parser = new DOMParser();
+ return parser.parseFromString( text, mimeType );
+
+ } );
+
+ case 'json':
+
+ return response.json();
+
+ default:
+
+ if ( mimeType === undefined ) {
+
+ return response.text();
+
+ } else {
+
+ // sniff encoding
+ const re = /charset="?([^;"\s]*)"?/i;
+ const exec = re.exec( mimeType );
+ const label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;
+ const decoder = new TextDecoder( label );
+ return response.arrayBuffer().then( ab => decoder.decode( ab ) );
+
+ }
+
+ }
+
+ } )
+ .then( data => {
+
+ // Add to cache only on HTTP success, so that we do not cache
+ // error response bodies as proper responses to requests.
+ Cache.add( url, data );
+
+ const callbacks = loading[ url ];
+ delete loading[ url ];
+
+ for ( let i = 0, il = callbacks.length; i < il; i ++ ) {
+
+ const callback = callbacks[ i ];
+ if ( callback.onLoad ) callback.onLoad( data );
+
+ }
+
+ } )
+ .catch( err => {
+
+ // Abort errors and other errors are handled the same
+
+ const callbacks = loading[ url ];
+
+ if ( callbacks === undefined ) {
+
+ // When onLoad was called and url was deleted in `loading`
+ this.manager.itemError( url );
+ throw err;
+
+ }
+
+ delete loading[ url ];
+
+ for ( let i = 0, il = callbacks.length; i < il; i ++ ) {
+
+ const callback = callbacks[ i ];
+ if ( callback.onError ) callback.onError( err );
+
+ }
+
+ this.manager.itemError( url );
+
+ } )
+ .finally( () => {
+
+ this.manager.itemEnd( url );
+
+ } );
+
+ this.manager.itemStart( url );
+
+ }
+
+ setResponseType( value ) {
+
+ this.responseType = value;
+ return this;
+
+ }
+
+ setMimeType( value ) {
+
+ this.mimeType = value;
+ return this;
+
+ }
+
+ }
+
+ class AnimationLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const loader = new FileLoader( this.manager );
+ loader.setPath( this.path );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( this.withCredentials );
+ loader.load( url, function ( text ) {
+
+ try {
+
+ onLoad( scope.parse( JSON.parse( text ) ) );
+
+ } catch ( e ) {
+
+ if ( onError ) {
+
+ onError( e );
+
+ } else {
+
+ console.error( e );
+
+ }
+
+ scope.manager.itemError( url );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+ parse( json ) {
+
+ const animations = [];
+
+ for ( let i = 0; i < json.length; i ++ ) {
+
+ const clip = AnimationClip.parse( json[ i ] );
+
+ animations.push( clip );
+
+ }
+
+ return animations;
+
+ }
+
+ }
+
+ /**
+ * Abstract Base class to block based textures loader (dds, pvr, ...)
+ *
+ * Sub classes have to implement the parse() method which will be used in load().
+ */
+
+ class CompressedTextureLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const images = [];
+
+ const texture = new CompressedTexture();
+
+ const loader = new FileLoader( this.manager );
+ loader.setPath( this.path );
+ loader.setResponseType( 'arraybuffer' );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( scope.withCredentials );
+
+ let loaded = 0;
+
+ function loadTexture( i ) {
+
+ loader.load( url[ i ], function ( buffer ) {
+
+ const texDatas = scope.parse( buffer, true );
+
+ images[ i ] = {
+ width: texDatas.width,
+ height: texDatas.height,
+ format: texDatas.format,
+ mipmaps: texDatas.mipmaps
+ };
+
+ loaded += 1;
+
+ if ( loaded === 6 ) {
+
+ if ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;
+
+ texture.image = images;
+ texture.format = texDatas.format;
+ texture.needsUpdate = true;
+
+ if ( onLoad ) onLoad( texture );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+ if ( Array.isArray( url ) ) {
+
+ for ( let i = 0, il = url.length; i < il; ++ i ) {
+
+ loadTexture( i );
+
+ }
+
+ } else {
+
+ // compressed cubemap texture stored in a single DDS file
+
+ loader.load( url, function ( buffer ) {
+
+ const texDatas = scope.parse( buffer, true );
+
+ if ( texDatas.isCubemap ) {
+
+ const faces = texDatas.mipmaps.length / texDatas.mipmapCount;
+
+ for ( let f = 0; f < faces; f ++ ) {
+
+ images[ f ] = { mipmaps: [] };
+
+ for ( let i = 0; i < texDatas.mipmapCount; i ++ ) {
+
+ images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );
+ images[ f ].format = texDatas.format;
+ images[ f ].width = texDatas.width;
+ images[ f ].height = texDatas.height;
+
+ }
+
+ }
+
+ texture.image = images;
+
+ } else {
+
+ texture.image.width = texDatas.width;
+ texture.image.height = texDatas.height;
+ texture.mipmaps = texDatas.mipmaps;
+
+ }
+
+ if ( texDatas.mipmapCount === 1 ) {
+
+ texture.minFilter = LinearFilter;
+
+ }
+
+ texture.format = texDatas.format;
+ texture.needsUpdate = true;
+
+ if ( onLoad ) onLoad( texture );
+
+ }, onProgress, onError );
+
+ }
+
+ return texture;
+
+ }
+
+ }
+
+ class ImageLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ if ( this.path !== undefined ) url = this.path + url;
+
+ url = this.manager.resolveURL( url );
+
+ const scope = this;
+
+ const cached = Cache.get( url );
+
+ if ( cached !== undefined ) {
+
+ scope.manager.itemStart( url );
+
+ setTimeout( function () {
+
+ if ( onLoad ) onLoad( cached );
+
+ scope.manager.itemEnd( url );
+
+ }, 0 );
+
+ return cached;
+
+ }
+
+ const image = createElementNS( 'img' );
+
+ function onImageLoad() {
+
+ removeEventListeners();
+
+ Cache.add( url, this );
+
+ if ( onLoad ) onLoad( this );
+
+ scope.manager.itemEnd( url );
+
+ }
+
+ function onImageError( event ) {
+
+ removeEventListeners();
+
+ if ( onError ) onError( event );
+
+ scope.manager.itemError( url );
+ scope.manager.itemEnd( url );
+
+ }
+
+ function removeEventListeners() {
+
+ image.removeEventListener( 'load', onImageLoad, false );
+ image.removeEventListener( 'error', onImageError, false );
+
+ }
+
+ image.addEventListener( 'load', onImageLoad, false );
+ image.addEventListener( 'error', onImageError, false );
+
+ if ( url.slice( 0, 5 ) !== 'data:' ) {
+
+ if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;
+
+ }
+
+ scope.manager.itemStart( url );
+
+ image.src = url;
+
+ return image;
+
+ }
+
+ }
+
+ class CubeTextureLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( urls, onLoad, onProgress, onError ) {
+
+ const texture = new CubeTexture();
+
+ const loader = new ImageLoader( this.manager );
+ loader.setCrossOrigin( this.crossOrigin );
+ loader.setPath( this.path );
+
+ let loaded = 0;
+
+ function loadTexture( i ) {
+
+ loader.load( urls[ i ], function ( image ) {
+
+ texture.images[ i ] = image;
+
+ loaded ++;
+
+ if ( loaded === 6 ) {
+
+ texture.needsUpdate = true;
+
+ if ( onLoad ) onLoad( texture );
+
+ }
+
+ }, undefined, onError );
+
+ }
+
+ for ( let i = 0; i < urls.length; ++ i ) {
+
+ loadTexture( i );
+
+ }
+
+ return texture;
+
+ }
+
+ }
+
+ /**
+ * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)
+ *
+ * Sub classes have to implement the parse() method which will be used in load().
+ */
+
+ class DataTextureLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const texture = new DataTexture();
+
+ const loader = new FileLoader( this.manager );
+ loader.setResponseType( 'arraybuffer' );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setPath( this.path );
+ loader.setWithCredentials( scope.withCredentials );
+ loader.load( url, function ( buffer ) {
+
+ const texData = scope.parse( buffer );
+
+ if ( ! texData ) return;
+
+ if ( texData.image !== undefined ) {
+
+ texture.image = texData.image;
+
+ } else if ( texData.data !== undefined ) {
+
+ texture.image.width = texData.width;
+ texture.image.height = texData.height;
+ texture.image.data = texData.data;
+
+ }
+
+ texture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;
+ texture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;
+
+ texture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;
+ texture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;
+
+ texture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;
+
+ if ( texData.encoding !== undefined ) {
+
+ texture.encoding = texData.encoding;
+
+ }
+
+ if ( texData.flipY !== undefined ) {
+
+ texture.flipY = texData.flipY;
+
+ }
+
+ if ( texData.format !== undefined ) {
+
+ texture.format = texData.format;
+
+ }
+
+ if ( texData.type !== undefined ) {
+
+ texture.type = texData.type;
+
+ }
+
+ if ( texData.mipmaps !== undefined ) {
+
+ texture.mipmaps = texData.mipmaps;
+ texture.minFilter = LinearMipmapLinearFilter; // presumably...
+
+ }
+
+ if ( texData.mipmapCount === 1 ) {
+
+ texture.minFilter = LinearFilter;
+
+ }
+
+ if ( texData.generateMipmaps !== undefined ) {
+
+ texture.generateMipmaps = texData.generateMipmaps;
+
+ }
+
+ texture.needsUpdate = true;
+
+ if ( onLoad ) onLoad( texture, texData );
+
+ }, onProgress, onError );
+
+
+ return texture;
+
+ }
+
+ }
+
+ class TextureLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const texture = new Texture();
+
+ const loader = new ImageLoader( this.manager );
+ loader.setCrossOrigin( this.crossOrigin );
+ loader.setPath( this.path );
+
+ loader.load( url, function ( image ) {
+
+ texture.image = image;
+ texture.needsUpdate = true;
+
+ if ( onLoad !== undefined ) {
+
+ onLoad( texture );
+
+ }
+
+ }, onProgress, onError );
+
+ return texture;
+
+ }
+
+ }
+
+ class Light extends Object3D {
+
+ constructor( color, intensity = 1 ) {
+
+ super();
+
+ this.type = 'Light';
+
+ this.color = new Color( color );
+ this.intensity = intensity;
+
+ }
+
+ dispose() {
+
+ // Empty here in base class; some subclasses override.
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.color.copy( source.color );
+ this.intensity = source.intensity;
+
+ return this;
+
+ }
+
+ toJSON( meta ) {
+
+ const data = super.toJSON( meta );
+
+ data.object.color = this.color.getHex();
+ data.object.intensity = this.intensity;
+
+ if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();
+
+ if ( this.distance !== undefined ) data.object.distance = this.distance;
+ if ( this.angle !== undefined ) data.object.angle = this.angle;
+ if ( this.decay !== undefined ) data.object.decay = this.decay;
+ if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;
+
+ if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();
+
+ return data;
+
+ }
+
+ }
+
+ Light.prototype.isLight = true;
+
+ class HemisphereLight extends Light {
+
+ constructor( skyColor, groundColor, intensity ) {
+
+ super( skyColor, intensity );
+
+ this.type = 'HemisphereLight';
+
+ this.position.copy( Object3D.DefaultUp );
+ this.updateMatrix();
+
+ this.groundColor = new Color( groundColor );
+
+ }
+
+ copy( source ) {
+
+ Light.prototype.copy.call( this, source );
+
+ this.groundColor.copy( source.groundColor );
+
+ return this;
+
+ }
+
+ }
+
+ HemisphereLight.prototype.isHemisphereLight = true;
+
+ const _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();
+ const _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();
+ const _lookTarget$1 = /*@__PURE__*/ new Vector3();
+
+ class LightShadow {
+
+ constructor( camera ) {
+
+ this.camera = camera;
+
+ this.bias = 0;
+ this.normalBias = 0;
+ this.radius = 1;
+ this.blurSamples = 8;
+
+ this.mapSize = new Vector2( 512, 512 );
+
+ this.map = null;
+ this.mapPass = null;
+ this.matrix = new Matrix4();
+
+ this.autoUpdate = true;
+ this.needsUpdate = false;
+
+ this._frustum = new Frustum();
+ this._frameExtents = new Vector2( 1, 1 );
+
+ this._viewportCount = 1;
+
+ this._viewports = [
+
+ new Vector4$1( 0, 0, 1, 1 )
+
+ ];
+
+ }
+
+ getViewportCount() {
+
+ return this._viewportCount;
+
+ }
+
+ getFrustum() {
+
+ return this._frustum;
+
+ }
+
+ updateMatrices( light ) {
+
+ const shadowCamera = this.camera;
+ const shadowMatrix = this.matrix;
+
+ _lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );
+ shadowCamera.position.copy( _lightPositionWorld$1 );
+
+ _lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );
+ shadowCamera.lookAt( _lookTarget$1 );
+ shadowCamera.updateMatrixWorld();
+
+ _projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
+ this._frustum.setFromProjectionMatrix( _projScreenMatrix$1 );
+
+ shadowMatrix.set(
+ 0.5, 0.0, 0.0, 0.5,
+ 0.0, 0.5, 0.0, 0.5,
+ 0.0, 0.0, 0.5, 0.5,
+ 0.0, 0.0, 0.0, 1.0
+ );
+
+ shadowMatrix.multiply( shadowCamera.projectionMatrix );
+ shadowMatrix.multiply( shadowCamera.matrixWorldInverse );
+
+ }
+
+ getViewport( viewportIndex ) {
+
+ return this._viewports[ viewportIndex ];
+
+ }
+
+ getFrameExtents() {
+
+ return this._frameExtents;
+
+ }
+
+ dispose() {
+
+ if ( this.map ) {
+
+ this.map.dispose();
+
+ }
+
+ if ( this.mapPass ) {
+
+ this.mapPass.dispose();
+
+ }
+
+ }
+
+ copy( source ) {
+
+ this.camera = source.camera.clone();
+
+ this.bias = source.bias;
+ this.radius = source.radius;
+
+ this.mapSize.copy( source.mapSize );
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ toJSON() {
+
+ const object = {};
+
+ if ( this.bias !== 0 ) object.bias = this.bias;
+ if ( this.normalBias !== 0 ) object.normalBias = this.normalBias;
+ if ( this.radius !== 1 ) object.radius = this.radius;
+ if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();
+
+ object.camera = this.camera.toJSON( false ).object;
+ delete object.camera.matrix;
+
+ return object;
+
+ }
+
+ }
+
+ class SpotLightShadow extends LightShadow {
+
+ constructor() {
+
+ super( new PerspectiveCamera( 50, 1, 0.5, 500 ) );
+
+ this.focus = 1;
+
+ }
+
+ updateMatrices( light ) {
+
+ const camera = this.camera;
+
+ const fov = RAD2DEG * 2 * light.angle * this.focus;
+ const aspect = this.mapSize.width / this.mapSize.height;
+ const far = light.distance || camera.far;
+
+ if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {
+
+ camera.fov = fov;
+ camera.aspect = aspect;
+ camera.far = far;
+ camera.updateProjectionMatrix();
+
+ }
+
+ super.updateMatrices( light );
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.focus = source.focus;
+
+ return this;
+
+ }
+
+ }
+
+ SpotLightShadow.prototype.isSpotLightShadow = true;
+
+ class SpotLight extends Light {
+
+ constructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 1 ) {
+
+ super( color, intensity );
+
+ this.type = 'SpotLight';
+
+ this.position.copy( Object3D.DefaultUp );
+ this.updateMatrix();
+
+ this.target = new Object3D();
+
+ this.distance = distance;
+ this.angle = angle;
+ this.penumbra = penumbra;
+ this.decay = decay; // for physically correct lights, should be 2.
+
+ this.shadow = new SpotLightShadow();
+
+ }
+
+ get power() {
+
+ // compute the light's luminous power (in lumens) from its intensity (in candela)
+ // by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)
+ return this.intensity * Math.PI;
+
+ }
+
+ set power( power ) {
+
+ // set the light's intensity (in candela) from the desired luminous power (in lumens)
+ this.intensity = power / Math.PI;
+
+ }
+
+ dispose() {
+
+ this.shadow.dispose();
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.distance = source.distance;
+ this.angle = source.angle;
+ this.penumbra = source.penumbra;
+ this.decay = source.decay;
+
+ this.target = source.target.clone();
+
+ this.shadow = source.shadow.clone();
+
+ return this;
+
+ }
+
+ }
+
+ SpotLight.prototype.isSpotLight = true;
+
+ const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
+ const _lightPositionWorld = /*@__PURE__*/ new Vector3();
+ const _lookTarget = /*@__PURE__*/ new Vector3();
+
+ class PointLightShadow extends LightShadow {
+
+ constructor() {
+
+ super( new PerspectiveCamera( 90, 1, 0.5, 500 ) );
+
+ this._frameExtents = new Vector2( 4, 2 );
+
+ this._viewportCount = 6;
+
+ this._viewports = [
+ // These viewports map a cube-map onto a 2D texture with the
+ // following orientation:
+ //
+ // xzXZ
+ // y Y
+ //
+ // X - Positive x direction
+ // x - Negative x direction
+ // Y - Positive y direction
+ // y - Negative y direction
+ // Z - Positive z direction
+ // z - Negative z direction
+
+ // positive X
+ new Vector4$1( 2, 1, 1, 1 ),
+ // negative X
+ new Vector4$1( 0, 1, 1, 1 ),
+ // positive Z
+ new Vector4$1( 3, 1, 1, 1 ),
+ // negative Z
+ new Vector4$1( 1, 1, 1, 1 ),
+ // positive Y
+ new Vector4$1( 3, 0, 1, 1 ),
+ // negative Y
+ new Vector4$1( 1, 0, 1, 1 )
+ ];
+
+ this._cubeDirections = [
+ new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),
+ new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )
+ ];
+
+ this._cubeUps = [
+ new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),
+ new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 )
+ ];
+
+ }
+
+ updateMatrices( light, viewportIndex = 0 ) {
+
+ const camera = this.camera;
+ const shadowMatrix = this.matrix;
+
+ const far = light.distance || camera.far;
+
+ if ( far !== camera.far ) {
+
+ camera.far = far;
+ camera.updateProjectionMatrix();
+
+ }
+
+ _lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
+ camera.position.copy( _lightPositionWorld );
+
+ _lookTarget.copy( camera.position );
+ _lookTarget.add( this._cubeDirections[ viewportIndex ] );
+ camera.up.copy( this._cubeUps[ viewportIndex ] );
+ camera.lookAt( _lookTarget );
+ camera.updateMatrixWorld();
+
+ shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );
+
+ _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
+ this._frustum.setFromProjectionMatrix( _projScreenMatrix );
+
+ }
+
+ }
+
+ PointLightShadow.prototype.isPointLightShadow = true;
+
+ class PointLight extends Light {
+
+ constructor( color, intensity, distance = 0, decay = 1 ) {
+
+ super( color, intensity );
+
+ this.type = 'PointLight';
+
+ this.distance = distance;
+ this.decay = decay; // for physically correct lights, should be 2.
+
+ this.shadow = new PointLightShadow();
+
+ }
+
+ get power() {
+
+ // compute the light's luminous power (in lumens) from its intensity (in candela)
+ // for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)
+ return this.intensity * 4 * Math.PI;
+
+ }
+
+ set power( power ) {
+
+ // set the light's intensity (in candela) from the desired luminous power (in lumens)
+ this.intensity = power / ( 4 * Math.PI );
+
+ }
+
+ dispose() {
+
+ this.shadow.dispose();
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.distance = source.distance;
+ this.decay = source.decay;
+
+ this.shadow = source.shadow.clone();
+
+ return this;
+
+ }
+
+ }
+
+ PointLight.prototype.isPointLight = true;
+
+ class DirectionalLightShadow extends LightShadow {
+
+ constructor() {
+
+ super( new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );
+
+ }
+
+ }
+
+ DirectionalLightShadow.prototype.isDirectionalLightShadow = true;
+
+ class DirectionalLight extends Light {
+
+ constructor( color, intensity ) {
+
+ super( color, intensity );
+
+ this.type = 'DirectionalLight';
+
+ this.position.copy( Object3D.DefaultUp );
+ this.updateMatrix();
+
+ this.target = new Object3D();
+
+ this.shadow = new DirectionalLightShadow();
+
+ }
+
+ dispose() {
+
+ this.shadow.dispose();
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.target = source.target.clone();
+ this.shadow = source.shadow.clone();
+
+ return this;
+
+ }
+
+ }
+
+ DirectionalLight.prototype.isDirectionalLight = true;
+
+ class AmbientLight extends Light {
+
+ constructor( color, intensity ) {
+
+ super( color, intensity );
+
+ this.type = 'AmbientLight';
+
+ }
+
+ }
+
+ AmbientLight.prototype.isAmbientLight = true;
+
+ class RectAreaLight extends Light {
+
+ constructor( color, intensity, width = 10, height = 10 ) {
+
+ super( color, intensity );
+
+ this.type = 'RectAreaLight';
+
+ this.width = width;
+ this.height = height;
+
+ }
+
+ get power() {
+
+ // compute the light's luminous power (in lumens) from its intensity (in nits)
+ return this.intensity * this.width * this.height * Math.PI;
+
+ }
+
+ set power( power ) {
+
+ // set the light's intensity (in nits) from the desired luminous power (in lumens)
+ this.intensity = power / ( this.width * this.height * Math.PI );
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.width = source.width;
+ this.height = source.height;
+
+ return this;
+
+ }
+
+ toJSON( meta ) {
+
+ const data = super.toJSON( meta );
+
+ data.object.width = this.width;
+ data.object.height = this.height;
+
+ return data;
+
+ }
+
+ }
+
+ RectAreaLight.prototype.isRectAreaLight = true;
+
+ /**
+ * Primary reference:
+ * https://graphics.stanford.edu/papers/envmap/envmap.pdf
+ *
+ * Secondary reference:
+ * https://www.ppsloan.org/publications/StupidSH36.pdf
+ */
+
+ // 3-band SH defined by 9 coefficients
+
+ class SphericalHarmonics3 {
+
+ constructor() {
+
+ this.coefficients = [];
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients.push( new Vector3() );
+
+ }
+
+ }
+
+ set( coefficients ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].copy( coefficients[ i ] );
+
+ }
+
+ return this;
+
+ }
+
+ zero() {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].set( 0, 0, 0 );
+
+ }
+
+ return this;
+
+ }
+
+ // get the radiance in the direction of the normal
+ // target is a Vector3
+ getAt( normal, target ) {
+
+ // normal is assumed to be unit length
+
+ const x = normal.x, y = normal.y, z = normal.z;
+
+ const coeff = this.coefficients;
+
+ // band 0
+ target.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );
+
+ // band 1
+ target.addScaledVector( coeff[ 1 ], 0.488603 * y );
+ target.addScaledVector( coeff[ 2 ], 0.488603 * z );
+ target.addScaledVector( coeff[ 3 ], 0.488603 * x );
+
+ // band 2
+ target.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );
+ target.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );
+ target.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );
+ target.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );
+ target.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );
+
+ return target;
+
+ }
+
+ // get the irradiance (radiance convolved with cosine lobe) in the direction of the normal
+ // target is a Vector3
+ // https://graphics.stanford.edu/papers/envmap/envmap.pdf
+ getIrradianceAt( normal, target ) {
+
+ // normal is assumed to be unit length
+
+ const x = normal.x, y = normal.y, z = normal.z;
+
+ const coeff = this.coefficients;
+
+ // band 0
+ target.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095
+
+ // band 1
+ target.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603
+ target.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );
+ target.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );
+
+ // band 2
+ target.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548
+ target.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );
+ target.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3
+ target.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );
+ target.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274
+
+ return target;
+
+ }
+
+ add( sh ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].add( sh.coefficients[ i ] );
+
+ }
+
+ return this;
+
+ }
+
+ addScaledSH( sh, s ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );
+
+ }
+
+ return this;
+
+ }
+
+ scale( s ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].multiplyScalar( s );
+
+ }
+
+ return this;
+
+ }
+
+ lerp( sh, alpha ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ this.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );
+
+ }
+
+ return this;
+
+ }
+
+ equals( sh ) {
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ if ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {
+
+ return false;
+
+ }
+
+ }
+
+ return true;
+
+ }
+
+ copy( sh ) {
+
+ return this.set( sh.coefficients );
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ fromArray( array, offset = 0 ) {
+
+ const coefficients = this.coefficients;
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ coefficients[ i ].fromArray( array, offset + ( i * 3 ) );
+
+ }
+
+ return this;
+
+ }
+
+ toArray( array = [], offset = 0 ) {
+
+ const coefficients = this.coefficients;
+
+ for ( let i = 0; i < 9; i ++ ) {
+
+ coefficients[ i ].toArray( array, offset + ( i * 3 ) );
+
+ }
+
+ return array;
+
+ }
+
+ // evaluate the basis functions
+ // shBasis is an Array[ 9 ]
+ static getBasisAt( normal, shBasis ) {
+
+ // normal is assumed to be unit length
+
+ const x = normal.x, y = normal.y, z = normal.z;
+
+ // band 0
+ shBasis[ 0 ] = 0.282095;
+
+ // band 1
+ shBasis[ 1 ] = 0.488603 * y;
+ shBasis[ 2 ] = 0.488603 * z;
+ shBasis[ 3 ] = 0.488603 * x;
+
+ // band 2
+ shBasis[ 4 ] = 1.092548 * x * y;
+ shBasis[ 5 ] = 1.092548 * y * z;
+ shBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );
+ shBasis[ 7 ] = 1.092548 * x * z;
+ shBasis[ 8 ] = 0.546274 * ( x * x - y * y );
+
+ }
+
+ }
+
+ SphericalHarmonics3.prototype.isSphericalHarmonics3 = true;
+
+ class LightProbe extends Light {
+
+ constructor( sh = new SphericalHarmonics3(), intensity = 1 ) {
+
+ super( undefined, intensity );
+
+ this.sh = sh;
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.sh.copy( source.sh );
+
+ return this;
+
+ }
+
+ fromJSON( json ) {
+
+ this.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();
+ this.sh.fromArray( json.sh );
+
+ return this;
+
+ }
+
+ toJSON( meta ) {
+
+ const data = super.toJSON( meta );
+
+ data.object.sh = this.sh.toArray();
+
+ return data;
+
+ }
+
+ }
+
+ LightProbe.prototype.isLightProbe = true;
+
+ class MaterialLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+ this.textures = {};
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const loader = new FileLoader( scope.manager );
+ loader.setPath( scope.path );
+ loader.setRequestHeader( scope.requestHeader );
+ loader.setWithCredentials( scope.withCredentials );
+ loader.load( url, function ( text ) {
+
+ try {
+
+ onLoad( scope.parse( JSON.parse( text ) ) );
+
+ } catch ( e ) {
+
+ if ( onError ) {
+
+ onError( e );
+
+ } else {
+
+ console.error( e );
+
+ }
+
+ scope.manager.itemError( url );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+ parse( json ) {
+
+ const textures = this.textures;
+
+ function getTexture( name ) {
+
+ if ( textures[ name ] === undefined ) {
+
+ console.warn( 'THREE.MaterialLoader: Undefined texture', name );
+
+ }
+
+ return textures[ name ];
+
+ }
+
+ const material = Material.fromType( json.type );
+
+ if ( json.uuid !== undefined ) material.uuid = json.uuid;
+ if ( json.name !== undefined ) material.name = json.name;
+ if ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );
+ if ( json.roughness !== undefined ) material.roughness = json.roughness;
+ if ( json.metalness !== undefined ) material.metalness = json.metalness;
+ if ( json.sheen !== undefined ) material.sheen = json.sheen;
+ if ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );
+ if ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;
+ if ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );
+ if ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );
+ if ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;
+ if ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );
+ if ( json.shininess !== undefined ) material.shininess = json.shininess;
+ if ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;
+ if ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;
+ if ( json.transmission !== undefined ) material.transmission = json.transmission;
+ if ( json.thickness !== undefined ) material.thickness = json.thickness;
+ if ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;
+ if ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );
+ if ( json.fog !== undefined ) material.fog = json.fog;
+ if ( json.flatShading !== undefined ) material.flatShading = json.flatShading;
+ if ( json.blending !== undefined ) material.blending = json.blending;
+ if ( json.combine !== undefined ) material.combine = json.combine;
+ if ( json.side !== undefined ) material.side = json.side;
+ if ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;
+ if ( json.opacity !== undefined ) material.opacity = json.opacity;
+ if ( json.transparent !== undefined ) material.transparent = json.transparent;
+ if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;
+ if ( json.depthTest !== undefined ) material.depthTest = json.depthTest;
+ if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;
+ if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;
+
+ if ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;
+ if ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;
+ if ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;
+ if ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;
+ if ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;
+ if ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;
+ if ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;
+ if ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;
+
+ if ( json.wireframe !== undefined ) material.wireframe = json.wireframe;
+ if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;
+ if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;
+ if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;
+
+ if ( json.rotation !== undefined ) material.rotation = json.rotation;
+
+ if ( json.linewidth !== 1 ) material.linewidth = json.linewidth;
+ if ( json.dashSize !== undefined ) material.dashSize = json.dashSize;
+ if ( json.gapSize !== undefined ) material.gapSize = json.gapSize;
+ if ( json.scale !== undefined ) material.scale = json.scale;
+
+ if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;
+ if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;
+ if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;
+
+ if ( json.dithering !== undefined ) material.dithering = json.dithering;
+
+ if ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;
+ if ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;
+
+ if ( json.visible !== undefined ) material.visible = json.visible;
+
+ if ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;
+
+ if ( json.userData !== undefined ) material.userData = json.userData;
+
+ if ( json.vertexColors !== undefined ) {
+
+ if ( typeof json.vertexColors === 'number' ) {
+
+ material.vertexColors = ( json.vertexColors > 0 ) ? true : false;
+
+ } else {
+
+ material.vertexColors = json.vertexColors;
+
+ }
+
+ }
+
+ // Shader Material
+
+ if ( json.uniforms !== undefined ) {
+
+ for ( const name in json.uniforms ) {
+
+ const uniform = json.uniforms[ name ];
+
+ material.uniforms[ name ] = {};
+
+ switch ( uniform.type ) {
+
+ case 't':
+ material.uniforms[ name ].value = getTexture( uniform.value );
+ break;
+
+ case 'c':
+ material.uniforms[ name ].value = new Color().setHex( uniform.value );
+ break;
+
+ case 'v2':
+ material.uniforms[ name ].value = new Vector2().fromArray( uniform.value );
+ break;
+
+ case 'v3':
+ material.uniforms[ name ].value = new Vector3().fromArray( uniform.value );
+ break;
+
+ case 'v4':
+ material.uniforms[ name ].value = new Vector4$1().fromArray( uniform.value );
+ break;
+
+ case 'm3':
+ material.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );
+ break;
+
+ case 'm4':
+ material.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );
+ break;
+
+ default:
+ material.uniforms[ name ].value = uniform.value;
+
+ }
+
+ }
+
+ }
+
+ if ( json.defines !== undefined ) material.defines = json.defines;
+ if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;
+ if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;
+
+ if ( json.extensions !== undefined ) {
+
+ for ( const key in json.extensions ) {
+
+ material.extensions[ key ] = json.extensions[ key ];
+
+ }
+
+ }
+
+ // Deprecated
+
+ if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading
+
+ // for PointsMaterial
+
+ if ( json.size !== undefined ) material.size = json.size;
+ if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;
+
+ // maps
+
+ if ( json.map !== undefined ) material.map = getTexture( json.map );
+ if ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );
+
+ if ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );
+
+ if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );
+ if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;
+
+ if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );
+ if ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;
+ if ( json.normalScale !== undefined ) {
+
+ let normalScale = json.normalScale;
+
+ if ( Array.isArray( normalScale ) === false ) {
+
+ // Blender exporter used to export a scalar. See #7459
+
+ normalScale = [ normalScale, normalScale ];
+
+ }
+
+ material.normalScale = new Vector2().fromArray( normalScale );
+
+ }
+
+ if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );
+ if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;
+ if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;
+
+ if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );
+ if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );
+
+ if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );
+ if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;
+
+ if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );
+ if ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );
+ if ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );
+
+ if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );
+ if ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;
+
+ if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;
+ if ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;
+
+ if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );
+ if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;
+
+ if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );
+ if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;
+
+ if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );
+
+ if ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );
+ if ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );
+ if ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );
+ if ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );
+
+ if ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );
+ if ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );
+
+ if ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );
+ if ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );
+
+ return material;
+
+ }
+
+ setTextures( value ) {
+
+ this.textures = value;
+ return this;
+
+ }
+
+ }
+
+ class LoaderUtils {
+
+ static decodeText( array ) {
+
+ if ( typeof TextDecoder !== 'undefined' ) {
+
+ return new TextDecoder().decode( array );
+
+ }
+
+ // Avoid the String.fromCharCode.apply(null, array) shortcut, which
+ // throws a "maximum call stack size exceeded" error for large arrays.
+
+ let s = '';
+
+ for ( let i = 0, il = array.length; i < il; i ++ ) {
+
+ // Implicitly assumes little-endian.
+ s += String.fromCharCode( array[ i ] );
+
+ }
+
+ try {
+
+ // merges multi-byte utf-8 characters.
+
+ return decodeURIComponent( escape( s ) );
+
+ } catch ( e ) { // see #16358
+
+ return s;
+
+ }
+
+ }
+
+ static extractUrlBase( url ) {
+
+ const index = url.lastIndexOf( '/' );
+
+ if ( index === - 1 ) return './';
+
+ return url.slice( 0, index + 1 );
+
+ }
+
+ static resolveURL( url, path ) {
+
+ // Invalid URL
+ if ( typeof url !== 'string' || url === '' ) return '';
+
+ // Host Relative URL
+ if ( /^https?:\/\//i.test( path ) && /^\//.test( url ) ) {
+
+ path = path.replace( /(^https?:\/\/[^\/]+).*/i, '$1' );
+
+ }
+
+ // Absolute URL http://,https://,//
+ if ( /^(https?:)?\/\//i.test( url ) ) return url;
+
+ // Data URI
+ if ( /^data:.*,.*$/i.test( url ) ) return url;
+
+ // Blob URL
+ if ( /^blob:.*$/i.test( url ) ) return url;
+
+ // Relative URL
+ return path + url;
+
+ }
+
+ }
+
+ class InstancedBufferGeometry extends BufferGeometry {
+
+ constructor() {
+
+ super();
+
+ this.type = 'InstancedBufferGeometry';
+ this.instanceCount = Infinity;
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.instanceCount = source.instanceCount;
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ toJSON() {
+
+ const data = super.toJSON( this );
+
+ data.instanceCount = this.instanceCount;
+
+ data.isInstancedBufferGeometry = true;
+
+ return data;
+
+ }
+
+ }
+
+ InstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;
+
+ class BufferGeometryLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const loader = new FileLoader( scope.manager );
+ loader.setPath( scope.path );
+ loader.setRequestHeader( scope.requestHeader );
+ loader.setWithCredentials( scope.withCredentials );
+ loader.load( url, function ( text ) {
+
+ try {
+
+ onLoad( scope.parse( JSON.parse( text ) ) );
+
+ } catch ( e ) {
+
+ if ( onError ) {
+
+ onError( e );
+
+ } else {
+
+ console.error( e );
+
+ }
+
+ scope.manager.itemError( url );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+ parse( json ) {
+
+ const interleavedBufferMap = {};
+ const arrayBufferMap = {};
+
+ function getInterleavedBuffer( json, uuid ) {
+
+ if ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];
+
+ const interleavedBuffers = json.interleavedBuffers;
+ const interleavedBuffer = interleavedBuffers[ uuid ];
+
+ const buffer = getArrayBuffer( json, interleavedBuffer.buffer );
+
+ const array = getTypedArray( interleavedBuffer.type, buffer );
+ const ib = new InterleavedBuffer( array, interleavedBuffer.stride );
+ ib.uuid = interleavedBuffer.uuid;
+
+ interleavedBufferMap[ uuid ] = ib;
+
+ return ib;
+
+ }
+
+ function getArrayBuffer( json, uuid ) {
+
+ if ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];
+
+ const arrayBuffers = json.arrayBuffers;
+ const arrayBuffer = arrayBuffers[ uuid ];
+
+ const ab = new Uint32Array( arrayBuffer ).buffer;
+
+ arrayBufferMap[ uuid ] = ab;
+
+ return ab;
+
+ }
+
+ const geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();
+
+ const index = json.data.index;
+
+ if ( index !== undefined ) {
+
+ const typedArray = getTypedArray( index.type, index.array );
+ geometry.setIndex( new BufferAttribute( typedArray, 1 ) );
+
+ }
+
+ const attributes = json.data.attributes;
+
+ for ( const key in attributes ) {
+
+ const attribute = attributes[ key ];
+ let bufferAttribute;
+
+ if ( attribute.isInterleavedBufferAttribute ) {
+
+ const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );
+ bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );
+
+ } else {
+
+ const typedArray = getTypedArray( attribute.type, attribute.array );
+ const bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;
+ bufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );
+
+ }
+
+ if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;
+ if ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );
+
+ if ( attribute.updateRange !== undefined ) {
+
+ bufferAttribute.updateRange.offset = attribute.updateRange.offset;
+ bufferAttribute.updateRange.count = attribute.updateRange.count;
+
+ }
+
+ geometry.setAttribute( key, bufferAttribute );
+
+ }
+
+ const morphAttributes = json.data.morphAttributes;
+
+ if ( morphAttributes ) {
+
+ for ( const key in morphAttributes ) {
+
+ const attributeArray = morphAttributes[ key ];
+
+ const array = [];
+
+ for ( let i = 0, il = attributeArray.length; i < il; i ++ ) {
+
+ const attribute = attributeArray[ i ];
+ let bufferAttribute;
+
+ if ( attribute.isInterleavedBufferAttribute ) {
+
+ const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );
+ bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );
+
+ } else {
+
+ const typedArray = getTypedArray( attribute.type, attribute.array );
+ bufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );
+
+ }
+
+ if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;
+ array.push( bufferAttribute );
+
+ }
+
+ geometry.morphAttributes[ key ] = array;
+
+ }
+
+ }
+
+ const morphTargetsRelative = json.data.morphTargetsRelative;
+
+ if ( morphTargetsRelative ) {
+
+ geometry.morphTargetsRelative = true;
+
+ }
+
+ const groups = json.data.groups || json.data.drawcalls || json.data.offsets;
+
+ if ( groups !== undefined ) {
+
+ for ( let i = 0, n = groups.length; i !== n; ++ i ) {
+
+ const group = groups[ i ];
+
+ geometry.addGroup( group.start, group.count, group.materialIndex );
+
+ }
+
+ }
+
+ const boundingSphere = json.data.boundingSphere;
+
+ if ( boundingSphere !== undefined ) {
+
+ const center = new Vector3();
+
+ if ( boundingSphere.center !== undefined ) {
+
+ center.fromArray( boundingSphere.center );
+
+ }
+
+ geometry.boundingSphere = new Sphere( center, boundingSphere.radius );
+
+ }
+
+ if ( json.name ) geometry.name = json.name;
+ if ( json.userData ) geometry.userData = json.userData;
+
+ return geometry;
+
+ }
+
+ }
+
+ class ObjectLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;
+ this.resourcePath = this.resourcePath || path;
+
+ const loader = new FileLoader( this.manager );
+ loader.setPath( this.path );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( this.withCredentials );
+ loader.load( url, function ( text ) {
+
+ let json = null;
+
+ try {
+
+ json = JSON.parse( text );
+
+ } catch ( error ) {
+
+ if ( onError !== undefined ) onError( error );
+
+ console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message );
+
+ return;
+
+ }
+
+ const metadata = json.metadata;
+
+ if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {
+
+ console.error( 'THREE.ObjectLoader: Can\'t load ' + url );
+ return;
+
+ }
+
+ scope.parse( json, onLoad );
+
+ }, onProgress, onError );
+
+ }
+
+ async loadAsync( url, onProgress ) {
+
+ const scope = this;
+
+ const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;
+ this.resourcePath = this.resourcePath || path;
+
+ const loader = new FileLoader( this.manager );
+ loader.setPath( this.path );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( this.withCredentials );
+
+ const text = await loader.loadAsync( url, onProgress );
+
+ const json = JSON.parse( text );
+
+ const metadata = json.metadata;
+
+ if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {
+
+ throw new Error( 'THREE.ObjectLoader: Can\'t load ' + url );
+
+ }
+
+ return await scope.parseAsync( json );
+
+ }
+
+ parse( json, onLoad ) {
+
+ const animations = this.parseAnimations( json.animations );
+ const shapes = this.parseShapes( json.shapes );
+ const geometries = this.parseGeometries( json.geometries, shapes );
+
+ const images = this.parseImages( json.images, function () {
+
+ if ( onLoad !== undefined ) onLoad( object );
+
+ } );
+
+ const textures = this.parseTextures( json.textures, images );
+ const materials = this.parseMaterials( json.materials, textures );
+
+ const object = this.parseObject( json.object, geometries, materials, textures, animations );
+ const skeletons = this.parseSkeletons( json.skeletons, object );
+
+ this.bindSkeletons( object, skeletons );
+
+ //
+
+ if ( onLoad !== undefined ) {
+
+ let hasImages = false;
+
+ for ( const uuid in images ) {
+
+ if ( images[ uuid ] instanceof HTMLImageElement ) {
+
+ hasImages = true;
+ break;
+
+ }
+
+ }
+
+ if ( hasImages === false ) onLoad( object );
+
+ }
+
+ return object;
+
+ }
+
+ async parseAsync( json ) {
+
+ const animations = this.parseAnimations( json.animations );
+ const shapes = this.parseShapes( json.shapes );
+ const geometries = this.parseGeometries( json.geometries, shapes );
+
+ const images = await this.parseImagesAsync( json.images );
+
+ const textures = this.parseTextures( json.textures, images );
+ const materials = this.parseMaterials( json.materials, textures );
+
+ const object = this.parseObject( json.object, geometries, materials, textures, animations );
+ const skeletons = this.parseSkeletons( json.skeletons, object );
+
+ this.bindSkeletons( object, skeletons );
+
+ return object;
+
+ }
+
+ parseShapes( json ) {
+
+ const shapes = {};
+
+ if ( json !== undefined ) {
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ const shape = new Shape().fromJSON( json[ i ] );
+
+ shapes[ shape.uuid ] = shape;
+
+ }
+
+ }
+
+ return shapes;
+
+ }
+
+ parseSkeletons( json, object ) {
+
+ const skeletons = {};
+ const bones = {};
+
+ // generate bone lookup table
+
+ object.traverse( function ( child ) {
+
+ if ( child.isBone ) bones[ child.uuid ] = child;
+
+ } );
+
+ // create skeletons
+
+ if ( json !== undefined ) {
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ const skeleton = new Skeleton().fromJSON( json[ i ], bones );
+
+ skeletons[ skeleton.uuid ] = skeleton;
+
+ }
+
+ }
+
+ return skeletons;
+
+ }
+
+ parseGeometries( json, shapes ) {
+
+ const geometries = {};
+
+ if ( json !== undefined ) {
+
+ const bufferGeometryLoader = new BufferGeometryLoader();
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ let geometry;
+ const data = json[ i ];
+
+ switch ( data.type ) {
+
+ case 'BufferGeometry':
+ case 'InstancedBufferGeometry':
+
+ geometry = bufferGeometryLoader.parse( data );
+
+ break;
+
+ case 'Geometry':
+
+ console.error( 'THREE.ObjectLoader: The legacy Geometry type is no longer supported.' );
+
+ break;
+
+ default:
+
+ if ( data.type in Geometries ) {
+
+ geometry = Geometries[ data.type ].fromJSON( data, shapes );
+
+ } else {
+
+ console.warn( `THREE.ObjectLoader: Unsupported geometry type "${ data.type }"` );
+
+ }
+
+ }
+
+ geometry.uuid = data.uuid;
+
+ if ( data.name !== undefined ) geometry.name = data.name;
+ if ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData;
+
+ geometries[ data.uuid ] = geometry;
+
+ }
+
+ }
+
+ return geometries;
+
+ }
+
+ parseMaterials( json, textures ) {
+
+ const cache = {}; // MultiMaterial
+ const materials = {};
+
+ if ( json !== undefined ) {
+
+ const loader = new MaterialLoader();
+ loader.setTextures( textures );
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ const data = json[ i ];
+
+ if ( data.type === 'MultiMaterial' ) {
+
+ // Deprecated
+
+ const array = [];
+
+ for ( let j = 0; j < data.materials.length; j ++ ) {
+
+ const material = data.materials[ j ];
+
+ if ( cache[ material.uuid ] === undefined ) {
+
+ cache[ material.uuid ] = loader.parse( material );
+
+ }
+
+ array.push( cache[ material.uuid ] );
+
+ }
+
+ materials[ data.uuid ] = array;
+
+ } else {
+
+ if ( cache[ data.uuid ] === undefined ) {
+
+ cache[ data.uuid ] = loader.parse( data );
+
+ }
+
+ materials[ data.uuid ] = cache[ data.uuid ];
+
+ }
+
+ }
+
+ }
+
+ return materials;
+
+ }
+
+ parseAnimations( json ) {
+
+ const animations = {};
+
+ if ( json !== undefined ) {
+
+ for ( let i = 0; i < json.length; i ++ ) {
+
+ const data = json[ i ];
+
+ const clip = AnimationClip.parse( data );
+
+ animations[ clip.uuid ] = clip;
+
+ }
+
+ }
+
+ return animations;
+
+ }
+
+ parseImages( json, onLoad ) {
+
+ const scope = this;
+ const images = {};
+
+ let loader;
+
+ function loadImage( url ) {
+
+ scope.manager.itemStart( url );
+
+ return loader.load( url, function () {
+
+ scope.manager.itemEnd( url );
+
+ }, undefined, function () {
+
+ scope.manager.itemError( url );
+ scope.manager.itemEnd( url );
+
+ } );
+
+ }
+
+ function deserializeImage( image ) {
+
+ if ( typeof image === 'string' ) {
+
+ const url = image;
+
+ const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url;
+
+ return loadImage( path );
+
+ } else {
+
+ if ( image.data ) {
+
+ return {
+ data: getTypedArray( image.type, image.data ),
+ width: image.width,
+ height: image.height
+ };
+
+ } else {
+
+ return null;
+
+ }
+
+ }
+
+ }
+
+ if ( json !== undefined && json.length > 0 ) {
+
+ const manager = new LoadingManager( onLoad );
+
+ loader = new ImageLoader( manager );
+ loader.setCrossOrigin( this.crossOrigin );
+
+ for ( let i = 0, il = json.length; i < il; i ++ ) {
+
+ const image = json[ i ];
+ const url = image.url;
+
+ if ( Array.isArray( url ) ) {
+
+ // load array of images e.g CubeTexture
+
+ const imageArray = [];
+
+ for ( let j = 0, jl = url.length; j < jl; j ++ ) {
+
+ const currentUrl = url[ j ];
+
+ const deserializedImage = deserializeImage( currentUrl );
+
+ if ( deserializedImage !== null ) {
+
+ if ( deserializedImage instanceof HTMLImageElement ) {
+
+ imageArray.push( deserializedImage );
+
+ } else {
+
+ // special case: handle array of data textures for cube textures
+
+ imageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );
+
+ }
+
+ }
+
+ }
+
+ images[ image.uuid ] = new Source( imageArray );
+
+ } else {
+
+ // load single image
+
+ const deserializedImage = deserializeImage( image.url );
+ images[ image.uuid ] = new Source( deserializedImage );
+
+
+ }
+
+ }
+
+ }
+
+ return images;
+
+ }
+
+ async parseImagesAsync( json ) {
+
+ const scope = this;
+ const images = {};
+
+ let loader;
+
+ async function deserializeImage( image ) {
+
+ if ( typeof image === 'string' ) {
+
+ const url = image;
+
+ const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url;
+
+ return await loader.loadAsync( path );
+
+ } else {
+
+ if ( image.data ) {
+
+ return {
+ data: getTypedArray( image.type, image.data ),
+ width: image.width,
+ height: image.height
+ };
+
+ } else {
+
+ return null;
+
+ }
+
+ }
+
+ }
+
+ if ( json !== undefined && json.length > 0 ) {
+
+ loader = new ImageLoader( this.manager );
+ loader.setCrossOrigin( this.crossOrigin );
+
+ for ( let i = 0, il = json.length; i < il; i ++ ) {
+
+ const image = json[ i ];
+ const url = image.url;
+
+ if ( Array.isArray( url ) ) {
+
+ // load array of images e.g CubeTexture
+
+ const imageArray = [];
+
+ for ( let j = 0, jl = url.length; j < jl; j ++ ) {
+
+ const currentUrl = url[ j ];
+
+ const deserializedImage = await deserializeImage( currentUrl );
+
+ if ( deserializedImage !== null ) {
+
+ if ( deserializedImage instanceof HTMLImageElement ) {
+
+ imageArray.push( deserializedImage );
+
+ } else {
+
+ // special case: handle array of data textures for cube textures
+
+ imageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );
+
+ }
+
+ }
+
+ }
+
+ images[ image.uuid ] = new Source( imageArray );
+
+ } else {
+
+ // load single image
+
+ const deserializedImage = await deserializeImage( image.url );
+ images[ image.uuid ] = new Source( deserializedImage );
+
+ }
+
+ }
+
+ }
+
+ return images;
+
+ }
+
+ parseTextures( json, images ) {
+
+ function parseConstant( value, type ) {
+
+ if ( typeof value === 'number' ) return value;
+
+ console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );
+
+ return type[ value ];
+
+ }
+
+ const textures = {};
+
+ if ( json !== undefined ) {
+
+ for ( let i = 0, l = json.length; i < l; i ++ ) {
+
+ const data = json[ i ];
+
+ if ( data.image === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid );
+
+ }
+
+ if ( images[ data.image ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined image', data.image );
+
+ }
+
+ const source = images[ data.image ];
+ const image = source.data;
+
+ let texture;
+
+ if ( Array.isArray( image ) ) {
+
+ texture = new CubeTexture();
+
+ if ( image.length === 6 ) texture.needsUpdate = true;
+
+ } else {
+
+ if ( image && image.data ) {
+
+ texture = new DataTexture();
+
+ } else {
+
+ texture = new Texture();
+
+ }
+
+ if ( image ) texture.needsUpdate = true; // textures can have undefined image data
+
+ }
+
+ texture.source = source;
+
+ texture.uuid = data.uuid;
+
+ if ( data.name !== undefined ) texture.name = data.name;
+
+ if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );
+
+ if ( data.offset !== undefined ) texture.offset.fromArray( data.offset );
+ if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );
+ if ( data.center !== undefined ) texture.center.fromArray( data.center );
+ if ( data.rotation !== undefined ) texture.rotation = data.rotation;
+
+ if ( data.wrap !== undefined ) {
+
+ texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );
+ texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );
+
+ }
+
+ if ( data.format !== undefined ) texture.format = data.format;
+ if ( data.type !== undefined ) texture.type = data.type;
+ if ( data.encoding !== undefined ) texture.encoding = data.encoding;
+
+ if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );
+ if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );
+ if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;
+
+ if ( data.flipY !== undefined ) texture.flipY = data.flipY;
+
+ if ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;
+ if ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;
+
+ if ( data.userData !== undefined ) texture.userData = data.userData;
+
+ textures[ data.uuid ] = texture;
+
+ }
+
+ }
+
+ return textures;
+
+ }
+
+ parseObject( data, geometries, materials, textures, animations ) {
+
+ let object;
+
+ function getGeometry( name ) {
+
+ if ( geometries[ name ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined geometry', name );
+
+ }
+
+ return geometries[ name ];
+
+ }
+
+ function getMaterial( name ) {
+
+ if ( name === undefined ) return undefined;
+
+ if ( Array.isArray( name ) ) {
+
+ const array = [];
+
+ for ( let i = 0, l = name.length; i < l; i ++ ) {
+
+ const uuid = name[ i ];
+
+ if ( materials[ uuid ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined material', uuid );
+
+ }
+
+ array.push( materials[ uuid ] );
+
+ }
+
+ return array;
+
+ }
+
+ if ( materials[ name ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined material', name );
+
+ }
+
+ return materials[ name ];
+
+ }
+
+ function getTexture( uuid ) {
+
+ if ( textures[ uuid ] === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: Undefined texture', uuid );
+
+ }
+
+ return textures[ uuid ];
+
+ }
+
+ let geometry, material;
+
+ switch ( data.type ) {
+
+ case 'Scene':
+
+ object = new Scene();
+
+ if ( data.background !== undefined ) {
+
+ if ( Number.isInteger( data.background ) ) {
+
+ object.background = new Color( data.background );
+
+ } else {
+
+ object.background = getTexture( data.background );
+
+ }
+
+ }
+
+ if ( data.environment !== undefined ) {
+
+ object.environment = getTexture( data.environment );
+
+ }
+
+ if ( data.fog !== undefined ) {
+
+ if ( data.fog.type === 'Fog' ) {
+
+ object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );
+
+ } else if ( data.fog.type === 'FogExp2' ) {
+
+ object.fog = new FogExp2( data.fog.color, data.fog.density );
+
+ }
+
+ }
+
+ break;
+
+ case 'PerspectiveCamera':
+
+ object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );
+
+ if ( data.focus !== undefined ) object.focus = data.focus;
+ if ( data.zoom !== undefined ) object.zoom = data.zoom;
+ if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;
+ if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;
+ if ( data.view !== undefined ) object.view = Object.assign( {}, data.view );
+
+ break;
+
+ case 'OrthographicCamera':
+
+ object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );
+
+ if ( data.zoom !== undefined ) object.zoom = data.zoom;
+ if ( data.view !== undefined ) object.view = Object.assign( {}, data.view );
+
+ break;
+
+ case 'AmbientLight':
+
+ object = new AmbientLight( data.color, data.intensity );
+
+ break;
+
+ case 'DirectionalLight':
+
+ object = new DirectionalLight( data.color, data.intensity );
+
+ break;
+
+ case 'PointLight':
+
+ object = new PointLight( data.color, data.intensity, data.distance, data.decay );
+
+ break;
+
+ case 'RectAreaLight':
+
+ object = new RectAreaLight( data.color, data.intensity, data.width, data.height );
+
+ break;
+
+ case 'SpotLight':
+
+ object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );
+
+ break;
+
+ case 'HemisphereLight':
+
+ object = new HemisphereLight( data.color, data.groundColor, data.intensity );
+
+ break;
+
+ case 'LightProbe':
+
+ object = new LightProbe().fromJSON( data );
+
+ break;
+
+ case 'SkinnedMesh':
+
+ geometry = getGeometry( data.geometry );
+ material = getMaterial( data.material );
+
+ object = new SkinnedMesh( geometry, material );
+
+ if ( data.bindMode !== undefined ) object.bindMode = data.bindMode;
+ if ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );
+ if ( data.skeleton !== undefined ) object.skeleton = data.skeleton;
+
+ break;
+
+ case 'Mesh':
+
+ geometry = getGeometry( data.geometry );
+ material = getMaterial( data.material );
+
+ object = new Mesh( geometry, material );
+
+ break;
+
+ case 'InstancedMesh':
+
+ geometry = getGeometry( data.geometry );
+ material = getMaterial( data.material );
+ const count = data.count;
+ const instanceMatrix = data.instanceMatrix;
+ const instanceColor = data.instanceColor;
+
+ object = new InstancedMesh( geometry, material, count );
+ object.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );
+ if ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );
+
+ break;
+
+ case 'LOD':
+
+ object = new LOD();
+
+ break;
+
+ case 'Line':
+
+ object = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );
+
+ break;
+
+ case 'LineLoop':
+
+ object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );
+
+ break;
+
+ case 'LineSegments':
+
+ object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );
+
+ break;
+
+ case 'PointCloud':
+ case 'Points':
+
+ object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );
+
+ break;
+
+ case 'Sprite':
+
+ object = new Sprite( getMaterial( data.material ) );
+
+ break;
+
+ case 'Group':
+
+ object = new Group();
+
+ break;
+
+ case 'Bone':
+
+ object = new Bone();
+
+ break;
+
+ default:
+
+ object = new Object3D();
+
+ }
+
+ object.uuid = data.uuid;
+
+ if ( data.name !== undefined ) object.name = data.name;
+
+ if ( data.matrix !== undefined ) {
+
+ object.matrix.fromArray( data.matrix );
+
+ if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;
+ if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );
+
+ } else {
+
+ if ( data.position !== undefined ) object.position.fromArray( data.position );
+ if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );
+ if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );
+ if ( data.scale !== undefined ) object.scale.fromArray( data.scale );
+
+ }
+
+ if ( data.castShadow !== undefined ) object.castShadow = data.castShadow;
+ if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;
+
+ if ( data.shadow ) {
+
+ if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;
+ if ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;
+ if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;
+ if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );
+ if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );
+
+ }
+
+ if ( data.visible !== undefined ) object.visible = data.visible;
+ if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;
+ if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;
+ if ( data.userData !== undefined ) object.userData = data.userData;
+ if ( data.layers !== undefined ) object.layers.mask = data.layers;
+
+ if ( data.children !== undefined ) {
+
+ const children = data.children;
+
+ for ( let i = 0; i < children.length; i ++ ) {
+
+ object.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );
+
+ }
+
+ }
+
+ if ( data.animations !== undefined ) {
+
+ const objectAnimations = data.animations;
+
+ for ( let i = 0; i < objectAnimations.length; i ++ ) {
+
+ const uuid = objectAnimations[ i ];
+
+ object.animations.push( animations[ uuid ] );
+
+ }
+
+ }
+
+ if ( data.type === 'LOD' ) {
+
+ if ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;
+
+ const levels = data.levels;
+
+ for ( let l = 0; l < levels.length; l ++ ) {
+
+ const level = levels[ l ];
+ const child = object.getObjectByProperty( 'uuid', level.object );
+
+ if ( child !== undefined ) {
+
+ object.addLevel( child, level.distance );
+
+ }
+
+ }
+
+ }
+
+ return object;
+
+ }
+
+ bindSkeletons( object, skeletons ) {
+
+ if ( Object.keys( skeletons ).length === 0 ) return;
+
+ object.traverse( function ( child ) {
+
+ if ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {
+
+ const skeleton = skeletons[ child.skeleton ];
+
+ if ( skeleton === undefined ) {
+
+ console.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton );
+
+ } else {
+
+ child.bind( skeleton, child.bindMatrix );
+
+ }
+
+ }
+
+ } );
+
+ }
+
+ /* DEPRECATED */
+
+ setTexturePath( value ) {
+
+ console.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' );
+ return this.setResourcePath( value );
+
+ }
+
+ }
+
+ const TEXTURE_MAPPING = {
+ UVMapping: UVMapping,
+ CubeReflectionMapping: CubeReflectionMapping,
+ CubeRefractionMapping: CubeRefractionMapping,
+ EquirectangularReflectionMapping: EquirectangularReflectionMapping,
+ EquirectangularRefractionMapping: EquirectangularRefractionMapping,
+ CubeUVReflectionMapping: CubeUVReflectionMapping,
+ CubeUVRefractionMapping: CubeUVRefractionMapping
+ };
+
+ const TEXTURE_WRAPPING = {
+ RepeatWrapping: RepeatWrapping,
+ ClampToEdgeWrapping: ClampToEdgeWrapping,
+ MirroredRepeatWrapping: MirroredRepeatWrapping
+ };
+
+ const TEXTURE_FILTER = {
+ NearestFilter: NearestFilter,
+ NearestMipmapNearestFilter: NearestMipmapNearestFilter,
+ NearestMipmapLinearFilter: NearestMipmapLinearFilter,
+ LinearFilter: LinearFilter,
+ LinearMipmapNearestFilter: LinearMipmapNearestFilter,
+ LinearMipmapLinearFilter: LinearMipmapLinearFilter
+ };
+
+ class ImageBitmapLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ if ( typeof createImageBitmap === 'undefined' ) {
+
+ console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );
+
+ }
+
+ if ( typeof fetch === 'undefined' ) {
+
+ console.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );
+
+ }
+
+ this.options = { premultiplyAlpha: 'none' };
+
+ }
+
+ setOptions( options ) {
+
+ this.options = options;
+
+ return this;
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ if ( url === undefined ) url = '';
+
+ if ( this.path !== undefined ) url = this.path + url;
+
+ url = this.manager.resolveURL( url );
+
+ const scope = this;
+
+ const cached = Cache.get( url );
+
+ if ( cached !== undefined ) {
+
+ scope.manager.itemStart( url );
+
+ setTimeout( function () {
+
+ if ( onLoad ) onLoad( cached );
+
+ scope.manager.itemEnd( url );
+
+ }, 0 );
+
+ return cached;
+
+ }
+
+ const fetchOptions = {};
+ fetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';
+ fetchOptions.headers = this.requestHeader;
+
+ fetch( url, fetchOptions ).then( function ( res ) {
+
+ return res.blob();
+
+ } ).then( function ( blob ) {
+
+ return createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );
+
+ } ).then( function ( imageBitmap ) {
+
+ Cache.add( url, imageBitmap );
+
+ if ( onLoad ) onLoad( imageBitmap );
+
+ scope.manager.itemEnd( url );
+
+ } ).catch( function ( e ) {
+
+ if ( onError ) onError( e );
+
+ scope.manager.itemError( url );
+ scope.manager.itemEnd( url );
+
+ } );
+
+ scope.manager.itemStart( url );
+
+ }
+
+ }
+
+ ImageBitmapLoader.prototype.isImageBitmapLoader = true;
+
+ let _context;
+
+ const AudioContext = {
+
+ getContext: function () {
+
+ if ( _context === undefined ) {
+
+ _context = new ( window.AudioContext || window.webkitAudioContext )();
+
+ }
+
+ return _context;
+
+ },
+
+ setContext: function ( value ) {
+
+ _context = value;
+
+ }
+
+ };
+
+ class AudioLoader extends Loader {
+
+ constructor( manager ) {
+
+ super( manager );
+
+ }
+
+ load( url, onLoad, onProgress, onError ) {
+
+ const scope = this;
+
+ const loader = new FileLoader( this.manager );
+ loader.setResponseType( 'arraybuffer' );
+ loader.setPath( this.path );
+ loader.setRequestHeader( this.requestHeader );
+ loader.setWithCredentials( this.withCredentials );
+ loader.load( url, function ( buffer ) {
+
+ try {
+
+ // Create a copy of the buffer. The `decodeAudioData` method
+ // detaches the buffer when complete, preventing reuse.
+ const bufferCopy = buffer.slice( 0 );
+
+ const context = AudioContext.getContext();
+ context.decodeAudioData( bufferCopy, function ( audioBuffer ) {
+
+ onLoad( audioBuffer );
+
+ } );
+
+ } catch ( e ) {
+
+ if ( onError ) {
+
+ onError( e );
+
+ } else {
+
+ console.error( e );
+
+ }
+
+ scope.manager.itemError( url );
+
+ }
+
+ }, onProgress, onError );
+
+ }
+
+ }
+
+ class HemisphereLightProbe extends LightProbe {
+
+ constructor( skyColor, groundColor, intensity = 1 ) {
+
+ super( undefined, intensity );
+
+ const color1 = new Color().set( skyColor );
+ const color2 = new Color().set( groundColor );
+
+ const sky = new Vector3( color1.r, color1.g, color1.b );
+ const ground = new Vector3( color2.r, color2.g, color2.b );
+
+ // without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI );
+ const c0 = Math.sqrt( Math.PI );
+ const c1 = c0 * Math.sqrt( 0.75 );
+
+ this.sh.coefficients[ 0 ].copy( sky ).add( ground ).multiplyScalar( c0 );
+ this.sh.coefficients[ 1 ].copy( sky ).sub( ground ).multiplyScalar( c1 );
+
+ }
+
+ }
+
+ HemisphereLightProbe.prototype.isHemisphereLightProbe = true;
+
+ class AmbientLightProbe extends LightProbe {
+
+ constructor( color, intensity = 1 ) {
+
+ super( undefined, intensity );
+
+ const color1 = new Color().set( color );
+
+ // without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI );
+ this.sh.coefficients[ 0 ].set( color1.r, color1.g, color1.b ).multiplyScalar( 2 * Math.sqrt( Math.PI ) );
+
+ }
+
+ }
+
+ AmbientLightProbe.prototype.isAmbientLightProbe = true;
+
+ const _eyeRight = /*@__PURE__*/ new Matrix4();
+ const _eyeLeft = /*@__PURE__*/ new Matrix4();
+ const _projectionMatrix = /*@__PURE__*/ new Matrix4();
+
+ class StereoCamera {
+
+ constructor() {
+
+ this.type = 'StereoCamera';
+
+ this.aspect = 1;
+
+ this.eyeSep = 0.064;
+
+ this.cameraL = new PerspectiveCamera();
+ this.cameraL.layers.enable( 1 );
+ this.cameraL.matrixAutoUpdate = false;
+
+ this.cameraR = new PerspectiveCamera();
+ this.cameraR.layers.enable( 2 );
+ this.cameraR.matrixAutoUpdate = false;
+
+ this._cache = {
+ focus: null,
+ fov: null,
+ aspect: null,
+ near: null,
+ far: null,
+ zoom: null,
+ eyeSep: null
+ };
+
+ }
+
+ update( camera ) {
+
+ const cache = this._cache;
+
+ const needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||
+ cache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||
+ cache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;
+
+ if ( needsUpdate ) {
+
+ cache.focus = camera.focus;
+ cache.fov = camera.fov;
+ cache.aspect = camera.aspect * this.aspect;
+ cache.near = camera.near;
+ cache.far = camera.far;
+ cache.zoom = camera.zoom;
+ cache.eyeSep = this.eyeSep;
+
+ // Off-axis stereoscopic effect based on
+ // http://paulbourke.net/stereographics/stereorender/
+
+ _projectionMatrix.copy( camera.projectionMatrix );
+ const eyeSepHalf = cache.eyeSep / 2;
+ const eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;
+ const ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;
+ let xmin, xmax;
+
+ // translate xOffset
+
+ _eyeLeft.elements[ 12 ] = - eyeSepHalf;
+ _eyeRight.elements[ 12 ] = eyeSepHalf;
+
+ // for left eye
+
+ xmin = - ymax * cache.aspect + eyeSepOnProjection;
+ xmax = ymax * cache.aspect + eyeSepOnProjection;
+
+ _projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );
+ _projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
+
+ this.cameraL.projectionMatrix.copy( _projectionMatrix );
+
+ // for right eye
+
+ xmin = - ymax * cache.aspect - eyeSepOnProjection;
+ xmax = ymax * cache.aspect - eyeSepOnProjection;
+
+ _projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );
+ _projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
+
+ this.cameraR.projectionMatrix.copy( _projectionMatrix );
+
+ }
+
+ this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );
+ this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );
+
+ }
+
+ }
+
+ class Clock {
+
+ constructor( autoStart = true ) {
+
+ this.autoStart = autoStart;
+
+ this.startTime = 0;
+ this.oldTime = 0;
+ this.elapsedTime = 0;
+
+ this.running = false;
+
+ }
+
+ start() {
+
+ this.startTime = now();
+
+ this.oldTime = this.startTime;
+ this.elapsedTime = 0;
+ this.running = true;
+
+ }
+
+ stop() {
+
+ this.getElapsedTime();
+ this.running = false;
+ this.autoStart = false;
+
+ }
+
+ getElapsedTime() {
+
+ this.getDelta();
+ return this.elapsedTime;
+
+ }
+
+ getDelta() {
+
+ let diff = 0;
+
+ if ( this.autoStart && ! this.running ) {
+
+ this.start();
+ return 0;
+
+ }
+
+ if ( this.running ) {
+
+ const newTime = now();
+
+ diff = ( newTime - this.oldTime ) / 1000;
+ this.oldTime = newTime;
+
+ this.elapsedTime += diff;
+
+ }
+
+ return diff;
+
+ }
+
+ }
+
+ function now() {
+
+ return ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732
+
+ }
+
+ const _position$1 = /*@__PURE__*/ new Vector3();
+ const _quaternion$1 = /*@__PURE__*/ new Quaternion();
+ const _scale$1 = /*@__PURE__*/ new Vector3();
+ const _orientation$1 = /*@__PURE__*/ new Vector3();
+
+ class AudioListener extends Object3D {
+
+ constructor() {
+
+ super();
+
+ this.type = 'AudioListener';
+
+ this.context = AudioContext.getContext();
+
+ this.gain = this.context.createGain();
+ this.gain.connect( this.context.destination );
+
+ this.filter = null;
+
+ this.timeDelta = 0;
+
+ // private
+
+ this._clock = new Clock();
+
+ }
+
+ getInput() {
+
+ return this.gain;
+
+ }
+
+ removeFilter() {
+
+ if ( this.filter !== null ) {
+
+ this.gain.disconnect( this.filter );
+ this.filter.disconnect( this.context.destination );
+ this.gain.connect( this.context.destination );
+ this.filter = null;
+
+ }
+
+ return this;
+
+ }
+
+ getFilter() {
+
+ return this.filter;
+
+ }
+
+ setFilter( value ) {
+
+ if ( this.filter !== null ) {
+
+ this.gain.disconnect( this.filter );
+ this.filter.disconnect( this.context.destination );
+
+ } else {
+
+ this.gain.disconnect( this.context.destination );
+
+ }
+
+ this.filter = value;
+ this.gain.connect( this.filter );
+ this.filter.connect( this.context.destination );
+
+ return this;
+
+ }
+
+ getMasterVolume() {
+
+ return this.gain.gain.value;
+
+ }
+
+ setMasterVolume( value ) {
+
+ this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );
+
+ return this;
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ super.updateMatrixWorld( force );
+
+ const listener = this.context.listener;
+ const up = this.up;
+
+ this.timeDelta = this._clock.getDelta();
+
+ this.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );
+
+ _orientation$1.set( 0, 0, - 1 ).applyQuaternion( _quaternion$1 );
+
+ if ( listener.positionX ) {
+
+ // code path for Chrome (see #14393)
+
+ const endTime = this.context.currentTime + this.timeDelta;
+
+ listener.positionX.linearRampToValueAtTime( _position$1.x, endTime );
+ listener.positionY.linearRampToValueAtTime( _position$1.y, endTime );
+ listener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );
+ listener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime );
+ listener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime );
+ listener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime );
+ listener.upX.linearRampToValueAtTime( up.x, endTime );
+ listener.upY.linearRampToValueAtTime( up.y, endTime );
+ listener.upZ.linearRampToValueAtTime( up.z, endTime );
+
+ } else {
+
+ listener.setPosition( _position$1.x, _position$1.y, _position$1.z );
+ listener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z );
+
+ }
+
+ }
+
+ }
+
+ class Audio extends Object3D {
+
+ constructor( listener ) {
+
+ super();
+
+ this.type = 'Audio';
+
+ this.listener = listener;
+ this.context = listener.context;
+
+ this.gain = this.context.createGain();
+ this.gain.connect( listener.getInput() );
+
+ this.autoplay = false;
+
+ this.buffer = null;
+ this.detune = 0;
+ this.loop = false;
+ this.loopStart = 0;
+ this.loopEnd = 0;
+ this.offset = 0;
+ this.duration = undefined;
+ this.playbackRate = 1;
+ this.isPlaying = false;
+ this.hasPlaybackControl = true;
+ this.source = null;
+ this.sourceType = 'empty';
+
+ this._startedAt = 0;
+ this._progress = 0;
+ this._connected = false;
+
+ this.filters = [];
+
+ }
+
+ getOutput() {
+
+ return this.gain;
+
+ }
+
+ setNodeSource( audioNode ) {
+
+ this.hasPlaybackControl = false;
+ this.sourceType = 'audioNode';
+ this.source = audioNode;
+ this.connect();
+
+ return this;
+
+ }
+
+ setMediaElementSource( mediaElement ) {
+
+ this.hasPlaybackControl = false;
+ this.sourceType = 'mediaNode';
+ this.source = this.context.createMediaElementSource( mediaElement );
+ this.connect();
+
+ return this;
+
+ }
+
+ setMediaStreamSource( mediaStream ) {
+
+ this.hasPlaybackControl = false;
+ this.sourceType = 'mediaStreamNode';
+ this.source = this.context.createMediaStreamSource( mediaStream );
+ this.connect();
+
+ return this;
+
+ }
+
+ setBuffer( audioBuffer ) {
+
+ this.buffer = audioBuffer;
+ this.sourceType = 'buffer';
+
+ if ( this.autoplay ) this.play();
+
+ return this;
+
+ }
+
+ play( delay = 0 ) {
+
+ if ( this.isPlaying === true ) {
+
+ console.warn( 'THREE.Audio: Audio is already playing.' );
+ return;
+
+ }
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ this._startedAt = this.context.currentTime + delay;
+
+ const source = this.context.createBufferSource();
+ source.buffer = this.buffer;
+ source.loop = this.loop;
+ source.loopStart = this.loopStart;
+ source.loopEnd = this.loopEnd;
+ source.onended = this.onEnded.bind( this );
+ source.start( this._startedAt, this._progress + this.offset, this.duration );
+
+ this.isPlaying = true;
+
+ this.source = source;
+
+ this.setDetune( this.detune );
+ this.setPlaybackRate( this.playbackRate );
+
+ return this.connect();
+
+ }
+
+ pause() {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ if ( this.isPlaying === true ) {
+
+ // update current progress
+
+ this._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;
+
+ if ( this.loop === true ) {
+
+ // ensure _progress does not exceed duration with looped audios
+
+ this._progress = this._progress % ( this.duration || this.buffer.duration );
+
+ }
+
+ this.source.stop();
+ this.source.onended = null;
+
+ this.isPlaying = false;
+
+ }
+
+ return this;
+
+ }
+
+ stop() {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ this._progress = 0;
+
+ this.source.stop();
+ this.source.onended = null;
+ this.isPlaying = false;
+
+ return this;
+
+ }
+
+ connect() {
+
+ if ( this.filters.length > 0 ) {
+
+ this.source.connect( this.filters[ 0 ] );
+
+ for ( let i = 1, l = this.filters.length; i < l; i ++ ) {
+
+ this.filters[ i - 1 ].connect( this.filters[ i ] );
+
+ }
+
+ this.filters[ this.filters.length - 1 ].connect( this.getOutput() );
+
+ } else {
+
+ this.source.connect( this.getOutput() );
+
+ }
+
+ this._connected = true;
+
+ return this;
+
+ }
+
+ disconnect() {
+
+ if ( this.filters.length > 0 ) {
+
+ this.source.disconnect( this.filters[ 0 ] );
+
+ for ( let i = 1, l = this.filters.length; i < l; i ++ ) {
+
+ this.filters[ i - 1 ].disconnect( this.filters[ i ] );
+
+ }
+
+ this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );
+
+ } else {
+
+ this.source.disconnect( this.getOutput() );
+
+ }
+
+ this._connected = false;
+
+ return this;
+
+ }
+
+ getFilters() {
+
+ return this.filters;
+
+ }
+
+ setFilters( value ) {
+
+ if ( ! value ) value = [];
+
+ if ( this._connected === true ) {
+
+ this.disconnect();
+ this.filters = value.slice();
+ this.connect();
+
+ } else {
+
+ this.filters = value.slice();
+
+ }
+
+ return this;
+
+ }
+
+ setDetune( value ) {
+
+ this.detune = value;
+
+ if ( this.source.detune === undefined ) return; // only set detune when available
+
+ if ( this.isPlaying === true ) {
+
+ this.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );
+
+ }
+
+ return this;
+
+ }
+
+ getDetune() {
+
+ return this.detune;
+
+ }
+
+ getFilter() {
+
+ return this.getFilters()[ 0 ];
+
+ }
+
+ setFilter( filter ) {
+
+ return this.setFilters( filter ? [ filter ] : [] );
+
+ }
+
+ setPlaybackRate( value ) {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ this.playbackRate = value;
+
+ if ( this.isPlaying === true ) {
+
+ this.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );
+
+ }
+
+ return this;
+
+ }
+
+ getPlaybackRate() {
+
+ return this.playbackRate;
+
+ }
+
+ onEnded() {
+
+ this.isPlaying = false;
+
+ }
+
+ getLoop() {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return false;
+
+ }
+
+ return this.loop;
+
+ }
+
+ setLoop( value ) {
+
+ if ( this.hasPlaybackControl === false ) {
+
+ console.warn( 'THREE.Audio: this Audio has no playback control.' );
+ return;
+
+ }
+
+ this.loop = value;
+
+ if ( this.isPlaying === true ) {
+
+ this.source.loop = this.loop;
+
+ }
+
+ return this;
+
+ }
+
+ setLoopStart( value ) {
+
+ this.loopStart = value;
+
+ return this;
+
+ }
+
+ setLoopEnd( value ) {
+
+ this.loopEnd = value;
+
+ return this;
+
+ }
+
+ getVolume() {
+
+ return this.gain.gain.value;
+
+ }
+
+ setVolume( value ) {
+
+ this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );
+
+ return this;
+
+ }
+
+ }
+
+ const _position = /*@__PURE__*/ new Vector3();
+ const _quaternion = /*@__PURE__*/ new Quaternion();
+ const _scale = /*@__PURE__*/ new Vector3();
+ const _orientation = /*@__PURE__*/ new Vector3();
+
+ class PositionalAudio extends Audio {
+
+ constructor( listener ) {
+
+ super( listener );
+
+ this.panner = this.context.createPanner();
+ this.panner.panningModel = 'HRTF';
+ this.panner.connect( this.gain );
+
+ }
+
+ getOutput() {
+
+ return this.panner;
+
+ }
+
+ getRefDistance() {
+
+ return this.panner.refDistance;
+
+ }
+
+ setRefDistance( value ) {
+
+ this.panner.refDistance = value;
+
+ return this;
+
+ }
+
+ getRolloffFactor() {
+
+ return this.panner.rolloffFactor;
+
+ }
+
+ setRolloffFactor( value ) {
+
+ this.panner.rolloffFactor = value;
+
+ return this;
+
+ }
+
+ getDistanceModel() {
+
+ return this.panner.distanceModel;
+
+ }
+
+ setDistanceModel( value ) {
+
+ this.panner.distanceModel = value;
+
+ return this;
+
+ }
+
+ getMaxDistance() {
+
+ return this.panner.maxDistance;
+
+ }
+
+ setMaxDistance( value ) {
+
+ this.panner.maxDistance = value;
+
+ return this;
+
+ }
+
+ setDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {
+
+ this.panner.coneInnerAngle = coneInnerAngle;
+ this.panner.coneOuterAngle = coneOuterAngle;
+ this.panner.coneOuterGain = coneOuterGain;
+
+ return this;
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ super.updateMatrixWorld( force );
+
+ if ( this.hasPlaybackControl === true && this.isPlaying === false ) return;
+
+ this.matrixWorld.decompose( _position, _quaternion, _scale );
+
+ _orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );
+
+ const panner = this.panner;
+
+ if ( panner.positionX ) {
+
+ // code path for Chrome and Firefox (see #14393)
+
+ const endTime = this.context.currentTime + this.listener.timeDelta;
+
+ panner.positionX.linearRampToValueAtTime( _position.x, endTime );
+ panner.positionY.linearRampToValueAtTime( _position.y, endTime );
+ panner.positionZ.linearRampToValueAtTime( _position.z, endTime );
+ panner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );
+ panner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );
+ panner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );
+
+ } else {
+
+ panner.setPosition( _position.x, _position.y, _position.z );
+ panner.setOrientation( _orientation.x, _orientation.y, _orientation.z );
+
+ }
+
+ }
+
+ }
+
+ class AudioAnalyser {
+
+ constructor( audio, fftSize = 2048 ) {
+
+ this.analyser = audio.context.createAnalyser();
+ this.analyser.fftSize = fftSize;
+
+ this.data = new Uint8Array( this.analyser.frequencyBinCount );
+
+ audio.getOutput().connect( this.analyser );
+
+ }
+
+
+ getFrequencyData() {
+
+ this.analyser.getByteFrequencyData( this.data );
+
+ return this.data;
+
+ }
+
+ getAverageFrequency() {
+
+ let value = 0;
+ const data = this.getFrequencyData();
+
+ for ( let i = 0; i < data.length; i ++ ) {
+
+ value += data[ i ];
+
+ }
+
+ return value / data.length;
+
+ }
+
+ }
+
+ class PropertyMixer {
+
+ constructor( binding, typeName, valueSize ) {
+
+ this.binding = binding;
+ this.valueSize = valueSize;
+
+ let mixFunction,
+ mixFunctionAdditive,
+ setIdentity;
+
+ // buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]
+ //
+ // interpolators can use .buffer as their .result
+ // the data then goes to 'incoming'
+ //
+ // 'accu0' and 'accu1' are used frame-interleaved for
+ // the cumulative result and are compared to detect
+ // changes
+ //
+ // 'orig' stores the original state of the property
+ //
+ // 'add' is used for additive cumulative results
+ //
+ // 'work' is optional and is only present for quaternion types. It is used
+ // to store intermediate quaternion multiplication results
+
+ switch ( typeName ) {
+
+ case 'quaternion':
+ mixFunction = this._slerp;
+ mixFunctionAdditive = this._slerpAdditive;
+ setIdentity = this._setAdditiveIdentityQuaternion;
+
+ this.buffer = new Float64Array( valueSize * 6 );
+ this._workIndex = 5;
+ break;
+
+ case 'string':
+ case 'bool':
+ mixFunction = this._select;
+
+ // Use the regular mix function and for additive on these types,
+ // additive is not relevant for non-numeric types
+ mixFunctionAdditive = this._select;
+
+ setIdentity = this._setAdditiveIdentityOther;
+
+ this.buffer = new Array( valueSize * 5 );
+ break;
+
+ default:
+ mixFunction = this._lerp;
+ mixFunctionAdditive = this._lerpAdditive;
+ setIdentity = this._setAdditiveIdentityNumeric;
+
+ this.buffer = new Float64Array( valueSize * 5 );
+
+ }
+
+ this._mixBufferRegion = mixFunction;
+ this._mixBufferRegionAdditive = mixFunctionAdditive;
+ this._setIdentity = setIdentity;
+ this._origIndex = 3;
+ this._addIndex = 4;
+
+ this.cumulativeWeight = 0;
+ this.cumulativeWeightAdditive = 0;
+
+ this.useCount = 0;
+ this.referenceCount = 0;
+
+ }
+
+ // accumulate data in the 'incoming' region into 'accu'
+ accumulate( accuIndex, weight ) {
+
+ // note: happily accumulating nothing when weight = 0, the caller knows
+ // the weight and shouldn't have made the call in the first place
+
+ const buffer = this.buffer,
+ stride = this.valueSize,
+ offset = accuIndex * stride + stride;
+
+ let currentWeight = this.cumulativeWeight;
+
+ if ( currentWeight === 0 ) {
+
+ // accuN := incoming * weight
+
+ for ( let i = 0; i !== stride; ++ i ) {
+
+ buffer[ offset + i ] = buffer[ i ];
+
+ }
+
+ currentWeight = weight;
+
+ } else {
+
+ // accuN := accuN + incoming * weight
+
+ currentWeight += weight;
+ const mix = weight / currentWeight;
+ this._mixBufferRegion( buffer, offset, 0, mix, stride );
+
+ }
+
+ this.cumulativeWeight = currentWeight;
+
+ }
+
+ // accumulate data in the 'incoming' region into 'add'
+ accumulateAdditive( weight ) {
+
+ const buffer = this.buffer,
+ stride = this.valueSize,
+ offset = stride * this._addIndex;
+
+ if ( this.cumulativeWeightAdditive === 0 ) {
+
+ // add = identity
+
+ this._setIdentity();
+
+ }
+
+ // add := add + incoming * weight
+
+ this._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );
+ this.cumulativeWeightAdditive += weight;
+
+ }
+
+ // apply the state of 'accu' to the binding when accus differ
+ apply( accuIndex ) {
+
+ const stride = this.valueSize,
+ buffer = this.buffer,
+ offset = accuIndex * stride + stride,
+
+ weight = this.cumulativeWeight,
+ weightAdditive = this.cumulativeWeightAdditive,
+
+ binding = this.binding;
+
+ this.cumulativeWeight = 0;
+ this.cumulativeWeightAdditive = 0;
+
+ if ( weight < 1 ) {
+
+ // accuN := accuN + original * ( 1 - cumulativeWeight )
+
+ const originalValueOffset = stride * this._origIndex;
+
+ this._mixBufferRegion(
+ buffer, offset, originalValueOffset, 1 - weight, stride );
+
+ }
+
+ if ( weightAdditive > 0 ) {
+
+ // accuN := accuN + additive accuN
+
+ this._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );
+
+ }
+
+ for ( let i = stride, e = stride + stride; i !== e; ++ i ) {
+
+ if ( buffer[ i ] !== buffer[ i + stride ] ) {
+
+ // value has changed -> update scene graph
+
+ binding.setValue( buffer, offset );
+ break;
+
+ }
+
+ }
+
+ }
+
+ // remember the state of the bound property and copy it to both accus
+ saveOriginalState() {
+
+ const binding = this.binding;
+
+ const buffer = this.buffer,
+ stride = this.valueSize,
+
+ originalValueOffset = stride * this._origIndex;
+
+ binding.getValue( buffer, originalValueOffset );
+
+ // accu[0..1] := orig -- initially detect changes against the original
+ for ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {
+
+ buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];
+
+ }
+
+ // Add to identity for additive
+ this._setIdentity();
+
+ this.cumulativeWeight = 0;
+ this.cumulativeWeightAdditive = 0;
+
+ }
+
+ // apply the state previously taken via 'saveOriginalState' to the binding
+ restoreOriginalState() {
+
+ const originalValueOffset = this.valueSize * 3;
+ this.binding.setValue( this.buffer, originalValueOffset );
+
+ }
+
+ _setAdditiveIdentityNumeric() {
+
+ const startIndex = this._addIndex * this.valueSize;
+ const endIndex = startIndex + this.valueSize;
+
+ for ( let i = startIndex; i < endIndex; i ++ ) {
+
+ this.buffer[ i ] = 0;
+
+ }
+
+ }
+
+ _setAdditiveIdentityQuaternion() {
+
+ this._setAdditiveIdentityNumeric();
+ this.buffer[ this._addIndex * this.valueSize + 3 ] = 1;
+
+ }
+
+ _setAdditiveIdentityOther() {
+
+ const startIndex = this._origIndex * this.valueSize;
+ const targetIndex = this._addIndex * this.valueSize;
+
+ for ( let i = 0; i < this.valueSize; i ++ ) {
+
+ this.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];
+
+ }
+
+ }
+
+
+ // mix functions
+
+ _select( buffer, dstOffset, srcOffset, t, stride ) {
+
+ if ( t >= 0.5 ) {
+
+ for ( let i = 0; i !== stride; ++ i ) {
+
+ buffer[ dstOffset + i ] = buffer[ srcOffset + i ];
+
+ }
+
+ }
+
+ }
+
+ _slerp( buffer, dstOffset, srcOffset, t ) {
+
+ Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );
+
+ }
+
+ _slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {
+
+ const workOffset = this._workIndex * stride;
+
+ // Store result in intermediate buffer offset
+ Quaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );
+
+ // Slerp to the intermediate result
+ Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );
+
+ }
+
+ _lerp( buffer, dstOffset, srcOffset, t, stride ) {
+
+ const s = 1 - t;
+
+ for ( let i = 0; i !== stride; ++ i ) {
+
+ const j = dstOffset + i;
+
+ buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;
+
+ }
+
+ }
+
+ _lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {
+
+ for ( let i = 0; i !== stride; ++ i ) {
+
+ const j = dstOffset + i;
+
+ buffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;
+
+ }
+
+ }
+
+ }
+
+ // Characters [].:/ are reserved for track binding syntax.
+ const _RESERVED_CHARS_RE = '\\[\\]\\.:\\/';
+ const _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );
+
+ // Attempts to allow node names from any language. ES5's `\w` regexp matches
+ // only latin characters, and the unicode \p{L} is not yet supported. So
+ // instead, we exclude reserved characters and match everything else.
+ const _wordChar = '[^' + _RESERVED_CHARS_RE + ']';
+ const _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\.', '' ) + ']';
+
+ // Parent directories, delimited by '/' or ':'. Currently unused, but must
+ // be matched to parse the rest of the track name.
+ const _directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', _wordChar );
+
+ // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.
+ const _nodeRe = /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );
+
+ // Object on target node, and accessor. May not contain reserved
+ // characters. Accessor may contain any character except closing bracket.
+ const _objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', _wordChar );
+
+ // Property and accessor. May not contain reserved characters. Accessor may
+ // contain any non-bracket characters.
+ const _propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', _wordChar );
+
+ const _trackRe = new RegExp( ''
+ + '^'
+ + _directoryRe
+ + _nodeRe
+ + _objectRe
+ + _propertyRe
+ + '$'
+ );
+
+ const _supportedObjectNames = [ 'material', 'materials', 'bones' ];
+
+ class Composite {
+
+ constructor( targetGroup, path, optionalParsedPath ) {
+
+ const parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );
+
+ this._targetGroup = targetGroup;
+ this._bindings = targetGroup.subscribe_( path, parsedPath );
+
+ }
+
+ getValue( array, offset ) {
+
+ this.bind(); // bind all binding
+
+ const firstValidIndex = this._targetGroup.nCachedObjects_,
+ binding = this._bindings[ firstValidIndex ];
+
+ // and only call .getValue on the first
+ if ( binding !== undefined ) binding.getValue( array, offset );
+
+ }
+
+ setValue( array, offset ) {
+
+ const bindings = this._bindings;
+
+ for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {
+
+ bindings[ i ].setValue( array, offset );
+
+ }
+
+ }
+
+ bind() {
+
+ const bindings = this._bindings;
+
+ for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {
+
+ bindings[ i ].bind();
+
+ }
+
+ }
+
+ unbind() {
+
+ const bindings = this._bindings;
+
+ for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {
+
+ bindings[ i ].unbind();
+
+ }
+
+ }
+
+ }
+
+ // Note: This class uses a State pattern on a per-method basis:
+ // 'bind' sets 'this.getValue' / 'setValue' and shadows the
+ // prototype version of these methods with one that represents
+ // the bound state. When the property is not found, the methods
+ // become no-ops.
+ class PropertyBinding {
+
+ constructor( rootNode, path, parsedPath ) {
+
+ this.path = path;
+ this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );
+
+ this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;
+
+ this.rootNode = rootNode;
+
+ // initial state of these methods that calls 'bind'
+ this.getValue = this._getValue_unbound;
+ this.setValue = this._setValue_unbound;
+
+ }
+
+
+ static create( root, path, parsedPath ) {
+
+ if ( ! ( root && root.isAnimationObjectGroup ) ) {
+
+ return new PropertyBinding( root, path, parsedPath );
+
+ } else {
+
+ return new PropertyBinding.Composite( root, path, parsedPath );
+
+ }
+
+ }
+
+ /**
+ * Replaces spaces with underscores and removes unsupported characters from
+ * node names, to ensure compatibility with parseTrackName().
+ *
+ * @param {string} name Node name to be sanitized.
+ * @return {string}
+ */
+ static sanitizeNodeName( name ) {
+
+ return name.replace( /\s/g, '_' ).replace( _reservedRe, '' );
+
+ }
+
+ static parseTrackName( trackName ) {
+
+ const matches = _trackRe.exec( trackName );
+
+ if ( matches === null ) {
+
+ throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );
+
+ }
+
+ const results = {
+ // directoryName: matches[ 1 ], // (tschw) currently unused
+ nodeName: matches[ 2 ],
+ objectName: matches[ 3 ],
+ objectIndex: matches[ 4 ],
+ propertyName: matches[ 5 ], // required
+ propertyIndex: matches[ 6 ]
+ };
+
+ const lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );
+
+ if ( lastDot !== undefined && lastDot !== - 1 ) {
+
+ const objectName = results.nodeName.substring( lastDot + 1 );
+
+ // Object names must be checked against an allowlist. Otherwise, there
+ // is no way to parse 'foo.bar.baz': 'baz' must be a property, but
+ // 'bar' could be the objectName, or part of a nodeName (which can
+ // include '.' characters).
+ if ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) {
+
+ results.nodeName = results.nodeName.substring( 0, lastDot );
+ results.objectName = objectName;
+
+ }
+
+ }
+
+ if ( results.propertyName === null || results.propertyName.length === 0 ) {
+
+ throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );
+
+ }
+
+ return results;
+
+ }
+
+ static findNode( root, nodeName ) {
+
+ if ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {
+
+ return root;
+
+ }
+
+ // search into skeleton bones.
+ if ( root.skeleton ) {
+
+ const bone = root.skeleton.getBoneByName( nodeName );
+
+ if ( bone !== undefined ) {
+
+ return bone;
+
+ }
+
+ }
+
+ // search into node subtree.
+ if ( root.children ) {
+
+ const searchNodeSubtree = function ( children ) {
+
+ for ( let i = 0; i < children.length; i ++ ) {
+
+ const childNode = children[ i ];
+
+ if ( childNode.name === nodeName || childNode.uuid === nodeName ) {
+
+ return childNode;
+
+ }
+
+ const result = searchNodeSubtree( childNode.children );
+
+ if ( result ) return result;
+
+ }
+
+ return null;
+
+ };
+
+ const subTreeNode = searchNodeSubtree( root.children );
+
+ if ( subTreeNode ) {
+
+ return subTreeNode;
+
+ }
+
+ }
+
+ return null;
+
+ }
+
+ // these are used to "bind" a nonexistent property
+ _getValue_unavailable() {}
+ _setValue_unavailable() {}
+
+ // Getters
+
+ _getValue_direct( buffer, offset ) {
+
+ buffer[ offset ] = this.targetObject[ this.propertyName ];
+
+ }
+
+ _getValue_array( buffer, offset ) {
+
+ const source = this.resolvedProperty;
+
+ for ( let i = 0, n = source.length; i !== n; ++ i ) {
+
+ buffer[ offset ++ ] = source[ i ];
+
+ }
+
+ }
+
+ _getValue_arrayElement( buffer, offset ) {
+
+ buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];
+
+ }
+
+ _getValue_toArray( buffer, offset ) {
+
+ this.resolvedProperty.toArray( buffer, offset );
+
+ }
+
+ // Direct
+
+ _setValue_direct( buffer, offset ) {
+
+ this.targetObject[ this.propertyName ] = buffer[ offset ];
+
+ }
+
+ _setValue_direct_setNeedsUpdate( buffer, offset ) {
+
+ this.targetObject[ this.propertyName ] = buffer[ offset ];
+ this.targetObject.needsUpdate = true;
+
+ }
+
+ _setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {
+
+ this.targetObject[ this.propertyName ] = buffer[ offset ];
+ this.targetObject.matrixWorldNeedsUpdate = true;
+
+ }
+
+ // EntireArray
+
+ _setValue_array( buffer, offset ) {
+
+ const dest = this.resolvedProperty;
+
+ for ( let i = 0, n = dest.length; i !== n; ++ i ) {
+
+ dest[ i ] = buffer[ offset ++ ];
+
+ }
+
+ }
+
+ _setValue_array_setNeedsUpdate( buffer, offset ) {
+
+ const dest = this.resolvedProperty;
+
+ for ( let i = 0, n = dest.length; i !== n; ++ i ) {
+
+ dest[ i ] = buffer[ offset ++ ];
+
+ }
+
+ this.targetObject.needsUpdate = true;
+
+ }
+
+ _setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {
+
+ const dest = this.resolvedProperty;
+
+ for ( let i = 0, n = dest.length; i !== n; ++ i ) {
+
+ dest[ i ] = buffer[ offset ++ ];
+
+ }
+
+ this.targetObject.matrixWorldNeedsUpdate = true;
+
+ }
+
+ // ArrayElement
+
+ _setValue_arrayElement( buffer, offset ) {
+
+ this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
+
+ }
+
+ _setValue_arrayElement_setNeedsUpdate( buffer, offset ) {
+
+ this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
+ this.targetObject.needsUpdate = true;
+
+ }
+
+ _setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {
+
+ this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
+ this.targetObject.matrixWorldNeedsUpdate = true;
+
+ }
+
+ // HasToFromArray
+
+ _setValue_fromArray( buffer, offset ) {
+
+ this.resolvedProperty.fromArray( buffer, offset );
+
+ }
+
+ _setValue_fromArray_setNeedsUpdate( buffer, offset ) {
+
+ this.resolvedProperty.fromArray( buffer, offset );
+ this.targetObject.needsUpdate = true;
+
+ }
+
+ _setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {
+
+ this.resolvedProperty.fromArray( buffer, offset );
+ this.targetObject.matrixWorldNeedsUpdate = true;
+
+ }
+
+ _getValue_unbound( targetArray, offset ) {
+
+ this.bind();
+ this.getValue( targetArray, offset );
+
+ }
+
+ _setValue_unbound( sourceArray, offset ) {
+
+ this.bind();
+ this.setValue( sourceArray, offset );
+
+ }
+
+ // create getter / setter pair for a property in the scene graph
+ bind() {
+
+ let targetObject = this.node;
+ const parsedPath = this.parsedPath;
+
+ const objectName = parsedPath.objectName;
+ const propertyName = parsedPath.propertyName;
+ let propertyIndex = parsedPath.propertyIndex;
+
+ if ( ! targetObject ) {
+
+ targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;
+
+ this.node = targetObject;
+
+ }
+
+ // set fail state so we can just 'return' on error
+ this.getValue = this._getValue_unavailable;
+ this.setValue = this._setValue_unavailable;
+
+ // ensure there is a value node
+ if ( ! targetObject ) {
+
+ console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' );
+ return;
+
+ }
+
+ if ( objectName ) {
+
+ let objectIndex = parsedPath.objectIndex;
+
+ // special cases were we need to reach deeper into the hierarchy to get the face materials....
+ switch ( objectName ) {
+
+ case 'materials':
+
+ if ( ! targetObject.material ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );
+ return;
+
+ }
+
+ if ( ! targetObject.material.materials ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );
+ return;
+
+ }
+
+ targetObject = targetObject.material.materials;
+
+ break;
+
+ case 'bones':
+
+ if ( ! targetObject.skeleton ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );
+ return;
+
+ }
+
+ // potential future optimization: skip this if propertyIndex is already an integer
+ // and convert the integer string to a true integer.
+
+ targetObject = targetObject.skeleton.bones;
+
+ // support resolving morphTarget names into indices.
+ for ( let i = 0; i < targetObject.length; i ++ ) {
+
+ if ( targetObject[ i ].name === objectIndex ) {
+
+ objectIndex = i;
+ break;
+
+ }
+
+ }
+
+ break;
+
+ default:
+
+ if ( targetObject[ objectName ] === undefined ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );
+ return;
+
+ }
+
+ targetObject = targetObject[ objectName ];
+
+ }
+
+
+ if ( objectIndex !== undefined ) {
+
+ if ( targetObject[ objectIndex ] === undefined ) {
+
+ console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );
+ return;
+
+ }
+
+ targetObject = targetObject[ objectIndex ];
+
+ }
+
+ }
+
+ // resolve property
+ const nodeProperty = targetObject[ propertyName ];
+
+ if ( nodeProperty === undefined ) {
+
+ const nodeName = parsedPath.nodeName;
+
+ console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +
+ '.' + propertyName + ' but it wasn\'t found.', targetObject );
+ return;
+
+ }
+
+ // determine versioning scheme
+ let versioning = this.Versioning.None;
+
+ this.targetObject = targetObject;
+
+ if ( targetObject.needsUpdate !== undefined ) { // material
+
+ versioning = this.Versioning.NeedsUpdate;
+
+ } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform
+
+ versioning = this.Versioning.MatrixWorldNeedsUpdate;
+
+ }
+
+ // determine how the property gets bound
+ let bindingType = this.BindingType.Direct;
+
+ if ( propertyIndex !== undefined ) {
+
+ // access a sub element of the property array (only primitives are supported right now)
+
+ if ( propertyName === 'morphTargetInfluences' ) {
+
+ // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.
+
+ // support resolving morphTarget names into indices.
+ if ( ! targetObject.geometry ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );
+ return;
+
+ }
+
+ if ( targetObject.geometry.isBufferGeometry ) {
+
+ if ( ! targetObject.geometry.morphAttributes ) {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );
+ return;
+
+ }
+
+ if ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {
+
+ propertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];
+
+ }
+
+
+ } else {
+
+ console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.', this );
+ return;
+
+ }
+
+ }
+
+ bindingType = this.BindingType.ArrayElement;
+
+ this.resolvedProperty = nodeProperty;
+ this.propertyIndex = propertyIndex;
+
+ } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {
+
+ // must use copy for Object3D.Euler/Quaternion
+
+ bindingType = this.BindingType.HasFromToArray;
+
+ this.resolvedProperty = nodeProperty;
+
+ } else if ( Array.isArray( nodeProperty ) ) {
+
+ bindingType = this.BindingType.EntireArray;
+
+ this.resolvedProperty = nodeProperty;
+
+ } else {
+
+ this.propertyName = propertyName;
+
+ }
+
+ // select getter / setter
+ this.getValue = this.GetterByBindingType[ bindingType ];
+ this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];
+
+ }
+
+ unbind() {
+
+ this.node = null;
+
+ // back to the prototype version of getValue / setValue
+ // note: avoiding to mutate the shape of 'this' via 'delete'
+ this.getValue = this._getValue_unbound;
+ this.setValue = this._setValue_unbound;
+
+ }
+
+ }
+
+ PropertyBinding.Composite = Composite;
+
+ PropertyBinding.prototype.BindingType = {
+ Direct: 0,
+ EntireArray: 1,
+ ArrayElement: 2,
+ HasFromToArray: 3
+ };
+
+ PropertyBinding.prototype.Versioning = {
+ None: 0,
+ NeedsUpdate: 1,
+ MatrixWorldNeedsUpdate: 2
+ };
+
+ PropertyBinding.prototype.GetterByBindingType = [
+
+ PropertyBinding.prototype._getValue_direct,
+ PropertyBinding.prototype._getValue_array,
+ PropertyBinding.prototype._getValue_arrayElement,
+ PropertyBinding.prototype._getValue_toArray,
+
+ ];
+
+ PropertyBinding.prototype.SetterByBindingTypeAndVersioning = [
+
+ [
+ // Direct
+ PropertyBinding.prototype._setValue_direct,
+ PropertyBinding.prototype._setValue_direct_setNeedsUpdate,
+ PropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,
+
+ ], [
+
+ // EntireArray
+
+ PropertyBinding.prototype._setValue_array,
+ PropertyBinding.prototype._setValue_array_setNeedsUpdate,
+ PropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,
+
+ ], [
+
+ // ArrayElement
+ PropertyBinding.prototype._setValue_arrayElement,
+ PropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,
+ PropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,
+
+ ], [
+
+ // HasToFromArray
+ PropertyBinding.prototype._setValue_fromArray,
+ PropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,
+ PropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,
+
+ ]
+
+ ];
+
+ /**
+ *
+ * A group of objects that receives a shared animation state.
+ *
+ * Usage:
+ *
+ * - Add objects you would otherwise pass as 'root' to the
+ * constructor or the .clipAction method of AnimationMixer.
+ *
+ * - Instead pass this object as 'root'.
+ *
+ * - You can also add and remove objects later when the mixer
+ * is running.
+ *
+ * Note:
+ *
+ * Objects of this class appear as one object to the mixer,
+ * so cache control of the individual objects must be done
+ * on the group.
+ *
+ * Limitation:
+ *
+ * - The animated properties must be compatible among the
+ * all objects in the group.
+ *
+ * - A single property can either be controlled through a
+ * target group or directly, but not both.
+ */
+
+ class AnimationObjectGroup {
+
+ constructor() {
+
+ this.uuid = generateUUID();
+
+ // cached objects followed by the active ones
+ this._objects = Array.prototype.slice.call( arguments );
+
+ this.nCachedObjects_ = 0; // threshold
+ // note: read by PropertyBinding.Composite
+
+ const indices = {};
+ this._indicesByUUID = indices; // for bookkeeping
+
+ for ( let i = 0, n = arguments.length; i !== n; ++ i ) {
+
+ indices[ arguments[ i ].uuid ] = i;
+
+ }
+
+ this._paths = []; // inside: string
+ this._parsedPaths = []; // inside: { we don't care, here }
+ this._bindings = []; // inside: Array< PropertyBinding >
+ this._bindingsIndicesByPath = {}; // inside: indices in these arrays
+
+ const scope = this;
+
+ this.stats = {
+
+ objects: {
+ get total() {
+
+ return scope._objects.length;
+
+ },
+ get inUse() {
+
+ return this.total - scope.nCachedObjects_;
+
+ }
+ },
+ get bindingsPerObject() {
+
+ return scope._bindings.length;
+
+ }
+
+ };
+
+ }
+
+ add() {
+
+ const objects = this._objects,
+ indicesByUUID = this._indicesByUUID,
+ paths = this._paths,
+ parsedPaths = this._parsedPaths,
+ bindings = this._bindings,
+ nBindings = bindings.length;
+
+ let knownObject = undefined,
+ nObjects = objects.length,
+ nCachedObjects = this.nCachedObjects_;
+
+ for ( let i = 0, n = arguments.length; i !== n; ++ i ) {
+
+ const object = arguments[ i ],
+ uuid = object.uuid;
+ let index = indicesByUUID[ uuid ];
+
+ if ( index === undefined ) {
+
+ // unknown object -> add it to the ACTIVE region
+
+ index = nObjects ++;
+ indicesByUUID[ uuid ] = index;
+ objects.push( object );
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );
+
+ }
+
+ } else if ( index < nCachedObjects ) {
+
+ knownObject = objects[ index ];
+
+ // move existing object to the ACTIVE region
+
+ const firstActiveIndex = -- nCachedObjects,
+ lastCachedObject = objects[ firstActiveIndex ];
+
+ indicesByUUID[ lastCachedObject.uuid ] = index;
+ objects[ index ] = lastCachedObject;
+
+ indicesByUUID[ uuid ] = firstActiveIndex;
+ objects[ firstActiveIndex ] = object;
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ const bindingsForPath = bindings[ j ],
+ lastCached = bindingsForPath[ firstActiveIndex ];
+
+ let binding = bindingsForPath[ index ];
+
+ bindingsForPath[ index ] = lastCached;
+
+ if ( binding === undefined ) {
+
+ // since we do not bother to create new bindings
+ // for objects that are cached, the binding may
+ // or may not exist
+
+ binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );
+
+ }
+
+ bindingsForPath[ firstActiveIndex ] = binding;
+
+ }
+
+ } else if ( objects[ index ] !== knownObject ) {
+
+ console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +
+ 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );
+
+ } // else the object is already where we want it to be
+
+ } // for arguments
+
+ this.nCachedObjects_ = nCachedObjects;
+
+ }
+
+ remove() {
+
+ const objects = this._objects,
+ indicesByUUID = this._indicesByUUID,
+ bindings = this._bindings,
+ nBindings = bindings.length;
+
+ let nCachedObjects = this.nCachedObjects_;
+
+ for ( let i = 0, n = arguments.length; i !== n; ++ i ) {
+
+ const object = arguments[ i ],
+ uuid = object.uuid,
+ index = indicesByUUID[ uuid ];
+
+ if ( index !== undefined && index >= nCachedObjects ) {
+
+ // move existing object into the CACHED region
+
+ const lastCachedIndex = nCachedObjects ++,
+ firstActiveObject = objects[ lastCachedIndex ];
+
+ indicesByUUID[ firstActiveObject.uuid ] = index;
+ objects[ index ] = firstActiveObject;
+
+ indicesByUUID[ uuid ] = lastCachedIndex;
+ objects[ lastCachedIndex ] = object;
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ const bindingsForPath = bindings[ j ],
+ firstActive = bindingsForPath[ lastCachedIndex ],
+ binding = bindingsForPath[ index ];
+
+ bindingsForPath[ index ] = firstActive;
+ bindingsForPath[ lastCachedIndex ] = binding;
+
+ }
+
+ }
+
+ } // for arguments
+
+ this.nCachedObjects_ = nCachedObjects;
+
+ }
+
+ // remove & forget
+ uncache() {
+
+ const objects = this._objects,
+ indicesByUUID = this._indicesByUUID,
+ bindings = this._bindings,
+ nBindings = bindings.length;
+
+ let nCachedObjects = this.nCachedObjects_,
+ nObjects = objects.length;
+
+ for ( let i = 0, n = arguments.length; i !== n; ++ i ) {
+
+ const object = arguments[ i ],
+ uuid = object.uuid,
+ index = indicesByUUID[ uuid ];
+
+ if ( index !== undefined ) {
+
+ delete indicesByUUID[ uuid ];
+
+ if ( index < nCachedObjects ) {
+
+ // object is cached, shrink the CACHED region
+
+ const firstActiveIndex = -- nCachedObjects,
+ lastCachedObject = objects[ firstActiveIndex ],
+ lastIndex = -- nObjects,
+ lastObject = objects[ lastIndex ];
+
+ // last cached object takes this object's place
+ indicesByUUID[ lastCachedObject.uuid ] = index;
+ objects[ index ] = lastCachedObject;
+
+ // last object goes to the activated slot and pop
+ indicesByUUID[ lastObject.uuid ] = firstActiveIndex;
+ objects[ firstActiveIndex ] = lastObject;
+ objects.pop();
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ const bindingsForPath = bindings[ j ],
+ lastCached = bindingsForPath[ firstActiveIndex ],
+ last = bindingsForPath[ lastIndex ];
+
+ bindingsForPath[ index ] = lastCached;
+ bindingsForPath[ firstActiveIndex ] = last;
+ bindingsForPath.pop();
+
+ }
+
+ } else {
+
+ // object is active, just swap with the last and pop
+
+ const lastIndex = -- nObjects,
+ lastObject = objects[ lastIndex ];
+
+ if ( lastIndex > 0 ) {
+
+ indicesByUUID[ lastObject.uuid ] = index;
+
+ }
+
+ objects[ index ] = lastObject;
+ objects.pop();
+
+ // accounting is done, now do the same for all bindings
+
+ for ( let j = 0, m = nBindings; j !== m; ++ j ) {
+
+ const bindingsForPath = bindings[ j ];
+
+ bindingsForPath[ index ] = bindingsForPath[ lastIndex ];
+ bindingsForPath.pop();
+
+ }
+
+ } // cached or active
+
+ } // if object is known
+
+ } // for arguments
+
+ this.nCachedObjects_ = nCachedObjects;
+
+ }
+
+ // Internal interface used by befriended PropertyBinding.Composite:
+
+ subscribe_( path, parsedPath ) {
+
+ // returns an array of bindings for the given path that is changed
+ // according to the contained objects in the group
+
+ const indicesByPath = this._bindingsIndicesByPath;
+ let index = indicesByPath[ path ];
+ const bindings = this._bindings;
+
+ if ( index !== undefined ) return bindings[ index ];
+
+ const paths = this._paths,
+ parsedPaths = this._parsedPaths,
+ objects = this._objects,
+ nObjects = objects.length,
+ nCachedObjects = this.nCachedObjects_,
+ bindingsForPath = new Array( nObjects );
+
+ index = bindings.length;
+
+ indicesByPath[ path ] = index;
+
+ paths.push( path );
+ parsedPaths.push( parsedPath );
+ bindings.push( bindingsForPath );
+
+ for ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {
+
+ const object = objects[ i ];
+ bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );
+
+ }
+
+ return bindingsForPath;
+
+ }
+
+ unsubscribe_( path ) {
+
+ // tells the group to forget about a property path and no longer
+ // update the array previously obtained with 'subscribe_'
+
+ const indicesByPath = this._bindingsIndicesByPath,
+ index = indicesByPath[ path ];
+
+ if ( index !== undefined ) {
+
+ const paths = this._paths,
+ parsedPaths = this._parsedPaths,
+ bindings = this._bindings,
+ lastBindingsIndex = bindings.length - 1,
+ lastBindings = bindings[ lastBindingsIndex ],
+ lastBindingsPath = path[ lastBindingsIndex ];
+
+ indicesByPath[ lastBindingsPath ] = index;
+
+ bindings[ index ] = lastBindings;
+ bindings.pop();
+
+ parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];
+ parsedPaths.pop();
+
+ paths[ index ] = paths[ lastBindingsIndex ];
+ paths.pop();
+
+ }
+
+ }
+
+ }
+
+ AnimationObjectGroup.prototype.isAnimationObjectGroup = true;
+
+ class AnimationAction {
+
+ constructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {
+
+ this._mixer = mixer;
+ this._clip = clip;
+ this._localRoot = localRoot;
+ this.blendMode = blendMode;
+
+ const tracks = clip.tracks,
+ nTracks = tracks.length,
+ interpolants = new Array( nTracks );
+
+ const interpolantSettings = {
+ endingStart: ZeroCurvatureEnding,
+ endingEnd: ZeroCurvatureEnding
+ };
+
+ for ( let i = 0; i !== nTracks; ++ i ) {
+
+ const interpolant = tracks[ i ].createInterpolant( null );
+ interpolants[ i ] = interpolant;
+ interpolant.settings = interpolantSettings;
+
+ }
+
+ this._interpolantSettings = interpolantSettings;
+
+ this._interpolants = interpolants; // bound by the mixer
+
+ // inside: PropertyMixer (managed by the mixer)
+ this._propertyBindings = new Array( nTracks );
+
+ this._cacheIndex = null; // for the memory manager
+ this._byClipCacheIndex = null; // for the memory manager
+
+ this._timeScaleInterpolant = null;
+ this._weightInterpolant = null;
+
+ this.loop = LoopRepeat;
+ this._loopCount = - 1;
+
+ // global mixer time when the action is to be started
+ // it's set back to 'null' upon start of the action
+ this._startTime = null;
+
+ // scaled local time of the action
+ // gets clamped or wrapped to 0..clip.duration according to loop
+ this.time = 0;
+
+ this.timeScale = 1;
+ this._effectiveTimeScale = 1;
+
+ this.weight = 1;
+ this._effectiveWeight = 1;
+
+ this.repetitions = Infinity; // no. of repetitions when looping
+
+ this.paused = false; // true -> zero effective time scale
+ this.enabled = true; // false -> zero effective weight
+
+ this.clampWhenFinished = false;// keep feeding the last frame?
+
+ this.zeroSlopeAtStart = true;// for smooth interpolation w/o separate
+ this.zeroSlopeAtEnd = true;// clips for start, loop and end
+
+ }
+
+ // State & Scheduling
+
+ play() {
+
+ this._mixer._activateAction( this );
+
+ return this;
+
+ }
+
+ stop() {
+
+ this._mixer._deactivateAction( this );
+
+ return this.reset();
+
+ }
+
+ reset() {
+
+ this.paused = false;
+ this.enabled = true;
+
+ this.time = 0; // restart clip
+ this._loopCount = - 1;// forget previous loops
+ this._startTime = null;// forget scheduling
+
+ return this.stopFading().stopWarping();
+
+ }
+
+ isRunning() {
+
+ return this.enabled && ! this.paused && this.timeScale !== 0 &&
+ this._startTime === null && this._mixer._isActiveAction( this );
+
+ }
+
+ // return true when play has been called
+ isScheduled() {
+
+ return this._mixer._isActiveAction( this );
+
+ }
+
+ startAt( time ) {
+
+ this._startTime = time;
+
+ return this;
+
+ }
+
+ setLoop( mode, repetitions ) {
+
+ this.loop = mode;
+ this.repetitions = repetitions;
+
+ return this;
+
+ }
+
+ // Weight
+
+ // set the weight stopping any scheduled fading
+ // although .enabled = false yields an effective weight of zero, this
+ // method does *not* change .enabled, because it would be confusing
+ setEffectiveWeight( weight ) {
+
+ this.weight = weight;
+
+ // note: same logic as when updated at runtime
+ this._effectiveWeight = this.enabled ? weight : 0;
+
+ return this.stopFading();
+
+ }
+
+ // return the weight considering fading and .enabled
+ getEffectiveWeight() {
+
+ return this._effectiveWeight;
+
+ }
+
+ fadeIn( duration ) {
+
+ return this._scheduleFading( duration, 0, 1 );
+
+ }
+
+ fadeOut( duration ) {
+
+ return this._scheduleFading( duration, 1, 0 );
+
+ }
+
+ crossFadeFrom( fadeOutAction, duration, warp ) {
+
+ fadeOutAction.fadeOut( duration );
+ this.fadeIn( duration );
+
+ if ( warp ) {
+
+ const fadeInDuration = this._clip.duration,
+ fadeOutDuration = fadeOutAction._clip.duration,
+
+ startEndRatio = fadeOutDuration / fadeInDuration,
+ endStartRatio = fadeInDuration / fadeOutDuration;
+
+ fadeOutAction.warp( 1.0, startEndRatio, duration );
+ this.warp( endStartRatio, 1.0, duration );
+
+ }
+
+ return this;
+
+ }
+
+ crossFadeTo( fadeInAction, duration, warp ) {
+
+ return fadeInAction.crossFadeFrom( this, duration, warp );
+
+ }
+
+ stopFading() {
+
+ const weightInterpolant = this._weightInterpolant;
+
+ if ( weightInterpolant !== null ) {
+
+ this._weightInterpolant = null;
+ this._mixer._takeBackControlInterpolant( weightInterpolant );
+
+ }
+
+ return this;
+
+ }
+
+ // Time Scale Control
+
+ // set the time scale stopping any scheduled warping
+ // although .paused = true yields an effective time scale of zero, this
+ // method does *not* change .paused, because it would be confusing
+ setEffectiveTimeScale( timeScale ) {
+
+ this.timeScale = timeScale;
+ this._effectiveTimeScale = this.paused ? 0 : timeScale;
+
+ return this.stopWarping();
+
+ }
+
+ // return the time scale considering warping and .paused
+ getEffectiveTimeScale() {
+
+ return this._effectiveTimeScale;
+
+ }
+
+ setDuration( duration ) {
+
+ this.timeScale = this._clip.duration / duration;
+
+ return this.stopWarping();
+
+ }
+
+ syncWith( action ) {
+
+ this.time = action.time;
+ this.timeScale = action.timeScale;
+
+ return this.stopWarping();
+
+ }
+
+ halt( duration ) {
+
+ return this.warp( this._effectiveTimeScale, 0, duration );
+
+ }
+
+ warp( startTimeScale, endTimeScale, duration ) {
+
+ const mixer = this._mixer,
+ now = mixer.time,
+ timeScale = this.timeScale;
+
+ let interpolant = this._timeScaleInterpolant;
+
+ if ( interpolant === null ) {
+
+ interpolant = mixer._lendControlInterpolant();
+ this._timeScaleInterpolant = interpolant;
+
+ }
+
+ const times = interpolant.parameterPositions,
+ values = interpolant.sampleValues;
+
+ times[ 0 ] = now;
+ times[ 1 ] = now + duration;
+
+ values[ 0 ] = startTimeScale / timeScale;
+ values[ 1 ] = endTimeScale / timeScale;
+
+ return this;
+
+ }
+
+ stopWarping() {
+
+ const timeScaleInterpolant = this._timeScaleInterpolant;
+
+ if ( timeScaleInterpolant !== null ) {
+
+ this._timeScaleInterpolant = null;
+ this._mixer._takeBackControlInterpolant( timeScaleInterpolant );
+
+ }
+
+ return this;
+
+ }
+
+ // Object Accessors
+
+ getMixer() {
+
+ return this._mixer;
+
+ }
+
+ getClip() {
+
+ return this._clip;
+
+ }
+
+ getRoot() {
+
+ return this._localRoot || this._mixer._root;
+
+ }
+
+ // Interna
+
+ _update( time, deltaTime, timeDirection, accuIndex ) {
+
+ // called by the mixer
+
+ if ( ! this.enabled ) {
+
+ // call ._updateWeight() to update ._effectiveWeight
+
+ this._updateWeight( time );
+ return;
+
+ }
+
+ const startTime = this._startTime;
+
+ if ( startTime !== null ) {
+
+ // check for scheduled start of action
+
+ const timeRunning = ( time - startTime ) * timeDirection;
+ if ( timeRunning < 0 || timeDirection === 0 ) {
+
+ return; // yet to come / don't decide when delta = 0
+
+ }
+
+ // start
+
+ this._startTime = null; // unschedule
+ deltaTime = timeDirection * timeRunning;
+
+ }
+
+ // apply time scale and advance time
+
+ deltaTime *= this._updateTimeScale( time );
+ const clipTime = this._updateTime( deltaTime );
+
+ // note: _updateTime may disable the action resulting in
+ // an effective weight of 0
+
+ const weight = this._updateWeight( time );
+
+ if ( weight > 0 ) {
+
+ const interpolants = this._interpolants;
+ const propertyMixers = this._propertyBindings;
+
+ switch ( this.blendMode ) {
+
+ case AdditiveAnimationBlendMode:
+
+ for ( let j = 0, m = interpolants.length; j !== m; ++ j ) {
+
+ interpolants[ j ].evaluate( clipTime );
+ propertyMixers[ j ].accumulateAdditive( weight );
+
+ }
+
+ break;
+
+ case NormalAnimationBlendMode:
+ default:
+
+ for ( let j = 0, m = interpolants.length; j !== m; ++ j ) {
+
+ interpolants[ j ].evaluate( clipTime );
+ propertyMixers[ j ].accumulate( accuIndex, weight );
+
+ }
+
+ }
+
+ }
+
+ }
+
+ _updateWeight( time ) {
+
+ let weight = 0;
+
+ if ( this.enabled ) {
+
+ weight = this.weight;
+ const interpolant = this._weightInterpolant;
+
+ if ( interpolant !== null ) {
+
+ const interpolantValue = interpolant.evaluate( time )[ 0 ];
+
+ weight *= interpolantValue;
+
+ if ( time > interpolant.parameterPositions[ 1 ] ) {
+
+ this.stopFading();
+
+ if ( interpolantValue === 0 ) {
+
+ // faded out, disable
+ this.enabled = false;
+
+ }
+
+ }
+
+ }
+
+ }
+
+ this._effectiveWeight = weight;
+ return weight;
+
+ }
+
+ _updateTimeScale( time ) {
+
+ let timeScale = 0;
+
+ if ( ! this.paused ) {
+
+ timeScale = this.timeScale;
+
+ const interpolant = this._timeScaleInterpolant;
+
+ if ( interpolant !== null ) {
+
+ const interpolantValue = interpolant.evaluate( time )[ 0 ];
+
+ timeScale *= interpolantValue;
+
+ if ( time > interpolant.parameterPositions[ 1 ] ) {
+
+ this.stopWarping();
+
+ if ( timeScale === 0 ) {
+
+ // motion has halted, pause
+ this.paused = true;
+
+ } else {
+
+ // warp done - apply final time scale
+ this.timeScale = timeScale;
+
+ }
+
+ }
+
+ }
+
+ }
+
+ this._effectiveTimeScale = timeScale;
+ return timeScale;
+
+ }
+
+ _updateTime( deltaTime ) {
+
+ const duration = this._clip.duration;
+ const loop = this.loop;
+
+ let time = this.time + deltaTime;
+ let loopCount = this._loopCount;
+
+ const pingPong = ( loop === LoopPingPong );
+
+ if ( deltaTime === 0 ) {
+
+ if ( loopCount === - 1 ) return time;
+
+ return ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;
+
+ }
+
+ if ( loop === LoopOnce ) {
+
+ if ( loopCount === - 1 ) {
+
+ // just started
+
+ this._loopCount = 0;
+ this._setEndings( true, true, false );
+
+ }
+
+ handle_stop: {
+
+ if ( time >= duration ) {
+
+ time = duration;
+
+ } else if ( time < 0 ) {
+
+ time = 0;
+
+ } else {
+
+ this.time = time;
+
+ break handle_stop;
+
+ }
+
+ if ( this.clampWhenFinished ) this.paused = true;
+ else this.enabled = false;
+
+ this.time = time;
+
+ this._mixer.dispatchEvent( {
+ type: 'finished', action: this,
+ direction: deltaTime < 0 ? - 1 : 1
+ } );
+
+ }
+
+ } else { // repetitive Repeat or PingPong
+
+ if ( loopCount === - 1 ) {
+
+ // just started
+
+ if ( deltaTime >= 0 ) {
+
+ loopCount = 0;
+
+ this._setEndings( true, this.repetitions === 0, pingPong );
+
+ } else {
+
+ // when looping in reverse direction, the initial
+ // transition through zero counts as a repetition,
+ // so leave loopCount at -1
+
+ this._setEndings( this.repetitions === 0, true, pingPong );
+
+ }
+
+ }
+
+ if ( time >= duration || time < 0 ) {
+
+ // wrap around
+
+ const loopDelta = Math.floor( time / duration ); // signed
+ time -= duration * loopDelta;
+
+ loopCount += Math.abs( loopDelta );
+
+ const pending = this.repetitions - loopCount;
+
+ if ( pending <= 0 ) {
+
+ // have to stop (switch state, clamp time, fire event)
+
+ if ( this.clampWhenFinished ) this.paused = true;
+ else this.enabled = false;
+
+ time = deltaTime > 0 ? duration : 0;
+
+ this.time = time;
+
+ this._mixer.dispatchEvent( {
+ type: 'finished', action: this,
+ direction: deltaTime > 0 ? 1 : - 1
+ } );
+
+ } else {
+
+ // keep running
+
+ if ( pending === 1 ) {
+
+ // entering the last round
+
+ const atStart = deltaTime < 0;
+ this._setEndings( atStart, ! atStart, pingPong );
+
+ } else {
+
+ this._setEndings( false, false, pingPong );
+
+ }
+
+ this._loopCount = loopCount;
+
+ this.time = time;
+
+ this._mixer.dispatchEvent( {
+ type: 'loop', action: this, loopDelta: loopDelta
+ } );
+
+ }
+
+ } else {
+
+ this.time = time;
+
+ }
+
+ if ( pingPong && ( loopCount & 1 ) === 1 ) {
+
+ // invert time for the "pong round"
+
+ return duration - time;
+
+ }
+
+ }
+
+ return time;
+
+ }
+
+ _setEndings( atStart, atEnd, pingPong ) {
+
+ const settings = this._interpolantSettings;
+
+ if ( pingPong ) {
+
+ settings.endingStart = ZeroSlopeEnding;
+ settings.endingEnd = ZeroSlopeEnding;
+
+ } else {
+
+ // assuming for LoopOnce atStart == atEnd == true
+
+ if ( atStart ) {
+
+ settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;
+
+ } else {
+
+ settings.endingStart = WrapAroundEnding;
+
+ }
+
+ if ( atEnd ) {
+
+ settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;
+
+ } else {
+
+ settings.endingEnd = WrapAroundEnding;
+
+ }
+
+ }
+
+ }
+
+ _scheduleFading( duration, weightNow, weightThen ) {
+
+ const mixer = this._mixer, now = mixer.time;
+ let interpolant = this._weightInterpolant;
+
+ if ( interpolant === null ) {
+
+ interpolant = mixer._lendControlInterpolant();
+ this._weightInterpolant = interpolant;
+
+ }
+
+ const times = interpolant.parameterPositions,
+ values = interpolant.sampleValues;
+
+ times[ 0 ] = now;
+ values[ 0 ] = weightNow;
+ times[ 1 ] = now + duration;
+ values[ 1 ] = weightThen;
+
+ return this;
+
+ }
+
+ }
+
+ class AnimationMixer extends EventDispatcher {
+
+ constructor( root ) {
+
+ super();
+
+ this._root = root;
+ this._initMemoryManager();
+ this._accuIndex = 0;
+ this.time = 0;
+ this.timeScale = 1.0;
+
+ }
+
+ _bindAction( action, prototypeAction ) {
+
+ const root = action._localRoot || this._root,
+ tracks = action._clip.tracks,
+ nTracks = tracks.length,
+ bindings = action._propertyBindings,
+ interpolants = action._interpolants,
+ rootUuid = root.uuid,
+ bindingsByRoot = this._bindingsByRootAndName;
+
+ let bindingsByName = bindingsByRoot[ rootUuid ];
+
+ if ( bindingsByName === undefined ) {
+
+ bindingsByName = {};
+ bindingsByRoot[ rootUuid ] = bindingsByName;
+
+ }
+
+ for ( let i = 0; i !== nTracks; ++ i ) {
+
+ const track = tracks[ i ],
+ trackName = track.name;
+
+ let binding = bindingsByName[ trackName ];
+
+ if ( binding !== undefined ) {
+
+ ++ binding.referenceCount;
+ bindings[ i ] = binding;
+
+ } else {
+
+ binding = bindings[ i ];
+
+ if ( binding !== undefined ) {
+
+ // existing binding, make sure the cache knows
+
+ if ( binding._cacheIndex === null ) {
+
+ ++ binding.referenceCount;
+ this._addInactiveBinding( binding, rootUuid, trackName );
+
+ }
+
+ continue;
+
+ }
+
+ const path = prototypeAction && prototypeAction.
+ _propertyBindings[ i ].binding.parsedPath;
+
+ binding = new PropertyMixer(
+ PropertyBinding.create( root, trackName, path ),
+ track.ValueTypeName, track.getValueSize() );
+
+ ++ binding.referenceCount;
+ this._addInactiveBinding( binding, rootUuid, trackName );
+
+ bindings[ i ] = binding;
+
+ }
+
+ interpolants[ i ].resultBuffer = binding.buffer;
+
+ }
+
+ }
+
+ _activateAction( action ) {
+
+ if ( ! this._isActiveAction( action ) ) {
+
+ if ( action._cacheIndex === null ) {
+
+ // this action has been forgotten by the cache, but the user
+ // appears to be still using it -> rebind
+
+ const rootUuid = ( action._localRoot || this._root ).uuid,
+ clipUuid = action._clip.uuid,
+ actionsForClip = this._actionsByClip[ clipUuid ];
+
+ this._bindAction( action,
+ actionsForClip && actionsForClip.knownActions[ 0 ] );
+
+ this._addInactiveAction( action, clipUuid, rootUuid );
+
+ }
+
+ const bindings = action._propertyBindings;
+
+ // increment reference counts / sort out state
+ for ( let i = 0, n = bindings.length; i !== n; ++ i ) {
+
+ const binding = bindings[ i ];
+
+ if ( binding.useCount ++ === 0 ) {
+
+ this._lendBinding( binding );
+ binding.saveOriginalState();
+
+ }
+
+ }
+
+ this._lendAction( action );
+
+ }
+
+ }
+
+ _deactivateAction( action ) {
+
+ if ( this._isActiveAction( action ) ) {
+
+ const bindings = action._propertyBindings;
+
+ // decrement reference counts / sort out state
+ for ( let i = 0, n = bindings.length; i !== n; ++ i ) {
+
+ const binding = bindings[ i ];
+
+ if ( -- binding.useCount === 0 ) {
+
+ binding.restoreOriginalState();
+ this._takeBackBinding( binding );
+
+ }
+
+ }
+
+ this._takeBackAction( action );
+
+ }
+
+ }
+
+ // Memory manager
+
+ _initMemoryManager() {
+
+ this._actions = []; // 'nActiveActions' followed by inactive ones
+ this._nActiveActions = 0;
+
+ this._actionsByClip = {};
+ // inside:
+ // {
+ // knownActions: Array< AnimationAction > - used as prototypes
+ // actionByRoot: AnimationAction - lookup
+ // }
+
+
+ this._bindings = []; // 'nActiveBindings' followed by inactive ones
+ this._nActiveBindings = 0;
+
+ this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >
+
+
+ this._controlInterpolants = []; // same game as above
+ this._nActiveControlInterpolants = 0;
+
+ const scope = this;
+
+ this.stats = {
+
+ actions: {
+ get total() {
+
+ return scope._actions.length;
+
+ },
+ get inUse() {
+
+ return scope._nActiveActions;
+
+ }
+ },
+ bindings: {
+ get total() {
+
+ return scope._bindings.length;
+
+ },
+ get inUse() {
+
+ return scope._nActiveBindings;
+
+ }
+ },
+ controlInterpolants: {
+ get total() {
+
+ return scope._controlInterpolants.length;
+
+ },
+ get inUse() {
+
+ return scope._nActiveControlInterpolants;
+
+ }
+ }
+
+ };
+
+ }
+
+ // Memory management for AnimationAction objects
+
+ _isActiveAction( action ) {
+
+ const index = action._cacheIndex;
+ return index !== null && index < this._nActiveActions;
+
+ }
+
+ _addInactiveAction( action, clipUuid, rootUuid ) {
+
+ const actions = this._actions,
+ actionsByClip = this._actionsByClip;
+
+ let actionsForClip = actionsByClip[ clipUuid ];
+
+ if ( actionsForClip === undefined ) {
+
+ actionsForClip = {
+
+ knownActions: [ action ],
+ actionByRoot: {}
+
+ };
+
+ action._byClipCacheIndex = 0;
+
+ actionsByClip[ clipUuid ] = actionsForClip;
+
+ } else {
+
+ const knownActions = actionsForClip.knownActions;
+
+ action._byClipCacheIndex = knownActions.length;
+ knownActions.push( action );
+
+ }
+
+ action._cacheIndex = actions.length;
+ actions.push( action );
+
+ actionsForClip.actionByRoot[ rootUuid ] = action;
+
+ }
+
+ _removeInactiveAction( action ) {
+
+ const actions = this._actions,
+ lastInactiveAction = actions[ actions.length - 1 ],
+ cacheIndex = action._cacheIndex;
+
+ lastInactiveAction._cacheIndex = cacheIndex;
+ actions[ cacheIndex ] = lastInactiveAction;
+ actions.pop();
+
+ action._cacheIndex = null;
+
+
+ const clipUuid = action._clip.uuid,
+ actionsByClip = this._actionsByClip,
+ actionsForClip = actionsByClip[ clipUuid ],
+ knownActionsForClip = actionsForClip.knownActions,
+
+ lastKnownAction =
+ knownActionsForClip[ knownActionsForClip.length - 1 ],
+
+ byClipCacheIndex = action._byClipCacheIndex;
+
+ lastKnownAction._byClipCacheIndex = byClipCacheIndex;
+ knownActionsForClip[ byClipCacheIndex ] = lastKnownAction;
+ knownActionsForClip.pop();
+
+ action._byClipCacheIndex = null;
+
+
+ const actionByRoot = actionsForClip.actionByRoot,
+ rootUuid = ( action._localRoot || this._root ).uuid;
+
+ delete actionByRoot[ rootUuid ];
+
+ if ( knownActionsForClip.length === 0 ) {
+
+ delete actionsByClip[ clipUuid ];
+
+ }
+
+ this._removeInactiveBindingsForAction( action );
+
+ }
+
+ _removeInactiveBindingsForAction( action ) {
+
+ const bindings = action._propertyBindings;
+
+ for ( let i = 0, n = bindings.length; i !== n; ++ i ) {
+
+ const binding = bindings[ i ];
+
+ if ( -- binding.referenceCount === 0 ) {
+
+ this._removeInactiveBinding( binding );
+
+ }
+
+ }
+
+ }
+
+ _lendAction( action ) {
+
+ // [ active actions | inactive actions ]
+ // [ active actions >| inactive actions ]
+ // s a
+ // <-swap->
+ // a s
+
+ const actions = this._actions,
+ prevIndex = action._cacheIndex,
+
+ lastActiveIndex = this._nActiveActions ++,
+
+ firstInactiveAction = actions[ lastActiveIndex ];
+
+ action._cacheIndex = lastActiveIndex;
+ actions[ lastActiveIndex ] = action;
+
+ firstInactiveAction._cacheIndex = prevIndex;
+ actions[ prevIndex ] = firstInactiveAction;
+
+ }
+
+ _takeBackAction( action ) {
+
+ // [ active actions | inactive actions ]
+ // [ active actions |< inactive actions ]
+ // a s
+ // <-swap->
+ // s a
+
+ const actions = this._actions,
+ prevIndex = action._cacheIndex,
+
+ firstInactiveIndex = -- this._nActiveActions,
+
+ lastActiveAction = actions[ firstInactiveIndex ];
+
+ action._cacheIndex = firstInactiveIndex;
+ actions[ firstInactiveIndex ] = action;
+
+ lastActiveAction._cacheIndex = prevIndex;
+ actions[ prevIndex ] = lastActiveAction;
+
+ }
+
+ // Memory management for PropertyMixer objects
+
+ _addInactiveBinding( binding, rootUuid, trackName ) {
+
+ const bindingsByRoot = this._bindingsByRootAndName,
+ bindings = this._bindings;
+
+ let bindingByName = bindingsByRoot[ rootUuid ];
+
+ if ( bindingByName === undefined ) {
+
+ bindingByName = {};
+ bindingsByRoot[ rootUuid ] = bindingByName;
+
+ }
+
+ bindingByName[ trackName ] = binding;
+
+ binding._cacheIndex = bindings.length;
+ bindings.push( binding );
+
+ }
+
+ _removeInactiveBinding( binding ) {
+
+ const bindings = this._bindings,
+ propBinding = binding.binding,
+ rootUuid = propBinding.rootNode.uuid,
+ trackName = propBinding.path,
+ bindingsByRoot = this._bindingsByRootAndName,
+ bindingByName = bindingsByRoot[ rootUuid ],
+
+ lastInactiveBinding = bindings[ bindings.length - 1 ],
+ cacheIndex = binding._cacheIndex;
+
+ lastInactiveBinding._cacheIndex = cacheIndex;
+ bindings[ cacheIndex ] = lastInactiveBinding;
+ bindings.pop();
+
+ delete bindingByName[ trackName ];
+
+ if ( Object.keys( bindingByName ).length === 0 ) {
+
+ delete bindingsByRoot[ rootUuid ];
+
+ }
+
+ }
+
+ _lendBinding( binding ) {
+
+ const bindings = this._bindings,
+ prevIndex = binding._cacheIndex,
+
+ lastActiveIndex = this._nActiveBindings ++,
+
+ firstInactiveBinding = bindings[ lastActiveIndex ];
+
+ binding._cacheIndex = lastActiveIndex;
+ bindings[ lastActiveIndex ] = binding;
+
+ firstInactiveBinding._cacheIndex = prevIndex;
+ bindings[ prevIndex ] = firstInactiveBinding;
+
+ }
+
+ _takeBackBinding( binding ) {
+
+ const bindings = this._bindings,
+ prevIndex = binding._cacheIndex,
+
+ firstInactiveIndex = -- this._nActiveBindings,
+
+ lastActiveBinding = bindings[ firstInactiveIndex ];
+
+ binding._cacheIndex = firstInactiveIndex;
+ bindings[ firstInactiveIndex ] = binding;
+
+ lastActiveBinding._cacheIndex = prevIndex;
+ bindings[ prevIndex ] = lastActiveBinding;
+
+ }
+
+
+ // Memory management of Interpolants for weight and time scale
+
+ _lendControlInterpolant() {
+
+ const interpolants = this._controlInterpolants,
+ lastActiveIndex = this._nActiveControlInterpolants ++;
+
+ let interpolant = interpolants[ lastActiveIndex ];
+
+ if ( interpolant === undefined ) {
+
+ interpolant = new LinearInterpolant(
+ new Float32Array( 2 ), new Float32Array( 2 ),
+ 1, this._controlInterpolantsResultBuffer );
+
+ interpolant.__cacheIndex = lastActiveIndex;
+ interpolants[ lastActiveIndex ] = interpolant;
+
+ }
+
+ return interpolant;
+
+ }
+
+ _takeBackControlInterpolant( interpolant ) {
+
+ const interpolants = this._controlInterpolants,
+ prevIndex = interpolant.__cacheIndex,
+
+ firstInactiveIndex = -- this._nActiveControlInterpolants,
+
+ lastActiveInterpolant = interpolants[ firstInactiveIndex ];
+
+ interpolant.__cacheIndex = firstInactiveIndex;
+ interpolants[ firstInactiveIndex ] = interpolant;
+
+ lastActiveInterpolant.__cacheIndex = prevIndex;
+ interpolants[ prevIndex ] = lastActiveInterpolant;
+
+ }
+
+ // return an action for a clip optionally using a custom root target
+ // object (this method allocates a lot of dynamic memory in case a
+ // previously unknown clip/root combination is specified)
+ clipAction( clip, optionalRoot, blendMode ) {
+
+ const root = optionalRoot || this._root,
+ rootUuid = root.uuid;
+
+ let clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;
+
+ const clipUuid = clipObject !== null ? clipObject.uuid : clip;
+
+ const actionsForClip = this._actionsByClip[ clipUuid ];
+ let prototypeAction = null;
+
+ if ( blendMode === undefined ) {
+
+ if ( clipObject !== null ) {
+
+ blendMode = clipObject.blendMode;
+
+ } else {
+
+ blendMode = NormalAnimationBlendMode;
+
+ }
+
+ }
+
+ if ( actionsForClip !== undefined ) {
+
+ const existingAction = actionsForClip.actionByRoot[ rootUuid ];
+
+ if ( existingAction !== undefined && existingAction.blendMode === blendMode ) {
+
+ return existingAction;
+
+ }
+
+ // we know the clip, so we don't have to parse all
+ // the bindings again but can just copy
+ prototypeAction = actionsForClip.knownActions[ 0 ];
+
+ // also, take the clip from the prototype action
+ if ( clipObject === null )
+ clipObject = prototypeAction._clip;
+
+ }
+
+ // clip must be known when specified via string
+ if ( clipObject === null ) return null;
+
+ // allocate all resources required to run it
+ const newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );
+
+ this._bindAction( newAction, prototypeAction );
+
+ // and make the action known to the memory manager
+ this._addInactiveAction( newAction, clipUuid, rootUuid );
+
+ return newAction;
+
+ }
+
+ // get an existing action
+ existingAction( clip, optionalRoot ) {
+
+ const root = optionalRoot || this._root,
+ rootUuid = root.uuid,
+
+ clipObject = typeof clip === 'string' ?
+ AnimationClip.findByName( root, clip ) : clip,
+
+ clipUuid = clipObject ? clipObject.uuid : clip,
+
+ actionsForClip = this._actionsByClip[ clipUuid ];
+
+ if ( actionsForClip !== undefined ) {
+
+ return actionsForClip.actionByRoot[ rootUuid ] || null;
+
+ }
+
+ return null;
+
+ }
+
+ // deactivates all previously scheduled actions
+ stopAllAction() {
+
+ const actions = this._actions,
+ nActions = this._nActiveActions;
+
+ for ( let i = nActions - 1; i >= 0; -- i ) {
+
+ actions[ i ].stop();
+
+ }
+
+ return this;
+
+ }
+
+ // advance the time and update apply the animation
+ update( deltaTime ) {
+
+ deltaTime *= this.timeScale;
+
+ const actions = this._actions,
+ nActions = this._nActiveActions,
+
+ time = this.time += deltaTime,
+ timeDirection = Math.sign( deltaTime ),
+
+ accuIndex = this._accuIndex ^= 1;
+
+ // run active actions
+
+ for ( let i = 0; i !== nActions; ++ i ) {
+
+ const action = actions[ i ];
+
+ action._update( time, deltaTime, timeDirection, accuIndex );
+
+ }
+
+ // update scene graph
+
+ const bindings = this._bindings,
+ nBindings = this._nActiveBindings;
+
+ for ( let i = 0; i !== nBindings; ++ i ) {
+
+ bindings[ i ].apply( accuIndex );
+
+ }
+
+ return this;
+
+ }
+
+ // Allows you to seek to a specific time in an animation.
+ setTime( timeInSeconds ) {
+
+ this.time = 0; // Zero out time attribute for AnimationMixer object;
+ for ( let i = 0; i < this._actions.length; i ++ ) {
+
+ this._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.
+
+ }
+
+ return this.update( timeInSeconds ); // Update used to set exact time. Returns "this" AnimationMixer object.
+
+ }
+
+ // return this mixer's root target object
+ getRoot() {
+
+ return this._root;
+
+ }
+
+ // free all resources specific to a particular clip
+ uncacheClip( clip ) {
+
+ const actions = this._actions,
+ clipUuid = clip.uuid,
+ actionsByClip = this._actionsByClip,
+ actionsForClip = actionsByClip[ clipUuid ];
+
+ if ( actionsForClip !== undefined ) {
+
+ // note: just calling _removeInactiveAction would mess up the
+ // iteration state and also require updating the state we can
+ // just throw away
+
+ const actionsToRemove = actionsForClip.knownActions;
+
+ for ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {
+
+ const action = actionsToRemove[ i ];
+
+ this._deactivateAction( action );
+
+ const cacheIndex = action._cacheIndex,
+ lastInactiveAction = actions[ actions.length - 1 ];
+
+ action._cacheIndex = null;
+ action._byClipCacheIndex = null;
+
+ lastInactiveAction._cacheIndex = cacheIndex;
+ actions[ cacheIndex ] = lastInactiveAction;
+ actions.pop();
+
+ this._removeInactiveBindingsForAction( action );
+
+ }
+
+ delete actionsByClip[ clipUuid ];
+
+ }
+
+ }
+
+ // free all resources specific to a particular root target object
+ uncacheRoot( root ) {
+
+ const rootUuid = root.uuid,
+ actionsByClip = this._actionsByClip;
+
+ for ( const clipUuid in actionsByClip ) {
+
+ const actionByRoot = actionsByClip[ clipUuid ].actionByRoot,
+ action = actionByRoot[ rootUuid ];
+
+ if ( action !== undefined ) {
+
+ this._deactivateAction( action );
+ this._removeInactiveAction( action );
+
+ }
+
+ }
+
+ const bindingsByRoot = this._bindingsByRootAndName,
+ bindingByName = bindingsByRoot[ rootUuid ];
+
+ if ( bindingByName !== undefined ) {
+
+ for ( const trackName in bindingByName ) {
+
+ const binding = bindingByName[ trackName ];
+ binding.restoreOriginalState();
+ this._removeInactiveBinding( binding );
+
+ }
+
+ }
+
+ }
+
+ // remove a targeted clip from the cache
+ uncacheAction( clip, optionalRoot ) {
+
+ const action = this.existingAction( clip, optionalRoot );
+
+ if ( action !== null ) {
+
+ this._deactivateAction( action );
+ this._removeInactiveAction( action );
+
+ }
+
+ }
+
+ }
+
+ AnimationMixer.prototype._controlInterpolantsResultBuffer = new Float32Array( 1 );
+
+ class Uniform {
+
+ constructor( value ) {
+
+ if ( typeof value === 'string' ) {
+
+ console.warn( 'THREE.Uniform: Type parameter is no longer needed.' );
+ value = arguments[ 1 ];
+
+ }
+
+ this.value = value;
+
+ }
+
+ clone() {
+
+ return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );
+
+ }
+
+ }
+
+ class InstancedInterleavedBuffer extends InterleavedBuffer {
+
+ constructor( array, stride, meshPerAttribute = 1 ) {
+
+ super( array, stride );
+
+ this.meshPerAttribute = meshPerAttribute;
+
+ }
+
+ copy( source ) {
+
+ super.copy( source );
+
+ this.meshPerAttribute = source.meshPerAttribute;
+
+ return this;
+
+ }
+
+ clone( data ) {
+
+ const ib = super.clone( data );
+
+ ib.meshPerAttribute = this.meshPerAttribute;
+
+ return ib;
+
+ }
+
+ toJSON( data ) {
+
+ const json = super.toJSON( data );
+
+ json.isInstancedInterleavedBuffer = true;
+ json.meshPerAttribute = this.meshPerAttribute;
+
+ return json;
+
+ }
+
+ }
+
+ InstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;
+
+ class GLBufferAttribute {
+
+ constructor( buffer, type, itemSize, elementSize, count ) {
+
+ this.buffer = buffer;
+ this.type = type;
+ this.itemSize = itemSize;
+ this.elementSize = elementSize;
+ this.count = count;
+
+ this.version = 0;
+
+ }
+
+ set needsUpdate( value ) {
+
+ if ( value === true ) this.version ++;
+
+ }
+
+ setBuffer( buffer ) {
+
+ this.buffer = buffer;
+
+ return this;
+
+ }
+
+ setType( type, elementSize ) {
+
+ this.type = type;
+ this.elementSize = elementSize;
+
+ return this;
+
+ }
+
+ setItemSize( itemSize ) {
+
+ this.itemSize = itemSize;
+
+ return this;
+
+ }
+
+ setCount( count ) {
+
+ this.count = count;
+
+ return this;
+
+ }
+
+ }
+
+ GLBufferAttribute.prototype.isGLBufferAttribute = true;
+
+ class Raycaster {
+
+ constructor( origin, direction, near = 0, far = Infinity ) {
+
+ this.ray = new Ray( origin, direction );
+ // direction is assumed to be normalized (for accurate distance calculations)
+
+ this.near = near;
+ this.far = far;
+ this.camera = null;
+ this.layers = new Layers();
+
+ this.params = {
+ Mesh: {},
+ Line: { threshold: 1 },
+ LOD: {},
+ Points: { threshold: 1 },
+ Sprite: {}
+ };
+
+ }
+
+ set( origin, direction ) {
+
+ // direction is assumed to be normalized (for accurate distance calculations)
+
+ this.ray.set( origin, direction );
+
+ }
+
+ setFromCamera( coords, camera ) {
+
+ if ( camera.isPerspectiveCamera ) {
+
+ this.ray.origin.setFromMatrixPosition( camera.matrixWorld );
+ this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();
+ this.camera = camera;
+
+ } else if ( camera.isOrthographicCamera ) {
+
+ this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera
+ this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );
+ this.camera = camera;
+
+ } else {
+
+ console.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type );
+
+ }
+
+ }
+
+ intersectObject( object, recursive = true, intersects = [] ) {
+
+ intersectObject( object, this, intersects, recursive );
+
+ intersects.sort( ascSort );
+
+ return intersects;
+
+ }
+
+ intersectObjects( objects, recursive = true, intersects = [] ) {
+
+ for ( let i = 0, l = objects.length; i < l; i ++ ) {
+
+ intersectObject( objects[ i ], this, intersects, recursive );
+
+ }
+
+ intersects.sort( ascSort );
+
+ return intersects;
+
+ }
+
+ }
+
+ function ascSort( a, b ) {
+
+ return a.distance - b.distance;
+
+ }
+
+ function intersectObject( object, raycaster, intersects, recursive ) {
+
+ if ( object.layers.test( raycaster.layers ) ) {
+
+ object.raycast( raycaster, intersects );
+
+ }
+
+ if ( recursive === true ) {
+
+ const children = object.children;
+
+ for ( let i = 0, l = children.length; i < l; i ++ ) {
+
+ intersectObject( children[ i ], raycaster, intersects, true );
+
+ }
+
+ }
+
+ }
+
+ /**
+ * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system
+ *
+ * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up.
+ * The azimuthal angle (theta) is measured from the positive z-axis.
+ */
+
+ class Spherical {
+
+ constructor( radius = 1, phi = 0, theta = 0 ) {
+
+ this.radius = radius;
+ this.phi = phi; // polar angle
+ this.theta = theta; // azimuthal angle
+
+ return this;
+
+ }
+
+ set( radius, phi, theta ) {
+
+ this.radius = radius;
+ this.phi = phi;
+ this.theta = theta;
+
+ return this;
+
+ }
+
+ copy( other ) {
+
+ this.radius = other.radius;
+ this.phi = other.phi;
+ this.theta = other.theta;
+
+ return this;
+
+ }
+
+ // restrict phi to be betwee EPS and PI-EPS
+ makeSafe() {
+
+ const EPS = 0.000001;
+ this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );
+
+ return this;
+
+ }
+
+ setFromVector3( v ) {
+
+ return this.setFromCartesianCoords( v.x, v.y, v.z );
+
+ }
+
+ setFromCartesianCoords( x, y, z ) {
+
+ this.radius = Math.sqrt( x * x + y * y + z * z );
+
+ if ( this.radius === 0 ) {
+
+ this.theta = 0;
+ this.phi = 0;
+
+ } else {
+
+ this.theta = Math.atan2( x, z );
+ this.phi = Math.acos( clamp$1( y / this.radius, - 1, 1 ) );
+
+ }
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ }
+
+ /**
+ * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system
+ */
+
+ class Cylindrical {
+
+ constructor( radius = 1, theta = 0, y = 0 ) {
+
+ this.radius = radius; // distance from the origin to a point in the x-z plane
+ this.theta = theta; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis
+ this.y = y; // height above the x-z plane
+
+ return this;
+
+ }
+
+ set( radius, theta, y ) {
+
+ this.radius = radius;
+ this.theta = theta;
+ this.y = y;
+
+ return this;
+
+ }
+
+ copy( other ) {
+
+ this.radius = other.radius;
+ this.theta = other.theta;
+ this.y = other.y;
+
+ return this;
+
+ }
+
+ setFromVector3( v ) {
+
+ return this.setFromCartesianCoords( v.x, v.y, v.z );
+
+ }
+
+ setFromCartesianCoords( x, y, z ) {
+
+ this.radius = Math.sqrt( x * x + z * z );
+ this.theta = Math.atan2( x, z );
+ this.y = y;
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ }
+
+ const _vector$4 = /*@__PURE__*/ new Vector2();
+
+ class Box2 {
+
+ constructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {
+
+ this.min = min;
+ this.max = max;
+
+ }
+
+ set( min, max ) {
+
+ this.min.copy( min );
+ this.max.copy( max );
+
+ return this;
+
+ }
+
+ setFromPoints( points ) {
+
+ this.makeEmpty();
+
+ for ( let i = 0, il = points.length; i < il; i ++ ) {
+
+ this.expandByPoint( points[ i ] );
+
+ }
+
+ return this;
+
+ }
+
+ setFromCenterAndSize( center, size ) {
+
+ const halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );
+ this.min.copy( center ).sub( halfSize );
+ this.max.copy( center ).add( halfSize );
+
+ return this;
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ copy( box ) {
+
+ this.min.copy( box.min );
+ this.max.copy( box.max );
+
+ return this;
+
+ }
+
+ makeEmpty() {
+
+ this.min.x = this.min.y = + Infinity;
+ this.max.x = this.max.y = - Infinity;
+
+ return this;
+
+ }
+
+ isEmpty() {
+
+ // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
+
+ return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );
+
+ }
+
+ getCenter( target ) {
+
+ return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );
+
+ }
+
+ getSize( target ) {
+
+ return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );
+
+ }
+
+ expandByPoint( point ) {
+
+ this.min.min( point );
+ this.max.max( point );
+
+ return this;
+
+ }
+
+ expandByVector( vector ) {
+
+ this.min.sub( vector );
+ this.max.add( vector );
+
+ return this;
+
+ }
+
+ expandByScalar( scalar ) {
+
+ this.min.addScalar( - scalar );
+ this.max.addScalar( scalar );
+
+ return this;
+
+ }
+
+ containsPoint( point ) {
+
+ return point.x < this.min.x || point.x > this.max.x ||
+ point.y < this.min.y || point.y > this.max.y ? false : true;
+
+ }
+
+ containsBox( box ) {
+
+ return this.min.x <= box.min.x && box.max.x <= this.max.x &&
+ this.min.y <= box.min.y && box.max.y <= this.max.y;
+
+ }
+
+ getParameter( point, target ) {
+
+ // This can potentially have a divide by zero if the box
+ // has a size dimension of 0.
+
+ return target.set(
+ ( point.x - this.min.x ) / ( this.max.x - this.min.x ),
+ ( point.y - this.min.y ) / ( this.max.y - this.min.y )
+ );
+
+ }
+
+ intersectsBox( box ) {
+
+ // using 4 splitting planes to rule out intersections
+
+ return box.max.x < this.min.x || box.min.x > this.max.x ||
+ box.max.y < this.min.y || box.min.y > this.max.y ? false : true;
+
+ }
+
+ clampPoint( point, target ) {
+
+ return target.copy( point ).clamp( this.min, this.max );
+
+ }
+
+ distanceToPoint( point ) {
+
+ const clampedPoint = _vector$4.copy( point ).clamp( this.min, this.max );
+ return clampedPoint.sub( point ).length();
+
+ }
+
+ intersect( box ) {
+
+ this.min.max( box.min );
+ this.max.min( box.max );
+
+ return this;
+
+ }
+
+ union( box ) {
+
+ this.min.min( box.min );
+ this.max.max( box.max );
+
+ return this;
+
+ }
+
+ translate( offset ) {
+
+ this.min.add( offset );
+ this.max.add( offset );
+
+ return this;
+
+ }
+
+ equals( box ) {
+
+ return box.min.equals( this.min ) && box.max.equals( this.max );
+
+ }
+
+ }
+
+ Box2.prototype.isBox2 = true;
+
+ const _startP = /*@__PURE__*/ new Vector3();
+ const _startEnd = /*@__PURE__*/ new Vector3();
+
+ class Line3 {
+
+ constructor( start = new Vector3(), end = new Vector3() ) {
+
+ this.start = start;
+ this.end = end;
+
+ }
+
+ set( start, end ) {
+
+ this.start.copy( start );
+ this.end.copy( end );
+
+ return this;
+
+ }
+
+ copy( line ) {
+
+ this.start.copy( line.start );
+ this.end.copy( line.end );
+
+ return this;
+
+ }
+
+ getCenter( target ) {
+
+ return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );
+
+ }
+
+ delta( target ) {
+
+ return target.subVectors( this.end, this.start );
+
+ }
+
+ distanceSq() {
+
+ return this.start.distanceToSquared( this.end );
+
+ }
+
+ distance() {
+
+ return this.start.distanceTo( this.end );
+
+ }
+
+ at( t, target ) {
+
+ return this.delta( target ).multiplyScalar( t ).add( this.start );
+
+ }
+
+ closestPointToPointParameter( point, clampToLine ) {
+
+ _startP.subVectors( point, this.start );
+ _startEnd.subVectors( this.end, this.start );
+
+ const startEnd2 = _startEnd.dot( _startEnd );
+ const startEnd_startP = _startEnd.dot( _startP );
+
+ let t = startEnd_startP / startEnd2;
+
+ if ( clampToLine ) {
+
+ t = clamp$1( t, 0, 1 );
+
+ }
+
+ return t;
+
+ }
+
+ closestPointToPoint( point, clampToLine, target ) {
+
+ const t = this.closestPointToPointParameter( point, clampToLine );
+
+ return this.delta( target ).multiplyScalar( t ).add( this.start );
+
+ }
+
+ applyMatrix4( matrix ) {
+
+ this.start.applyMatrix4( matrix );
+ this.end.applyMatrix4( matrix );
+
+ return this;
+
+ }
+
+ equals( line ) {
+
+ return line.start.equals( this.start ) && line.end.equals( this.end );
+
+ }
+
+ clone() {
+
+ return new this.constructor().copy( this );
+
+ }
+
+ }
+
+ const _vector$3 = /*@__PURE__*/ new Vector3();
+
+ class SpotLightHelper extends Object3D {
+
+ constructor( light, color ) {
+
+ super();
+ this.light = light;
+ this.light.updateMatrixWorld();
+
+ this.matrix = light.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.color = color;
+
+ const geometry = new BufferGeometry();
+
+ const positions = [
+ 0, 0, 0, 0, 0, 1,
+ 0, 0, 0, 1, 0, 1,
+ 0, 0, 0, - 1, 0, 1,
+ 0, 0, 0, 0, 1, 1,
+ 0, 0, 0, 0, - 1, 1
+ ];
+
+ for ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {
+
+ const p1 = ( i / l ) * Math.PI * 2;
+ const p2 = ( j / l ) * Math.PI * 2;
+
+ positions.push(
+ Math.cos( p1 ), Math.sin( p1 ), 1,
+ Math.cos( p2 ), Math.sin( p2 ), 1
+ );
+
+ }
+
+ geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
+
+ const material = new LineBasicMaterial( { fog: false, toneMapped: false } );
+
+ this.cone = new LineSegments( geometry, material );
+ this.add( this.cone );
+
+ this.update();
+
+ }
+
+ dispose() {
+
+ this.cone.geometry.dispose();
+ this.cone.material.dispose();
+
+ }
+
+ update() {
+
+ this.light.updateMatrixWorld();
+
+ const coneLength = this.light.distance ? this.light.distance : 1000;
+ const coneWidth = coneLength * Math.tan( this.light.angle );
+
+ this.cone.scale.set( coneWidth, coneWidth, coneLength );
+
+ _vector$3.setFromMatrixPosition( this.light.target.matrixWorld );
+
+ this.cone.lookAt( _vector$3 );
+
+ if ( this.color !== undefined ) {
+
+ this.cone.material.color.set( this.color );
+
+ } else {
+
+ this.cone.material.color.copy( this.light.color );
+
+ }
+
+ }
+
+ }
+
+ const _vector$2 = /*@__PURE__*/ new Vector3();
+ const _boneMatrix = /*@__PURE__*/ new Matrix4();
+ const _matrixWorldInv = /*@__PURE__*/ new Matrix4();
+
+
+ class SkeletonHelper extends LineSegments {
+
+ constructor( object ) {
+
+ const bones = getBoneList( object );
+
+ const geometry = new BufferGeometry();
+
+ const vertices = [];
+ const colors = [];
+
+ const color1 = new Color( 0, 0, 1 );
+ const color2 = new Color( 0, 1, 0 );
+
+ for ( let i = 0; i < bones.length; i ++ ) {
+
+ const bone = bones[ i ];
+
+ if ( bone.parent && bone.parent.isBone ) {
+
+ vertices.push( 0, 0, 0 );
+ vertices.push( 0, 0, 0 );
+ colors.push( color1.r, color1.g, color1.b );
+ colors.push( color2.r, color2.g, color2.b );
+
+ }
+
+ }
+
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ const material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );
+
+ super( geometry, material );
+
+ this.type = 'SkeletonHelper';
+ this.isSkeletonHelper = true;
+
+ this.root = object;
+ this.bones = bones;
+
+ this.matrix = object.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ const bones = this.bones;
+
+ const geometry = this.geometry;
+ const position = geometry.getAttribute( 'position' );
+
+ _matrixWorldInv.copy( this.root.matrixWorld ).invert();
+
+ for ( let i = 0, j = 0; i < bones.length; i ++ ) {
+
+ const bone = bones[ i ];
+
+ if ( bone.parent && bone.parent.isBone ) {
+
+ _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );
+ _vector$2.setFromMatrixPosition( _boneMatrix );
+ position.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );
+
+ _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );
+ _vector$2.setFromMatrixPosition( _boneMatrix );
+ position.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );
+
+ j += 2;
+
+ }
+
+ }
+
+ geometry.getAttribute( 'position' ).needsUpdate = true;
+
+ super.updateMatrixWorld( force );
+
+ }
+
+ }
+
+
+ function getBoneList( object ) {
+
+ const boneList = [];
+
+ if ( object.isBone === true ) {
+
+ boneList.push( object );
+
+ }
+
+ for ( let i = 0; i < object.children.length; i ++ ) {
+
+ boneList.push.apply( boneList, getBoneList( object.children[ i ] ) );
+
+ }
+
+ return boneList;
+
+ }
+
+ class PointLightHelper extends Mesh {
+
+ constructor( light, sphereSize, color ) {
+
+ const geometry = new SphereGeometry( sphereSize, 4, 2 );
+ const material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );
+
+ super( geometry, material );
+
+ this.light = light;
+ this.light.updateMatrixWorld();
+
+ this.color = color;
+
+ this.type = 'PointLightHelper';
+
+ this.matrix = this.light.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.update();
+
+
+ /*
+ // TODO: delete this comment?
+ const distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );
+ const distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );
+
+ this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );
+ this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );
+
+ const d = light.distance;
+
+ if ( d === 0.0 ) {
+
+ this.lightDistance.visible = false;
+
+ } else {
+
+ this.lightDistance.scale.set( d, d, d );
+
+ }
+
+ this.add( this.lightDistance );
+ */
+
+ }
+
+ dispose() {
+
+ this.geometry.dispose();
+ this.material.dispose();
+
+ }
+
+ update() {
+
+ if ( this.color !== undefined ) {
+
+ this.material.color.set( this.color );
+
+ } else {
+
+ this.material.color.copy( this.light.color );
+
+ }
+
+ /*
+ const d = this.light.distance;
+
+ if ( d === 0.0 ) {
+
+ this.lightDistance.visible = false;
+
+ } else {
+
+ this.lightDistance.visible = true;
+ this.lightDistance.scale.set( d, d, d );
+
+ }
+ */
+
+ }
+
+ }
+
+ const _vector$1 = /*@__PURE__*/ new Vector3();
+ const _color1 = /*@__PURE__*/ new Color();
+ const _color2 = /*@__PURE__*/ new Color();
+
+ class HemisphereLightHelper extends Object3D {
+
+ constructor( light, size, color ) {
+
+ super();
+ this.light = light;
+ this.light.updateMatrixWorld();
+
+ this.matrix = light.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.color = color;
+
+ const geometry = new OctahedronGeometry( size );
+ geometry.rotateY( Math.PI * 0.5 );
+
+ this.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );
+ if ( this.color === undefined ) this.material.vertexColors = true;
+
+ const position = geometry.getAttribute( 'position' );
+ const colors = new Float32Array( position.count * 3 );
+
+ geometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );
+
+ this.add( new Mesh( geometry, this.material ) );
+
+ this.update();
+
+ }
+
+ dispose() {
+
+ this.children[ 0 ].geometry.dispose();
+ this.children[ 0 ].material.dispose();
+
+ }
+
+ update() {
+
+ const mesh = this.children[ 0 ];
+
+ if ( this.color !== undefined ) {
+
+ this.material.color.set( this.color );
+
+ } else {
+
+ const colors = mesh.geometry.getAttribute( 'color' );
+
+ _color1.copy( this.light.color );
+ _color2.copy( this.light.groundColor );
+
+ for ( let i = 0, l = colors.count; i < l; i ++ ) {
+
+ const color = ( i < ( l / 2 ) ) ? _color1 : _color2;
+
+ colors.setXYZ( i, color.r, color.g, color.b );
+
+ }
+
+ colors.needsUpdate = true;
+
+ }
+
+ mesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );
+
+ }
+
+ }
+
+ class GridHelper extends LineSegments {
+
+ constructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {
+
+ color1 = new Color( color1 );
+ color2 = new Color( color2 );
+
+ const center = divisions / 2;
+ const step = size / divisions;
+ const halfSize = size / 2;
+
+ const vertices = [], colors = [];
+
+ for ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {
+
+ vertices.push( - halfSize, 0, k, halfSize, 0, k );
+ vertices.push( k, 0, - halfSize, k, 0, halfSize );
+
+ const color = i === center ? color1 : color2;
+
+ color.toArray( colors, j ); j += 3;
+ color.toArray( colors, j ); j += 3;
+ color.toArray( colors, j ); j += 3;
+ color.toArray( colors, j ); j += 3;
+
+ }
+
+ const geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );
+
+ super( geometry, material );
+
+ this.type = 'GridHelper';
+
+ }
+
+ }
+
+ class PolarGridHelper extends LineSegments {
+
+ constructor( radius = 10, radials = 16, circles = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {
+
+ color1 = new Color( color1 );
+ color2 = new Color( color2 );
+
+ const vertices = [];
+ const colors = [];
+
+ // create the radials
+
+ for ( let i = 0; i <= radials; i ++ ) {
+
+ const v = ( i / radials ) * ( Math.PI * 2 );
+
+ const x = Math.sin( v ) * radius;
+ const z = Math.cos( v ) * radius;
+
+ vertices.push( 0, 0, 0 );
+ vertices.push( x, 0, z );
+
+ const color = ( i & 1 ) ? color1 : color2;
+
+ colors.push( color.r, color.g, color.b );
+ colors.push( color.r, color.g, color.b );
+
+ }
+
+ // create the circles
+
+ for ( let i = 0; i <= circles; i ++ ) {
+
+ const color = ( i & 1 ) ? color1 : color2;
+
+ const r = radius - ( radius / circles * i );
+
+ for ( let j = 0; j < divisions; j ++ ) {
+
+ // first vertex
+
+ let v = ( j / divisions ) * ( Math.PI * 2 );
+
+ let x = Math.sin( v ) * r;
+ let z = Math.cos( v ) * r;
+
+ vertices.push( x, 0, z );
+ colors.push( color.r, color.g, color.b );
+
+ // second vertex
+
+ v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );
+
+ x = Math.sin( v ) * r;
+ z = Math.cos( v ) * r;
+
+ vertices.push( x, 0, z );
+ colors.push( color.r, color.g, color.b );
+
+ }
+
+ }
+
+ const geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );
+
+ super( geometry, material );
+
+ this.type = 'PolarGridHelper';
+
+ }
+
+ }
+
+ const _v1 = /*@__PURE__*/ new Vector3();
+ const _v2 = /*@__PURE__*/ new Vector3();
+ const _v3 = /*@__PURE__*/ new Vector3();
+
+ class DirectionalLightHelper extends Object3D {
+
+ constructor( light, size, color ) {
+
+ super();
+ this.light = light;
+ this.light.updateMatrixWorld();
+
+ this.matrix = light.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.color = color;
+
+ if ( size === undefined ) size = 1;
+
+ let geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( [
+ - size, size, 0,
+ size, size, 0,
+ size, - size, 0,
+ - size, - size, 0,
+ - size, size, 0
+ ], 3 ) );
+
+ const material = new LineBasicMaterial( { fog: false, toneMapped: false } );
+
+ this.lightPlane = new Line( geometry, material );
+ this.add( this.lightPlane );
+
+ geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );
+
+ this.targetLine = new Line( geometry, material );
+ this.add( this.targetLine );
+
+ this.update();
+
+ }
+
+ dispose() {
+
+ this.lightPlane.geometry.dispose();
+ this.lightPlane.material.dispose();
+ this.targetLine.geometry.dispose();
+ this.targetLine.material.dispose();
+
+ }
+
+ update() {
+
+ _v1.setFromMatrixPosition( this.light.matrixWorld );
+ _v2.setFromMatrixPosition( this.light.target.matrixWorld );
+ _v3.subVectors( _v2, _v1 );
+
+ this.lightPlane.lookAt( _v2 );
+
+ if ( this.color !== undefined ) {
+
+ this.lightPlane.material.color.set( this.color );
+ this.targetLine.material.color.set( this.color );
+
+ } else {
+
+ this.lightPlane.material.color.copy( this.light.color );
+ this.targetLine.material.color.copy( this.light.color );
+
+ }
+
+ this.targetLine.lookAt( _v2 );
+ this.targetLine.scale.z = _v3.length();
+
+ }
+
+ }
+
+ const _vector = /*@__PURE__*/ new Vector3();
+ const _camera = /*@__PURE__*/ new Camera();
+
+ /**
+ * - shows frustum, line of sight and up of the camera
+ * - suitable for fast updates
+ * - based on frustum visualization in lightgl.js shadowmap example
+ * https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html
+ */
+
+ class CameraHelper extends LineSegments {
+
+ constructor( camera ) {
+
+ const geometry = new BufferGeometry();
+ const material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );
+
+ const vertices = [];
+ const colors = [];
+
+ const pointMap = {};
+
+ // colors
+
+ const colorFrustum = new Color( 0xffaa00 );
+ const colorCone = new Color( 0xff0000 );
+ const colorUp = new Color( 0x00aaff );
+ const colorTarget = new Color( 0xffffff );
+ const colorCross = new Color( 0x333333 );
+
+ // near
+
+ addLine( 'n1', 'n2', colorFrustum );
+ addLine( 'n2', 'n4', colorFrustum );
+ addLine( 'n4', 'n3', colorFrustum );
+ addLine( 'n3', 'n1', colorFrustum );
+
+ // far
+
+ addLine( 'f1', 'f2', colorFrustum );
+ addLine( 'f2', 'f4', colorFrustum );
+ addLine( 'f4', 'f3', colorFrustum );
+ addLine( 'f3', 'f1', colorFrustum );
+
+ // sides
+
+ addLine( 'n1', 'f1', colorFrustum );
+ addLine( 'n2', 'f2', colorFrustum );
+ addLine( 'n3', 'f3', colorFrustum );
+ addLine( 'n4', 'f4', colorFrustum );
+
+ // cone
+
+ addLine( 'p', 'n1', colorCone );
+ addLine( 'p', 'n2', colorCone );
+ addLine( 'p', 'n3', colorCone );
+ addLine( 'p', 'n4', colorCone );
+
+ // up
+
+ addLine( 'u1', 'u2', colorUp );
+ addLine( 'u2', 'u3', colorUp );
+ addLine( 'u3', 'u1', colorUp );
+
+ // target
+
+ addLine( 'c', 't', colorTarget );
+ addLine( 'p', 'c', colorCross );
+
+ // cross
+
+ addLine( 'cn1', 'cn2', colorCross );
+ addLine( 'cn3', 'cn4', colorCross );
+
+ addLine( 'cf1', 'cf2', colorCross );
+ addLine( 'cf3', 'cf4', colorCross );
+
+ function addLine( a, b, color ) {
+
+ addPoint( a, color );
+ addPoint( b, color );
+
+ }
+
+ function addPoint( id, color ) {
+
+ vertices.push( 0, 0, 0 );
+ colors.push( color.r, color.g, color.b );
+
+ if ( pointMap[ id ] === undefined ) {
+
+ pointMap[ id ] = [];
+
+ }
+
+ pointMap[ id ].push( ( vertices.length / 3 ) - 1 );
+
+ }
+
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ super( geometry, material );
+
+ this.type = 'CameraHelper';
+
+ this.camera = camera;
+ if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();
+
+ this.matrix = camera.matrixWorld;
+ this.matrixAutoUpdate = false;
+
+ this.pointMap = pointMap;
+
+ this.update();
+
+ }
+
+ update() {
+
+ const geometry = this.geometry;
+ const pointMap = this.pointMap;
+
+ const w = 1, h = 1;
+
+ // we need just camera projection matrix inverse
+ // world matrix must be identity
+
+ _camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );
+
+ // center / target
+
+ setPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 );
+ setPoint( 't', pointMap, geometry, _camera, 0, 0, 1 );
+
+ // near
+
+ setPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 );
+ setPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 );
+ setPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 );
+ setPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 );
+
+ // far
+
+ setPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 );
+ setPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 );
+ setPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 );
+ setPoint( 'f4', pointMap, geometry, _camera, w, h, 1 );
+
+ // up
+
+ setPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 );
+ setPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 );
+ setPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 );
+
+ // cross
+
+ setPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 );
+ setPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 );
+ setPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 );
+ setPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 );
+
+ setPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 );
+ setPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 );
+ setPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 );
+ setPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 );
+
+ geometry.getAttribute( 'position' ).needsUpdate = true;
+
+ }
+
+ dispose() {
+
+ this.geometry.dispose();
+ this.material.dispose();
+
+ }
+
+ }
+
+
+ function setPoint( point, pointMap, geometry, camera, x, y, z ) {
+
+ _vector.set( x, y, z ).unproject( camera );
+
+ const points = pointMap[ point ];
+
+ if ( points !== undefined ) {
+
+ const position = geometry.getAttribute( 'position' );
+
+ for ( let i = 0, l = points.length; i < l; i ++ ) {
+
+ position.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );
+
+ }
+
+ }
+
+ }
+
+ const _box = /*@__PURE__*/ new Box3();
+
+ class BoxHelper extends LineSegments {
+
+ constructor( object, color = 0xffff00 ) {
+
+ const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );
+ const positions = new Float32Array( 8 * 3 );
+
+ const geometry = new BufferGeometry();
+ geometry.setIndex( new BufferAttribute( indices, 1 ) );
+ geometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );
+
+ super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
+
+ this.object = object;
+ this.type = 'BoxHelper';
+
+ this.matrixAutoUpdate = false;
+
+ this.update();
+
+ }
+
+ update( object ) {
+
+ if ( object !== undefined ) {
+
+ console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );
+
+ }
+
+ if ( this.object !== undefined ) {
+
+ _box.setFromObject( this.object );
+
+ }
+
+ if ( _box.isEmpty() ) return;
+
+ const min = _box.min;
+ const max = _box.max;
+
+ /*
+ 5____4
+ 1/___0/|
+ | 6__|_7
+ 2/___3/
+
+ 0: max.x, max.y, max.z
+ 1: min.x, max.y, max.z
+ 2: min.x, min.y, max.z
+ 3: max.x, min.y, max.z
+ 4: max.x, max.y, min.z
+ 5: min.x, max.y, min.z
+ 6: min.x, min.y, min.z
+ 7: max.x, min.y, min.z
+ */
+
+ const position = this.geometry.attributes.position;
+ const array = position.array;
+
+ array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;
+ array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;
+ array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;
+ array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;
+ array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;
+ array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;
+ array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;
+ array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;
+
+ position.needsUpdate = true;
+
+ this.geometry.computeBoundingSphere();
+
+
+ }
+
+ setFromObject( object ) {
+
+ this.object = object;
+ this.update();
+
+ return this;
+
+ }
+
+ copy( source ) {
+
+ LineSegments.prototype.copy.call( this, source );
+
+ this.object = source.object;
+
+ return this;
+
+ }
+
+ }
+
+ class Box3Helper extends LineSegments {
+
+ constructor( box, color = 0xffff00 ) {
+
+ const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );
+
+ const positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];
+
+ const geometry = new BufferGeometry();
+
+ geometry.setIndex( new BufferAttribute( indices, 1 ) );
+
+ geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
+
+ super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
+
+ this.box = box;
+
+ this.type = 'Box3Helper';
+
+ this.geometry.computeBoundingSphere();
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ const box = this.box;
+
+ if ( box.isEmpty() ) return;
+
+ box.getCenter( this.position );
+
+ box.getSize( this.scale );
+
+ this.scale.multiplyScalar( 0.5 );
+
+ super.updateMatrixWorld( force );
+
+ }
+
+ }
+
+ class PlaneHelper extends Line {
+
+ constructor( plane, size = 1, hex = 0xffff00 ) {
+
+ const color = hex;
+
+ const positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ];
+
+ const geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
+ geometry.computeBoundingSphere();
+
+ super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
+
+ this.type = 'PlaneHelper';
+
+ this.plane = plane;
+
+ this.size = size;
+
+ const positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];
+
+ const geometry2 = new BufferGeometry();
+ geometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );
+ geometry2.computeBoundingSphere();
+
+ this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );
+
+ }
+
+ updateMatrixWorld( force ) {
+
+ let scale = - this.plane.constant;
+
+ if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter
+
+ this.scale.set( 0.5 * this.size, 0.5 * this.size, scale );
+
+ this.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here
+
+ this.lookAt( this.plane.normal );
+
+ super.updateMatrixWorld( force );
+
+ }
+
+ }
+
+ const _axis = /*@__PURE__*/ new Vector3();
+ let _lineGeometry, _coneGeometry;
+
+ class ArrowHelper extends Object3D {
+
+ // dir is assumed to be normalized
+
+ constructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {
+
+ super();
+
+ this.type = 'ArrowHelper';
+
+ if ( _lineGeometry === undefined ) {
+
+ _lineGeometry = new BufferGeometry();
+ _lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );
+
+ _coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 );
+ _coneGeometry.translate( 0, - 0.5, 0 );
+
+ }
+
+ this.position.copy( origin );
+
+ this.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
+ this.line.matrixAutoUpdate = false;
+ this.add( this.line );
+
+ this.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );
+ this.cone.matrixAutoUpdate = false;
+ this.add( this.cone );
+
+ this.setDirection( dir );
+ this.setLength( length, headLength, headWidth );
+
+ }
+
+ setDirection( dir ) {
+
+ // dir is assumed to be normalized
+
+ if ( dir.y > 0.99999 ) {
+
+ this.quaternion.set( 0, 0, 0, 1 );
+
+ } else if ( dir.y < - 0.99999 ) {
+
+ this.quaternion.set( 1, 0, 0, 0 );
+
+ } else {
+
+ _axis.set( dir.z, 0, - dir.x ).normalize();
+
+ const radians = Math.acos( dir.y );
+
+ this.quaternion.setFromAxisAngle( _axis, radians );
+
+ }
+
+ }
+
+ setLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {
+
+ this.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458
+ this.line.updateMatrix();
+
+ this.cone.scale.set( headWidth, headLength, headWidth );
+ this.cone.position.y = length;
+ this.cone.updateMatrix();
+
+ }
+
+ setColor( color ) {
+
+ this.line.material.color.set( color );
+ this.cone.material.color.set( color );
+
+ }
+
+ copy( source ) {
+
+ super.copy( source, false );
+
+ this.line.copy( source.line );
+ this.cone.copy( source.cone );
+
+ return this;
+
+ }
+
+ }
+
+ class AxesHelper extends LineSegments {
+
+ constructor( size = 1 ) {
+
+ const vertices = [
+ 0, 0, 0, size, 0, 0,
+ 0, 0, 0, 0, size, 0,
+ 0, 0, 0, 0, 0, size
+ ];
+
+ const colors = [
+ 1, 0, 0, 1, 0.6, 0,
+ 0, 1, 0, 0.6, 1, 0,
+ 0, 0, 1, 0, 0.6, 1
+ ];
+
+ const geometry = new BufferGeometry();
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+ geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
+
+ const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );
+
+ super( geometry, material );
+
+ this.type = 'AxesHelper';
+
+ }
+
+ setColors( xAxisColor, yAxisColor, zAxisColor ) {
+
+ const color = new Color();
+ const array = this.geometry.attributes.color.array;
+
+ color.set( xAxisColor );
+ color.toArray( array, 0 );
+ color.toArray( array, 3 );
+
+ color.set( yAxisColor );
+ color.toArray( array, 6 );
+ color.toArray( array, 9 );
+
+ color.set( zAxisColor );
+ color.toArray( array, 12 );
+ color.toArray( array, 15 );
+
+ this.geometry.attributes.color.needsUpdate = true;
+
+ return this;
+
+ }
+
+ dispose() {
+
+ this.geometry.dispose();
+ this.material.dispose();
+
+ }
+
+ }
+
+ class ShapePath {
+
+ constructor() {
+
+ this.type = 'ShapePath';
+
+ this.color = new Color();
+
+ this.subPaths = [];
+ this.currentPath = null;
+
+ }
+
+ moveTo( x, y ) {
+
+ this.currentPath = new Path();
+ this.subPaths.push( this.currentPath );
+ this.currentPath.moveTo( x, y );
+
+ return this;
+
+ }
+
+ lineTo( x, y ) {
+
+ this.currentPath.lineTo( x, y );
+
+ return this;
+
+ }
+
+ quadraticCurveTo( aCPx, aCPy, aX, aY ) {
+
+ this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );
+
+ return this;
+
+ }
+
+ bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {
+
+ this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );
+
+ return this;
+
+ }
+
+ splineThru( pts ) {
+
+ this.currentPath.splineThru( pts );
+
+ return this;
+
+ }
+
+ toShapes( isCCW, noHoles ) {
+
+ function toShapesNoHoles( inSubpaths ) {
+
+ const shapes = [];
+
+ for ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {
+
+ const tmpPath = inSubpaths[ i ];
+
+ const tmpShape = new Shape();
+ tmpShape.curves = tmpPath.curves;
+
+ shapes.push( tmpShape );
+
+ }
+
+ return shapes;
+
+ }
+
+ function isPointInsidePolygon( inPt, inPolygon ) {
+
+ const polyLen = inPolygon.length;
+
+ // inPt on polygon contour => immediate success or
+ // toggling of inside/outside at every single! intersection point of an edge
+ // with the horizontal line through inPt, left of inPt
+ // not counting lowerY endpoints of edges and whole edges on that line
+ let inside = false;
+ for ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {
+
+ let edgeLowPt = inPolygon[ p ];
+ let edgeHighPt = inPolygon[ q ];
+
+ let edgeDx = edgeHighPt.x - edgeLowPt.x;
+ let edgeDy = edgeHighPt.y - edgeLowPt.y;
+
+ if ( Math.abs( edgeDy ) > Number.EPSILON ) {
+
+ // not parallel
+ if ( edgeDy < 0 ) {
+
+ edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;
+ edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;
+
+ }
+
+ if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue;
+
+ if ( inPt.y === edgeLowPt.y ) {
+
+ if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ?
+ // continue; // no intersection or edgeLowPt => doesn't count !!!
+
+ } else {
+
+ const perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );
+ if ( perpEdge === 0 ) return true; // inPt is on contour ?
+ if ( perpEdge < 0 ) continue;
+ inside = ! inside; // true intersection left of inPt
+
+ }
+
+ } else {
+
+ // parallel or collinear
+ if ( inPt.y !== edgeLowPt.y ) continue; // parallel
+ // edge lies on the same horizontal line as inPt
+ if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||
+ ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour !
+ // continue;
+
+ }
+
+ }
+
+ return inside;
+
+ }
+
+ const isClockWise = ShapeUtils.isClockWise;
+
+ const subPaths = this.subPaths;
+ if ( subPaths.length === 0 ) return [];
+
+ if ( noHoles === true ) return toShapesNoHoles( subPaths );
+
+
+ let solid, tmpPath, tmpShape;
+ const shapes = [];
+
+ if ( subPaths.length === 1 ) {
+
+ tmpPath = subPaths[ 0 ];
+ tmpShape = new Shape();
+ tmpShape.curves = tmpPath.curves;
+ shapes.push( tmpShape );
+ return shapes;
+
+ }
+
+ let holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );
+ holesFirst = isCCW ? ! holesFirst : holesFirst;
+
+ // console.log("Holes first", holesFirst);
+
+ const betterShapeHoles = [];
+ const newShapes = [];
+ let newShapeHoles = [];
+ let mainIdx = 0;
+ let tmpPoints;
+
+ newShapes[ mainIdx ] = undefined;
+ newShapeHoles[ mainIdx ] = [];
+
+ for ( let i = 0, l = subPaths.length; i < l; i ++ ) {
+
+ tmpPath = subPaths[ i ];
+ tmpPoints = tmpPath.getPoints();
+ solid = isClockWise( tmpPoints );
+ solid = isCCW ? ! solid : solid;
+
+ if ( solid ) {
+
+ if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++;
+
+ newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };
+ newShapes[ mainIdx ].s.curves = tmpPath.curves;
+
+ if ( holesFirst ) mainIdx ++;
+ newShapeHoles[ mainIdx ] = [];
+
+ //console.log('cw', i);
+
+ } else {
+
+ newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );
+
+ //console.log('ccw', i);
+
+ }
+
+ }
+
+ // only Holes? -> probably all Shapes with wrong orientation
+ if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths );
+
+
+ if ( newShapes.length > 1 ) {
+
+ let ambiguous = false;
+ let toChange = 0;
+
+ for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {
+
+ betterShapeHoles[ sIdx ] = [];
+
+ }
+
+ for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {
+
+ const sho = newShapeHoles[ sIdx ];
+
+ for ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {
+
+ const ho = sho[ hIdx ];
+ let hole_unassigned = true;
+
+ for ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {
+
+ if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {
+
+ if ( sIdx !== s2Idx ) toChange ++;
+
+ if ( hole_unassigned ) {
+
+ hole_unassigned = false;
+ betterShapeHoles[ s2Idx ].push( ho );
+
+ } else {
+
+ ambiguous = true;
+
+ }
+
+ }
+
+ }
+
+ if ( hole_unassigned ) {
+
+ betterShapeHoles[ sIdx ].push( ho );
+
+ }
+
+ }
+
+ }
+
+ if ( toChange > 0 && ambiguous === false ) {
+
+ newShapeHoles = betterShapeHoles;
+
+ }
+
+ }
+
+ let tmpHoles;
+
+ for ( let i = 0, il = newShapes.length; i < il; i ++ ) {
+
+ tmpShape = newShapes[ i ].s;
+ shapes.push( tmpShape );
+ tmpHoles = newShapeHoles[ i ];
+
+ for ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {
+
+ tmpShape.holes.push( tmpHoles[ j ].h );
+
+ }
+
+ }
+
+ //console.log("shape", shapes);
+
+ return shapes;
+
+ }
+
+ }
+
+ const _floatView = new Float32Array( 1 );
+ const _int32View = new Int32Array( _floatView.buffer );
+
+ class DataUtils {
+
+ // Converts float32 to float16 (stored as uint16 value).
+
+ static toHalfFloat( val ) {
+
+ if ( val > 65504 ) {
+
+ console.warn( 'THREE.DataUtils.toHalfFloat(): value exceeds 65504.' );
+
+ val = 65504; // maximum representable value in float16
+
+ }
+
+ // Source: http://gamedev.stackexchange.com/questions/17326/conversion-of-a-number-from-single-precision-floating-point-representation-to-a/17410#17410
+
+ /* This method is faster than the OpenEXR implementation (very often
+ * used, eg. in Ogre), with the additional benefit of rounding, inspired
+ * by James Tursa?s half-precision code. */
+
+ _floatView[ 0 ] = val;
+ const x = _int32View[ 0 ];
+
+ let bits = ( x >> 16 ) & 0x8000; /* Get the sign */
+ let m = ( x >> 12 ) & 0x07ff; /* Keep one extra bit for rounding */
+ const e = ( x >> 23 ) & 0xff; /* Using int is faster here */
+
+ /* If zero, or denormal, or exponent underflows too much for a denormal
+ * half, return signed zero. */
+ if ( e < 103 ) return bits;
+
+ /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */
+ if ( e > 142 ) {
+
+ bits |= 0x7c00;
+ /* If exponent was 0xff and one mantissa bit was set, it means NaN,
+ * not Inf, so make sure we set one mantissa bit too. */
+ bits |= ( ( e == 255 ) ? 0 : 1 ) && ( x & 0x007fffff );
+ return bits;
+
+ }
+
+ /* If exponent underflows but not too much, return a denormal */
+ if ( e < 113 ) {
+
+ m |= 0x0800;
+ /* Extra rounding may overflow and set mantissa to 0 and exponent
+ * to 1, which is OK. */
+ bits |= ( m >> ( 114 - e ) ) + ( ( m >> ( 113 - e ) ) & 1 );
+ return bits;
+
+ }
+
+ bits |= ( ( e - 112 ) << 10 ) | ( m >> 1 );
+ /* Extra rounding. An overflow will set mantissa to 0 and increment
+ * the exponent, which is OK. */
+ bits += m & 1;
+ return bits;
+
+ }
+
+ }
+
+ const LineStrip = 0;
+ const LinePieces = 1;
+ const NoColors = 0;
+ const FaceColors = 1;
+ const VertexColors = 2;
+
+ function MeshFaceMaterial( materials ) {
+
+ console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' );
+ return materials;
+
+ }
+
+ function MultiMaterial( materials = [] ) {
+
+ console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' );
+ materials.isMultiMaterial = true;
+ materials.materials = materials;
+ materials.clone = function () {
+
+ return materials.slice();
+
+ };
+
+ return materials;
+
+ }
+
+ function PointCloud( geometry, material ) {
+
+ console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );
+ return new Points( geometry, material );
+
+ }
+
+ function Particle( material ) {
+
+ console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );
+ return new Sprite( material );
+
+ }
+
+ function ParticleSystem( geometry, material ) {
+
+ console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );
+ return new Points( geometry, material );
+
+ }
+
+ function PointCloudMaterial( parameters ) {
+
+ console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );
+ return new PointsMaterial( parameters );
+
+ }
+
+ function ParticleBasicMaterial( parameters ) {
+
+ console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );
+ return new PointsMaterial( parameters );
+
+ }
+
+ function ParticleSystemMaterial( parameters ) {
+
+ console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );
+ return new PointsMaterial( parameters );
+
+ }
+
+ function Vertex( x, y, z ) {
+
+ console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );
+ return new Vector3( x, y, z );
+
+ }
+
+ //
+
+ function DynamicBufferAttribute( array, itemSize ) {
+
+ console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.' );
+ return new BufferAttribute( array, itemSize ).setUsage( DynamicDrawUsage );
+
+ }
+
+ function Int8Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );
+ return new Int8BufferAttribute( array, itemSize );
+
+ }
+
+ function Uint8Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );
+ return new Uint8BufferAttribute( array, itemSize );
+
+ }
+
+ function Uint8ClampedAttribute( array, itemSize ) {
+
+ console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );
+ return new Uint8ClampedBufferAttribute( array, itemSize );
+
+ }
+
+ function Int16Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );
+ return new Int16BufferAttribute( array, itemSize );
+
+ }
+
+ function Uint16Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );
+ return new Uint16BufferAttribute( array, itemSize );
+
+ }
+
+ function Int32Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );
+ return new Int32BufferAttribute( array, itemSize );
+
+ }
+
+ function Uint32Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );
+ return new Uint32BufferAttribute( array, itemSize );
+
+ }
+
+ function Float32Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );
+ return new Float32BufferAttribute( array, itemSize );
+
+ }
+
+ function Float64Attribute( array, itemSize ) {
+
+ console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );
+ return new Float64BufferAttribute( array, itemSize );
+
+ }
+
+ //
+
+ Curve.create = function ( construct, getPoint ) {
+
+ console.log( 'THREE.Curve.create() has been deprecated' );
+
+ construct.prototype = Object.create( Curve.prototype );
+ construct.prototype.constructor = construct;
+ construct.prototype.getPoint = getPoint;
+
+ return construct;
+
+ };
+
+ //
+
+ Path.prototype.fromPoints = function ( points ) {
+
+ console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' );
+ return this.setFromPoints( points );
+
+ };
+
+ //
+
+ function AxisHelper( size ) {
+
+ console.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' );
+ return new AxesHelper( size );
+
+ }
+
+ function BoundingBoxHelper( object, color ) {
+
+ console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );
+ return new BoxHelper( object, color );
+
+ }
+
+ function EdgesHelper( object, hex ) {
+
+ console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );
+ return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );
+
+ }
+
+ GridHelper.prototype.setColors = function () {
+
+ console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );
+
+ };
+
+ SkeletonHelper.prototype.update = function () {
+
+ console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' );
+
+ };
+
+ function WireframeHelper( object, hex ) {
+
+ console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );
+ return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );
+
+ }
+
+ //
+
+ Loader.prototype.extractUrlBase = function ( url ) {
+
+ console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' );
+ return LoaderUtils.extractUrlBase( url );
+
+ };
+
+ Loader.Handlers = {
+
+ add: function ( /* regex, loader */ ) {
+
+ console.error( 'THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.' );
+
+ },
+
+ get: function ( /* file */ ) {
+
+ console.error( 'THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.' );
+
+ }
+
+ };
+
+ function XHRLoader( manager ) {
+
+ console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );
+ return new FileLoader( manager );
+
+ }
+
+ function BinaryTextureLoader( manager ) {
+
+ console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );
+ return new DataTextureLoader( manager );
+
+ }
+
+ //
+
+ Box2.prototype.center = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );
+ return this.getCenter( optionalTarget );
+
+ };
+
+ Box2.prototype.empty = function () {
+
+ console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );
+ return this.isEmpty();
+
+ };
+
+ Box2.prototype.isIntersectionBox = function ( box ) {
+
+ console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );
+ return this.intersectsBox( box );
+
+ };
+
+ Box2.prototype.size = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );
+ return this.getSize( optionalTarget );
+
+ };
+
+ //
+
+ Box3.prototype.center = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );
+ return this.getCenter( optionalTarget );
+
+ };
+
+ Box3.prototype.empty = function () {
+
+ console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );
+ return this.isEmpty();
+
+ };
+
+ Box3.prototype.isIntersectionBox = function ( box ) {
+
+ console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );
+ return this.intersectsBox( box );
+
+ };
+
+ Box3.prototype.isIntersectionSphere = function ( sphere ) {
+
+ console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );
+ return this.intersectsSphere( sphere );
+
+ };
+
+ Box3.prototype.size = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );
+ return this.getSize( optionalTarget );
+
+ };
+
+ //
+
+ Euler.prototype.toVector3 = function () {
+
+ console.error( 'THREE.Euler: .toVector3() has been removed. Use Vector3.setFromEuler() instead' );
+
+ };
+
+
+ //
+
+ Sphere.prototype.empty = function () {
+
+ console.warn( 'THREE.Sphere: .empty() has been renamed to .isEmpty().' );
+ return this.isEmpty();
+
+ };
+
+ //
+
+ Frustum.prototype.setFromMatrix = function ( m ) {
+
+ console.warn( 'THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().' );
+ return this.setFromProjectionMatrix( m );
+
+ };
+
+ //
+
+ Line3.prototype.center = function ( optionalTarget ) {
+
+ console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );
+ return this.getCenter( optionalTarget );
+
+ };
+
+ //
+
+ Matrix3.prototype.flattenToArrayOffset = function ( array, offset ) {
+
+ console.warn( 'THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' );
+ return this.toArray( array, offset );
+
+ };
+
+ Matrix3.prototype.multiplyVector3 = function ( vector ) {
+
+ console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );
+ return vector.applyMatrix3( this );
+
+ };
+
+ Matrix3.prototype.multiplyVector3Array = function ( /* a */ ) {
+
+ console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' );
+
+ };
+
+ Matrix3.prototype.applyToBufferAttribute = function ( attribute ) {
+
+ console.warn( 'THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.' );
+ return attribute.applyMatrix3( this );
+
+ };
+
+ Matrix3.prototype.applyToVector3Array = function ( /* array, offset, length */ ) {
+
+ console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );
+
+ };
+
+ Matrix3.prototype.getInverse = function ( matrix ) {
+
+ console.warn( 'THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' );
+ return this.copy( matrix ).invert();
+
+ };
+
+ //
+
+ Matrix4.prototype.extractPosition = function ( m ) {
+
+ console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );
+ return this.copyPosition( m );
+
+ };
+
+ Matrix4.prototype.flattenToArrayOffset = function ( array, offset ) {
+
+ console.warn( 'THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' );
+ return this.toArray( array, offset );
+
+ };
+
+ Matrix4.prototype.getPosition = function () {
+
+ console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );
+ return new Vector3().setFromMatrixColumn( this, 3 );
+
+ };
+
+ Matrix4.prototype.setRotationFromQuaternion = function ( q ) {
+
+ console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );
+ return this.makeRotationFromQuaternion( q );
+
+ };
+
+ Matrix4.prototype.multiplyToArray = function () {
+
+ console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );
+
+ };
+
+ Matrix4.prototype.multiplyVector3 = function ( vector ) {
+
+ console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
+ return vector.applyMatrix4( this );
+
+ };
+
+ Matrix4.prototype.multiplyVector4 = function ( vector ) {
+
+ console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
+ return vector.applyMatrix4( this );
+
+ };
+
+ Matrix4.prototype.multiplyVector3Array = function ( /* a */ ) {
+
+ console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' );
+
+ };
+
+ Matrix4.prototype.rotateAxis = function ( v ) {
+
+ console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );
+ v.transformDirection( this );
+
+ };
+
+ Matrix4.prototype.crossVector = function ( vector ) {
+
+ console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
+ return vector.applyMatrix4( this );
+
+ };
+
+ Matrix4.prototype.translate = function () {
+
+ console.error( 'THREE.Matrix4: .translate() has been removed.' );
+
+ };
+
+ Matrix4.prototype.rotateX = function () {
+
+ console.error( 'THREE.Matrix4: .rotateX() has been removed.' );
+
+ };
+
+ Matrix4.prototype.rotateY = function () {
+
+ console.error( 'THREE.Matrix4: .rotateY() has been removed.' );
+
+ };
+
+ Matrix4.prototype.rotateZ = function () {
+
+ console.error( 'THREE.Matrix4: .rotateZ() has been removed.' );
+
+ };
+
+ Matrix4.prototype.rotateByAxis = function () {
+
+ console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );
+
+ };
+
+ Matrix4.prototype.applyToBufferAttribute = function ( attribute ) {
+
+ console.warn( 'THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.' );
+ return attribute.applyMatrix4( this );
+
+ };
+
+ Matrix4.prototype.applyToVector3Array = function ( /* array, offset, length */ ) {
+
+ console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );
+
+ };
+
+ Matrix4.prototype.makeFrustum = function ( left, right, bottom, top, near, far ) {
+
+ console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );
+ return this.makePerspective( left, right, top, bottom, near, far );
+
+ };
+
+ Matrix4.prototype.getInverse = function ( matrix ) {
+
+ console.warn( 'THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' );
+ return this.copy( matrix ).invert();
+
+ };
+
+ //
+
+ Plane.prototype.isIntersectionLine = function ( line ) {
+
+ console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );
+ return this.intersectsLine( line );
+
+ };
+
+ //
+
+ Quaternion.prototype.multiplyVector3 = function ( vector ) {
+
+ console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );
+ return vector.applyQuaternion( this );
+
+ };
+
+ Quaternion.prototype.inverse = function ( ) {
+
+ console.warn( 'THREE.Quaternion: .inverse() has been renamed to invert().' );
+ return this.invert();
+
+ };
+
+ //
+
+ Ray.prototype.isIntersectionBox = function ( box ) {
+
+ console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );
+ return this.intersectsBox( box );
+
+ };
+
+ Ray.prototype.isIntersectionPlane = function ( plane ) {
+
+ console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );
+ return this.intersectsPlane( plane );
+
+ };
+
+ Ray.prototype.isIntersectionSphere = function ( sphere ) {
+
+ console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );
+ return this.intersectsSphere( sphere );
+
+ };
+
+ //
+
+ Triangle.prototype.area = function () {
+
+ console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' );
+ return this.getArea();
+
+ };
+
+ Triangle.prototype.barycoordFromPoint = function ( point, target ) {
+
+ console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );
+ return this.getBarycoord( point, target );
+
+ };
+
+ Triangle.prototype.midpoint = function ( target ) {
+
+ console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' );
+ return this.getMidpoint( target );
+
+ };
+
+ Triangle.prototypenormal = function ( target ) {
+
+ console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );
+ return this.getNormal( target );
+
+ };
+
+ Triangle.prototype.plane = function ( target ) {
+
+ console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' );
+ return this.getPlane( target );
+
+ };
+
+ Triangle.barycoordFromPoint = function ( point, a, b, c, target ) {
+
+ console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );
+ return Triangle.getBarycoord( point, a, b, c, target );
+
+ };
+
+ Triangle.normal = function ( a, b, c, target ) {
+
+ console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );
+ return Triangle.getNormal( a, b, c, target );
+
+ };
+
+ //
+
+ Shape.prototype.extractAllPoints = function ( divisions ) {
+
+ console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' );
+ return this.extractPoints( divisions );
+
+ };
+
+ Shape.prototype.extrude = function ( options ) {
+
+ console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );
+ return new ExtrudeGeometry( this, options );
+
+ };
+
+ Shape.prototype.makeGeometry = function ( options ) {
+
+ console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );
+ return new ShapeGeometry( this, options );
+
+ };
+
+ //
+
+ Vector2.prototype.fromAttribute = function ( attribute, index, offset ) {
+
+ console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );
+ return this.fromBufferAttribute( attribute, index, offset );
+
+ };
+
+ Vector2.prototype.distanceToManhattan = function ( v ) {
+
+ console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );
+ return this.manhattanDistanceTo( v );
+
+ };
+
+ Vector2.prototype.lengthManhattan = function () {
+
+ console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' );
+ return this.manhattanLength();
+
+ };
+
+ //
+
+ Vector3.prototype.setEulerFromRotationMatrix = function () {
+
+ console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );
+
+ };
+
+ Vector3.prototype.setEulerFromQuaternion = function () {
+
+ console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );
+
+ };
+
+ Vector3.prototype.getPositionFromMatrix = function ( m ) {
+
+ console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );
+ return this.setFromMatrixPosition( m );
+
+ };
+
+ Vector3.prototype.getScaleFromMatrix = function ( m ) {
+
+ console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );
+ return this.setFromMatrixScale( m );
+
+ };
+
+ Vector3.prototype.getColumnFromMatrix = function ( index, matrix ) {
+
+ console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );
+ return this.setFromMatrixColumn( matrix, index );
+
+ };
+
+ Vector3.prototype.applyProjection = function ( m ) {
+
+ console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );
+ return this.applyMatrix4( m );
+
+ };
+
+ Vector3.prototype.fromAttribute = function ( attribute, index, offset ) {
+
+ console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );
+ return this.fromBufferAttribute( attribute, index, offset );
+
+ };
+
+ Vector3.prototype.distanceToManhattan = function ( v ) {
+
+ console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );
+ return this.manhattanDistanceTo( v );
+
+ };
+
+ Vector3.prototype.lengthManhattan = function () {
+
+ console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' );
+ return this.manhattanLength();
+
+ };
+
+ //
+
+ Vector4$1.prototype.fromAttribute = function ( attribute, index, offset ) {
+
+ console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );
+ return this.fromBufferAttribute( attribute, index, offset );
+
+ };
+
+ Vector4$1.prototype.lengthManhattan = function () {
+
+ console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' );
+ return this.manhattanLength();
+
+ };
+
+ //
+
+ Object3D.prototype.getChildByName = function ( name ) {
+
+ console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );
+ return this.getObjectByName( name );
+
+ };
+
+ Object3D.prototype.renderDepth = function () {
+
+ console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );
+
+ };
+
+ Object3D.prototype.translate = function ( distance, axis ) {
+
+ console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );
+ return this.translateOnAxis( axis, distance );
+
+ };
+
+ Object3D.prototype.getWorldRotation = function () {
+
+ console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' );
+
+ };
+
+ Object3D.prototype.applyMatrix = function ( matrix ) {
+
+ console.warn( 'THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().' );
+ return this.applyMatrix4( matrix );
+
+ };
+
+ Object.defineProperties( Object3D.prototype, {
+
+ eulerOrder: {
+ get: function () {
+
+ console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );
+ return this.rotation.order;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );
+ this.rotation.order = value;
+
+ }
+ },
+ useQuaternion: {
+ get: function () {
+
+ console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );
+
+ }
+ }
+
+ } );
+
+ Mesh.prototype.setDrawMode = function () {
+
+ console.error( 'THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );
+
+ };
+
+ Object.defineProperties( Mesh.prototype, {
+
+ drawMode: {
+ get: function () {
+
+ console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.' );
+ return TrianglesDrawMode;
+
+ },
+ set: function () {
+
+ console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );
+
+ }
+ }
+
+ } );
+
+ SkinnedMesh.prototype.initBones = function () {
+
+ console.error( 'THREE.SkinnedMesh: initBones() has been removed.' );
+
+ };
+
+ //
+
+ PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {
+
+ console.warn( 'THREE.PerspectiveCamera.setLens is deprecated. ' +
+ 'Use .setFocalLength and .filmGauge for a photographic setup.' );
+
+ if ( filmGauge !== undefined ) this.filmGauge = filmGauge;
+ this.setFocalLength( focalLength );
+
+ };
+
+ //
+
+ Object.defineProperties( Light.prototype, {
+ onlyShadow: {
+ set: function () {
+
+ console.warn( 'THREE.Light: .onlyShadow has been removed.' );
+
+ }
+ },
+ shadowCameraFov: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );
+ this.shadow.camera.fov = value;
+
+ }
+ },
+ shadowCameraLeft: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );
+ this.shadow.camera.left = value;
+
+ }
+ },
+ shadowCameraRight: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );
+ this.shadow.camera.right = value;
+
+ }
+ },
+ shadowCameraTop: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );
+ this.shadow.camera.top = value;
+
+ }
+ },
+ shadowCameraBottom: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );
+ this.shadow.camera.bottom = value;
+
+ }
+ },
+ shadowCameraNear: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );
+ this.shadow.camera.near = value;
+
+ }
+ },
+ shadowCameraFar: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );
+ this.shadow.camera.far = value;
+
+ }
+ },
+ shadowCameraVisible: {
+ set: function () {
+
+ console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );
+
+ }
+ },
+ shadowBias: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );
+ this.shadow.bias = value;
+
+ }
+ },
+ shadowDarkness: {
+ set: function () {
+
+ console.warn( 'THREE.Light: .shadowDarkness has been removed.' );
+
+ }
+ },
+ shadowMapWidth: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );
+ this.shadow.mapSize.width = value;
+
+ }
+ },
+ shadowMapHeight: {
+ set: function ( value ) {
+
+ console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );
+ this.shadow.mapSize.height = value;
+
+ }
+ }
+ } );
+
+ //
+
+ Object.defineProperties( BufferAttribute.prototype, {
+
+ length: {
+ get: function () {
+
+ console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );
+ return this.array.length;
+
+ }
+ },
+ dynamic: {
+ get: function () {
+
+ console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );
+ return this.usage === DynamicDrawUsage;
+
+ },
+ set: function ( /* value */ ) {
+
+ console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );
+ this.setUsage( DynamicDrawUsage );
+
+ }
+ }
+
+ } );
+
+ BufferAttribute.prototype.setDynamic = function ( value ) {
+
+ console.warn( 'THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.' );
+ this.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );
+ return this;
+
+ };
+
+ BufferAttribute.prototype.copyIndicesArray = function ( /* indices */ ) {
+
+ console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' );
+
+ },
+
+ BufferAttribute.prototype.setArray = function ( /* array */ ) {
+
+ console.error( 'THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );
+
+ };
+
+ //
+
+ BufferGeometry.prototype.addIndex = function ( index ) {
+
+ console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );
+ this.setIndex( index );
+
+ };
+
+ BufferGeometry.prototype.addAttribute = function ( name, attribute ) {
+
+ console.warn( 'THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().' );
+
+ if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) {
+
+ console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );
+
+ return this.setAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );
+
+ }
+
+ if ( name === 'index' ) {
+
+ console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );
+ this.setIndex( attribute );
+
+ return this;
+
+ }
+
+ return this.setAttribute( name, attribute );
+
+ };
+
+ BufferGeometry.prototype.addDrawCall = function ( start, count, indexOffset ) {
+
+ if ( indexOffset !== undefined ) {
+
+ console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );
+
+ }
+
+ console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );
+ this.addGroup( start, count );
+
+ };
+
+ BufferGeometry.prototype.clearDrawCalls = function () {
+
+ console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );
+ this.clearGroups();
+
+ };
+
+ BufferGeometry.prototype.computeOffsets = function () {
+
+ console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );
+
+ };
+
+ BufferGeometry.prototype.removeAttribute = function ( name ) {
+
+ console.warn( 'THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().' );
+
+ return this.deleteAttribute( name );
+
+ };
+
+ BufferGeometry.prototype.applyMatrix = function ( matrix ) {
+
+ console.warn( 'THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().' );
+ return this.applyMatrix4( matrix );
+
+ };
+
+ Object.defineProperties( BufferGeometry.prototype, {
+
+ drawcalls: {
+ get: function () {
+
+ console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );
+ return this.groups;
+
+ }
+ },
+ offsets: {
+ get: function () {
+
+ console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );
+ return this.groups;
+
+ }
+ }
+
+ } );
+
+ InterleavedBuffer.prototype.setDynamic = function ( value ) {
+
+ console.warn( 'THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.' );
+ this.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );
+ return this;
+
+ };
+
+ InterleavedBuffer.prototype.setArray = function ( /* array */ ) {
+
+ console.error( 'THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );
+
+ };
+
+ //
+
+ ExtrudeGeometry.prototype.getArrays = function () {
+
+ console.error( 'THREE.ExtrudeGeometry: .getArrays() has been removed.' );
+
+ };
+
+ ExtrudeGeometry.prototype.addShapeList = function () {
+
+ console.error( 'THREE.ExtrudeGeometry: .addShapeList() has been removed.' );
+
+ };
+
+ ExtrudeGeometry.prototype.addShape = function () {
+
+ console.error( 'THREE.ExtrudeGeometry: .addShape() has been removed.' );
+
+ };
+
+ //
+
+ Scene.prototype.dispose = function () {
+
+ console.error( 'THREE.Scene: .dispose() has been removed.' );
+
+ };
+
+ //
+
+ Uniform.prototype.onUpdate = function () {
+
+ console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );
+ return this;
+
+ };
+
+ //
+
+ Object.defineProperties( Material.prototype, {
+
+ wrapAround: {
+ get: function () {
+
+ console.warn( 'THREE.Material: .wrapAround has been removed.' );
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.Material: .wrapAround has been removed.' );
+
+ }
+ },
+
+ overdraw: {
+ get: function () {
+
+ console.warn( 'THREE.Material: .overdraw has been removed.' );
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.Material: .overdraw has been removed.' );
+
+ }
+ },
+
+ wrapRGB: {
+ get: function () {
+
+ console.warn( 'THREE.Material: .wrapRGB has been removed.' );
+ return new Color();
+
+ }
+ },
+
+ shading: {
+ get: function () {
+
+ console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
+ this.flatShading = ( value === FlatShading );
+
+ }
+ },
+
+ stencilMask: {
+ get: function () {
+
+ console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );
+ return this.stencilFuncMask;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );
+ this.stencilFuncMask = value;
+
+ }
+ },
+
+ vertexTangents: {
+ get: function () {
+
+ console.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' );
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' );
+
+ }
+ },
+
+ } );
+
+ Object.defineProperties( ShaderMaterial.prototype, {
+
+ derivatives: {
+ get: function () {
+
+ console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );
+ return this.extensions.derivatives;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );
+ this.extensions.derivatives = value;
+
+ }
+ }
+
+ } );
+
+ //
+
+ WebGLRenderer.prototype.clearTarget = function ( renderTarget, color, depth, stencil ) {
+
+ console.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' );
+ this.setRenderTarget( renderTarget );
+ this.clear( color, depth, stencil );
+
+ };
+
+ WebGLRenderer.prototype.animate = function ( callback ) {
+
+ console.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' );
+ this.setAnimationLoop( callback );
+
+ };
+
+ WebGLRenderer.prototype.getCurrentRenderTarget = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );
+ return this.getRenderTarget();
+
+ };
+
+ WebGLRenderer.prototype.getMaxAnisotropy = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' );
+ return this.capabilities.getMaxAnisotropy();
+
+ };
+
+ WebGLRenderer.prototype.getPrecision = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' );
+ return this.capabilities.precision;
+
+ };
+
+ WebGLRenderer.prototype.resetGLState = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' );
+ return this.state.reset();
+
+ };
+
+ WebGLRenderer.prototype.supportsFloatTextures = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' );
+ return this.extensions.get( 'OES_texture_float' );
+
+ };
+
+ WebGLRenderer.prototype.supportsHalfFloatTextures = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' );
+ return this.extensions.get( 'OES_texture_half_float' );
+
+ };
+
+ WebGLRenderer.prototype.supportsStandardDerivatives = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' );
+ return this.extensions.get( 'OES_standard_derivatives' );
+
+ };
+
+ WebGLRenderer.prototype.supportsCompressedTextureS3TC = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' );
+ return this.extensions.get( 'WEBGL_compressed_texture_s3tc' );
+
+ };
+
+ WebGLRenderer.prototype.supportsCompressedTexturePVRTC = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' );
+ return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );
+
+ };
+
+ WebGLRenderer.prototype.supportsBlendMinMax = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' );
+ return this.extensions.get( 'EXT_blend_minmax' );
+
+ };
+
+ WebGLRenderer.prototype.supportsVertexTextures = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );
+ return this.capabilities.vertexTextures;
+
+ };
+
+ WebGLRenderer.prototype.supportsInstancedArrays = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' );
+ return this.extensions.get( 'ANGLE_instanced_arrays' );
+
+ };
+
+ WebGLRenderer.prototype.enableScissorTest = function ( boolean ) {
+
+ console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );
+ this.setScissorTest( boolean );
+
+ };
+
+ WebGLRenderer.prototype.initMaterial = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );
+
+ };
+
+ WebGLRenderer.prototype.addPrePlugin = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );
+
+ };
+
+ WebGLRenderer.prototype.addPostPlugin = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );
+
+ };
+
+ WebGLRenderer.prototype.updateShadowMap = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );
+
+ };
+
+ WebGLRenderer.prototype.setFaceCulling = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' );
+
+ };
+
+ WebGLRenderer.prototype.allocTextureUnit = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .allocTextureUnit() has been removed.' );
+
+ };
+
+ WebGLRenderer.prototype.setTexture = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .setTexture() has been removed.' );
+
+ };
+
+ WebGLRenderer.prototype.setTexture2D = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .setTexture2D() has been removed.' );
+
+ };
+
+ WebGLRenderer.prototype.setTextureCube = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .setTextureCube() has been removed.' );
+
+ };
+
+ WebGLRenderer.prototype.getActiveMipMapLevel = function () {
+
+ console.warn( 'THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().' );
+ return this.getActiveMipmapLevel();
+
+ };
+
+ Object.defineProperties( WebGLRenderer.prototype, {
+
+ shadowMapEnabled: {
+ get: function () {
+
+ return this.shadowMap.enabled;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );
+ this.shadowMap.enabled = value;
+
+ }
+ },
+ shadowMapType: {
+ get: function () {
+
+ return this.shadowMap.type;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );
+ this.shadowMap.type = value;
+
+ }
+ },
+ shadowMapCullFace: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );
+ return undefined;
+
+ },
+ set: function ( /* value */ ) {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );
+
+ }
+ },
+ context: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.' );
+ return this.getContext();
+
+ }
+ },
+ vr: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .vr has been renamed to .xr' );
+ return this.xr;
+
+ }
+ },
+ gammaInput: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );
+ return false;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );
+
+ }
+ },
+ gammaOutput: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );
+ return false;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );
+ this.outputEncoding = ( value === true ) ? sRGBEncoding : LinearEncoding;
+
+ }
+ },
+ toneMappingWhitePoint: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );
+ return 1.0;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );
+
+ }
+ },
+ gammaFactor: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' );
+ return 2;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' );
+
+ }
+ }
+ } );
+
+ Object.defineProperties( WebGLShadowMap.prototype, {
+
+ cullFace: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );
+ return undefined;
+
+ },
+ set: function ( /* cullFace */ ) {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );
+
+ }
+ },
+ renderReverseSided: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );
+ return undefined;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );
+
+ }
+ },
+ renderSingleSided: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );
+ return undefined;
+
+ },
+ set: function () {
+
+ console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );
+
+ }
+ }
+
+ } );
+
+ function WebGLRenderTargetCube( width, height, options ) {
+
+ console.warn( 'THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).' );
+ return new WebGLCubeRenderTarget( width, options );
+
+ }
+
+ //
+
+ Object.defineProperties( WebGLRenderTarget.prototype, {
+
+ wrapS: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );
+ return this.texture.wrapS;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );
+ this.texture.wrapS = value;
+
+ }
+ },
+ wrapT: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );
+ return this.texture.wrapT;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );
+ this.texture.wrapT = value;
+
+ }
+ },
+ magFilter: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );
+ return this.texture.magFilter;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );
+ this.texture.magFilter = value;
+
+ }
+ },
+ minFilter: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );
+ return this.texture.minFilter;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );
+ this.texture.minFilter = value;
+
+ }
+ },
+ anisotropy: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );
+ return this.texture.anisotropy;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );
+ this.texture.anisotropy = value;
+
+ }
+ },
+ offset: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );
+ return this.texture.offset;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );
+ this.texture.offset = value;
+
+ }
+ },
+ repeat: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );
+ return this.texture.repeat;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );
+ this.texture.repeat = value;
+
+ }
+ },
+ format: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );
+ return this.texture.format;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );
+ this.texture.format = value;
+
+ }
+ },
+ type: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );
+ return this.texture.type;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );
+ this.texture.type = value;
+
+ }
+ },
+ generateMipmaps: {
+ get: function () {
+
+ console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );
+ return this.texture.generateMipmaps;
+
+ },
+ set: function ( value ) {
+
+ console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );
+ this.texture.generateMipmaps = value;
+
+ }
+ }
+
+ } );
+
+ //
+
+ Audio.prototype.load = function ( file ) {
+
+ console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );
+ const scope = this;
+ const audioLoader = new AudioLoader();
+ audioLoader.load( file, function ( buffer ) {
+
+ scope.setBuffer( buffer );
+
+ } );
+ return this;
+
+ };
+
+
+ AudioAnalyser.prototype.getData = function () {
+
+ console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );
+ return this.getFrequencyData();
+
+ };
+
+ //
+
+ CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) {
+
+ console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' );
+ return this.update( renderer, scene );
+
+ };
+
+ CubeCamera.prototype.clear = function ( renderer, color, depth, stencil ) {
+
+ console.warn( 'THREE.CubeCamera: .clear() is now .renderTarget.clear().' );
+ return this.renderTarget.clear( renderer, color, depth, stencil );
+
+ };
+
+ ImageUtils.crossOrigin = undefined;
+
+ ImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) {
+
+ console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );
+
+ const loader = new TextureLoader();
+ loader.setCrossOrigin( this.crossOrigin );
+
+ const texture = loader.load( url, onLoad, undefined, onError );
+
+ if ( mapping ) texture.mapping = mapping;
+
+ return texture;
+
+ };
+
+ ImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) {
+
+ console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );
+
+ const loader = new CubeTextureLoader();
+ loader.setCrossOrigin( this.crossOrigin );
+
+ const texture = loader.load( urls, onLoad, undefined, onError );
+
+ if ( mapping ) texture.mapping = mapping;
+
+ return texture;
+
+ };
+
+ ImageUtils.loadCompressedTexture = function () {
+
+ console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );
+
+ };
+
+ ImageUtils.loadCompressedTextureCube = function () {
+
+ console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );
+
+ };
+
+ //
+
+ function CanvasRenderer() {
+
+ console.error( 'THREE.CanvasRenderer has been removed' );
+
+ }
+
+ //
+
+ function JSONLoader() {
+
+ console.error( 'THREE.JSONLoader has been removed.' );
+
+ }
+
+ //
+
+ const SceneUtils = {
+
+ createMultiMaterialObject: function ( /* geometry, materials */ ) {
+
+ console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );
+
+ },
+
+ detach: function ( /* child, parent, scene */ ) {
+
+ console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );
+
+ },
+
+ attach: function ( /* child, scene, parent */ ) {
+
+ console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );
+
+ }
+
+ };
+
+ //
+
+ function LensFlare() {
+
+ console.error( 'THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js' );
+
+ }
+
+ //
+
+ function ParametricGeometry() {
+
+ console.error( 'THREE.ParametricGeometry has been moved to /examples/jsm/geometries/ParametricGeometry.js' );
+ return new BufferGeometry();
+
+ }
+
+ function TextGeometry() {
+
+ console.error( 'THREE.TextGeometry has been moved to /examples/jsm/geometries/TextGeometry.js' );
+ return new BufferGeometry();
+
+ }
+
+ function FontLoader() {
+
+ console.error( 'THREE.FontLoader has been moved to /examples/jsm/loaders/FontLoader.js' );
+
+ }
+
+ function Font() {
+
+ console.error( 'THREE.Font has been moved to /examples/jsm/loaders/FontLoader.js' );
+
+ }
+
+ function ImmediateRenderObject() {
+
+ console.error( 'THREE.ImmediateRenderObject has been removed.' );
+
+ }
+
+ function WebGLMultisampleRenderTarget( width, height, options ) {
+
+ console.error( 'THREE.WebGLMultisampleRenderTarget has been removed. Use a normal render target and set the "samples" property to greater 0 to enable multisampling.' );
+ const renderTarget = new WebGLRenderTarget( width, height, options );
+ renderTarget.samples = 4;
+ return renderTarget;
+
+ }
+
+ function DataTexture2DArray( data, width, height, depth ) {
+
+ console.warn( 'THREE.DataTexture2DArray has been renamed to DataArrayTexture.' );
+ return new DataArrayTexture( data, width, height, depth );
+
+ }
+
+ function DataTexture3D( data, width, height, depth ) {
+
+ console.warn( 'THREE.DataTexture3D has been renamed to Data3DTexture.' );
+ return new Data3DTexture( data, width, height, depth );
+
+ }
+
+ if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {
+
+ __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {
+ revision: REVISION,
+ } } ) );
+
+ }
+
+ if ( typeof window !== 'undefined' ) {
+
+ if ( window.__THREE__ ) {
+
+ console.warn( 'WARNING: Multiple instances of Three.js being imported.' );
+
+ } else {
+
+ window.__THREE__ = REVISION;
+
+ }
+
+ }
+
+ /**
+ * Three targets are provided for both GLSL and Sculpt/JS api.
+ *
+ * 1: source -> Threejs shader source components (easy customization)
+ * 2: source -> Threejs material
+ * 3: source -> Threejs mesh (easy to use)
+ *
+ * TODO: make these materials 'plug in' to threejs' lighting model, like unity's surface shaders
+ */
+
+ function glslToThreeJSShaderSource(source) {
+ return {
+ uniforms: baseUniforms(),
+ frag: threeHeader + 'const float STEP_SIZE_CONSTANT = 0.9;\n' + 'const int MAX_ITERATIONS = 300;\n' + uniformsToGLSL(baseUniforms()) + sculptureStarterCode + source + fragFooter,
+ vert: threeJSVertexSource
+ };
+ }
+ function glslToThreeJSMaterial(source, payload) {
+ var src = glslToThreeJSShaderSource(source);
+ return makeMaterial(src.uniforms, src.vert, src.frag, payload);
+ }
+ function glslToThreeJSMesh(source, payload) {
+ return makeBasicMesh(glslToThreeJSMaterial(source, payload));
+ }
+ function sculptToThreeJSShaderSource(source) {
+ var src = sculptToGLSL(source);
+
+ if (src.error) {
+ console.log(src.error);
+ }
+
+ var frg = threeHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(src.uniforms) + 'const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL + '\n' + src.colorGLSL + '\n' + fragFooter;
+ return {
+ uniforms: src.uniforms,
+ frag: frg,
+ vert: threeJSVertexSource,
+ error: src.error,
+ geoGLSL: src.geoGLSL,
+ colorGLSL: src.colorGLSL
+ };
+ }
+ function sculptToThreeJSMaterial(source, payload) {
+ var src = sculptToThreeJSShaderSource(source);
+ var material = makeMaterial(src.uniforms, src.vert, src.frag, payload);
+ material.uniformDescriptions = src.uniforms;
+ return material;
+ }
+ function sculptToThreeJSMesh(source, payload) {
+ source = convertFunctionToString(source);
+ return makeBasicMesh(sculptToThreeJSMaterial(source, payload));
+ }
+ function createSculptureWithGeometry(geometry, source) {
+ var uniformCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {
+ return {};
+ };
+ var params = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
+ geometry.computeBoundingSphere();
+ var radius = 'radius' in params ? params.radius : geometry.boundingSphere.radius;
+ params.radius = radius;
+ params.geometry = geometry;
+ return createSculpture(source, uniformCallback, params);
+ } // uniformCallback
+
+ function createSculpture(source) {
+ var uniformCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
+ return {};
+ };
+ var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ source = convertFunctionToString(source);
+ var radius = 'radius' in params ? params.radius : 2;
+ var geometry;
+
+ if ('geometry' in params) {
+ geometry = params.geometry;
+ } else {
+ var segments = 'segments' in params ? params.segments : 8;
+ geometry = new SphereGeometry(radius, segments, segments);
+ }
+
+ var material = sculptToThreeJSMaterial(source);
+ material.uniforms['opacity'].value = 1.0;
+ material.uniforms['mouse'].value = new Vector3();
+ material.uniforms['_scale'].value = radius;
+ var mesh = new Mesh(geometry, material);
+
+ mesh.onBeforeRender = function (renderer, scene, camera, geometry, material, group) {
+ var uniformsToUpdate = uniformCallback();
+
+ if (!(_typeof(uniformsToUpdate) === "object")) {
+ throw "createSculpture takes, (source, uniformCallback, params) the uniformCallback must be a function that returns a dictionary of uniforms to update";
+ }
+
+ for (var _i = 0, _Object$entries = Object.entries(uniformsToUpdate); _i < _Object$entries.length; _i++) {
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
+ uniform = _Object$entries$_i[0],
+ value = _Object$entries$_i[1];
+
+ material.uniforms[uniform].value = value;
+ } // material.uniforms['sculptureCenter'].value = geometry.position;
+
+ };
+
+ return mesh;
+ }
+
+ function uniformDescriptionToThreeJSFormat(unifs, payload) {
+ var finalUniforms = {};
+
+ if (payload && payload !== undefined && payload.msdfTexture !== undefined) {
+ finalUniforms["msdf"] = {
+ value: payload.msdfTexture || new Texture()
+ };
+ }
+
+ unifs.forEach(function (uniform) {
+ if (uniform.type === 'float') {
+ finalUniforms[uniform.name] = {
+ value: uniform.value
+ };
+ } else if (uniform.type === 'vec2') {
+ finalUniforms[uniform.name] = {
+ value: new Vector2(uniform.value.x, uniform.value.y)
+ };
+ } else if (uniform.type === 'vec3') {
+ finalUniforms[uniform.name] = {
+ value: new Vector3(uniform.value.x, uniform.value.y, uniform.value.z)
+ };
+ } else if (uniform.type === 'vec4') {
+ finalUniforms[uniform.name] = {
+ value: new Vector4(uniform.value.x, uniform.value.y, uniform.value.z, uniform.value.w)
+ };
+ }
+ });
+ return finalUniforms;
+ } // could use a scale parameter
+
+
+ function makeMaterial(unifs, vert, frag, payload) {
+ var material = new ShaderMaterial({
+ uniforms: uniformDescriptionToThreeJSFormat(unifs, payload),
+ vertexShader: vert,
+ fragmentShader: frag,
+ transparent: true,
+ side: BackSide
+ });
+ material.extensions.fragDepth = false;
+ return material;
+ } // There should be more options supported like size and shape
+
+
+ function makeBasicMesh(material) {
+ return new Mesh(new BoxGeometry(2, 2, 2), material);
+ }
+
+ function uniformToCpp(uniforms) {
+ var res = '';
+
+ for (var i = 0; i < uniforms.length; i++) {
+ var unif = uniforms[i];
+ res += unif.type + ' ' + unif.name + ' = ';
+
+ if (typeof unif.value === 'number') {
+ // float
+ res += unif.value + 0.0000001 + 'f';
+ } else {
+ // vec
+ res += 'vec' + unif.value.length + '(';
+
+ for (var j = 0; j < unif.value.length; j++) {
+ res += unif.value[j] + 0.0000001 + 'f';
+
+ if (j + 1 < unif.value.length) {
+ res += ', ';
+ }
+ }
+
+ res += ')';
+ }
+
+ res += ';\n';
+ }
+
+ return res;
+ }
+
+ var cppFooter = "\n\n";
+ var cppHeader = uniformToCpp(baseUniforms());
+
+ function glslToGLM(source) {
+ // converts all numbers to floats
+ var result = source.replace(/([^a-zA-Z][0-9]+([.][^a-zA-Z][0-9]*)|[.][0-9]+)()/g, '$1f'); // adds parentheses after swizzling for glm to pick up
+
+ result = result.replace(/([a-zA-Z0-9][.][w-z]{2,})()/g, '$1()');
+ return result;
+ }
+
+ function glslToOfflineRenderer(source) {}
+ function sculptToOfflineRenderer(source) {
+ var src = sculptToGLSL(source); //console.log(filteredStarter);
+
+ return cppHeader + glslToGLM('const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + 'f;\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL + src.colorGLSL) + cppFooter;
+ }
+
+ function glslToMinimalRenderer(canvas, source, updateUniforms) {
+ var fullFrag = minimalHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(baseUniforms()) + 'const float STEP_SIZE_CONSTANT = 0.9;\n' + 'const int MAX_ITERATIONS = 300;\n' + sculptureStarterCode + source + fragFooter;
+ return fragToMinimalRenderer(canvas, fullFrag, updateUniforms);
+ }
+ /**
+ * for fast and efficient use on the web
+ * input - sculpt code
+ * output - a fully self-contained lightweight html file which renders the sculpture
+ **/
+
+ function sculptToMinimalRenderer(canvas, source, updateUniforms) {
+ if (typeof source === "function") {
+ source = source.toString();
+ source = source.slice(source.indexOf("{") + 1, source.lastIndexOf("}"));
+ } else if (!(typeof source === "string")) {
+ throw "sculptToMinimalRenderer requires the source code to be a function, or a string";
+ }
+
+ var generatedGLSL = sculptToGLSL(source);
+ var fullFrag = minimalHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(generatedGLSL.uniforms) + 'const float STEP_SIZE_CONSTANT = ' + generatedGLSL.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + generatedGLSL.maxIterations + ';\n' + sculptureStarterCode + generatedGLSL.geoGLSL + '\n' + generatedGLSL.colorGLSL + '\n' + fragFooter;
+ return fragToMinimalRenderer(canvas, fullFrag, updateUniforms);
+ }
+
+ function fragToMinimalRenderer(canvas, fullFrag, updateUniforms) {
+ // if no update function is provided assume no-op
+ if (updateUniforms === undefined) {
+ updateUniforms = function updateUniforms() {
+ return {};
+ };
+ }
+
+ function resizeCanvas() {
+ var devicePixelRatio = window.devicePixelRatio || 1; // change this so canvas doesn't have to fill entire window
+
+ var width = window.innerWidth * devicePixelRatio;
+ var height = window.innerHeight * devicePixelRatio;
+
+ if (canvas.width != width || canvas.height != height) {
+ canvas.width = width;
+ canvas.height = height;
+ }
+ }
+
+ resizeCanvas();
+ window.addEventListener('resize', resizeCanvas);
+ var gl = canvas.getContext('webgl2');
+ var vertices = [-1.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0];
+ var indices = [3, 2, 1, 3, 1, 0];
+ var vertex_buffer = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
+ var Index_Buffer = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, Index_Buffer);
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
+ var vertShader = gl.createShader(gl.VERTEX_SHADER);
+ gl.shaderSource(vertShader, minimalVertexSource);
+ gl.compileShader(vertShader);
+ var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
+ gl.shaderSource(fragShader, fullFrag);
+ gl.compileShader(fragShader);
+
+ var logShaderComp = function logShaderComp(shader) {
+ var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
+ console.log('Shader compiled successfully: ' + compiled);
+ var compilationLog = gl.getShaderInfoLog(shader);
+ if (!compiled) console.error('Shader compiler log: ' + compilationLog);
+ };
+
+ logShaderComp(vertShader);
+ logShaderComp(fragShader);
+ var shaderProgram = gl.createProgram();
+ gl.attachShader(shaderProgram, vertShader);
+ gl.attachShader(shaderProgram, fragShader);
+ gl.linkProgram(shaderProgram); // Check if it linked.
+
+ var success = gl.getProgramParameter(shaderProgram, gl.LINK_STATUS);
+
+ if (!success) {
+ // something went wrong with the link; get the error
+ console.error("program failed to link:" + gl.getProgramInfoLog(shaderProgram));
+ }
+
+ gl.useProgram(shaderProgram);
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, Index_Buffer);
+ var coord = gl.getAttribLocation(shaderProgram, "coordinates");
+ gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, 0, 0);
+ gl.enableVertexAttribArray(coord);
+ gl.clearColor(1.0, 1.0, 1.0, 0.9);
+ gl.enable(gl.DEPTH_TEST);
+ var oTime = Date.now();
+ var loc = gl.getUniformLocation(shaderProgram, "time");
+
+ var _scale = gl.getUniformLocation(shaderProgram, "_scale");
+
+ var resolution = gl.getUniformLocation(shaderProgram, "resolution");
+ var opac = gl.getUniformLocation(shaderProgram, "opacity");
+ var mouseloc = gl.getUniformLocation(shaderProgram, "mouse");
+ gl.uniform1f(opac, 1.0);
+ gl.uniform1f(_scale, 1.0);
+ var userUniformUpdateFuncs = assignUniforms(updateUniforms);
+ canvas.addEventListener("pointermove", function (e) {
+ var devicePixelRatio = window.devicePixelRatio || 1;
+ var canvasX = (e.pageX - canvas.offsetLeft) * devicePixelRatio;
+ var canvasY = (e.pageY - canvas.offsetTop) * devicePixelRatio;
+ gl.uniform3f(mouseloc, 2.0 * canvasX / canvas.width - 1.0, 2.0 * (1.0 - canvasY / canvas.height) - 1.0, -0.5);
+ }, false);
+
+ function updateDraw() {
+ if (typeof updateUniforms === 'function') {
+ callUniformFuncs(userUniformUpdateFuncs, updateUniforms());
+ }
+
+ gl.uniform1f(loc, (Date.now() - oTime) * 0.001);
+ var devicePixelRatio = window.devicePixelRatio || 1;
+ var wwidth = window.innerWidth * devicePixelRatio;
+ var wheight = window.innerHeight * devicePixelRatio;
+ gl.uniform2fv(resolution, [wwidth, wheight]);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.viewport(0, 0, canvas.width, canvas.height);
+ gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0);
+ window.requestAnimationFrame(updateDraw);
+ }
+
+ updateDraw(); // loops through a dictionary and calls the function sotred in the value
+
+ function callUniformFuncs(uniformFuncs, updatedUniforms) {
+ if (_typeof(updatedUniforms) !== 'object') {
+ console.error('updateUniforms must return a dictionary of uniform names and values. Instead got: ', updateUniforms);
+ return;
+ }
+
+ Object.entries(uniformFuncs).forEach(function (keys) {
+ var _keys = _slicedToArray(keys, 2),
+ key = _keys[0],
+ uniformUpdateFunc = _keys[1];
+
+ if (key in updatedUniforms) {
+ uniformUpdateFunc(updatedUniforms[key]);
+ }
+ });
+ }
+
+ function assignUniforms(updateUniforms) {
+ if (typeof updateUniforms !== 'function') {
+ console.error('updateUniforms must be a function that returns a dictionary of uniform names and values');
+ return {};
+ }
+
+ var userUniformUpdateFuncs = {};
+ var uniformsDict = updateUniforms();
+
+ if (uniformsDict !== undefined && _typeof(uniformsDict) === 'object') {
+ Object.entries(uniformsDict).forEach(function (keys) {
+ var _keys2 = _slicedToArray(keys, 2),
+ key = _keys2[0],
+ val = _keys2[1];
+
+ var unifLocation = gl.getUniformLocation(shaderProgram, key);
+
+ if (typeof val === 'number') {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform1f(unifLocation, unif);
+ };
+ } else if (Array.isArray(val)) {
+ if (val.length === 1) {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform1f(unifLocation, unif[0]);
+ };
+ } else if (val.length === 2) {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform2iv(unifLocation, unif);
+ };
+ } else if (val.length === 3) {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform3iv(unifLocation, unif);
+ };
+ } else if (val.length === 4) {
+ userUniformUpdateFuncs[key] = function (unif) {
+ return gl.uniform4iv(unifLocation, unif);
+ };
+ } else {
+ console.error('Uniforms must be either a float or an array with length 1, 2, 3 or 4');
+ }
+ } else {
+ console.error('Uniforms must be either a float or an array with length 1, 2, 3 or 4');
+ }
+ });
+ }
+
+ return userUniformUpdateFuncs;
+ }
+ }
+
+ /**
+ * for fast tesing
+ * input - sculpt code
+ * output - self-contained lightweight html which renders the sculpture
+ **/
+ function sculptToMinimalHTMLRenderer(spCode, libPath) {
+ return makeHTML(spCode, 'sculptToMinimalRenderer', libPath);
+ }
+ function glslToMinimalHTMLRenderer(spCode, libPath) {
+ return makeHTML(spCode, 'glslToMinimalRenderer', libPath);
+ }
+
+ function makeHTML(spCode, minRenderFunc, libPath) {
+ return "\n\n\n Shader Park\n \n \n \n \n \n \n \n\n");
+ }
+
+ /**
+ * export for meshing with https://github.com/tdhooper/glsl-marching-cubes
+ * input - sculpt code
+ * output - glsl containing "mapDistance"
+ **/
+
+ function sculptToRawSDF4Meshing(source) {
+ var minimalHeader = "\nprecision highp float;\nuniform float w_width;\nuniform float w_height;\nuniform mat4 projectionMatrix;\n#define cameraPosition vec3(0.0,0.0,-1.0)\n#define vUv vec2(0.0)\n#define worldPos vec4(vec2((gl_FragCoord.x/w_width-0.5)*(w_width/w_height),gl_FragCoord.y/w_height-0.5)*1.75,0.0,0.0)\n#define STEP_SIZE_CONSTANT 0.9\n#define MAX_ITERATIONS 300\n#define stepSize 0.9\n#define mouse vec3(0.0)\n#define time 0.0\n";
+ var generatedGLSL = sculptToGLSL(source);
+ var fullFrag = minimalHeader + usePBRHeader + useHemisphereLight //+ uniformsToGLSL(generatedGLSL.uniforms)
+ + sculptureStarterCode + generatedGLSL.geoGLSL;
+ return fullFrag.replace(/surfaceDistance/g, 'mapDistance');
+ }
+
+ /**
+ * TD target for GLSL and Sculpt/JS api.
+ *
+ * TODO: make these materials 'plug in' to Touch Designer's ' PBR lighting model.
+ */
+
+ var TDHeader = "\nuniform float uShadowStrength;\nuniform vec3 uShadowColor;\nuniform vec4 uBaseColor;\nuniform float uMetallic;\nuniform float uRoughness;\nuniform float uSpecularLevel;\nuniform float uAmbientOcclusion;\nuniform vec3 cameraPosition;\nuniform sampler2D sBaseColorMap;\nuniform float useTDLighting;\n\n\nin Vertex\n{\n\tvec4 color;\n\tvec3 worldSpacePos;\n\tvec3 worldSpaceNorm;\n\tflat int cameraIndex;\n\tvec2 texCoord0;\n\tvec3 sculptureCenter;\n} iVert;\n\n#define sculptureCenter iVert.sculptureCenter;\n#define worldPos iVert.worldSpacePos\nlayout(location = 0) out vec4 oFragColor[TD_NUM_COLOR_BUFFERS];\nout float depthTexture;\n";
+ var TDFooter = "\nvoid main()\n{\n\t// This allows things such as order independent transparency\n\t// and Dual-Paraboloid rendering to work properly\n\tTDCheckDiscard();\n\n\t// Raymarching\n\tvec3 rayOrigin = worldPos.xyz-sculptureCenter;\n\tvec3 rayDirection = getRayDirection();\n\trayOrigin -= rayDirection*2.0;\n\tfloat t = intersect(rayOrigin, rayDirection, stepSize);\n depthTexture = t;\n\n\tvec4 outcol = vec4(0.0, 0.0, 0.0, 0.0);\n\tvec3 diffuseSum = vec3(0.0, 0.0, 0.0);\n\tvec3 specularSum = vec3(0.0, 0.0, 0.0);\n\n\tvec3 worldSpaceNorm = normalize(iVert.worldSpaceNorm.xyz);\n\t// vec3 normal = normalize(worldSpaceNorm.xyz);\n\tif(t < 2.5) {\n\t\tvec3 p = (rayOrigin + rayDirection*t);\n\t\tvec3 normal = calcNormal(p);\n\t\tvec3 raymarchedColor = shade(p, normal);\n\t\n\t\tvec3 baseColor = uBaseColor.rgb;\n\n\t\t// 0.08 is the value for dielectric specular that\n\t\t// Substance Designer uses for it's top-end.\n\t\tfloat specularLevel = 0.08 * uSpecularLevel;\n\t\tfloat metallic = uMetallic;\n\n\t\tfloat roughness = uRoughness;\n\n\t\tfloat ambientOcclusion = uAmbientOcclusion;\n\n\t\tvec3 finalBaseColor = baseColor.rgb * iVert.color.rgb;\n\n\t\tvec2 texCoord0 = iVert.texCoord0.st;\n\t\tvec4 baseColorMap = texture(sBaseColorMap, texCoord0.st);\n\t\tfinalBaseColor *= baseColorMap.rgb;\n\n\n\t\t// A roughness of exactly 0 is not allowed\n\t\troughness = max(roughness, 0.0001);\n\n\t\tvec3 pbrDiffuseColor = finalBaseColor * (1.0 - metallic);\n\t\tvec3 pbrSpecularColor = mix(vec3(specularLevel), finalBaseColor, metallic);\n\n\t\tvec3 viewVec = normalize(uTDMats[iVert.cameraIndex].camInverse[3].xyz - iVert.worldSpacePos.xyz );\n\n\n\t\t// Your shader will be recompiled based on the number\n\t\t// of lights in your scene, so this continues to work\n\t\t// even if you change your lighting setup after the shader\n\t\t// has been exported from the Phong MAT\n\t\tfor (int i = 0; i < TD_NUM_LIGHTS; i++)\n\t\t{\n\t\t\tTDPBRResult res;\n\t\t\tres = TDLightingPBR(i,\n\t\t\t\t\t\t\t\tpbrDiffuseColor,\n\t\t\t\t\t\t\t\tpbrSpecularColor,\n\t\t\t\t\t\t\t\tiVert.worldSpacePos.xyz,\n\t\t\t\t\t\t\t\tnormal,\n\t\t\t\t\t\t\t\tuShadowStrength, uShadowColor,\n\t\t\t\t\t\t\t\tviewVec,\n\t\t\t\t\t\t\t\troughness);\n\t\t\tdiffuseSum += res.diffuse;\n\t\t\tspecularSum += res.specular;\n\t\t}\n\n\t\t// Environment lights\n\t\tfor (int i = 0; i < TD_NUM_ENV_LIGHTS; i++)\n\t\t{\n\t\t\tTDPBRResult res;\n\t\t\tres = TDEnvLightingPBR(i,\n\t\t\t\t\t\tpbrDiffuseColor,\n\t\t\t\t\t\tpbrSpecularColor,\n\t\t\t\t\t\tnormal,\n\t\t\t\t\t\tviewVec,\n\t\t\t\t\t\troughness,\n\t\t\t\t\t\tambientOcclusion);\n\t\t\tdiffuseSum += res.diffuse;\n\t\t\tspecularSum += res.specular;\n\t\t}\n\t\t// Final Diffuse Contribution\n\t\tvec3 finalDiffuse = diffuseSum;\n\t\toutcol.rgb += finalDiffuse;\n\n\t\t// Final Specular Contribution\n\t\tvec3 finalSpecular = vec3(0.0);\n\t\tfinalSpecular += specularSum;\n\n\t\toutcol.rgb += finalSpecular;\n\n\n\t\t// Apply fog, this does nothing if fog is disabled\n\t\toutcol = TDFog(outcol, iVert.worldSpacePos.xyz, iVert.cameraIndex);\n\n\t\t// Alpha Calculation\n\t\tfloat alpha = uBaseColor.a * iVert.color.a ;\n\n\t\t// Dithering, does nothing if dithering is disabled\n\t\toutcol = TDDither(outcol);\n\n\t\toutcol.rgb *= alpha;\n\n\t\t// Modern GL removed the implicit alpha test, so we need to apply\n\t\t// it manually here. This function does nothing if alpha test is disabled.\n\t\tTDAlphaTest(alpha);\n\n\t\toutcol.a = alpha;\n\t\toutcol = mix(vec4(raymarchedColor, 1.0), outcol, useTDLighting);\n\t\toFragColor[0] = TDOutputSwizzle(outcol);\n\n\n\t\t// TD_NUM_COLOR_BUFFERS will be set to the number of color buffers\n\t\t// active in the render. By default we want to output zero to every\n\t\t// buffer except the first one.\n\t\tfor (int i = 1; i < TD_NUM_COLOR_BUFFERS; i++)\n\t\t{\n\t\t\toFragColor[i] = vec4(0.0);\n\t\t}\n\t} else {\n\t\tdiscard;\n\t}\n}\n";
+ function glslToTouchDesignerShaderSource(source) {
+ return {
+ uniforms: baseUniforms(),
+ frag: TDHeader + 'const float STEP_SIZE_CONSTANT = 0.9;\n' + 'const int MAX_ITERATIONS = 300;\n' + uniformsToGLSL(baseUniforms()) + sculptureStarterCode + source + TDFooter,
+ vert: minimalVertexSource
+ };
+ }
+ function sculptToTouchDesignerShaderSource(source) {
+ var src = sculptToGLSL(source);
+
+ if (src.error) {
+ console.log(src.error);
+ }
+
+ var frg = TDHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(src.uniforms) + 'const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL + '\n' + src.colorGLSL + '\n' + TDFooter;
+ var sdf = 'const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL;
+ return {
+ uniforms: src.uniforms,
+ frag: frg,
+ vert: minimalVertexSource,
+ error: src.error,
+ geoGLSL: src.geoGLSL,
+ colorGLSL: src.colorGLSL,
+ sdf: sdf,
+ glslUniforms: uniformsToGLSL(src.uniforms)
+ };
+ }
+
+ console.log('using shader-park-core version: 0.1.26'); /// Generate code for various targets
+
+ exports.baseUniforms = baseUniforms;
+ exports.bindStaticData = bindStaticData;
+ exports.createSculpture = createSculpture;
+ exports.createSculptureWithGeometry = createSculptureWithGeometry;
+ exports.defaultFragSourceGLSL = defaultFragSourceGLSL;
+ exports.fragFooter = fragFooter;
+ exports.glslToMinimalHTMLRenderer = glslToMinimalHTMLRenderer;
+ exports.glslToMinimalRenderer = glslToMinimalRenderer;
+ exports.glslToOfflineRenderer = glslToOfflineRenderer;
+ exports.glslToThreeJSMaterial = glslToThreeJSMaterial;
+ exports.glslToThreeJSMesh = glslToThreeJSMesh;
+ exports.glslToThreeJSShaderSource = glslToThreeJSShaderSource;
+ exports.glslToTouchDesignerShaderSource = glslToTouchDesignerShaderSource;
+ exports.minimalHeader = minimalHeader;
+ exports.minimalVertexSource = minimalVertexSource;
+ exports.sculptToGLSL = sculptToGLSL;
+ exports.sculptToMinimalHTMLRenderer = sculptToMinimalHTMLRenderer;
+ exports.sculptToMinimalRenderer = sculptToMinimalRenderer;
+ exports.sculptToOfflineRenderer = sculptToOfflineRenderer;
+ exports.sculptToRawSDF4Meshing = sculptToRawSDF4Meshing;
+ exports.sculptToThreeJSMaterial = sculptToThreeJSMaterial;
+ exports.sculptToThreeJSMesh = sculptToThreeJSMesh;
+ exports.sculptToThreeJSShaderSource = sculptToThreeJSShaderSource;
+ exports.sculptToTouchDesignerShaderSource = sculptToTouchDesignerShaderSource;
+ exports.sculptureStarterCode = sculptureStarterCode;
+ exports.uniformsToGLSL = uniformsToGLSL;
+ exports.useHemisphereLight = useHemisphereLight;
+ exports.usePBRHeader = usePBRHeader;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
diff --git a/libai/webfonts/fa-brands-400.ttf b/libai/webfonts/fa-brands-400.ttf
new file mode 100644
index 0000000..0f82a83
Binary files /dev/null and b/libai/webfonts/fa-brands-400.ttf differ
diff --git a/libai/webfonts/fa-brands-400.woff2 b/libai/webfonts/fa-brands-400.woff2
new file mode 100644
index 0000000..3c5cf97
Binary files /dev/null and b/libai/webfonts/fa-brands-400.woff2 differ
diff --git a/libai/webfonts/fa-regular-400.ttf b/libai/webfonts/fa-regular-400.ttf
new file mode 100644
index 0000000..9ee1919
Binary files /dev/null and b/libai/webfonts/fa-regular-400.ttf differ
diff --git a/libai/webfonts/fa-regular-400.woff2 b/libai/webfonts/fa-regular-400.woff2
new file mode 100644
index 0000000..57d9179
Binary files /dev/null and b/libai/webfonts/fa-regular-400.woff2 differ
diff --git a/libai/webfonts/fa-solid-900.ttf b/libai/webfonts/fa-solid-900.ttf
new file mode 100644
index 0000000..1c10972
Binary files /dev/null and b/libai/webfonts/fa-solid-900.ttf differ
diff --git a/libai/webfonts/fa-solid-900.woff2 b/libai/webfonts/fa-solid-900.woff2
new file mode 100644
index 0000000..1672102
Binary files /dev/null and b/libai/webfonts/fa-solid-900.woff2 differ
diff --git a/libai/webfonts/fa-v4compatibility.ttf b/libai/webfonts/fa-v4compatibility.ttf
new file mode 100644
index 0000000..3bcb67f
Binary files /dev/null and b/libai/webfonts/fa-v4compatibility.ttf differ
diff --git a/libai/webfonts/fa-v4compatibility.woff2 b/libai/webfonts/fa-v4compatibility.woff2
new file mode 100644
index 0000000..fbafb22
Binary files /dev/null and b/libai/webfonts/fa-v4compatibility.woff2 differ
diff --git a/research/002714.SZ_0724.html b/research/002714.SZ_0724.html
index af9ff49..62094a0 100644
--- a/research/002714.SZ_0724.html
+++ b/research/002714.SZ_0724.html
@@ -4,7 +4,7 @@
牧原股份(002714.SZ)深度经营分析报告
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
中国AI产业链深度研究报告
+
市场规模、产品创新与投资价值分析
+
+
+
+
+
+
+
+
+
+
+
+
1.1 核心发现概述
+
+
中国人工智能产业正处于从技术突破向规模化应用转型的关键时期。根据中国信通院最新数据,2024年中国人工智能产业规模已超9000亿元人民币,同比增长24%。其中,基础层表现最为突出,收入规模达3099亿元,同比增长54%,成为推动产业增长的核心引擎。
+
+
从产业结构看,中国AI产业链已形成"基础层-技术层-应用层"的完整体系。基础层涵盖算力基础设施、数据资源等核心要素;技术层包括算法模型、开发框架等关键技术;应用层则渗透到智能制造、智慧医疗、智能驾驶等多个领域。2024年应用层收入规模达5665亿元,占产业总规模的63%,显示出AI技术与实体经济融合的深度和广度。
+
+
企业数量方面,截至2025年9月,中国人工智能企业数量超5300家,占全球比重达15%,形成了覆盖基础底座、模型框架、行业应用的完整产业体系。其中,北京、广东、上海、浙江、江苏等地区集聚了全国80%以上的AI企业,成为产业发展的核心区域。
+
+
+
+
+
+
1.2 投资建议总结
+
+
基于对中国AI产业链的深度分析,我们给出以下投资建议:
+
+
重点投资领域排序:
+
+
+
+
+
+
1. AI芯片与算力基础设施
+ 优先级:★★★★★
+
+
+ - 投资逻辑:算力需求爆发式增长,国产替代空间巨大
+ - 核心标的:海光信息(688041)、寒武纪(688256)、澜起科技(688008)
+ - 预期收益:未来3年复合增长率超50%
+
+
+
+
+
+
+
2. 智能终端与边缘AI
+ 优先级:★★★★★
+
+
+ - 投资逻辑:端侧AI市场快速爆发,渗透率持续提升
+ - 核心标的:瑞芯微(603893)、晶晨股份(688099)、全志科技(300458)
+ - 预期收益:2025-2030年市场规模CAGR达30%以上
+
+
+
+
+
+
+
3. AI应用与行业解决方案
+ 优先级:★★★★☆
+
+
+ - 投资逻辑:AI+行业深度融合,商业模式日趋成熟
+ - 核心标的:科大讯飞(002230)、海康威视(002415)、大华股份(002236)
+ - 预期收益:稳健增长,年复合增长率20-30%
+
+
+
+
+
+
+
4. AI基础设施与平台服务
+ 优先级:★★★★☆
+
+
+ - 投资逻辑:云计算、数据中心等基础设施需求旺盛
+ - 核心标的:浪潮信息(000977)、中科曙光(603019)、光环新网(300383)
+ - 预期收益:受益于AI算力需求,增长确定性高
+
+
+
+
+
+
+
+
+
1.3 关键数据概览
+
+
+
+
中国AI产业关键数据概览(2024年)
+
+
+
+ | 指标类别 |
+ 具体数据 |
+ 同比增长 |
+ 全球占比 |
+
+
+
+
+ | 产业总规模 |
+ 超9000亿元 |
+ 24% |
+ 约15% |
+
+
+ | 基础层规模 |
+ 3099亿元 |
+ 54% |
+ - |
+
+
+ | 技术层规模 |
+ 315亿元 |
+ 18% |
+ - |
+
+
+ | 应用层规模 |
+ 5665亿元 |
+ 13% |
+ - |
+
+
+ | 企业数量 |
+ 超5300家 |
+ - |
+ 15% |
+
+
+ | AI芯片市场 |
+ 约1400亿元 |
+ 65% |
+ 约20% |
+
+
+ | 智能算力规模 |
+ 640.7 EFLOPS |
+ 86.9% |
+ - |
+
+
+
+
+
+
+
+
未来10年增长预测
+
+
+
+
+
+ - 2025年:产业规模约1.2万亿元,CAGR 30%+
+ - 2030年:产业规模突破2.5万亿元,CAGR 15-20%
+ - 2035年:产业规模达1.73万亿元(核心产业),占全球30.6%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
2. 中国AI产业链市场规模分析
+
+
+
+
+
2.1 历史回顾:2020-2024年市场规模与增长态势
+
+
+
中国人工智能产业在过去五年经历了从高速增长到稳健发展的演进过程。根据中国信通院的权威数据,2020年中国人工智能产业规模为3031亿元人民币,同比增长15.1%。这一增速虽然相对温和,但标志着中国AI产业进入了新的发展阶段。
+
+
+
+
2020-2024年产业规模增长
+
+
+
+
+
+
关键年份里程碑
+
+ -
+ 2021
+ 产业规模4041亿元,同比增长33.3%,创历史新高
+
+ -
+ 2022
+ 产业规模5080亿元,同比增长18%,从量增转向质升
+
+ -
+ 2023
+ 产业规模5784亿元,增速放缓至13.9%,生成式AI崛起
+
+ -
+ 2024
+ 产业规模突破9000亿元,同比增长24%,大模型技术驱动
+
+
+
+
+
+
从产业结构演变看,基础层占比从2020年的约25%提升至2024年的34%,反映出算力基础设施建设的重要性日益凸显。应用层占比保持在60%以上,是产业的主要组成部分,但增速相对较慢,显示出AI技术与传统产业融合的渐进性特征。
+
+
+
+
+
+
+
2.2 产业链结构:基础层、技术层、应用层细分市场
+
+
+
中国AI产业链呈现出清晰的三层结构,每一层都有其独特的价值创造模式和发展特征。
+
+
+
+
+
+
算力与数据的基础设施
+
+ -
+
+ 2024年收入3099亿元,同比增长54%
+
+ -
+
+ 智能算力规模640.7 EFLOPS,CAGR 52.5%
+
+ -
+
+ AI服务器市场190亿美元,同比增长87%
+
+ -
+
+ 数据产量全球第二,要素市场加速形成
+
+
+
+
+
+
+
+
算法创新与平台构建
+
+ -
+
+ 2024年收入315亿元,同比增长18%
+
+ -
+
+ 计算机视觉技术国际领先
+
+ -
+
+ 大模型技术快速发展(文心一言、通义千问等)
+
+ -
+
+ 国产AI框架日趋成熟(飞桨、天元等)
+
+
+
+
+
+
+
+
AI技术的行业落地
+
+ -
+
+ 2024年收入5665亿元,同比增长13%
+
+ -
+
+ 智能制造应用成熟,效率提升30%+
+
+ -
+
+ 智慧医疗诊断准确率超资深医生
+
+ -
+
+ 智能网联汽车市场2024年突破1200亿元
+
+
+
+
+
+
+
+
2024年中国AI产业结构分布
+
+
+
+
+
+
+
+
+
+
+
2.3 未来展望:2025-2035年市场预测与增长驱动
+
+
+
基于当前的发展态势和技术演进趋势,多家权威机构对中国AI产业未来10年的发展进行了预测。
+
+
+
+
+
+
+ 短期预测(2025-2030年):高速增长期
+
+
+
+
+
赛迪顾问预测:中国人工智能产业规模将从2025年的3985亿元增长至2030年的1万亿元,"十五五"期间CAGR为19.8%。
+
+
+
+
中研普华预测:2025年中国AI产业规模将接近万亿元,2030年达到2.5万亿元,2025-2030年CAGR超过25%。
+
+
+
+
细分领域亮点:
+
+ - • 生成式AI:2025年市场规模将达260亿美元,CAGR超85%
+ - • AI Agent:2025年市场规模突破1735亿元,2027年达5442亿元
+
+
+
+
+
+
+
+
+
+ 长期展望(2030-2035年):成熟发展期
+
+
+
+
+
赛迪顾问预测:2035年中国人工智能产业规模将达到17295亿元,2025-2035年CAGR为15.6%。
+
+
+
+
中研普华预测:2035年中国AI核心产业规模将达1.73万亿元,占全球比重从当前的10%提升至30.6%。
+
+
+
+
全球地位展望:
+
中国将成为全球AI产业的主导力量之一,在技术创新、标准制定和产业生态方面发挥重要作用。
+
+
+
+
+
+
+
+
增长驱动因素分析
+
+
+
+
+
技术创新突破
+
+
大模型技术演进、量子计算、脑机接口等前沿技术突破,扩展AI应用边界。
+
+
+
+
+
+
政策支持力度
+
+
《新一代人工智能发展规划》明确目标,各级政府出台支持政策,优化发展环境。
+
+
+
+
+
+
应用需求旺盛
+
+
传统产业数字化转型需求强烈,AI成为提升竞争力的关键手段,应用场景不断拓展。
+
+
+
+
+
+
资本投入增加
+
+
2024年AI领域投资事件达1136起,融资金额6596亿元,约是2023年的2倍。
+
+
+
+
+
+
基础设施完善
+
+
5G、数据中心、云计算等基础设施完善,降低AI应用成本,推动大规模应用。
+
+
+
+
+
+
全球化机遇
+
+
"一带一路"等国际合作提供广阔市场空间,中国AI企业国际化进程加速。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
3. 中国AI产业链未来产品形式与创新趋势
+
+
+
+
+
3.1 技术演进路径与产品创新方向
+
+
+
中国AI产业正处于技术创新的关键转折点,从单一技术突破向多技术融合创新转变,从通用模型向专用场景优化演进。
+
+
+
+
+
+
+
+
+
大模型技术的深化与分化
+
大语言模型(LLM)技术是当前AI发展的核心驱动力。截至2024年12月30日,我国生成式人工智能服务已备案数量达到302条。
+
+
未来3-5年发展趋势:
+
+ -
+
+ 技术路线分化,通用与专用模型并行发展
+
+ -
+
+ 多模态融合成为主流,扩展应用场景
+
+ -
+
+ 推理能力持续提升,处理复杂任务
+
+
+
+
+ 核心技术
+
+
+
+
+
+
+
+
+
+
边缘AI与端侧智能的兴起
+
边缘AI将AI计算能力部署在靠近数据源的边缘设备上,实现本地化的智能处理,对中国庞大的物联网设备基础具有特殊意义。
+
+
市场规模预测:
+
+ -
+
+ 2024年端侧AI市场规模1939亿元
+
+ -
+
+ 2025年将突破2500亿元
+
+ -
+
+ 2030年有望达到1.2万亿元,CAGR超30%
+
+
+
+
+ 增长热点
+
+
+
+
+
+
+
+
+
+
具身智能的突破与应用
+
具身智能(Embodied AI)将AI技术与物理实体相结合,创造出具有感知、决策和行动能力的智能体,是AI发展的下一个重要方向。
+
+
产品形态展望:
+
+ -
+
+ 人形机器人:家庭、服务、工业应用
+
+ -
+
+ 自主移动机器人:物流、巡检、清洁
+
+ -
+
+ 智能穿戴设备:实时智能辅助
+
+
+
+
+ 未来方向
+
+
+
+
+
+
+
端侧AI设备出货量预测(2025年)
+
+
+
+
+
+
+
+
+
+
+
3.2 重点产品领域市场预测
+
+
+
基于技术发展趋势和市场需求分析,以下几个产品领域将成为未来5-10年的重点发展方向:
+
+
+
+
+
+
+
+
智能网联汽车:万亿级市场的新赛道
+
+
+
+
+
智能网联汽车是AI技术应用最为广泛和深入的领域之一。2024年,中国智能网联汽车相关市场规模已突破1200亿元,预计到2030年将增长至6800亿元以上,年均复合增长率高达32.7%。
+
+
细分市场预测:
+
+ -
+
+ 自动驾驶系统:2025年8000亿元 → 2030年5万亿元
+
+ -
+
+ 车联网数据服务:年均增速35%
+
+ -
+
+ 智能座舱:2025年渗透率超50%,2030年达80%+
+
+
+
+
+
自动驾驶技术路线时间线
+
+
+
+
2025年
+
L2+级别辅助驾驶大规模普及
+
+
+
+
2027年
+
L3级别有条件自动驾驶商业化
+
+
+
+
2030年后
+
L4/L5级别完全自动驾驶逐步落地
+
+
+
+
+
+
+
+
+
+
+
+
+
AI终端设备:从单品智能到全屋智能
+
+
+
+
+
AI终端设备市场正经历爆发式增长。2024年中国AI终端市场规模达5860亿元,同比增长67.3%,预计2025年将突破万亿元大关,2030年达4.2万亿元,占全球比重超35%。
+
+
+
+
+
+
+
主要产品类别预测:
+
+
+
AI手机
+
2025年出货量预计达1.18亿部,渗透率超过40%。具备更强的本地AI处理能力,实现实时翻译、图像生成等功能。
+
+
+
+
AI PC
+
2025年国内出货量预计超1亿台,占全球市场40%。具备智能内容创作、智能会议、智能安全等功能。
+
+
+
+
智能家居
+
从单品智能向全屋智能演进,通过AI中枢系统实现设备智能联动和个性化控制。
+
+
+
+
可穿戴设备
+
集成更多AI功能,如健康监测、运动指导、实时翻译等,成为日常生活的智能助手。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
生成式AI应用:内容创作的革命
+
+
+
生成式AI正在重塑内容创作产业,从文字、图像到音频、视频,AI生成内容的质量和效率都在快速提升。
+
+
+
市场规模预测:
+
AIGC市场将迎来爆发式增长。2025年中国AIGC市场规模预计将达到7770亿元,复合年均增长率高达122%,预计到2030年有望突破万亿元大关。
+
+
+
具体应用领域:
+
+ - • 文本创作:新闻稿、商业报告、创意文案
+ - • 图像生成:AI绘画、设计工具
+ - • 视频制作:全流程自动化,降低成本
+ - • 音乐创作:个性化音乐作品生成
+
+
+
+
+
+
+
+
+
+
AI Agent:智能化的数字助手
+
+
+
AI Agent(智能体)是一种能够自主感知环境、理解任务、制定计划并执行操作的智能软件。随着大模型技术的成熟,AI Agent正从概念走向现实。
+
+
+
市场前景分析:
+
2025年中国AI Agent市场规模有望突破1735亿元,到2027年进一步扩张至5442亿元,2023-2027年间的年均复合增长率约为77%。
+
+
+
应用前景:
+
+ - • 企业级应用:客户服务、数据分析、流程自动化
+ - • 个人助理:日程安排、信息检索、决策支持
+ - • 行业专属Agent:金融、医疗、教育、法律等领域
+ - • 2028年企业级应用市场规模超270亿美元
+
+
+
+
+
+
+
+
+
+
3.3 商业模式创新与价值链重构
+
+
+
AI技术的发展不仅带来了产品创新,更推动了商业模式的根本性变革。
+
+
+
+
+
+
+ 从产品销售到服务订阅的转变
+
+
+
+
+
软件即服务(SaaS)
+
企业通过云端提供AI能力,用户按需付费,大大降低了AI应用的门槛和成本。如AI翻译服务、AI设计工具、AI分析平台等。
+
+
+
+
模型即服务(MaaS)
+
Gartner预测,模型即服务模式在软件市场的占比将从2025年的12%跃升至2030年的35%。允许企业快速获取和部署AI模型,无需大量资源投入。
+
+
+
+
+
+
+ 从单一产品到平台生态的演进
+
+
+
+
平台型商业模式特征:
+
+ - • 技术能力的开放共享(开放API、低代码工具)
+ - • 生态伙伴的协同创新(平台方+行业伙伴)
+ - • 数据和知识的积累增值(正向循环)
+
+
+
+
+
+
+
+
+
+ 从技术驱动到价值共创的升级
+
+
+
+
价值共创模式特点:
+
+ -
+
+ 深度参与客户业务流程:深入了解客户需求,共同设计和优化业务流程
+
+ -
+
+ 效果导向的收费模式:从项目收费转向基于效果的收费,与客户利益绑定
+
+ -
+
+ 持续的运营优化:提供持续的运营服务,建立长期合作关系
+
+
+
+
+
+
+ 价值链的重构与延伸
+
+
+
+
+
数据价值的重新发现
+
数据从生产要素转变为重要资产,数据交易市场形成,价值得以充分释放。
+
+
+
+
算法价值的凸显
+
优秀算法模型成为稀缺资源,通过授权、服务等方式变现,可解释性、公平性、安全性成为新价值维度。
+
+
+
+
场景价值的挖掘
+
AI技术价值体现在具体应用场景中,对场景的深度理解和创新应用成为新竞争优势。
+
+
+
+
+
+
+
+
AI商业模式演进路径
+
+
+
+
+
+
传统模式(2015-2020)
+
产品销售导向,一次性交付,客户自主使用,价值实现单一。
+
+
+
+
+
服务模式(2020-2023)
+
项目服务导向,定制化开发,持续服务支持,价值实现多元化。
+
+
+
+
+
平台模式(2023-2025)
+
平台生态导向,开放能力输出,伙伴协同创新,价值网络构建。
+
+
+
+
+
价值共创模式(2025+)
+
生态协同导向,深度业务融合,数据驱动创新,价值持续创造。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4. 中国AI硬件产业链供应链分析
+
+
+
+
+
4.1 产业链结构与关键环节
+
+
+
中国AI硬件产业链呈现出复杂而完整的结构,涵盖了从上游原材料到下游应用产品的全链条。理解这一产业链的结构和关键环节,对于把握投资机会至关重要。
+
+
+
+
中国AI硬件产业链结构
+
+
+
+
上游:基础材料与核心设备
+
+
+
半导体材料
+
+ -
+
+ 硅片:沪硅产业(300mm硅片市占率18%)
+
+ -
+
+ 光刻胶:南大光电(KrF光刻胶通过验证)
+
+ -
+
+ 电子特气:华特气体、金宏气体
+
+ -
+
+ CMP抛光液:安集科技(28nm节点市占率35%)
+
+
+
+
+
制造设备
+
+ -
+
+ 刻蚀机:中微公司(5nm制程设备)
+
+ -
+
+ 薄膜沉积设备:北方华创(14nm节点良率达标)
+
+ -
+
+ CMP设备:华海清科
+
+ -
+
+ 光刻机:上海微电子(90nm及以上工艺)
+
+
+
+
+
+
+
+
+
中游:芯片设计、制造与封测
+
+
+
芯片设计
+
+ -
+
+ GPU/DCU:海光信息(市占率超50%)
+
+ -
+
+ AI芯片:寒武纪(思元系列)
+
+ -
+
+ 汽车AI芯片:地平线(市场份额第一)
+
+ -
+
+ 内存接口芯片:澜起科技(市占率40-50%)
+
+
+
+
+
晶圆制造
+
+ -
+
+ 中芯国际:14nm量产,7nm风险试产
+
+ -
+
+ 2024年营收577.96亿元(+27.72%)
+
+ -
+
+ 华虹半导体:特色工艺优势
+
+
+
+
+
封装测试
+
+ -
+
+ 长电科技:全球第三,2024营收359.6亿元
+
+ -
+
+ 通富微电、华天科技、晶方科技
+
+ -
+
+ 先进封装:Fan-out、SiP、Chiplet
+
+
+
+
+
+
+
+
+
下游:AI服务器与终端产品
+
+
+
AI服务器
+
+ -
+
+ 浪潮信息:国内AI服务器龙头
+
+ -
+
+ 中科曙光、紫光股份、中兴通讯
+
+ -
+
+ 2024年全球AI服务器市场增长87%
+
+
+
+
+
智能终端
+
+ -
+
+ AI手机:2025年渗透率超40%
+
+ -
+
+ AI PC:2025年国内出货超1亿台
+
+ -
+
+ 边缘计算设备:智能摄像头、工业设备
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.2 主要供应链与零配件体系
+
+
+
+
+
+
+
+
+
+ 芯片设计供应链
+
+
+
+
+
EDA工具
+
+ 被Synopsys、Cadence、Siemens EDA三大巨头垄断,国产化率不足10%。
+ 华大九天、广立微等企业正在突破,已支持28nm工艺设计。
+
+
+
+
+
IP核
+
+ 包括处理器内核、接口IP、模拟IP等。芯原股份在IP授权领域占据重要地位,
+ 平头哥、兆易创新等通过自研或合作布局核心IP。
+
+
+
+
+
设计服务
+
+ 众多专业芯片设计服务公司,为芯片设计企业提供从前端设计到后端实现的全流程服务。
+
+
+
+
+
+
+
+
+
+ 制造供应链
+
+
+
+
+
关键设备
+
+ 光刻机:ASML垄断高端市场,国产支持90nm及以上工艺
+ 刻蚀机:中微公司、北方华创、盛美半导体
+ 薄膜沉积设备:北方华创、中微公司、拓荆科技
+
+
+
+
+
材料
+
+ 硅片:沪硅产业、立昂微、神工股份
+ 光刻胶:南大光电、上海新阳、北京科华
+ 电子特气:华特气体、金宏气体、南大光电
+
+
+
+
+
+
+
+
+
+
+
+
+ 封测供应链
+
+
+
+
+
封装材料
+
+ 封装基板:深南电路、兴森科技、生益科技
+ 键合丝:康强电子、贺利氏(金丝);先进半导体材料(铜丝)
+ 塑封料:长电科技、华天科技等自产为主
+ 底部填充胶:德邦科技、回天新材
+
+
+
+
+
测试设备
+
+ 测试机:华峰测控、长川科技
+ 分选机:奥特维、新益昌
+ 探针台:科威尔、和林微纳
+
+
+
+
+
+
+
+
+
+ 系统集成供应链
+
+
+
+
主要供应链组成
+
+ PCB:深南电路、沪电股份、生益科技
+ 连接器:立讯精密、中航光电、得润电子
+ 散热器:飞荣达、中石科技、超频三
+ 电源:长城电源、新雷能、英飞源
+ 存储器件:兆易创新、北京君正、江波龙
+ 光模块:中际旭创、新易盛、华工科技
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.3 供应链风险评估与国产化进展
+
+
+
中国AI硬件供应链面临着复杂的国际环境和技术挑战,供应链安全成为产业发展的关键议题。
+
+
+
+
+
+
+ 主要风险点分析
+
+
+
+
+
技术依赖风险
+
+ 在高端芯片设计、先进制程制造、关键设备等领域,中国仍高度依赖国外技术。
+ 特别是在光刻机、EDA工具、高端芯片等"卡脖子"环节,一旦供应中断,将对产业造成重大影响。
+
+
+
+
+
地缘政治风险
+
+ 美国及其盟友的技术封锁和出口管制不断升级,对中国AI产业的发展构成直接威胁。
+ 例如,美国对高端GPU、先进制程芯片的出口限制,迫使中国企业加快自主研发。
+
+
+
+
+
供应链集中度风险
+
+ 许多关键材料和设备的供应高度集中在少数几家企业,一旦出现问题,将影响整个产业链的运行。
+
+
+
+
+
成本上升风险
+
+ 随着国际形势的变化和技术封锁的加剧,获取先进技术和产品的成本大幅上升,给企业带来巨大压力。
+
+
+
+
+
+
+
+
+
+ 国产化进展评估
+
+
+
+ 面对供应链风险,中国在关键领域的国产化取得了积极进展。
+
+
+
+
+
芯片设计领域
+
+ 国产AI芯片在特定领域已具备竞争力。寒武纪的推理芯片市场份额国内第一(18%),
+ 思元370芯片能效比较上一代提升40%。海光信息的DCU产品已在多个数据中心大规模部署。
+
+
+
+
+
制造领域
+
+ 中芯国际的14nm工艺已实现量产,7nm工艺进入风险试产,虽然与国际先进水平仍有差距,
+ 但正在快速追赶。华虹半导体在特色工艺领域建立了竞争优势。
+
+
+
+
+
设备和材料领域
+
+ 国产化率逐步提升。根据预测,到2025年,EDA工具、光刻胶、大硅片等关键材料设备的
+ 国产化率有望分别达到30%、20%、40%。
+
+
+
+
+
+
+
关键领域国产化率预测(2025年)
+
+
+
+
+
+
+
+
+
+
重点突破方向
+
+
+
+
+
先进制程技术
+
+
+ 加快7nm及以下先进制程的研发和量产,缩小与国际先进水平的差距。
+ 同时,通过Chiplet等新技术路线,在不依赖最先进制程的情况下实现性能提升。
+
+
+
+
+
+
+
关键设备国产化
+
+
+ 重点突破光刻机、刻蚀机、薄膜沉积设备等核心设备,
+ 特别是DUV光刻机有望在2025年实现突破。
+
+
+
+
+
+
+
材料自主可控
+
+
+ 加快光刻胶、电子特气、靶材等关键材料的国产化进程,
+ 降低对外依赖。
+
+
+
+
+
+
+
生态体系建设
+
+
+ 建立"芯片-软件-应用"的完整生态,通过生态协同降低对单一技术或产品的依赖。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
5. 中国AI产业链主要上市公司分析
+
+
+
+
+
5.1 产业链各环节龙头企业概览
+
+
+
+ 中国AI产业链上市公司众多,分布在从上游材料设备到下游应用的各个环节。
+ 通过对企业的技术实力、市场地位、财务表现等多维度分析,我们识别出各细分领域的龙头企业。
+
+
+
+
+
+
+
+ | 产业链环节 |
+ 龙头企业 |
+ 股票代码 |
+ 核心优势 |
+ 2024年关键指标 |
+
+
+
+
+
+ | 上游材料 |
+ 沪硅产业 |
+ 688126 |
+ 硅片龙头,300mm硅片市占率18% |
+ 营收增长35%+ |
+
+
+ | 安集科技 |
+ 300706 |
+ CMP抛光液,28nm节点市占率35% |
+ 净利润增长42% |
+
+
+ | 南大光电 |
+ 300346 |
+ 光刻胶突破,KrF通过中芯验证 |
+ 营收增长68% |
+
+
+
+
+ | 上游设备 |
+ 北方华创 |
+ 002371 |
+ 设备龙头,28nm离子注入机量产 |
+ 营收146亿元(+65%) |
+
+
+ | 中微公司 |
+ 688012 |
+ 刻蚀机全球领先,进入台积电 |
+ 净利润增长72% |
+
+
+
+
+ | 中游芯片设计 |
+ 海光信息 |
+ 688041 |
+ CPU/DCU龙头,市占率超50% |
+ 营收91.6亿(+52%),净利19.3亿 |
+
+
+ | 寒武纪 |
+ 688256 |
+ AI芯片先锋,思元系列产品 |
+ 营收11.7亿(+66%),Q1扭亏 |
+
+
+ | 澜起科技 |
+ 688008 |
+ 内存接口芯片市占率40-50% |
+ 净利14.1亿(+213%) |
+
+
+
+
+ | 中游制造封测 |
+ 中芯国际 |
+ 688981/00981 |
+ 晶圆代工龙头,14nm量产 |
+ 营收578亿(+28%) |
+
+
+ | 长电科技 |
+ 600584 |
+ 封测龙头,全球第三 |
+ 营收360亿(+21%),净利16.1亿 |
+
+
+
+
+ | 下游应用 |
+ 科大讯飞 |
+ 002230 |
+ AI应用龙头,智能语音领先 |
+ 营收超100亿元 |
+
+
+ | 海康威视 |
+ 002415 |
+ 智能安防龙头,全球市占率第一 |
+ 营收800亿+,净利140亿+ |
+
+
+ | 浪潮信息 |
+ 000977
\ No newline at end of file
diff --git a/research/Ai_industry_research_kimi.html b/research/Ai_industry_research_kimi.html
new file mode 100644
index 0000000..51ec142
--- /dev/null
+++ b/research/Ai_industry_research_kimi.html
@@ -0,0 +1,1740 @@
+
+
+
+ 中国AI产业链深度研究报告:投资决策参考
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 中国AI产业链深度研究报告
+
+ 投资决策参考 · 2025年度
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+ 执行摘要
+
+
+ 中国AI产业链正处在一波黄金发展期,由技术突破、政策支持和市场需求共同推动。过去五年,该行业经历了指数级增长,未来5到10年,预计将保持超过30%的年复合增长率,市场规模有望超过万亿元人民币。AI大模型是当前和未来行业发展的核心引擎,不仅推动了AI芯片、服务器等硬件基础设施的升级,也催生了AI PC、AI智能手机、人形机器人等一系列革命性产品形态。
+
+
+ 从投资角度来看,产业链上游的AI硬件供应链是价值最高、进入壁垒最深的环节,也是国内替代的焦点。其中,AI芯片(如寒武纪、海光信息)、AI传感器(如韦尔股份)、AI存储器(如兆易创新)、AI电源管理(如欧陆通、晶丰明源)、高端PCB(如沪电股份)等细分领域的领军企业,凭借技术优势、市场地位和生态系统领先地位,将成为本轮AI浪潮中最具投资价值的标的。这些企业不仅受益于国内市场巨大的需求,还肩负着国家信息安全和科技自立自强的战略使命,拥有巨大的长期增长潜力。
+
+
+
+
+
+
+
+
+
+
+
+ 1. AI产业链市场规模与增长分析
+
+
+
+ 1.1 过去5年市场规模与增长回顾
+
+
+
+ 整体市场规模爆发式增长
+
+ 中国人工智能市场规模从2018年的238亿元增长到2023年的2137亿元,复合年增长率超过28%
+ [28]
+ [9]。
+ 这一显著增长主要得益于国家战略推动、技术成熟以及应用场景的不断拓展。
+
+
+
+ AI基础设施快速发展
+
+ 2023年中国AI基础设施市场规模达到1513.9亿元
+ [1],
+ 主要由高性能计算、存储和网络资源需求的大幅增长,以及政府对AI技术发展的支持政策和投资推动。
+
+
+
+
+
+ AI软件及应用市场稳步增长
+
+ 根据IDC数据,2020年中国AI软件市场规模达到230.9亿元,约为美国AI软件市场规模的60%
+ [5]。
+ 在应用领域,计算机视觉、智能语音、自然语言处理是中国AI市场最大的三个细分领域,
+ 分别占比34.9%、24.8%和21%
+ [3]。
+
+
+
+
+
+
+ 1.2 未来5-10年市场规模与增长预测
+
+
+
+ 1万亿+
+ 2029年市场规模(人民币)
+
+
+ 32.1%
+ 2025-2029 CAGR
+
+
+ 11020亿
+ 2025年AI硬件市场规模
+
+
+
+
+ 智慧交通等垂直领域前景广阔
+
+ 根据东吴证券报告,2024年中国智慧交通市场规模预计将达到2610亿元,2025年将增至2871亿元
+ [20]。
+ 在自动驾驶领域,麦肯锡预测到2030年,中国自动驾驶相关新车销售和出行服务将产生超过5000亿美元的收入
+ [19]
+ [60]。
+
+
+
+
+
+
+ 1.3 未来技术趋势
+
+
+
+
+
+ AI大模型成为核心驱动力
+
+
+ 未来5-10年,AI大模型将继续作为产业发展的核心驱动力,引领技术变革和应用创新。
+ 多模态大模型将成为重要发展方向,实现文本、图像、语音等多种模态的统一处理,
+ 为AI应用带来更广阔的空间[62]。
+
+
+
+
+
+
+ AI与硬件深度融合
+
+
+ 随着端侧大模型技术的成熟,AI能力将加速下沉到边缘侧和终端侧,推动AI硬件创新发展。
+ AI PC、AI智能手机、AI平板等智能终端将成为AI技术的重要载体,
+ 为用户提供更智能的体验[19]
+ [60]。
+
+
+
+
+
+
+ 软硬件一体化解决方案
+
+
+ 未来软硬件一体化解决方案将成为AI产业的重要发展方向。大模型一体机通过软硬件集成,
+ 降低了企业应用大模型的技术门槛,加速了AI技术在垂直行业的落地。
+
+
+
+
+
+
+
+ 1.4 主要驱动因素
+
+
+
+
+
+ 政策扶持与国家战略
+
+
+ 政府出台了一系列政策文件,为AI产业发展提供强有力的政策支持。
+ 2025年发布的"AI+"行动将AI提升到新的国家战略高度。
+
+
+
+
+
+
+ 数字化转型需求
+
+
+ 随着数字经济快速发展,各行业数字化转型需求日益迫切。
+ AI技术作为重要支撑,在制造、金融、医疗等领域得到广泛应用。
+
+
+
+
+
+
+ 技术创新与算力提升
+
+
+ 中国在AI芯片、算法、框架等领域取得重要突破,
+ "东数西算"工程为AI产业发展提供强大算力支撑。
+
+
+
+
+
+
+
+ 1.5 潜在挑战
+
+
+
+
+
+ 核心技术瓶颈
+
+
+ 在高端AI芯片、核心算法、开发框架等方面,与国际先进水平仍存在差距。
+ 算力不足是制约大模型发展的重要因素,特别是在高端GPU等核心硬件方面仍面临"卡脖子"风险
+ [24]。
+
+
+
+
+
+
+ 数据安全与隐私问题
+
+
+ 随着AI技术广泛应用,数据安全和隐私问题日益突出。AI模型的训练和运行需要大量数据,
+ 如何在保障数据安全和用户隐私前提下推动AI健康发展成为重要挑战。
+
+
+
+
+
+
+ 商业化落地难度
+
+
+ 虽然AI技术发展迅速,但商业化落地仍面临困难。一方面,大模型等先进技术建设和应用成本较高;
+ 另一方面,AI技术在真实业务场景中的表现尚未能完全满足部分客户需求。
+
+
+
+
+
+
+
+
+
+
+
+
+ 2. AI产业链未来产品形式与市场预测
+
+
+
+ 2.1 未来可能出现的产品形式
+
+
+
+
+
+ AI智能硬件
+
+
+ AI PC、AI智能手机、AI平板等智能终端将成为AI技术的重要载体。
+ 根据IDC预测,2025年中国AIPC、AI平板和AI智能手机总出货量将同比增长20%
+ [19]
+ [60]。
+
+
+
+
+
+
+ 智能辅助驾驶
+
+
+ 随着技术成熟和政策逐步放开,智能辅助驾驶将从高端车型向中低端车型普及,
+ 成为汽车标配功能。麦肯锡预测到2030年中国自动驾驶相关新车销售和出行服务将产生超过5000亿美元收入
+ [19]
+ [60]。
+
+
+
+
+
+
+ 人形机器人
+
+
+ 人形机器人是AI技术发展的终极形态之一。华为预测10年后90%以上的中国家庭将拥有智能机器人
+ [21],
+ 它不仅能承担家务,还能提供情感陪伴。
+
+
+
+
+
+
+ 大模型一体机
+
+
+ 大模型一体机是软硬件一体化解决方案的重要体现,将加速AI技术在垂直行业的应用。
+ 通过软硬件的深度集成和优化,降低企业应用大模型的技术门槛和成本。
+
+
+
+
+
+
+ 
+
+
+
+ 2.2 市场预测
+
+
+
+ AI硬件市场增长预测
+
+ 中国AI硬件市场将保持高速增长态势。根据洛图科技预测,
+ 2025年中国AI硬件市场(不包括AI智能手机和AI汽车)将达到11020亿元,
+ 未来五年复合增长率将达到18%
+ [16]
+ [61]。
+
+
+
+
+ 7938亿
+ 2025年智能家电市场规模
+
+
+
+
+
+ AI应用商业化进程加速
+
+ 随着技术成熟和应用场景的拓展,AI应用商业化进程将加快。未来AI应用将从目前的几个重点行业
+ 扩展到更多传统行业,实现更广泛的产业渗透。AI应用深度也将不断提升,从辅助决策走向自主决策。
+
+
+ 商业模式创新
+
+ - • SaaS订阅制模式普及
+ - • 按效果付费模式探索
+ - • 软硬件一体化解决方案
+ - • MaaS(模型即服务)模式
+
+
+
+
+
+
+
+
+
+
+
+
+ 3. AI硬件产业链供应链梳理
+
+
+ 
+
+
+
+
+ 3.1 AI芯片
+
+
+ 市场概况
+
+ AI芯片是AI硬件的"大脑",负责执行复杂的计算任务,是算力的核心来源。
+ 根据技术架构,AI芯片主要分为GPU(图形处理单元)、ASIC(专用集成电路)和FPGA(现场可编程门阵列)。
+ 在中国市场,GPU因其强大的并行计算能力和成熟的软件生态,在AI训练和推理领域占据主导地位。
+
+
+ 市场份额预测
+
+ 根据弗若斯特沙利文数据,2024年基于GPU架构的AI芯片约占中国AI芯片市场的69.9%,
+ 预计到2029年将增至77.3%
+ [83]。
+
+
+
+
+
+
+
+ GPU
+
+
+ GPU是AI计算的首选,特别是深度学习模型训练。国际巨头如NVIDIA和AMD凭借技术优势和完善的CUDA生态系统,
+ 在全球和中国市场占据领先地位。
+
+
+ 主要玩家: 英伟达、AMD、沐曦、海光信息、天数智芯、壁仞科技、摩尔线程
+
+
+
+
+
+ ASIC
+
+
+ ASIC是为特定应用设计的集成电路,在性能、功耗和成本之间实现极致平衡。
+ 在中国市场,华为海思的昇腾系列芯片表现突出。
+
+
+ 主要玩家: 华为海思、寒武纪、昆仑芯、平头哥、燧原科技
+
+
+
+
+
+ FPGA
+
+
+ FPGA是一种半定制化芯片,硬件逻辑可以通过编程重构,兼具灵活性和高性能。
+ 在AI领域主要用于算法原型验证和小批量生产。
+
+
+ 主要玩家: 紫光国微、复旦微电
+
+
+
+
+
+
+
+ 3.2 AI传感器
+
+
+
+
+ 图像传感器
+
+
+ 图像传感器(CIS)是AI视觉应用的核心,广泛应用于智能手机、安防监控、自动驾驶、医疗影像等领域。
+
+
+ 主要玩家: 韦尔股份、格科微、思特威
+
+
+
+
+
+ 雷达传感器
+
+
+ 雷达传感器包括激光雷达(LiDAR)和毫米波雷达,是实现高级别自动驾驶的关键组件。
+
+
+ 主要玩家: 禾赛科技、速腾聚创、德赛西威、华域汽车
+
+
+
+
+
+ 语音传感器
+
+
+ 语音传感器即麦克风,是AI语音交互的入口。随着智能音箱、语音助手等应用普及,
+ 对高性能麦克风的需求不断增长。
+
+
+ 主要玩家: 歌尔股份、敏芯股份、共达电声
+
+
+
+
+
+
+
+ 3.3 AI存储器
+
+
+
+
+ HBM(高带宽存储器)
+
+
+ HBM采用3D堆叠技术,实现极高带宽和更低功耗。HBM是目前AI加速芯片的主流存储解决方案,
+ 其性能直接影响AI模型训练效率。
+
+
+ 技术挑战: 全球市场主要由三星、SK海力士等韩国厂商垄断,
+ 长江存储等国内龙头企业正积极研发相关技术
+ [101]。
+
+
+
+
+
+ SSD(固态硬盘)
+
+
+ SSD作为AI服务器和数据中心的主要存储设备,其读写速度和可靠性对AI应用性能至关重要。
+
+
+ 主要玩家: 兆易创新、江波龙、佰维存储
+
+
+
+
+
+
+
+ 3.4 AI电源管理
+
+
+
+
+ 电源管理IC(PMIC)
+
+
+ PMIC负责为CPU、GPU等核心芯片提供稳定高效的电源。在AI应用中,
+ 由于芯片功耗巨大,对PMIC性能要求极高。
+
+
+ 主要玩家: 晶丰明源、矽力杰、杰华特
+
+ 技术突破: 晶丰明源已推出数字多相控制器等产品,填补国内技术空白
+ [93]。
+
+
+
+
+
+ 电源模块(PSU)
+
+
+ PSU是数据中心供电系统的核心。随着AI服务器功率密度不断提升,
+ 传统供电架构面临挑战,氮化镓(GaN)等第三代半导体材料备受青睐。
+
+
+ 技术突破: 英诺赛科成功入选NVIDIA 800V架构供应商名单,
+ 标志着中国芯片企业在全球高端AI基建供应链中取得重要突破
+ [92]。
+
+
+
+
+
+
+
+ 3.5 其他关键部件
+
+
+
+
+ PCB
+
+
+ AI服务器和高端AI芯片对PCB性能要求极高,需要高频高速CCL和HDI技术。
+
+ 主要玩家:沪电股份、胜宏科技
+
+
+
+
+ 连接器
+
+
+ 确保信号和电源可靠传输的关键组件。
+
+ 主要玩家:立讯精密
+
+
+
+
+ 通信模块
+
+
+ 高速光模块是实现分布式AI计算中数据高速传输的关键。
+
+ 主要玩家:中际旭创、新易盛
+
+
+
+
+ 散热系统
+
+
+ AI硬件高功耗带来巨大散热挑战,液冷技术逐渐成为主流。
+
+ 主要玩家:中科曙光、思泉新材
+
+
+
+
+
+
+
+
+
+
+
+ 4. AI硬件产业链主要上市公司及龙头企业分析
+
+
+ 
+
+
+
+
+ 4.1 AI芯片领域
+
+
+
+
+
+
+
+ |
+
+ 寒武纪 (688256.SH) - AI芯片设计龙头
+ 总部:北京
+
+ |
+
+
+
+
+ | 2025年前三季度营收 |
+ 46.07亿元,同比增长2386.38%
+ [120]
+ |
+
+
+ | 归母净利润 |
+ 16.05亿元,扭亏为盈
+ [120]
+ |
+
+
+ | 研发投入 |
+ 7.15亿元,研发投入强度超过15%
+ [120]
+ |
+
+
+ | 总资产 |
+ 126.0亿元(截至2025年9月30日)
+ [121]
+ |
+
+
+ | 核心竞争力 |
+ 产品线覆盖云、边、端全系列智能芯片及处理器,思元系列芯片在运营商、金融、互联网等重点行业规模化部署 |
+
+
+
+
+
+
+
+
+
+ 海光信息 (688041.SH) - CPU/DCU领先企业
+
+
+
+ 财务表现
+
+ - • 2025年上半年营收:37.63亿元,同比增长44.08%
+ [99]
+
+ - • 归母净利润:8.53亿元,同比增长25.97%
+ - • DCU产品性能达到国际先进水平
+
+
+
+ 核心竞争力
+
+ - • 技术源自AMD x86架构授权,自主创新发展
+ - • 构建自主可控软硬件生态体系
+ - • 产品获得国内市场广泛认可
+
+
+
+
+
+
+
+
+
+ 景嘉微 (300474.SZ) - 国产GPU领军企业
+
+
+ 国内GPU领域领军企业,专注于高可靠军用电子产品研发、生产和销售。
+ 近年来积极拓展民用市场,推出面向AI计算、云计算等应用的JM9系列高性能GPU。
+ 核心优势在于图形处理和高性能计算领域深厚的技术积累,以及军工领域的深厚背景。
+
+
+
+
+
+
+
+ 4.2 AI传感器领域
+
+
+
+
+
+
+
+ |
+
+ 韦尔股份 (603501.SH) - 图像传感器龙头
+ 总部:上海
+
+ |
+
+
+
+
+ | 市场地位 |
+ 中国最大、全球第三大CMOS图像传感器企业
+ [125]
+ |
+
+
+ | 业务布局 |
+ 产品覆盖智能手机、汽车电子、安防监控、医疗影像等领域 |
+
+
+ | 核心竞争力 |
+ 通过收购豪威科技获得深厚技术积累,在CIS领域具有全球竞争力 |
+
+
+
+
+
+
+
+
+
+
+ |
+
+ 敏芯股份 (688286.SH) - MEMS传感器领先企业
+ 总部:苏州
+
+ |
+
+
+
+
+ | 2025年上半年业绩 |
+ 扭亏为盈,实现营收和净利润双增长
+ [276]
+ |
+
+
+ | 研发投入 |
+ 3863.03万元
+ [276]
+ |
+
+
+ | 综合毛利率 |
+ 31.64%,同比提升10.21个百分点 |
+
+
+ | 技术布局 |
+ 布局AI语音交互、AI眼镜、六维力/力矩传感器等前沿技术 |
+
+
+
+
+
+
+
+
+
+ 4.3 AI存储器领域
+
+
+
+
+
+
+
+ |
+
+ 兆易创新 (603986.SH) - 存储器龙头
+ 总部:北京
+
+ |
+
+
+
+
+ | 2025年上半年营收 |
+ 41.50亿元,同比增长15.00%
+ [270]
+ |
+
+
+ | 归母净利润 |
+ 5.75亿元,同比增长11.31% |
+
+
+ | 经营活动现金流 |
+ 9.58亿元 |
+
+
+ | 业务布局 |
+ 覆盖NOR Flash、NAND Flash、DRAM,形成"存储+控制"平台优势 |
+
+
+
+
+
+
+
+
+
+ 江波龙 (301308.SZ) - 存储解决方案提供商
+
+
+ 专注于闪存应用产品开发,总部位于深圳。产品线覆盖嵌入式存储、SSD、移动存储、内存条等,
+ 为消费电子、工业、通信、汽车等客户提供一站式存储解决方案。
+
+
+ AI时代机遇
+
+ 企业级和工业级SSD产品在AI服务器、数据中心、边缘计算等场景广泛应用,
+ 受益于AI算力需求爆发带来的高性能存储需求增长。
+
+
+
+
+
+
+
+
+ 4.4 AI电源管理领域
+
+
+
+
+
+
+ 欧陆通 (300870.SZ) - 开关电源龙头
+
+
+
+ AI服务器电源业务
+
+ 2025年上半年AI服务器电源业务快速增长,客户包括浪潮信息、富士康、华勤、联想等
+ [251]。
+
+
+ 技术优势: 液冷电源产品进入准量产阶段,
+ 满足下一代数据中心高效散热需求
+
+
+
+ 市场地位
+
+ 在AI服务器电源领域技术实力国内领先,随着AI服务器市场持续扩大和国产化替代趋势加速,
+ 有望在高增长赛道中占据领先地位。
+
+
+
+
+
+
+
+
+
+ 中恒电气 (002364.SZ) - 数据中心电源龙头
+
+
+ 国内数据中心电源领军企业,在HVDC电源市场市占率超过30%,
+ 为阿里、腾讯、百度等互联网巨头数据中心提供48V/600A大电流电源模块
+ [292]。
+
+
+ HVDC技术优势
+
+ 相比传统UPS方案,HVDC技术能效更高、成本更低,是数据中心绿色低碳发展的重要方向。
+ 在AI时代,数据中心功率密度和能耗大幅提升,对高效可靠电源解决方案需求迫切。
+
+
+
+
+
+
+
+
+ 晶丰明源 (688368.SH) - 电源管理芯片设计企业
+
+
+ 国内领先的电源管理驱动芯片设计企业,总部位于上海。最初从LED照明驱动芯片起步,
+ 近年来成功将业务拓展至高性能计算电源芯片领域。
+
+
+ 技术突破
+
+ 10相数字控制电源管理芯片BPD93010已实现量产,
+ 填补国内该技术领域空白
+ [93]。
+ 该突破对保障国产AI芯片稳定运行、减少对国外厂商依赖具有重要意义。
+
+
+
+
+
+
+
+
+ 4.5 其他关键部件领域
+
+
+
+
+
+
+ 沪电股份 (002463.SZ) - PCB龙头
+
+
+ 中国领先的PCB制造商,总部位于江苏昆山。专注于企业通信市场板、汽车板、
+ 工业设备板等中高端PCB产品研发、生产和销售。
+
+
+ AI时代机遇: AI服务器、数据中心、高速网络设备等对高频高速PCB需求激增
+
+
+
+
+
+
+
+ 浪潮信息 (000977.SZ) - AI服务器龙头
+
+
+ 中国领先的云计算、大数据服务商,总部位于山东济南。全球领先的AI服务器和算力基础设施供应商,
+ 服务器产品在中国市场连续多年保持第一。
+
+
+ 市场表现: 2022年营收695.25亿元,ChatGPT带动2023年Q1营收同比增长85%
+ [98]
+ [105]
+
+
+
+
+
+
+
+ 中科曙光 (603019.SH) - 高性能计算龙头
+
+
+ 中国领先的高性能计算、云计算、大数据解决方案提供商,总部位于北京。
+ 在高端计算、存储、安全、数据中心等领域拥有深厚技术积累。
+
+
+ 技术优势: 液冷服务器技术国内领先,有效解决AI硬件高功耗散热问题
+ [111]
+
+
+
+
+
+
+
+
+
+
+
+
+ 投资结论
+
+
+
+ 
+
+
+
+
+
+ 黄金发展期
+
+
+ 中国AI产业链正处于由技术突破、政策支持和市场需求共同推动的黄金发展期。
+ 未来5-10年预计将保持超过30%的年复合增长率,市场规模有望突破万亿元人民币。
+
+
+
+
+
+
+ 大模型驱动
+
+
+ AI大模型是当前和未来产业发展的核心引擎,不仅推动了硬件基础设施升级,
+ 也催生了AI PC、AI智能手机、人形机器人等一系列革命性产品形态。
+
+
+
+
+
+
+ "产业链上游的AI硬件供应链是价值最高、进入壁垒最深的环节,也是国内替代的焦点。
+ 其中,AI芯片、AI传感器、AI存储器、AI电源管理、高端PCB等细分领域的领军企业,
+ 将成为本轮AI浪潮中最具投资价值的标的。"
+
+
+
+
+
+
+ 国家安全战略
+
+
+ 这些企业不仅受益于国内市场巨大需求,还肩负着国家信息安全和科技自立自强的战略使命,
+ 拥有巨大的长期增长潜力。
+
+
+
+
+
+
+ 技术壁垒
+
+
+ AI硬件供应链技术壁垒高,进入门槛深,龙头企业凭借技术优势、
+ 市场地位和生态系统领先地位,具备较强的竞争壁垒。
+
+
+
+
+
+
+ 成长空间
+
+
+ 随着AI技术在各行业的深入应用,以及国产化替代进程加速,
+ 相关龙头企业将迎来广阔的发展空间和长期增长机会。
+
+
+
+
+
+
+
+ 投资建议
+
+
+
+ 重点关注领域:
+ AI芯片(寒武纪、海光信息)、AI传感器(韦尔股份、敏芯股份)、
+ AI存储器(兆易创新、江波龙)、AI电源管理(欧陆通、晶丰明源)、
+ 高端PCB(沪电股份)等细分领域的龙头企业。
+
+
+ 投资策略:
+ 建议采用长期投资策略,关注企业技术创新能力、市场地位、
+ 财务健康状况以及国产化替代进程。
+
+
+ 风险提示:
+ 需要关注技术迭代风险、市场竞争加剧风险、
+ 政策变化风险以及国际贸易摩擦风险。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/research/Ai_industry_research_qwen.html b/research/Ai_industry_research_qwen.html
new file mode 100644
index 0000000..d3564e1
--- /dev/null
+++ b/research/Ai_industry_research_qwen.html
@@ -0,0 +1,1003 @@
+
+
+
+
+
+
+ AI产业链全景分析:市场规模、产品形态与供应链格局
+
+
+
+
+
+
+
+
+
+ AI产业链全景分析
+ 市场规模、产品形态与供应链格局深度解析
+
+
+
+
+
+
+
+ AI产业链市场规模与增长趋势
+
+
+
+ 8159亿美元
+ 2028年全球AI市场规模预测
+
+
+
+ 7000亿元
+ 2024年中国AI市场规模
+
+
+ 2万亿
+ 2030年中国AI市场规模预测
+
+
+
+
+
+
+ 市场规模分析要点
+ 人工智能产业正处于第三次技术浪潮的爆发期,全球市场规模持续扩大。2018年全球AI产业规模为555.7亿美元,到2022年增长至1630.2亿美元,年均复合增长率高达30.9% [1]。IDC预测,全球AI投资规模将在2028年达到8159亿美元,五年复合增长率达32.9%。
+
+ 中国市场增速更为迅猛。2024年中国AI市场规模突破7000亿元,预计2030年将超过2万亿元,五年复合增长率稳定在25%以上。中国AI市场规模可分为核心产业规模和总市场规模两个维度,其中核心产业规模指芯片、算法、服务器等基础环节,2025年目标4918亿元。
+
+
+
+
+
+
+
+
+ AI硬件产业链结构与主要供应链
+
+
+ 产业链三层结构
+
+
+
+ 上游基础层
+ 芯片、传感器、存储设备
+
+
+
+ 中游技术层
+ 算法框架、AI加速卡、边缘计算设备
+
+
+
+ 下游应用层
+ 消费电子、自动驾驶、工业智能
+
+
+
+
+
+ 芯片供应链分析
+ 芯片供应链分为GPU、FPGA、ASIC和类脑芯片四大类。全球市场由英伟达主导,占GPU市场80%以上份额 [4];中国市场则由华为昇腾、寒武纪等企业引领。华为昇腾910B推理成本仅为英伟达H100的十分之一,2025年市场份额达28%,在云端训练芯片市场占据近一半份额。
+
+
+
+ 传感器供应链分析
+ 主要包括MEMS传感器、激光雷达和摄像头模组等。歌尔微电子(歌尔股份子公司)为国内最大MEMS传感器供应商,2024年营收67.26亿元,来自苹果占比57.45% [8],但依赖英飞凌芯片。
+
+
+
+
+
+
+ 各段供应链的主要上市公司及龙头企业分析
+
+
+
+ 芯片供应链环节
+
+ 英伟达
+ 全球GPU市场领导者,占80%以上份额。2024年在AI芯片领域的垄断地位受到挑战,但其CUDA生态仍是行业标准。
+
+
+ 华为昇腾
+ 国产AI芯片的绝对领跑者,2025年市场份额达28% [4]。昇腾910B算力密度达26P Flops/U,性能直逼H100。
+
+
+ 寒武纪
+ 国产AI芯片的技术差异化竞争者,2024年营收11.74亿元,同比增长65.56% [7],2025年前三季度营收46.07亿元,同比增长2386.38%。
+
+
+
+
+ 传感器供应链环节
+
+ 歌尔股份
+ 声学组件全球龙头,2024年营收1009.54亿元,净利润26.65亿元,同比增长144.93%。子公司歌尔微电子专注于MEMS传感器研发,累计出货量超40亿颗。
+
+
+ 水晶光电
+ AR波导片技术领先企业,2024年营收62.78亿元,净利润10.30亿元,同比增长71.57%。衍射光波导片技术已应用于智能眼镜等终端设备。
+
+
+ 舜宇光学
+ 摄像头模组全球龙头,产品广泛应用于智能手机、汽车电子等领域。在车载镜头、手机镜头等领域的市场份额持续提升。
+
+
+
+
+ 存储设备供应链环节
+
+ 江波龙
+ 存储模组龙头,2024年营收174.64亿元,净利润4.99亿元,同比增长160.24%。产品线涵盖嵌入式存储、固态硬盘(SSD)、移动存储及内存条四大系列。
+
+
+ 佰维存储
+ AI端侧存储解决方案提供商,2024年营收66.95亿元,净利润1.61亿元,同比增长125.82%。ePOP产品已进入Meta、雷鸟创新等知名AI/AR眼镜厂商供应链。
+
+
+
+
+ 连接器与结构件供应链环节
+
+ 立讯精密
+ 连接器全球龙头,2025年Q2云计算业务营收同比增超60%,是OpenAI硬件项目的独家组装商 [10]。在精密制造领域的积累使其在AI硬件代工环节占据优势地位。
+
+
+ 长盈精密
+ 金属中框供应商,2024年营收169.34亿元,净利润7.72亿元,同比增长800.24%。金属中框产品已应用于AI硬件设备,在结构件领域的技术壁垒较高。
+
+
+
+
+
+
+ AI硬件产业链未来发展趋势与挑战
+
+
+
+ 技术融合趋势
+ AI硬件产业链将进一步融合量子计算、生物识别等前沿技术,催生新一代智能设备。量子计算与AI结合的硬件将提升复杂问题的解决能力,生物识别传感器将增强人机交互体验。
+
+
+
+ 国产替代加速
+ 随着中美科技竞争加剧,中国AI硬件产业链的国产替代进程将加速。华为昇腾、寒武纪等企业在AI芯片领域的突破,以及歌尔股份、水晶光电等企业在传感器领域的布局,将推动中国AI硬件产业链的自主可控。
+
+
+
+ 应用场景扩展
+ AI硬件将从消费电子向工业、医疗、农业等更广泛领域扩展。AI医疗设备将在诊断、治疗和康复等环节发挥更大作用;工业AI传感器将提升智能制造水平;农业AI设备将推动精准农业发展。
+
+
+
+
+ 供应链安全挑战
+ AI硬件产业链面临供应链安全挑战,特别是关键环节的"卡脖子"问题。例如,高端芯片制造仍依赖台积电等国际厂商;传感器芯片约80%依赖海外企业 [17];通信模块主要由高通、博通等国际厂商主导。这种供应链依赖增加了企业运营风险,也限制了产业链的自主可控能力。
+
+
+
+ 成本与性能平衡
+ AI硬件产业链面临成本与性能平衡的挑战。随着AI技术的普及,终端设备对成本敏感度提高,而对性能要求也日益严格。例如,华为昇腾910B推理成本仅为英伟达H100的十分之一 [4],但性能仍有差距;寒武纪MLU590单价约为英伟达A100的60%,但在能效比上仍有提升空间。这种成本与性能的平衡将决定AI硬件产业链的长期竞争力。
+
+
+
+
+ AI硬件产业链投资机会与风险分析
+
+
+
+ 投资机会
+
+ - 芯片设计:华为昇腾生态已覆盖2700多家合作伙伴、6000多个行业方案 [9]
+ - 传感器制造:歌尔股份MEMS传感器已累计出货量超40亿颗 [11]
+ - 存储设备:江波龙2024年营收174.64亿元,同比增长72.48%
+ - 连接器与结构件:立讯精密2025年Q2云计算业务营收同比增超60%
+ - 代工服务:立讯精密是OpenAI硬件项目的独家组装商 [10]
+
+
+
+
+ 投资风险
+
+ - 技术迭代风险:寒武纪2024年研发投入10.72亿元,占营业收入比例达91.30% [13]
+ - 市场波动风险:江波龙、佰维存储2025年Q1净利润同比大幅下滑
+ - 供应链安全风险:歌尔微电子依赖英飞凌芯片,寒武纪依赖台积电代工 [4]
+ - 客户集中度风险:歌尔微电子最大客户A收入占比57.45%
+ - 估值泡沫风险:部分企业估值已处于较高水平
+
+
+
+
+
+
+
+
+ AI硬件产业链龙头企业竞争力对比
+
+
+ 主要企业竞争力对比表
+
+
+
+ | 企业名称 |
+ 总部城市 |
+ 2024年营收(亿元) |
+ 2024年净利润(亿元) |
+ 2024年增长率(%) |
+ 主要产品与优势 |
+
+
+
+
+ | 立讯精密 |
+ 广东东莞 |
+ 1539.46 [14] |
+ 70.71 [14] |
+ 2025Q2云计算业务营收同比增超60% |
+ 连接器全球第8位 OpenAI硬件项目独家组装商 全球化制造布局 |
+
+
+ | 歌尔股份 |
+ 山东潍坊 |
+ 1009.54 |
+ 26.65 |
+ 2.41% |
+ MEMS传感器全球领先 声学模组AirPods核心供应商 全球化客户布局 |
+
+
+ | 江波龙 |
+ 广东深圳 |
+ 174.64 |
+ 4.99 |
+ 72.48% |
+ 存储模组AI端侧龙头 全球化产品布局 DDR5/PCIe Gen5技术领先 |
+
+
+ | 寒武纪 |
+ 上海 |
+ 11.74 [13] |
+ 16.05(2025Q3) [7] |
+ 65.56% [13] |
+ 国产AI芯片技术领先 MLU590中标率37% [4] 软硬一体解决方案 |
+
+
+ | 华为昇腾 |
+ 广东深圳 |
+ 未单独披露 |
+ 未单独披露 |
+ 2025年市场份额28% [4] |
+ 昇腾910B性能直逼H100 昇腾生态覆盖2700家伙伴 [4] 政务云/智慧城市领域优势 |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/research/ai_companys/analysis.html b/research/ai_companys/analysis.html
new file mode 100644
index 0000000..32127a6
--- /dev/null
+++ b/research/ai_companys/analysis.html
@@ -0,0 +1,1051 @@
+
+
+
+
+
+ 产业链分析 - AI产业链护城河深度分析
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 产业链
+ 全景分析
+
+
+ 深度解析AI产业上中下游的技术壁垒、市场格局与发展趋势
+
+
+
+
+
+
+
+
+
+ 上游:基础层分析
+ AI芯片、算力、数据、算法 - 产业基石
+
+
+
+
+
+
+ 竞争格局
+
+
+
+ 英伟达
+ 领导者
+
+
+
+ 市场份额
+ 90%+
+
+
+ 技术壁垒
+ 9.9/10
+
+
+ 生态成熟度
+ 极高
+
+
+
+
+
+
+ 华为昇腾
+ 挑战者
+
+
+
+ 市场份额
+ 25%
+
+
+ 技术壁垒
+ 9.5/10
+
+
+ 自主可控
+ 极高
+
+
+
+
+
+
+ 寒武纪
+ 专业者
+
+
+
+ 市场份额
+ 15%
+
+
+ 技术壁垒
+ 9.2/10
+
+
+ 创新能力
+ 强
+
+
+
+
+
+
+ 百度昆仑芯
+ 追赶者
+
+
+
+ 生态绑定
+ 百度生态
+
+
+ 场景优化
+ 8.5/10
+
+
+ 成本控制
+ 良好
+
+
+
+
+
+
+
+
+ 核心洞察
+
+
+ 技术特征
+
+ -
+ •
+ 架构创新:存算一体、异构计算成为主流
+
+ -
+ •
+ 工艺演进:7nm以下先进工艺竞争加剧
+
+ -
+ •
+ 生态构建:软硬件协同优化重要性凸显
+
+
+
+
+ 市场趋势
+
+ -
+ •
+ 国产替代:政策驱动下的历史性机遇
+
+ -
+ •
+ 垂直优化:专用芯片需求快速增长
+
+ -
+ •
+ 成本压力:规模化生产和成本控制关键
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 中游:技术层分析
+ AI开发框架、模型、平台 - 技术核心
+
+
+
+
+
+
+ 平台化竞争格局
+
+
+ 百度飞桨 - 本土化领导者
+
+ 作为中国首个开源产业级深度学习平台,飞桨已经构建了庞大的开发者生态。截至2025年9月,平台开发者数量达到2333万,服务企业超过76万家。
+
+
+ 2333万开发者
+ 76万企业
+ 110万模型
+ 40+芯片适配
+
+
+
+
+ 华为MindSpore - 自主可控先锋
+
+ 与昇腾AI处理器深度协同,提供全场景AI计算框架。在自主可控的大背景下,MindSpore在关键信息基础设施领域具有重要战略价值。
+
+
+ 自主可控
+ 全场景支持
+ 软硬协同
+ 企业级
+
+
+
+
+ 腾讯优图 - 应用驱动
+
+ 依托腾讯在社交、游戏等领域积累的海量数据和应用场景,优图实验室在计算机视觉、语音识别等技术领域保持领先。
+
+
+ 海量数据
+ 场景丰富
+ 技术领先
+ 云原生
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 下游:应用层分析
+ 行业解决方案、产品服务 - 价值实现
+
+
+
+
+
+
+ 行业领导者分析
+
+
+
+ 海康威视
+ 安防龙头
+
+
+ 全球安防市场领导者,"物联感知+AI"深度融合,准确率稳定在99%以上
+
+
+
+ 全球份额
+ 28%
+
+
+ AI准确率
+ 99%+
+
+
+
+
+
+
+ 科大讯飞
+ AI+教育
+
+
+ 垂直行业数据壁垒深厚,教育、医疗AI应用的先行者
+
+
+
+ 开发者生态
+ 870万+
+
+
+ 应用场景
+ 教育/医疗
+
+
+
+
+
+
+ 大华股份
+ 智慧物联
+
+
+ 安防AI领域重要参与者,向智慧物联领域转型
+
+
+
+ 国内份额
+ 12%+
+
+
+ 转型方向
+ AIoT
+
+
+
+
+
+
+
+
+
+
+
+
+ 发展趋势预测
+
+
+
+
+ 技术发展趋势
+
+
+ 大模型与小模型并存
+
+ 超大规模模型追求通用能力,轻量级模型专注特定场景,形成互补发展格局
+
+
+
+ 多模态融合
+
+ 文本、图像、语音、视频等多模态技术深度融合,提升AI系统的感知和理解能力
+
+
+
+ 边缘AI兴起
+
+ 边缘计算与AI结合,实现低延迟、高隐私的本地化智能处理
+
+
+
+
+
+
+
+
+
+
+
+ 未来展望
+
+
+
+ 🚀
+
+ 技术突破
+
+ 算法、算力、数据三重驱动,AI技术将迎来新的突破周期
+
+
+
+
+ 🌐
+
+ 生态繁荣
+
+ 开源社区、产业联盟、标准组织共同推动AI生态繁荣发展
+
+
+
+
+ 💡
+
+ 应用普及
+
+ AI将深度融入各行各业,成为推动社会进步的重要力量
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/research/ai_companys/company.html b/research/ai_companys/company.html
new file mode 100644
index 0000000..2515b67
--- /dev/null
+++ b/research/ai_companys/company.html
@@ -0,0 +1,907 @@
+
+
+
+
+
+ 公司详情分析 - AI产业链护城河深度分析
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 公司概览
+
+
+ 寒武纪作为中国AI芯片领域的领军企业,其护城河主要建立在深厚的技术积累、前瞻性的市场布局以及日益完善的生态系统之上。公司专注于人工智能芯片产品的研发与技术创新,致力于打造人工智能领域的核心处理器芯片。
+
+
+ 在技术层面,寒武纪的核心竞争力源于其自主研发的Cambricon指令集和创新的存算一体架构。这一指令集是专为人工智能计算设计的,能够高效地处理复杂的神经网络算法,从而在AI推理任务中实现卓越的性能和能效比。
+
+
+ 在市场表现方面,寒武纪凭借其技术优势,迅速在国内云端AI芯片市场占据了一席之地。根据2025年上半年的数据显示,寒武纪的AI芯片营收实现了65%的同比增长,市场份额达到了约15%,在国内厂商中仅次于华为昇腾,稳居第二。
+
+
+
+
+
+
+
+
+ 关键数据
+
+
+ 成立时间
+ 2016年
+
+
+ 员工规模
+ 800+人
+
+
+ 研发投入
+ 85%+
+
+
+ 上市时间
+ 2020年
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 护城河深度分析
+
+
+
+
+
+ SWOT分析
+
+
+ 优势 (Strengths)
+
+ - • 自主研发的Cambricon指令集
+ - • 存算一体架构创新
+ - • 强大的研发团队(硕博80%+)
+ - • 丰富的专利组合(2700+项)
+ - • 国产替代政策支持
+
+
+
+
+ 劣势 (Weaknesses)
+
+ - • 规模相对较小
+ - • 生态系统建设初期
+ - • 客户集中度较高
+ - • 盈利能力待提升
+ - • 国际竞争力有限
+
+
+
+
+ 机会 (Opportunities)
+
+ - • 国产替代加速推进
+ - • AI应用场景快速扩展
+ - • 政策支持力度加大
+ - • 边缘计算市场兴起
+ - • 车规级芯片需求增长
+
+
+
+
+ 威胁 (Threats)
+
+ - • 英伟达等巨头技术领先
+ - • 华为等国内厂商竞争
+ - • 技术迭代速度加快
+ - • 地缘政治风险
+ - • 供应链安全挑战
+
+
+
+
+
+
+
+
+
+
+ 财务数据分析
+
+
+
+
+
+
+ 盈利能力
+
+
+ 毛利率
+ 65.2%
+
+
+ 净利率
+ -15.3%
+
+
+ ROE
+ -8.7%
+
+
+
+
+
+ 运营效率
+
+
+ 总资产周转率
+ 0.32
+
+
+ 存货周转天数
+ 156天
+
+
+ 应收账款周转
+ 89天
+
+
+
+
+
+ 成长能力
+
+
+ 营收增长率
+ +65%
+
+
+ 净利润增长
+ -23%
+
+
+ 研发投入比
+ 85%
+
+
+
+
+
+
+
+
+
+
+
+ 未来展望
+
+
+ 发展战略
+
+ -
+ •
+ 持续推进存算一体架构技术迭代
+
+ -
+ •
+ 扩大边缘AI和车载AI市场布局
+
+ -
+ •
+ 加强生态系统建设和开发者支持
+
+ -
+ •
+ 探索新的商业模式和合作机会
+
+
+
+
+ 投资建议
+
+
+
+ 长期投资
+ 推荐
+
+
+ 技术壁垒深厚,受益于国产替代趋势,长期发展前景良好
+
+
+
+
+ 风险提示
+ 谨慎
+
+
+ 短期内仍面临盈利压力,需关注技术迭代和市场竞争
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/research/ai_companys/dashboard.html b/research/ai_companys/dashboard.html
new file mode 100644
index 0000000..345b94a
--- /dev/null
+++ b/research/ai_companys/dashboard.html
@@ -0,0 +1,1049 @@
+
+
+
+
+
+ 数据看板 - AI产业链护城河深度分析
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 数据看板
+ 实时监控
+
+
+ 交互式数据探索,深度洞察AI产业链动态变化
+
+
+
+
+
+
+
+ 关键指标监控
+
+
+
+
+
+ 时间范围:
+
+
+
+ 产业链层级:
+
+
+
+ 指标类型:
+
+
+
+
+
+
+
+
+
+ 8,500
+ AI产业总规模(亿元)
+ +23.5% 环比
+
+
+
+ 156
+ 上市公司数量
+ +12 新增
+
+
+
+ 8.2
+ 平均护城河评分
+ +0.3 提升
+
+
+
+ 1,250
+ 月度投资额(亿元)
+ -8.2% 环比
+
+
+
+ 45,680
+ 累计专利数量
+ +1,245 新增
+
+
+
+ 2,850,000
+ 从业人员数量
+ +15.6% 同比
+
+
+
+
+
+
+
+
+
+
+
+ 对比分析工具
+
+
+
+
+
+ 选择公司:
+
+
+
+ vs
+
+
+
+
+
+
+
+
+
+
+
+ 详细对比数据
+
+
+
+
+ | 指标 |
+ 寒武纪 |
+ 华为昇腾 |
+ 差异分析 |
+
+
+
+
+ | 护城河评分 |
+ 9.2/10 |
+ 9.5/10 |
+ 华为略胜一筹 |
+
+
+ | 市场份额 |
+ 15% |
+ 25% |
+ 华为领先10% |
+
+
+ | 技术壁垒 |
+ 9.2/10 |
+ 9.5/10 |
+ 两者都很强 |
+
+
+ | 专利数量 |
+ 2700+ |
+ 5000+ |
+ 华为专利更多 |
+
+
+ | 营收规模 |
+ 2.3亿 |
+ 8.5亿 |
+ 华为规模更大 |
+
+
+ | 同比增长 |
+ +65% |
+ +45% |
+ 寒武纪增长更快 |
+
+
+
+
+
+
+
+
+
+
+
+ 市场情报
+
+
+
+
+ 热点追踪
+
+
+ 大模型竞赛
+
+ 各大厂商加速大模型研发,算力需求激增,AI芯片供不应求
+
+ 热度指数: 🔥🔥🔥🔥🔥
+
+
+ 国产替代
+
+ 政策支持力度加大,国产AI芯片迎来发展黄金期
+
+ 热度指数: 🔥🔥🔥🔥
+
+
+ 边缘AI
+
+ 边缘计算与AI结合,低延迟、高隐私的本地化智能处理兴起
+
+ 热度指数: 🔥🔥🔥
+
+
+
+
+
+
+ 投资趋势
+
+
+
+ 本月投资总额
+ 1,250亿元
+
+
+ 投资案例数
+ 342起
+
+
+ 平均投资额
+ 3.65亿元
+
+
+
+
+
+
+ 政策动态
+
+
+ AI产业发展规划
+
+ 国家发布新一轮AI产业发展规划,目标到2027年产业规模突破万亿
+
+ 2025-10-15
+
+
+ 芯片产业支持政策
+
+ 出台税收优惠政策,支持AI芯片研发和产业化
+
+ 2025-10-10
+
+
+ 数据安全法规
+
+ 完善AI数据安全法规,推动产业健康发展
+
+ 2025-10-05
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/research/ai_companys/design.md b/research/ai_companys/design.md
new file mode 100644
index 0000000..fbbee14
--- /dev/null
+++ b/research/ai_companys/design.md
@@ -0,0 +1,166 @@
+# AI产业链分析平台 - 设计风格
+
+## 设计理念
+
+### 核心概念
+**"数字时代的商业智慧"** - 将复杂的AI产业链分析转化为直观、专业的数字体验
+
+### 设计原则
+1. **专业权威**: 体现深度分析的专业性和可信度
+2. **科技前沿**: 展现AI产业的创新性和未来感
+3. **数据驱动**: 突出数据可视化的重要性
+4. **简洁优雅**: 避免过度设计,保持内容聚焦
+
+## 视觉语言
+
+### 色彩系统
+**主色调**: 深蓝灰 (#1a1d29) - 专业、稳重、科技感
+**辅助色**:
+- 青蓝色 (#2563eb) - 科技、创新
+- 深青色 (#0891b2) - 数据、智能
+- 暖灰色 (#6b7280) - 中性、平衡
+
+**功能色彩**:
+- 成功绿 (#059669) - 正向数据
+- 警告橙 (#d97706) - 中性数据
+- 错误红 (#dc2626) - 负向数据
+
+**背景色**: 渐变从深蓝到黑色,营造深度感
+
+### 字体系统
+**标题字体**: Noto Sans SC (粗体)
+- 现代、简洁、具有科技感
+- 用于主标题、导航、按钮
+
+**正文字体**: Noto Serif SC (常规)
+- 优雅、易读、专业感
+- 用于正文内容、数据标签
+
+**数据字体**: JetBrains Mono
+- 等宽字体,用于代码和数据展示
+
+### 布局系统
+**网格系统**: 12列响应式网格
+**间距系统**: 基于8px的间距单位
+**圆角**: 8px统一圆角,体现现代感
+**阴影**: 微妙的投影,增加层次感
+
+## 视觉效果
+
+### 背景效果
+**主背景**: 使用shader-park创建的动态粒子场
+- 深蓝色基调
+- 缓慢移动的粒子
+- 微妙的连接线条
+- 响应鼠标移动的交互
+
+### 数据可视化风格
+**图表配色**: 使用低饱和度的蓝色系渐变
+**动画效果**:
+- 数据加载动画
+- 悬停高亮效果
+- 平滑的过渡动画
+
+### 交互效果
+**悬停效果**:
+- 卡片轻微上浮 (translateY: -4px)
+- 阴影加深
+- 颜色微妙变化
+
+**点击效果**:
+- 微妙的缩放动画
+- 涟漪效果
+- 状态变化反馈
+
+### 滚动动画
+**触发机制**: 元素进入视口上半部分时触发
+**动画效果**:
+- 淡入效果 (opacity: 0 → 1)
+- 上移效果 (translateY: 20px → 0)
+- 交错延迟 (stagger: 100ms)
+
+## 组件设计
+
+### 公司卡片
+**设计特点**:
+- 圆角矩形设计
+- 微妙的边框和阴影
+- 公司logo和关键信息
+- 护城河评分可视化
+
+**交互状态**:
+- 默认: 轻微阴影
+- 悬停: 上浮 + 阴影加深
+- 选中: 边框高亮
+
+### 数据图表
+**设计原则**:
+- 简洁的配色方案
+- 清晰的标签和图例
+- 响应式设计
+- 交互式提示框
+
+### 导航组件
+**设计风格**:
+- 顶部固定导航栏
+- 半透明背景
+- 清晰的层级结构
+- 当前页面高亮
+
+## 响应式设计
+
+### 断点设置
+- 移动端: 320px - 767px
+- 平板端: 768px - 1199px
+- 桌面端: 1200px+
+
+### 适配策略
+**移动端**:
+- 单列布局
+- 大尺寸触摸目标
+- 简化的导航
+
+**平板端**:
+- 两列布局
+- 可折叠侧边栏
+- 触摸优化
+
+**桌面端**:
+- 多列布局
+- 丰富的悬停效果
+- 完整的交互功能
+
+## 品牌元素
+
+### Logo设计概念
+**设计思路**: 抽象的神经网络节点连接图案
+**颜色**: 青蓝色渐变
+**寓意**: AI产业的连接性和智能化
+
+### 图标系统
+**风格**: 线性图标
+**粗细**: 2px统一粗细
+**颜色**: 继承文本颜色
+**大小**: 16px, 20px, 24px标准尺寸
+
+### 插图风格
+**风格**: 扁平化几何插图
+**配色**: 品牌色彩系统
+**主题**: AI、数据、科技元素
+
+## 可访问性设计
+
+### 颜色对比度
+- 所有文本与背景对比度 ≥ 4.5:1
+- 大文本对比度 ≥ 3:1
+- 使用工具验证对比度
+
+### 交互反馈
+- 清晰的焦点指示器
+- 足够的点击目标大小 (44px+)
+- 明确的加载状态
+
+### 内容结构
+- 语义化HTML结构
+- 清晰的标题层级
+- 有意义的链接文本
\ No newline at end of file
diff --git a/research/ai_companys/index.html b/research/ai_companys/index.html
new file mode 100644
index 0000000..32b6571
--- /dev/null
+++ b/research/ai_companys/index.html
@@ -0,0 +1,665 @@
+
+
+
+
+
+ AI产业链上市公司护城河深度分析
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AI产业链
+ 护城河深度分析
+
+
+ 深入解析中国AI上市公司的技术壁垒、市场地位与竞争优势
+
+
+
+
+
+
+
+
+
+
+
+
+ 产业链全景
+
+ AI产业链分为上、中、下游三个层次,每个层次都有其独特的技术壁垒和市场特征
+
+
+
+
+
+
+
+
+ 🔬
+
+ 上游:基础层
+ AI芯片、算力、数据、算法
+
+
+
+
+
+
+
+
+ ⚙️
+
+ 中游:技术层
+ AI开发框架、模型、平台
+
+
+
+
+
+
+
+
+ 🚀
+
+ 下游:应用层
+ 行业解决方案、产品服务
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 公司矩阵
+
+ 深度分析AI产业链各环节的核心企业及其护城河优势
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 寒
+
+ 寒武纪
+ 国产AI芯片技术先锋
+
+
+ 技术壁垒
+ 9.2/10
+
+
+ 市场份额
+ 15%
+
+
+ 专利数量
+ 2700+
+
+
+
+ 核心竞争力:Cambricon指令集、存算一体架构
+
+
+
+
+ 华
+
+ 华为昇腾
+ 自主可控AI算力基石
+
+
+ 技术壁垒
+ 9.5/10
+
+
+ 生态完整性
+ 9.8/10
+
+
+ 市场地位
+ 领导者
+
+
+
+ 核心竞争力:达芬奇架构、MindSpore框架
+
+
+
+
+ 英
+
+ 英伟达
+ 全球AI芯片领导者
+
+
+ 技术壁垒
+ 9.9/10
+
+
+ 市场份额
+ 90%+
+
+
+ 生态规模
+ 400万+
+
+
+
+ 核心竞争力:CUDA生态系统、GPU性能
+
+
+
+
+ 科
+
+ 科大讯飞
+ 垂直行业数据壁垒
+
+
+ 数据壁垒
+ 9.3/10
+
+
+ 技术领先性
+ 9.1/10
+
+
+ 应用场景
+ 教育/医疗
+
+
+
+ 核心竞争力:垂直行业数据、语音识别技术
+
+
+
+
+
+ 百
+
+ 百度飞桨
+ 深度学习框架生态
+
+
+ 开发者数量
+ 2333万
+
+
+ 生态成熟度
+ 9.0/10
+
+
+ 硬件适配
+ 40+芯片
+
+
+
+ 核心竞争力:庞大开发者生态、本土化优势
+
+
+
+
+ 华
+
+ 华为MindSpore
+ 自主可控AI框架
+
+
+ 自主可控
+ 9.8/10
+
+
+ 全场景支持
+ 9.5/10
+
+
+ 硬件协同
+ 昇腾优化
+
+
+
+ 核心竞争力:软硬件一体化、自主可控
+
+
+
+
+
+ 海
+
+ 海康威视
+ 智能安防领导者
+
+
+ 市场份额
+ 全球第一
+
+
+ 技术融合
+ AI+IoT
+
+
+ 准确率
+ 99%+
+
+
+
+ 核心竞争力:物联感知+AI深度融合
+
+
+
+
+ 大
+
+ 大华股份
+ 智慧物联解决方案
+
+
+ 市场地位
+ 全球第二
+
+
+ 国内份额
+ 12%+
+
+
+ 转型进度
+ AIoT
+
+
+
+ 核心竞争力:全面产品线、规模效应
+
+
+
+
+
+
+
+
+
+
+ 深度分析
+
+ 基于多维度数据分析,洞察AI产业竞争格局与发展趋势
+
+
+
+
+
+
+
+ 核心洞察
+
+
+ 护城河特征
+
+ -
+ •
+ 技术壁垒:核心技术专利和持续创新能力
+
+ -
+ •
+ 数据壁垒:垂直行业高质量数据积累
+
+ -
+ •
+ 生态壁垒:开发者社区和合作伙伴网络
+
+ -
+ •
+ 规模壁垒:市场份额和成本优势
+
+
+
+
+ 发展趋势
+
+ -
+ •
+ 国产替代:自主可控成为关键驱动力
+
+ -
+ •
+ 软硬一体:软硬件协同优化趋势明显
+
+ -
+ •
+ 垂直深耕:行业应用深度决定价值
+
+ -
+ •
+ 生态竞争:平台化服务能力成为关键
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/research/ai_companys/interaction.md b/research/ai_companys/interaction.md
new file mode 100644
index 0000000..cf0872d
--- /dev/null
+++ b/research/ai_companys/interaction.md
@@ -0,0 +1,127 @@
+# AI产业链分析平台 - 交互设计
+
+## 核心交互功能
+
+### 1. 智能筛选系统
+**功能描述**: 用户可以通过多个维度筛选AI公司
+**交互方式**:
+- 产业链层级筛选 (上游/中游/下游)
+- 技术领域筛选 (芯片/算法/数据/应用)
+- 市值规模筛选 (大型/中型/初创)
+- 地理位置筛选 (北京/上海/深圳等)
+
+**交互流程**:
+1. 用户点击筛选器按钮
+2. 展开多选下拉菜单
+3. 选择筛选条件
+4. 实时更新公司网格显示
+5. 显示筛选结果数量
+
+### 2. 公司对比工具
+**功能描述**: 用户可以选择多家公司进行深度对比
+**交互方式**:
+- 在公司卡片上点击"添加对比"
+- 最多选择4家公司进行对比
+- 打开对比面板显示关键指标
+
+**对比维度**:
+- 市值和财务数据
+- 技术专利数量
+- 市场份额
+- 护城河深度评分
+- 产品线对比
+
+### 3. 交互式数据可视化
+**功能描述**: 丰富的图表支持用户交互探索
+**图表类型**:
+- **产业链地图**: 点击节点查看公司详情
+- **市场份额饼图**: 悬停显示具体数值
+- **技术壁垒雷达图**: 多维度对比
+- **发展趋势折线图**: 时间轴交互
+- **地理分布热力图**: 区域集中度分析
+
+**交互行为**:
+- 悬停显示详细数据
+- 点击钻取到具体数据
+- 拖拽时间轴查看历史数据
+- 缩放和平移地图视图
+
+### 4. 深度分析导航
+**功能描述**: 引导用户深入了解护城河分析
+**导航结构**:
+- 技术壁垒分析
+- 数据资源分析
+- 生态系统分析
+- 市场表现分析
+- 未来趋势预测
+
+**交互方式**:
+- 侧边栏导航菜单
+- 面包屑导航
+- 相关推荐链接
+- 返回顶部按钮
+
+## 用户体验流程
+
+### 首次访问流程
+1. **Landing**: 用户进入主页,看到震撼的hero区域
+2. **概览**: 快速了解AI产业链全景
+3. **探索**: 通过筛选器找到感兴趣的公司
+4. **深入**: 点击公司卡片查看详细分析
+5. **对比**: 使用对比工具进行多公司分析
+
+### 深度分析流程
+1. **选择关注点**: 用户选择特定的产业链环节
+2. **查看分析**: 阅读深度的护城河分析
+3. **数据验证**: 通过图表验证分析结论
+4. **扩展探索**: 查看相关公司和技术
+5. **形成洞察**: 获得完整的市场认知
+
+## 响应式设计考虑
+
+### 桌面端 (1200px+)
+- 三栏布局: 侧边栏 + 主内容 + 信息面板
+- 大尺寸图表和详细数据表格
+- 鼠标悬停效果和右键菜单
+
+### 平板端 (768px-1199px)
+- 两栏布局: 可折叠侧边栏 + 主内容
+- 触摸友好的图表交互
+- 简化的对比功能
+
+### 移动端 (320px-767px)
+- 单栏布局: 全屏内容展示
+- 底部导航栏
+- 手势操作支持
+- 简化的筛选和对比功能
+
+## 可访问性设计
+
+### 键盘导航
+- Tab键顺序优化
+- 快捷键支持 (Ctrl+K 快速搜索)
+- 焦点指示器清晰可见
+
+### 屏幕阅读器支持
+- 语义化HTML结构
+- ARIA标签和角色定义
+- 图表的文字描述替代
+
+### 视觉设计
+- 高对比度颜色方案
+- 可调节的字体大小
+- 色盲友好的配色
+
+## 性能优化
+
+### 加载策略
+- 关键内容优先加载
+- 图片懒加载
+- 图表按需渲染
+- 预加载关键资源
+
+### 交互优化
+- 防抖和节流处理
+- 虚拟滚动长列表
+- 缓存筛选结果
+- 渐进式数据加载
\ No newline at end of file
diff --git a/research/ai_companys/main.js b/research/ai_companys/main.js
new file mode 100644
index 0000000..60fbe1c
--- /dev/null
+++ b/research/ai_companys/main.js
@@ -0,0 +1,637 @@
+// AI产业链分析平台 - 主要JavaScript文件
+
+// 全局变量
+let currentFilter = 'all';
+let marketChart, techBarrierChart, marketShareChart;
+
+// 公司数据
+const companiesData = {
+ cambricon: {
+ name: '寒武纪',
+ category: 'upstream',
+ moatScore: 9.2,
+ marketShare: 15,
+ patents: 2700,
+ revenue: 2.3,
+ growth: 65
+ },
+ huawei: {
+ name: '华为昇腾',
+ category: 'upstream',
+ moatScore: 9.5,
+ marketShare: 25,
+ patents: 5000,
+ revenue: 8.5,
+ growth: 45
+ },
+ nvidia: {
+ name: '英伟达',
+ category: 'upstream',
+ moatScore: 9.9,
+ marketShare: 90,
+ patents: 8000,
+ revenue: 60.9,
+ growth: 122
+ },
+ iflytek: {
+ name: '科大讯飞',
+ category: 'upstream',
+ moatScore: 9.1,
+ marketShare: 18,
+ patents: 3200,
+ revenue: 18.3,
+ growth: 25
+ },
+ baidu: {
+ name: '百度飞桨',
+ category: 'midstream',
+ moatScore: 9.0,
+ marketShare: 35,
+ developers: 2333,
+ models: 110,
+ growth: 40
+ },
+ hikvision: {
+ name: '海康威视',
+ category: 'downstream',
+ moatScore: 8.8,
+ marketShare: 28,
+ revenue: 81.2,
+ accuracy: 99,
+ growth: 12
+ }
+};
+
+// DOM加载完成后初始化
+document.addEventListener('DOMContentLoaded', function() {
+ initializeAnimations();
+ initializeCharts();
+ initializeFilters();
+ initializeScrollEffects();
+});
+
+// 初始化滚动动画
+function initializeAnimations() {
+ // 页面加载动画
+ anime({
+ targets: '.fade-in',
+ opacity: [0, 1],
+ translateY: [30, 0],
+ delay: anime.stagger(200),
+ duration: 800,
+ easing: 'easeOutQuart'
+ });
+
+ // 公司卡片动画
+ anime({
+ targets: '.company-card',
+ scale: [0.9, 1],
+ opacity: [0, 1],
+ delay: anime.stagger(100, {start: 500}),
+ duration: 600,
+ easing: 'easeOutBack'
+ });
+}
+
+// 初始化图表
+function initializeCharts() {
+ // 市场规模分析图表
+ const marketChartDom = document.getElementById('marketChart');
+ marketChart = echarts.init(marketChartDom);
+
+ const marketOption = {
+ backgroundColor: 'transparent',
+ title: {
+ text: 'AI产业市场规模趋势',
+ textStyle: { color: '#ffffff', fontSize: 18 },
+ left: 'center'
+ },
+ tooltip: {
+ trigger: 'axis',
+ backgroundColor: 'rgba(30, 41, 59, 0.9)',
+ borderColor: 'rgba(148, 163, 184, 0.2)',
+ textStyle: { color: '#ffffff' }
+ },
+ legend: {
+ data: ['中国AI市场', '全球AI市场', 'AI芯片市场'],
+ textStyle: { color: '#cbd5e1' },
+ bottom: 10
+ },
+ grid: {
+ left: '3%',
+ right: '4%',
+ bottom: '15%',
+ containLabel: true
+ },
+ xAxis: {
+ type: 'category',
+ boundaryGap: false,
+ data: ['2020', '2021', '2022', '2023', '2024', '2025'],
+ axisLine: { lineStyle: { color: '#475569' } },
+ axisLabel: { color: '#94a3b8' }
+ },
+ yAxis: {
+ type: 'value',
+ axisLine: { lineStyle: { color: '#475569' } },
+ axisLabel: { color: '#94a3b8' },
+ splitLine: { lineStyle: { color: 'rgba(71, 85, 105, 0.3)' } }
+ },
+ series: [
+ {
+ name: '中国AI市场',
+ type: 'line',
+ smooth: true,
+ data: [150, 220, 320, 450, 620, 850],
+ lineStyle: { color: '#2563eb', width: 3 },
+ areaStyle: {
+ color: {
+ type: 'linear',
+ x: 0, y: 0, x2: 0, y2: 1,
+ colorStops: [
+ { offset: 0, color: 'rgba(37, 99, 235, 0.3)' },
+ { offset: 1, color: 'rgba(37, 99, 235, 0.05)' }
+ ]
+ }
+ }
+ },
+ {
+ name: '全球AI市场',
+ type: 'line',
+ smooth: true,
+ data: [1200, 1650, 2200, 2900, 3800, 4900],
+ lineStyle: { color: '#0891b2', width: 3 },
+ areaStyle: {
+ color: {
+ type: 'linear',
+ x: 0, y: 0, x2: 0, y2: 1,
+ colorStops: [
+ { offset: 0, color: 'rgba(8, 145, 178, 0.3)' },
+ { offset: 1, color: 'rgba(8, 145, 178, 0.05)' }
+ ]
+ }
+ }
+ },
+ {
+ name: 'AI芯片市场',
+ type: 'line',
+ smooth: true,
+ data: [180, 280, 420, 650, 950, 1400],
+ lineStyle: { color: '#059669', width: 3 },
+ areaStyle: {
+ color: {
+ type: 'linear',
+ x: 0, y: 0, x2: 0, y2: 1,
+ colorStops: [
+ { offset: 0, color: 'rgba(5, 150, 105, 0.3)' },
+ { offset: 1, color: 'rgba(5, 150, 105, 0.05)' }
+ ]
+ }
+ }
+ }
+ ]
+ };
+
+ marketChart.setOption(marketOption);
+
+ // 技术壁垒分析图表
+ const techChartDom = document.getElementById('techBarrierChart');
+ techBarrierChart = echarts.init(techChartDom);
+
+ const techOption = {
+ backgroundColor: 'transparent',
+ title: {
+ text: '各公司技术壁垒评分',
+ textStyle: { color: '#ffffff', fontSize: 16 },
+ left: 'center'
+ },
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: { type: 'shadow' },
+ backgroundColor: 'rgba(30, 41, 59, 0.9)',
+ borderColor: 'rgba(148, 163, 184, 0.2)',
+ textStyle: { color: '#ffffff' }
+ },
+ grid: {
+ left: '3%',
+ right: '4%',
+ bottom: '3%',
+ containLabel: true
+ },
+ xAxis: {
+ type: 'category',
+ data: ['寒武纪', '华为昇腾', '英伟达', '科大讯飞', '百度飞桨', '海康威视'],
+ axisLine: { lineStyle: { color: '#475569' } },
+ axisLabel: { color: '#94a3b8', rotate: 45 }
+ },
+ yAxis: {
+ type: 'value',
+ max: 10,
+ axisLine: { lineStyle: { color: '#475569' } },
+ axisLabel: { color: '#94a3b8' },
+ splitLine: { lineStyle: { color: 'rgba(71, 85, 105, 0.3)' } }
+ },
+ series: [{
+ type: 'bar',
+ data: [9.2, 9.5, 9.9, 9.1, 9.0, 8.8],
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0, y: 0, x2: 0, y2: 1,
+ colorStops: [
+ { offset: 0, color: '#2563eb' },
+ { offset: 1, color: '#0891b2' }
+ ]
+ },
+ borderRadius: [4, 4, 0, 0]
+ },
+ emphasis: {
+ itemStyle: { color: '#059669' }
+ }
+ }]
+ };
+
+ techBarrierChart.setOption(techOption);
+
+ // 市场份额分析图表
+ const shareChartDom = document.getElementById('marketShareChart');
+ marketShareChart = echarts.init(shareChartDom);
+
+ const shareOption = {
+ backgroundColor: 'transparent',
+ title: {
+ text: 'AI芯片市场份额',
+ textStyle: { color: '#ffffff', fontSize: 16 },
+ left: 'center'
+ },
+ tooltip: {
+ trigger: 'item',
+ backgroundColor: 'rgba(30, 41, 59, 0.9)',
+ borderColor: 'rgba(148, 163, 184, 0.2)',
+ textStyle: { color: '#ffffff' }
+ },
+ legend: {
+ orient: 'horizontal',
+ bottom: '0%',
+ textStyle: { color: '#94a3b8' }
+ },
+ series: [{
+ type: 'pie',
+ radius: ['40%', '70%'],
+ center: ['50%', '45%'],
+ avoidLabelOverlap: false,
+ label: {
+ show: false,
+ position: 'center'
+ },
+ emphasis: {
+ label: {
+ show: true,
+ fontSize: '18',
+ fontWeight: 'bold',
+ color: '#ffffff'
+ }
+ },
+ labelLine: { show: false },
+ data: [
+ { value: 90, name: '英伟达', itemStyle: { color: '#2563eb' } },
+ { value: 25, name: '华为昇腾', itemStyle: { color: '#0891b2' } },
+ { value: 15, name: '寒武纪', itemStyle: { color: '#059669' } },
+ { value: 8, name: '其他', itemStyle: { color: '#6b7280' } }
+ ]
+ }]
+ };
+
+ marketShareChart.setOption(shareOption);
+
+ // 响应式处理
+ window.addEventListener('resize', function() {
+ marketChart.resize();
+ techBarrierChart.resize();
+ marketShareChart.resize();
+ });
+}
+
+// 初始化筛选功能
+function initializeFilters() {
+ const filterButtons = document.querySelectorAll('.filter-btn');
+ const companyCards = document.querySelectorAll('.company-card');
+
+ filterButtons.forEach(button => {
+ button.addEventListener('click', function() {
+ // 更新按钮状态
+ filterButtons.forEach(btn => btn.classList.remove('active'));
+ this.classList.add('active');
+
+ const filter = this.getAttribute('data-filter');
+ currentFilter = filter;
+
+ // 筛选公司卡片
+ companyCards.forEach(card => {
+ const categories = card.getAttribute('data-category');
+
+ if (filter === 'all' || categories.includes(filter)) {
+ card.style.display = 'block';
+ anime({
+ targets: card,
+ opacity: [0, 1],
+ scale: [0.8, 1],
+ duration: 400,
+ easing: 'easeOutBack'
+ });
+ } else {
+ anime({
+ targets: card,
+ opacity: [1, 0],
+ scale: [1, 0.8],
+ duration: 300,
+ easing: 'easeInBack',
+ complete: function() {
+ card.style.display = 'none';
+ }
+ });
+ }
+ });
+ });
+ });
+
+ // 公司卡片点击事件
+ companyCards.forEach(card => {
+ card.addEventListener('click', function() {
+ const companyId = this.getAttribute('data-company');
+ if (companyId) {
+ showCompanyDetails(companyId);
+ }
+ });
+ });
+}
+
+// 显示公司详情
+function showCompanyDetails(companyId) {
+ const company = companiesData[companyId];
+ if (!company) return;
+
+ // 创建模态框显示公司详情
+ const modal = document.createElement('div');
+ modal.className = 'fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50';
+ modal.innerHTML = `
+
+
+ ${company.name} - 详细分析
+
+
+
+
+ 基本指标
+
+
+ 护城河评分:
+ ${company.moatScore}/10
+
+
+ 市场份额:
+ ${company.marketShare}%
+
+ ${company.patents ? ` 专利数量:${company.patents}+ ` : ''}
+ ${company.developers ? ` 开发者数:${company.developers}万 ` : ''}
+
+
+
+ 财务表现
+
+ ${company.revenue ? ` 营收规模:${company.revenue}亿元 ` : ''}
+ ${company.growth ? ` 同比增长:+${company.growth}% ` : ''}
+
+
+
+
+
+
+
+ `;
+
+ document.body.appendChild(modal);
+
+ // 添加动画
+ anime({
+ targets: modal.querySelector('div'),
+ scale: [0.8, 1],
+ opacity: [0, 1],
+ duration: 300,
+ easing: 'easeOutBack'
+ });
+}
+
+// 初始化滚动效果
+function initializeScrollEffects() {
+ const observerOptions = {
+ threshold: 0.1,
+ rootMargin: '0px 0px -50px 0px'
+ };
+
+ const observer = new IntersectionObserver(function(entries) {
+ entries.forEach(entry => {
+ if (entry.isIntersecting) {
+ entry.target.classList.add('visible');
+
+ // 为图表添加动画
+ if (entry.target.querySelector('.chart-container')) {
+ animateChart(entry.target);
+ }
+ }
+ });
+ }, observerOptions);
+
+ // 观察所有需要动画的元素
+ document.querySelectorAll('.fade-in').forEach(el => {
+ observer.observe(el);
+ });
+}
+
+// 图表动画
+function animateChart(container) {
+ const chartContainer = container.querySelector('.chart-container');
+ if (!chartContainer) return;
+
+ const chartId = chartContainer.id;
+
+ // 根据图表类型添加不同的动画
+ switch(chartId) {
+ case 'marketChart':
+ animateMarketChart();
+ break;
+ case 'techBarrierChart':
+ animateTechBarrierChart();
+ break;
+ case 'marketShareChart':
+ animateMarketShareChart();
+ break;
+ }
+}
+
+// 市场规模图表动画
+function animateMarketChart() {
+ if (!marketChart) return;
+
+ const option = marketChart.getOption();
+ const newOption = { ...option };
+
+ // 重置数据为0
+ newOption.series.forEach(series => {
+ series.data = series.data.map(() => 0);
+ });
+
+ marketChart.setOption(newOption);
+
+ // 动画显示数据
+ setTimeout(() => {
+ marketChart.setOption(option);
+ }, 500);
+}
+
+// 技术壁垒图表动画
+function animateTechBarrierChart() {
+ if (!techBarrierChart) return;
+
+ const option = techBarrierChart.getOption();
+ const newOption = { ...option };
+
+ // 重置数据为0
+ newOption.series[0].data = newOption.series[0].data.map(() => 0);
+
+ techBarrierChart.setOption(newOption);
+
+ // 动画显示数据
+ setTimeout(() => {
+ techBarrierChart.setOption(option);
+ }, 500);
+}
+
+// 市场份额图表动画
+function animateMarketShareChart() {
+ if (!marketShareChart) return;
+
+ const option = marketShareChart.getOption();
+ const newOption = { ...option };
+
+ // 重置数据为0
+ newOption.series[0].data.forEach(item => {
+ item.value = 0;
+ });
+
+ marketShareChart.setOption(newOption);
+
+ // 动画显示数据
+ setTimeout(() => {
+ marketShareChart.setOption(option);
+ }, 500);
+}
+
+// 滚动到指定区域
+function scrollToSection(sectionId) {
+ const section = document.getElementById(sectionId);
+ if (section) {
+ section.scrollIntoView({
+ behavior: 'smooth',
+ block: 'start'
+ });
+ }
+}
+
+// 平滑滚动导航
+document.querySelectorAll('a[href^="#"]').forEach(anchor => {
+ anchor.addEventListener('click', function (e) {
+ e.preventDefault();
+ const targetId = this.getAttribute('href').substring(1);
+ scrollToSection(targetId);
+ });
+});
+
+// 导航栏滚动效果
+window.addEventListener('scroll', function() {
+ const nav = document.querySelector('nav');
+ if (window.scrollY > 100) {
+ nav.style.background = 'rgba(30, 41, 59, 0.95)';
+ } else {
+ nav.style.background = 'rgba(30, 41, 59, 0.8)';
+ }
+});
+
+// 添加鼠标移动视差效果
+document.addEventListener('mousemove', function(e) {
+ const mouseX = e.clientX / window.innerWidth;
+ const mouseY = e.clientY / window.innerHeight;
+
+ // 为hero背景添加微妙的视差效果
+ const heroBg = document.querySelector('.hero-bg');
+ if (heroBg) {
+ const moveX = (mouseX - 0.5) * 20;
+ const moveY = (mouseY - 0.5) * 20;
+ heroBg.style.transform = `translate(${moveX}px, ${moveY}px)`;
+ }
+});
+
+// 键盘快捷键支持
+document.addEventListener('keydown', function(e) {
+ // Ctrl/Cmd + K 快速搜索
+ if ((e.ctrlKey || e.metaKey) && e.key === 'k') {
+ e.preventDefault();
+ // 这里可以添加搜索功能
+ console.log('快速搜索功能');
+ }
+
+ // ESC 关闭模态框
+ if (e.key === 'Escape') {
+ const modal = document.querySelector('.fixed.inset-0');
+ if (modal) {
+ modal.remove();
+ }
+ }
+});
+
+// 性能优化:防抖和节流
+function debounce(func, wait) {
+ let timeout;
+ return function executedFunction(...args) {
+ const later = () => {
+ clearTimeout(timeout);
+ func(...args);
+ };
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ };
+}
+
+function throttle(func, limit) {
+ let inThrottle;
+ return function() {
+ const args = arguments;
+ const context = this;
+ if (!inThrottle) {
+ func.apply(context, args);
+ inThrottle = true;
+ setTimeout(() => inThrottle = false, limit);
+ }
+ }
+}
+
+// 使用防抖优化窗口大小改变事件
+const debouncedResize = debounce(function() {
+ if (marketChart) marketChart.resize();
+ if (techBarrierChart) techBarrierChart.resize();
+ if (marketShareChart) marketShareChart.resize();
+}, 250);
+
+window.addEventListener('resize', debouncedResize);
+
+// 使用节流优化滚动事件
+const throttledScroll = throttle(function() {
+ // 滚动相关的处理
+}, 16);
+
+window.addEventListener('scroll', throttledScroll);
\ No newline at end of file
diff --git a/research/ai_companys/outline.md b/research/ai_companys/outline.md
new file mode 100644
index 0000000..9c3bda6
--- /dev/null
+++ b/research/ai_companys/outline.md
@@ -0,0 +1,71 @@
+# AI产业链上市公司护城河深度分析 - 项目大纲
+
+## 项目概述
+创建一个专业的AI产业链分析网站,展示中国AI上市公司的护城河深度分析,包含丰富的数据可视化和交互元素。
+
+## 网站结构
+
+### 1. 主页面 (index.html)
+- **Hero区域**: 动态背景效果 + 主标题
+- **产业链概览**: 上游、中游、下游的可视化展示
+- **公司矩阵**: 交互式公司卡片网格
+- **关键数据**: 市场数据可视化图表
+- **分析洞察**: 护城河深度分析摘要
+
+### 2. 公司详情页 (company.html)
+- **公司概览**: 基本信息和核心业务
+- **护城河分析**: 深度技术分析
+- **市场表现**: 财务数据和市场份额
+- **竞争优势**: SWOT分析可视化
+- **未来发展**: 战略展望
+
+### 3. 产业链分析页 (analysis.html)
+- **产业链全景**: 三层结构详细分析
+- **技术壁垒**: 核心技术对比
+- **市场格局**: 竞争态势分析
+- **发展趋势**: 未来预测
+
+### 4. 数据看板页 (dashboard.html)
+- **实时数据**: 市场表现监控
+- **对比分析**: 多公司数据对比
+- **趋势预测**: 数据驱动的洞察
+- **交互图表**: 可筛选的数据可视化
+
+## 核心功能
+
+### 交互元素
+1. **公司筛选器**: 按产业链位置、市值、技术领域筛选
+2. **数据对比工具**: 多公司数据对比功能
+3. **交互式图表**: 可点击、悬停的数据可视化
+4. **搜索功能**: 公司和技术的快速搜索
+
+### 视觉效果
+1. **动态背景**: 使用shader-park创建科技感的背景
+2. **数据动画**: 使用ECharts实现数据动画效果
+3. **滚动动画**: 使用Anime.js创建滚动触发动画
+4. **悬停效果**: 卡片和按钮的3D悬停效果
+
+### 内容结构
+1. **上游**: AI芯片、算力、数据、算法
+2. **中游**: AI开发框架、模型、平台
+3. **下游**: 行业解决方案、产品服务
+
+## 技术栈
+- **前端框架**: 纯HTML/CSS/JavaScript
+- **样式**: Tailwind CSS
+- **动画**: Anime.js
+- **图表**: ECharts.js
+- **特效**: shader-park, p5.js
+- **字体**: Noto Sans SC (标题), Noto Serif SC (正文)
+
+## 设计原则
+- **专业权威**: 体现深度分析的专业性
+- **现代科技**: 展现AI产业的科技属性
+- **数据驱动**: 突出数据可视化的重要性
+- **交互友好**: 提供良好的用户体验
+
+## 内容重点
+- 深度分析各公司的技术护城河
+- 展示市场数据和竞争格局
+- 提供交互式的数据探索体验
+- 突出中国AI产业的发展特色
\ No newline at end of file
diff --git a/research/ai_companys/resources/hero-ai-chain.png b/research/ai_companys/resources/hero-ai-chain.png
new file mode 100644
index 0000000..7376b04
Binary files /dev/null and b/research/ai_companys/resources/hero-ai-chain.png differ
diff --git a/research/ai_companys/resources/neural-network-bg.png b/research/ai_companys/resources/neural-network-bg.png
new file mode 100644
index 0000000..2e1fb24
Binary files /dev/null and b/research/ai_companys/resources/neural-network-bg.png differ
diff --git a/research/ai_companys/resources/tech-office.png b/research/ai_companys/resources/tech-office.png
new file mode 100644
index 0000000..4502a65
Binary files /dev/null and b/research/ai_companys/resources/tech-office.png differ
diff --git a/research/ai_industry_report_kimi.pdf b/research/ai_industry_report_kimi.pdf
new file mode 100644
index 0000000..24ea5c8
Binary files /dev/null and b/research/ai_industry_report_kimi.pdf differ
diff --git a/research/ai_supply_chain_companys.pdf b/research/ai_supply_chain_companys.pdf
new file mode 100644
index 0000000..8916eb3
Binary files /dev/null and b/research/ai_supply_chain_companys.pdf differ
diff --git a/research/smee_0721.html b/research/smee_0721.html
index ff67625..607237c 100644
--- a/research/smee_0721.html
+++ b/research/smee_0721.html
@@ -4,8 +4,8 @@
天岳先进(688234.SH)深度研究报告
-
-
+
+
|