mc-react-phonon-visualizer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.eslintrc.cjs ADDED
@@ -0,0 +1,18 @@
1
+ module.exports = {
2
+ root: true,
3
+ env: { browser: true, es2020: true },
4
+ extends: [
5
+ "eslint:recommended",
6
+ "plugin:@typescript-eslint/recommended",
7
+ "plugin:react-hooks/recommended",
8
+ ],
9
+ ignorePatterns: ["dist", ".eslintrc.cjs"],
10
+ parser: "@typescript-eslint/parser",
11
+ plugins: ["react-refresh"],
12
+ rules: {
13
+ "react-refresh/only-export-components": [
14
+ "warn",
15
+ { allowConstantExport: true },
16
+ ],
17
+ },
18
+ };
@@ -0,0 +1,41 @@
1
+ name: Release and publish
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ release_and_publish:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - name: Checkout code
13
+ uses: actions/checkout@v2
14
+
15
+ - name: Set up Node.js
16
+ uses: actions/setup-node@v3
17
+ with:
18
+ node-version: "20"
19
+ registry-url: "https://registry.npmjs.org/"
20
+
21
+ - name: Install project dependencies
22
+ run: npm clean-install
23
+
24
+ - name: Build the dist folder
25
+ run: npm run build
26
+
27
+ - name: Create GitHub Release
28
+ id: create_release
29
+ uses: actions/create-release@v1
30
+ env:
31
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
32
+ with:
33
+ tag_name: ${{ github.ref }}
34
+ release_name: ${{ github.ref }}
35
+ draft: false
36
+ prerelease: false
37
+
38
+ - name: Publish to npm
39
+ run: npm publish
40
+ env:
41
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -0,0 +1,4 @@
1
+ /node_modules
2
+ /coverage
3
+ /dist
4
+ .vscode
@@ -0,0 +1,3 @@
1
+ {
2
+ "tabWidth": 2
3
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Materials Cloud
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # Phonon visualizer React component for the MaterialsCloud
2
+
3
+ The React component implemented in this repo mimics the features of the [phonon visualizer](https://henriquemiranda.github.io/phononwebsite/) developed by [Henrique Miranda](https://henriquemiranda.github.io/) and used in the MaterialsCloud.
4
+
5
+ ## Dependencies
6
+
7
+ - `sass`, `bootstrap`, and `bootstrap-icons` for styles
8
+ - `react-plotly.js` for the phonon bands view
9
+ - `WEAS` for the cell view
10
+
11
+ ## Testing
12
+
13
+ The app is self-tested via the `App` component against local test data (`/data/test.json`).
package/data/test.json ADDED
@@ -0,0 +1 @@
1
+ {"name": "C", "natoms": 2, "lattice": [[2.4659697484, 0.0, 0.0], [-1.2329848742, 2.1355924471, 0.0], [0.0, 0.0, 20.0000002075]], "atom_types": ["C", "C"], "atom_numbers": [6, 6], "formula": "C2", "qpoints": [[0.0, 0.0, 0.0], [0.025000040109747396, -2.9234232280520832e-05, 0.0], [0.05000008021949479, 2.8134214762521642e-05, 0.0], [0.07500012032924218, -1.100017517996468e-06, 0.0], [0.10000016043898959, -3.0334249798520025e-05, 0.0], [0.12500020054873698, 2.703419724453534e-05, 0.0], [0.15000024065848436, -2.200035035992936e-06, 0.0], [0.17500028076823176, -3.143426731651178e-05, 0.0], [0.20000032087797917, 2.5934179726542127e-05, 0.0], [0.22500036098772658, -3.300052554005014e-06, 0.0], [0.25000040109747396, -3.253428483449263e-05, 0.0], [0.2750004412072214, 2.4834162208520612e-05, 0.0], [0.3000004813169687, -4.400070071985872e-06, 0.0], [0.32500052142671615, -3.363430235251415e-05, 0.0], [0.35000056153646353, 2.3734144690520887e-05, 0.0], [0.37500060164621096, -5.500087589988516e-06, 0.0], [0.40000064175595834, -3.473431987049792e-05, 0.0], [0.4250006818657057, 2.263412717253711e-05, 0.0], [0.45000072197545316, -6.600105108010028e-06, 0.0], [0.4750007620852005, -3.5834337388475864e-05, 0.0], [0.5000008021949479, 2.153410965459691e-05, 0.0], [0.49170078887851176, 0.016642326590465772, 0.0], [0.4833007754016367, 0.03331311915149654, 0.0], [0.4750007620852005, 0.05002051431163134, 0.0], [0.46670074876876433, 0.0666413067924426, 0.0], [0.45830073529188925, 0.08331209935347329, 0.0], [0.45000072197545316, 0.10001949451360811, 0.0], [0.44170070865901695, 0.11664028699441938, 0.0], [0.43330069518214187, 0.1333110795554501, 0.0], [0.4250006818657057, 0.15001847471558488, 0.0], [0.4167006685492695, 0.16663926719639618, 0.0], [0.40830065507239444, 0.18331005975742692, 0.0], [0.40000064175595834, 0.20001745491756173, 0.0], [0.3917006284395222, 0.21663824739837298, 0.0], [0.38330061496264706, 0.23330903995940377, 0.0], [0.37500060164621096, 0.2500164351195385, 0.0], [0.36670058832977476, 0.26663722760034975, 0.0], [0.3583005748528997, 0.28330802016138046, 0.0], [0.35000056153646353, 0.3000154153215154, 0.0], [0.3417005482200274, 0.31663620780232654, 0.0], [0.33330053474315224, 0.33339360304268095, 0.0], [0.31670050811028, 0.31666544203460717, 0.0], [0.3000004813169687, 0.29998728110675277, 0.0], [0.28330045452365743, 0.28330912017889853, 0.0], [0.26670042789078524, 0.2666675618501483, 0.0], [0.25000040109747396, 0.249989400922294, 0.0], [0.2333003743041627, 0.2333112399944397, 0.0], [0.2167003476712904, 0.2166696816656895, 0.0], [0.20000032087797917, 0.1999915207378352, 0.0], [0.1833002940846679, 0.18331335980998095, 0.0], [0.16670026745179561, 0.16667180148123073, 0.0], [0.15000024065848436, 0.14999364055337638, 0.0], [0.13330021386517313, 0.13331547962552212, 0.0], [0.11670018723230083, 0.11667392129677187, 0.0], [0.10000016043898959, 0.0999957603689176, 0.0], [0.08330013364567831, 0.08331759944106332, 0.0], [0.06670010701280604, 0.0666760411123131, 0.0], [0.05000008021949479, 0.0499978801844588, 0.0], [0.03330005342618353, 0.033319719256604506, 0.0], [0.01670002679331126, 0.016678160927854287, 0.0], [0.0, 0.0, 0.0]], "repetitions": [5, 5, 1], "atom_pos_car": [[0.0, 1.423728298, 10.0000002075], [0.0, 0.0, 10.0]], "atom_pos_red": [[0.3333333333177248, 0.6666666666354496, 0.5000000051874999], [0.0, 0.0, 0.4999999948125]], "eigenvalues": [[-4.1e-05, -1.8e-05, 3.1e-05, 875.60123, 1553.82483, 1553.82483], [86.169062, 2.847772, 56.214599, 875.146006, 1557.835078, 1553.232767], [171.744909, 11.06583, 111.636316, 873.752479, 1568.346772, 1551.174928], [256.140711, 23.771194, 165.469624, 871.354705, 1581.632908, 1547.018357], [338.835923, 39.775518, 216.988535, 867.887465, 1593.643993, 1540.256514], [419.474551, 57.922801, 265.670271, 863.314905, 1601.695846, 1530.906418], [497.926338, 77.403281, 311.299743, 857.624012, 1605.065098, 1519.557236], [574.245673, 97.928349, 353.950777, 850.782975, 1604.436078, 1507.06702], [648.536342, 119.695473, 393.817223, 842.689694, 1600.809448, 1494.154202], [720.805202, 143.170986, 430.979016, 833.144056, 1594.660491, 1481.183634], [790.89899, 168.821022, 465.269033, 821.865172, 1585.80247, 1468.264436], [858.554284, 196.935518, 496.351215, 808.551462, 1573.832295, 1455.516171], [923.506733, 227.591543, 523.945619, 792.961354, 1558.64771, 1443.247458], [985.57353, 260.684791, 548.005653, 774.985752, 1540.587867, 1431.907088], [1044.664753, 295.926686, 568.695116, 754.693108, 1520.136786, 1421.884994], [1100.75034, 332.761045, 586.19553, 732.351294, 1497.493356, 1413.359363], [1153.839592, 370.217932, 600.535986, 708.465599, 1472.380589, 1406.315016], [1203.989197, 406.707607, 611.612131, 683.928503, 1444.23142, 1400.68956], [1251.286473, 439.617181, 619.358187, 660.484298, 1412.582584, 1396.506206], [1295.691133, 464.414169, 623.871226, 641.799339, 1377.437711, 1393.893435], [1331.600668, 474.137807, 625.343081, 634.192125, 1344.57868, 1393.000816], [1330.896219, 474.069308, 627.461728, 633.857691, 1344.106498, 1392.675608], [1328.798374, 473.865193, 633.74023, 632.874201, 1342.692542, 1391.770337], [1325.352006, 473.531828, 643.958819, 631.29719, 1340.347389, 1390.470574], [1320.62687, 473.086558, 657.788602, 629.206978, 1337.101696, 1389.003183], [1314.711316, 472.565683, 674.834167, 626.692748, 1333.027843, 1387.530625], [1307.705783, 472.031962, 694.67275, 623.834706, 1328.253423, 1386.054647], [1299.717794, 471.579152, 716.880515, 620.687805, 1322.943485, 1384.376297], [1290.860083, 471.331727, 741.042427, 617.270196, 1317.252792, 1382.129043], [1281.253027, 471.439047, 766.747817, 613.558601, 1311.27544, 1378.865239], [1271.032149, 472.064642, 793.577089, 609.491315, 1305.018614, 1374.164332], [1260.36103, 473.372539, 821.085486, 604.977919, 1298.40959, 1367.737629], [1249.450001, 475.513455, 848.787711, 599.913484, 1291.329788, 1359.51206], [1238.581434, 478.613712, 876.143395, 594.194271, 1283.662382, 1349.679926], [1228.143093, 482.769037, 902.539519, 587.731922, 1275.338009, 1338.706073], [1218.670313, 488.043875, 927.264288, 580.463769, 1266.3639, 1327.290433], [1210.890853, 494.475256, 949.473243, 572.357856, 1256.825069, 1316.29184], [1205.743061, 502.078843, 968.172579, 563.412486, 1246.855519, 1306.623658], [1204.292965, 510.854322, 982.291997, 553.651111, 1236.594857, 1299.128907], [1207.460156, 520.787761, 990.938259, 543.114173, 1226.156526, 1294.443086], [1215.615209, 531.84985, 993.770675, 531.849835, 1215.615214, 1292.875522], [1244.822506, 557.132047, 984.039379, 507.321877, 1194.246791, 1298.493405], [1284.610825, 585.936858, 959.871246, 480.348308, 1171.779583, 1312.10795], [1328.110753, 616.972355, 926.939338, 451.067576, 1146.540797, 1328.34039], [1371.053248, 648.609912, 888.331779, 419.555483, 1116.939784, 1343.669055], [1411.255796, 679.31394, 845.845511, 385.931794, 1082.417913, 1357.553546], [1448.055589, 708.042826, 800.669299, 350.425281, 1043.404696, 1371.310528], [1481.502237, 734.371786, 753.475535, 313.423322, 1000.396125, 1386.196253], [1511.448137, 758.297654, 704.432641, 275.562441, 953.087781, 1402.273469], [1537.170442, 779.906724, 653.417404, 237.840653, 900.413571, 1418.664272], [1557.858082, 799.156718, 600.365122, 201.621407, 841.417818, 1434.602279], [1573.482366, 815.898189, 545.501795, 168.367689, 776.097765, 1450.202476], [1585.088481, 830.052079, 489.288505, 139.078786, 705.447852, 1466.298684], [1593.975895, 841.748779, 432.143548, 113.713297, 630.696138, 1483.547039], [1600.318285, 851.301067, 374.178537, 91.151608, 552.424883, 1501.569433], [1602.552596, 859.047735, 315.167324, 69.971131, 470.334184, 1518.836553], [1598.460133, 865.21271, 254.767595, 49.513308, 383.790344, 1533.386519], [1587.450739, 869.888433, 192.804826, 30.43505, 292.604158, 1543.851983], [1572.363867, 873.122141, 129.410966, 14.483883, 197.394258, 1550.089777], [1559.113977, 874.993183, 64.973205, 3.779278, 99.387112, 1553.021805], [1553.82483, 875.60123, -4.1e-05, -1.8e-05, 3.1e-05, 1553.82483]], "distances": [0, 0.011699533707757405, 0.023419360530437146, 0.035118894238194545, 0.04681842794595195, 0.05853825476863169, 0.07023778847638909, 0.08193732218414648, 0.09365714900682624, 0.10535668271458365, 0.11705621642234104, 0.1287760432450208, 0.14047557695277818, 0.1521751106605356, 0.16389493748321532, 0.17559447119097277, 0.18729400489873016, 0.19901383172140988, 0.2107133654291673, 0.2224128991369247, 0.23413272595960444, 0.2408727911268979, 0.2476331982830816, 0.2544084274477678, 0.26114849261506135, 0.26790889977124505, 0.27468412893593125, 0.2814241941032247, 0.2881846012594084, 0.2949598304240946, 0.30169989559138816, 0.30846030274757186, 0.31523553191225806, 0.3219755970795516, 0.3287360042357353, 0.3355112334004215, 0.34225129856771497, 0.34901170572389867, 0.3557869348885849, 0.3625270000558784, 0.36932246594807683, 0.38283774518740243, 0.39637326813124074, 0.409908791075079, 0.42338892140966594, 0.4369244443535042, 0.45045996729734245, 0.46394009763192945, 0.4774756205757677, 0.49101114351960595, 0.5044912738541929, 0.5180267967980312, 0.5315623197418695, 0.5450424500764565, 0.5585779730202948, 0.5721134959641331, 0.58559362629872, 0.5991291492425583, 0.6126646721863966, 0.6261448025209836, 0.6396803254648219], "highsym_qpts": [[0, "\u0393"], [20, "M"], [40, "K"], [60, "\u0393"]], "vectors": [[[[[0.706128, 0.0], [-0.037171, 0.0], [-0.001408, 0.0]], [[0.706128, 0.0], [-0.037171, 0.0], [-0.001408, 0.0]]], [[[0.002139, 0.0], [0.013843, 0.0], [0.706968, 0.0]], [[0.002139, 0.0], [0.013843, 0.0], [0.706968, 0.0]]], [[[0.037136, 0.0], [0.705993, 0.0], [-0.013937, 0.0]], [[0.037136, 0.0], [0.705993, 0.0], [-0.013937, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]], [[0.0, 0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[0.707107, 0.0], [0.0, 0.0], [-0.0, 0.0]], [[-0.707107, 0.0], [-0.0, 0.0], [-0.0, 0.0]]], [[[0.0, 0.0], [-0.707107, 0.0], [-0.0, 0.0]], [[-0.0, 0.0], [0.707107, 0.0], [-0.0, 0.0]]]], [[[[0.146026, 0.594707], [0.084308, 0.343354], [-0.0, 0.0]], [[0.186809, 0.583183], [0.107854, 0.336701], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.706138, 0.037006]], [[-0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.35352, -0.00488], [0.612314, 0.008452], [0.0, 0.0]], [[-0.353469, 0.007728], [0.612226, -0.013386], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.706138, -0.037006]], [[-0.0, -0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.038174, 0.611181], [-0.02204, 0.352866], [0.0, 0.0]], [[-0.004189, -0.612358], [-0.002418, -0.353545], [0.0, 0.0]]], [[[0.251296, 0.248697], [-0.435258, -0.430756], [0.0, 0.0]], [[-0.260004, -0.239579], [0.45034, 0.414963], [-0.0, 0.0]]]], [[[[0.235576, 0.565247], [0.13601, 0.326346], [-0.0, 0.0]], [[0.311887, 0.526998], [0.180068, 0.304262], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.703233, 0.073911]], [[-0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.352969, -0.020314], [0.611361, 0.035184], [-0.0, -0.0]], [[-0.353521, 0.004789], [0.612316, -0.008295], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.703233, -0.073911]], [[-0.0, -0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.076315, 0.607599], [-0.04406, 0.350797], [0.0, 0.0]], [[-0.008915, -0.612308], [-0.005147, -0.353516], [0.0, 0.0]]], [[[-0.048212, -0.350251], [0.083505, 0.606652], [0.0, -0.0]], [[0.072949, 0.345946], [-0.126351, -0.599196], [0.0, 0.0]]]], [[[[0.213794, 0.57384], [0.123434, 0.331307], [-0.0, 0.0]], [[0.329508, 0.516163], [0.190242, 0.298007], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.698399, 0.110632]], [[0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[-0.352614, -0.025763], [0.610744, 0.044623], [0.0, 0.0]], [[-0.353367, 0.011477], [0.61205, -0.019878], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.698399, -0.110632]], [[-0.0, -0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.114103, 0.601648], [-0.065878, 0.347362], [0.0, 0.0]], [[-0.014758, -0.612195], [-0.008521, -0.353451], [0.0, 0.0]]], [[[0.062029, -0.34807], [-0.107437, 0.602874], [0.0, 0.0]], [[-0.025066, 0.352664], [0.043416, -0.610831], [0.0, 0.0]]]], [[[[0.612309, 0.008797], [0.353517, 0.005079], [-0.0, 0.0]], [[0.590015, -0.163956], [0.340646, -0.09466], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.69163, 0.147134]], [[0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[-0.348284, -0.060815], [0.603245, 0.105334], [0.0, 0.0]], [[-0.353333, -0.012484], [0.611991, 0.021622], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.69163, -0.147134]], [[-0.0, -0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.150425, 0.593609], [-0.086848, 0.342721], [0.0, 0.0]], [[-0.022792, -0.611948], [-0.013159, -0.353308], [0.0, 0.0]]], [[[-0.069895, -0.346576], [0.121062, 0.600287], [0.0, -0.0]], [[0.116758, 0.333718], [-0.20223, -0.578016], [0.0, 0.0]]]], [[[[0.566152, 0.233391], [0.326868, 0.134749], [-0.0, -0.0]], [[0.612095, 0.018447], [0.353393, 0.010651], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.6829, 0.183434]], [[0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[-0.349385, -0.054129], [0.605153, 0.093755], [-0.0, -0.0]], [[-0.353526, 0.004385], [0.612325, -0.007595], [-0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [-0.6829, -0.183434]], [[0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[-0.179917, 0.585346], [-0.103875, 0.33795], [0.0, 0.0]], [[-0.03836, -0.61117], [-0.022147, -0.352859], [0.0, 0.0]]], [[[0.075585, -0.345379], [-0.130917, 0.598215], [0.0, -0.0]], [[-0.017438, 0.353123], [0.030203, -0.611627], [0.0, 0.0]]]], [[[[0.604698, 0.096644], [0.349123, 0.055798], [-0.0, 0.0]], [[0.588685, -0.168673], [0.339877, -0.097383], [-0.0, 0.0]]], [[[0.0, 0.0], [0.0, 0.0], [0.672151, 0.219575]], [[0.0, -0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[-0.344752, 0.078396], [0.597128, -0.135786], [-0.0, -0.0]], [[-0.323744, 0.14209], [0.560742, -0.246107], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, -0.0], [-0.672151, -0.219575]], [[0.0, -0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[-0.319183, 0.522611], [-0.18428, 0.30173], [-0.0, -0.0]], [[0.067683, -0.608621], [0.039077, -0.351387], [-0.0, 0.0]]], [[[-0.17665, -0.306259], [0.305967, 0.530457], [0.0, 0.0]], [[0.231307, 0.26739], [-0.400635, -0.463132], [-0.0, 0.0]]]], [[[[-0.593626, 0.150359], [-0.34273, 0.08681], [0.0, -0.0]], [[-0.442558, 0.423252], [-0.255511, 0.244364], [0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [0.659321, 0.25553]], [[0.0, -0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[-0.345537, -0.07486], [0.598488, 0.129661], [-0.0, -0.0]], [[-0.35355, -0.001652], [0.612366, 0.002861], [-0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [0.659321, 0.25553]], [[-0.0, 0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[0.279292, -0.544973], [0.161249, -0.314641], [0.0, 0.0]], [[0.025372, 0.611847], [0.014648, 0.35325], [0.0, 0.0]]], [[[0.140376, 0.324491], [-0.243138, -0.562035], [-0.0, -0.0]], [[-0.204555, -0.28837], [0.354299, 0.499472], [0.0, 0.0]]]], [[[[-0.566449, 0.23267], [-0.32704, 0.134332], [0.0, -0.0]], [[-0.339543, 0.509618], [-0.196035, 0.294228], [0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [0.644413, 0.291088]], [[0.0, -0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[-0.298636, -0.189252], [0.517254, 0.327794], [0.0, 0.0]], [[-0.332996, -0.118802], [0.576766, 0.20577], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.644413, -0.291088]], [[-0.0, -0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[0.301462, -0.53303], [0.174049, -0.307745], [0.0, 0.0]], [[0.048092, 0.610481], [0.027766, 0.352461], [0.0, 0.0]]], [[[-0.311675, -0.166909], [0.539837, 0.289095], [0.0, 0.0]], [[0.340791, 0.094135], [-0.590267, -0.163047], [0.0, 0.0]]]], [[[[0.278734, -0.545259], [0.160927, -0.314806], [-0.0, -0.0]], [[-0.121721, -0.600153], [-0.070275, -0.346499], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.627584, -0.325789]], [[-0.0, 0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[-0.352122, 0.031784], [0.609893, -0.055052], [0.0, 0.0]], [[-0.335553, 0.111373], [0.581196, -0.192903], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.627584, 0.325789]], [[-0.0, -0.0], [-0.0, -0.0], [-0.707107, 0.0]]], [[[0.297339, -0.535341], [0.171669, -0.309079], [0.0, 0.0]], [[0.100988, 0.603988], [0.058306, 0.348713], [0.0, 0.0]]], [[[0.34246, -0.087869], [-0.593158, 0.152194], [-0.0, -0.0]], [[-0.313337, 0.163768], [0.542715, -0.283655], [0.0, 0.0]]]], [[[[0.362108, -0.49384], [0.209063, -0.285119], [-0.0, -0.0]], [[-0.073771, -0.607913], [-0.042592, -0.350979], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.609228, 0.358945]], [[0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[-0.35332, -0.012832], [0.611969, 0.022226], [0.0, 0.0]], [[-0.346712, 0.069214], [0.600523, -0.119882], [0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [-0.609228, -0.358945]], [[0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[0.564256, -0.23794], [0.325773, -0.137375], [0.0, -0.0]], [[-0.248738, 0.559579], [-0.143609, 0.323073], [-0.0, 0.0]]], [[[-0.347897, -0.062988], [0.602576, 0.109098], [-0.0, -0.0]], [[0.353034, -0.019164], [-0.611472, 0.033192], [0.0, 0.0]]]], [[[[0.413049, -0.452096], [0.238474, -0.261018], [0.0, 0.0]], [[-0.058564, -0.609566], [-0.033812, -0.351933], [-0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [-0.589998, -0.389746]], [[-0.0, -0.0], [-0.0, -0.0], [-0.707107, 0.0]]], [[[-0.345052, -0.077066], [0.597647, 0.133483], [-0.0, -0.0]], [[-0.353533, 0.003793], [0.612337, -0.006569], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.589998, -0.389746]], [[-0.0, -0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.484135, 0.374985], [-0.279515, 0.216498], [0.0, 0.0]], [[0.046308, -0.610619], [0.026736, -0.352541], [0.0, 0.0]]], [[[-0.337362, -0.105768], [0.584328, 0.183195], [0.0, 0.0]], [[0.352603, 0.025907], [-0.610726, -0.044872], [-0.0, 0.0]]]], [[[[0.51652, -0.328949], [0.298213, -0.189919], [0.0, 0.0]], [[0.0508, -0.610262], [0.02933, -0.352335], [-0.0, 0.0]]], [[[0.0, 0.0], [0.0, 0.0], [0.570805, 0.417351]], [[0.0, -0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[0.139955, 0.324673], [-0.24241, -0.56235], [-0.0, 0.0]], [[0.207901, 0.285967], [-0.360095, -0.495309], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.570805, -0.417351]], [[-0.0, -0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.00084, -0.612372], [-0.000485, -0.353553], [0.0, -0.0]], [[0.487959, 0.369995], [0.281723, 0.213617], [0.0, 0.0]]], [[[0.353505, 0.005832], [-0.612289, -0.010101], [-0.0, -0.0]], [[-0.346141, 0.072018], [0.599533, -0.124738], [0.0, 0.0]]]], [[[[-0.202778, 0.577824], [-0.117074, 0.333607], [0.0, -0.0]], [[0.380068, 0.480154], [0.219432, 0.277217], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.55285, -0.440859]], [[-0.0, 0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[-0.353356, -0.01181], [0.612031, 0.020456], [-0.0, -0.0]], [[-0.348233, 0.061103], [0.603158, -0.105834], [-0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [-0.55285, -0.440859]], [[0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[0.488522, -0.369251], [0.282048, -0.213187], [0.0, 0.0]], [[0.051084, 0.610238], [0.029493, 0.352321], [0.0, 0.0]]], [[[0.329632, -0.127838], [-0.57094, 0.221422], [0.0, 0.0]], [[-0.2963, 0.192889], [0.513207, -0.334094], [0.0, 0.0]]]], [[[[-0.43114, 0.434878], [-0.248919, 0.251077], [0.0, 0.0]], [[0.189118, 0.582438], [0.109187, 0.336271], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.537823, -0.459071]], [[-0.0, 0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[-0.120861, -0.332254], [0.209338, 0.57548], [0.0, -0.0]], [[-0.180713, -0.30388], [0.313003, 0.526335], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.537823, 0.459071]], [[-0.0, -0.0], [-0.0, -0.0], [-0.707107, 0.0]]], [[[0.522653, -0.319115], [0.301754, -0.184241], [0.0, 0.0]], [[0.044297, 0.610768], [0.025575, 0.352627], [0.0, 0.0]]], [[[0.322429, -0.145049], [-0.558464, 0.251233], [-0.0, 0.0]], [[-0.289716, 0.202644], [0.501803, -0.350989], [-0.0, 0.0]]]], [[[[0.55477, -0.259287], [0.320297, -0.1497], [-0.0, -0.0]], [[-0.031198, -0.611577], [-0.018012, -0.353094], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.528367, 0.469924]], [[-0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.353229, -0.015132], [0.611811, 0.026209], [-0.0, -0.0]], [[-0.350963, 0.042719], [0.607886, -0.073992], [0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [-0.528367, -0.469924]], [[0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[0.430267, -0.435742], [0.248415, -0.251575], [-0.0, -0.0]], [[0.241555, 0.562718], [0.139462, 0.324885], [-0.0, 0.0]]], [[[-0.337574, -0.10509], [0.584695, 0.182022], [0.0, 0.0]], [[0.350199, 0.048588], [-0.606562, -0.084157], [0.0, 0.0]]]], [[[[0.438374, 0.427584], [0.253095, 0.246866], [0.0, 0.0]], [[0.536381, -0.295458], [0.30968, -0.170583], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.528933, 0.469286]], [[-0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.353553, -0.00063], [0.612371, 0.001091], [0.0, 0.0]], [[-0.350345, 0.047526], [0.606815, -0.082317], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.528933, 0.469286]], [[0.0, -0.0], [0.0, -0.0], [-0.707107, 0.0]]], [[[-0.544722, 0.279782], [-0.314495, 0.161532], [0.0, 0.0]], [[-0.109702, -0.602466], [-0.063336, -0.347834], [0.0, 0.0]]], [[[-0.289488, 0.20297], [0.501408, -0.351554], [0.0, 0.0]], [[0.259149, -0.240503], [-0.448859, 0.416564], [-0.0, 0.0]]]], [[[[0.178288, 0.585844], [0.102934, 0.338237], [0.0, 0.0]], [[0.609437, -0.059892], [0.351858, -0.034578], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.546889, 0.448232]], [[0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[-0.341697, -0.090791], [0.591837, 0.157255], [-0.0, -0.0]], [[-0.349385, -0.054129], [0.605153, 0.093754], [0.0, 0.0]]], [[[0.0, 0.0], [0.0, 0.0], [-0.546889, -0.448232]], [[-0.0, -0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.558316, 0.251562], [-0.322344, 0.145239], [0.0, 0.0]], [[-0.137143, -0.596818], [-0.079179, -0.344573], [0.0, 0.0]]], [[[-0.068348, 0.346884], [0.118383, -0.600821], [-0.0, 0.0]], [[0.031263, -0.352168], [-0.054149, 0.609974], [-0.0, 0.0]]]], [[[[-0.461645, -0.402348], [-0.266531, -0.232296], [-0.0, 0.0]], [[-0.441077, 0.424795], [-0.254656, 0.245256], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.591996, 0.386705]], [[-0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.352793, 0.023179], [0.611055, -0.040148], [0.0, 0.0]], [[-0.350186, 0.048679], [0.60654, -0.084314], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.591996, 0.386705]], [[-0.0, -0.0], [-0.0, -0.0], [-0.707107, 0.0]]], [[[-0.55167, 0.26582], [-0.318507, 0.153471], [0.0, 0.0]], [[-0.216693, -0.572751], [-0.125108, -0.330678], [0.0, 0.0]]], [[[-0.083896, 0.343455], [0.145312, -0.594882], [0.0, 0.0]], [[0.058791, -0.348631], [-0.101829, 0.603847], [-0.0, 0.0]]]], [[[[0.593178, 0.152118], [0.342471, 0.087825], [0.0, -0.0]], [[0.107001, -0.602952], [0.061777, -0.348114], [0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, -0.0], [0.663232, 0.245202]], [[-0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.353188, 0.01606], [0.61174, -0.027816], [0.0, 0.0]], [[-0.352357, 0.02906], [0.6103, -0.050333], [-0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [-0.663232, -0.245202]], [[0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[0.230815, 0.567208], [0.133261, 0.327477], [-0.0, -0.0]], [[-0.548208, 0.272887], [-0.316508, 0.157552], [0.0, 0.0]]], [[[-0.351024, -0.042217], [0.607991, 0.073122], [-0.0, -0.0]], [[0.352341, 0.029257], [-0.610272, -0.050675], [-0.0, 0.0]]]], [[[[-0.612372, -0.0], [-0.353553, -0.0], [0.0, 0.0]], [[0.612372, 0.0], [0.353553, 0.0], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, -0.0], [0.707107, 0.0]], [[-0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.353553, -0.0], [0.612372, 0.0], [-0.0, -0.0]], [[-0.353553, 0.0], [0.612372, -0.0], [0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [-0.707107, -0.0]], [[0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[-0.612372, 0.0], [-0.353553, 0.0], [-0.0, -0.0]], [[-0.612372, -0.0], [-0.353553, -0.0], [-0.0, 0.0]]], [[[-0.353553, -0.0], [0.612372, 0.0], [-0.0, -0.0]], [[0.353553, 0.0], [-0.612372, -0.0], [0.0, 0.0]]]], [[[[0.611407, 0.034235], [0.353261, 0.014716], [-0.0, -0.0]], [[-0.612361, 0.002189], [-0.353547, -0.003792], [0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.706138, 0.037007]], [[-0.0, 0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.02229, 0.352864], [0.029862, -0.611636], [-0.0, -0.0]], [[0.003792, 0.353547], [0.002189, -0.612361], [0.0, 0.0]]], [[[0.0, -0.0], [-0.0, 0.0], [-0.706138, -0.037007]], [[-0.0, -0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.609582, -0.05147], [-0.354299, 0.015246], [-0.0, -0.0]], [[-0.611441, 0.019496], [-0.353015, -0.033768], [-0.0, 0.0]]], [[[0.052197, -0.350764], [-0.012531, 0.611623], [-0.0, -0.0]], [[0.033768, 0.353015], [0.019496, -0.611441], [-0.0, 0.0]]]], [[[[-0.608504, -0.068437], [-0.352396, -0.029277], [0.0, 0.0]], [[0.612324, -0.004457], [0.353525, 0.007719], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.703233, 0.073913]], [[-0.0, 0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[0.04463, -0.350782], [-0.059573, 0.609435], [-2e-06, -0.0]], [[-0.007719, -0.353525], [-0.004457, 0.612324], [2e-06, 0.0]]], [[[-0.0, 1e-06], [0.0, -1e-06], [-0.703233, -0.073913]], [[0.0, 1e-06], [0.0, -1e-06], [0.707107, 0.0]]], [[[0.600975, 0.103223], [0.35659, -0.031903], [0.0, 0.0]], [[0.608472, -0.039838], [0.351302, 0.069002], [0.0, 0.0]]], [[[-0.105345, 0.342165], [0.023983, -0.609303], [0.0, 0.0]], [[-0.069002, -0.351302], [-0.039838, 0.608472], [0.0, 0.0]]]], [[[[-0.603642, -0.102576], [-0.350999, -0.043523], [0.0, 0.0]], [[0.612256, -0.006882], [0.353486, 0.011921], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.698401, 0.110616]], [[-0.0, 0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[0.067071, -0.34727], [-0.08898, 0.605795], [-0.0, -0.0]], [[-0.011921, -0.353486], [-0.006882, 0.612256], [0.0, 0.0]]], [[[0.0, -0.0], [-0.0, 0.0], [0.698401, 0.110616]], [[-0.0, -0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[0.586057, 0.154944], [0.360527, -0.050496], [0.0, 0.0]], [[0.60308, -0.061357], [0.348189, 0.106273], [0.0, 0.0]]], [[[-0.159433, 0.327277], [0.033741, -0.605254], [0.0, 0.0]], [[-0.106273, -0.348189], [-0.061357, 0.60308], [0.0, 0.0]]]], [[[[-0.596786, -0.136616], [-0.349141, -0.057297], [0.0, 0.0]], [[0.612149, -0.009552], [0.353424, 0.016545], [-0.0, 0.0]]], [[[0.0, 0.0], [0.0, -0.0], [-0.691655, -0.147016]], [[0.0, -0.0], [0.0, 0.0], [-0.707107, 0.0]]], [[[-0.089665, 0.342261], [0.117929, -0.600758], [0.0, 0.0]], [[0.016545, 0.353424], [0.009552, -0.612149], [-0.0, 0.0]]], [[[-0.0, 0.0], [0.0, -0.0], [-0.691655, -0.147016]], [[0.0, 0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[0.56465, 0.205443], [0.366121, -0.070135], [0.0, 0.0]], [[0.595025, -0.083556], [0.343538, 0.144724], [0.0, 0.0]]], [[[-0.212987, 0.305941], [0.041982, -0.599395], [0.0, 0.0]], [[-0.144724, -0.343538], [-0.083556, 0.595025], [0.0, 0.0]]]], [[[[0.587882, 0.170526], [0.346921, 0.070435], [-0.0, -0.0]], [[-0.611986, 0.01256], [-0.35333, -0.021755], [0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.683013, 0.183013]], [[-0.0, 0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[0.112463, -0.33566], [-0.146261, 0.594384], [-0.0, -0.0]], [[-0.021755, -0.35333], [-0.01256, 0.611986], [0.0, 0.0]]], [[[-0.0, 0.0], [0.0, -0.0], [-0.683013, -0.183013]], [[0.0, 0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[-0.53746, -0.252959], [-0.373203, 0.088702], [-0.0, -0.0]], [[-0.584617, 0.105234], [-0.337529, -0.182272], [-0.0, 0.0]]], [[[0.26342, -0.278852], [-0.049661, 0.591933], [-0.0, -0.0]], [[0.182272, 0.337529], [0.105234, -0.584617], [-0.0, 0.0]]]], [[[[0.576855, 0.204269], [0.344475, 0.082763], [-0.0, -0.0]], [[-0.611744, 0.016014], [-0.353191, -0.027737], [0.0, 0.0]]], [[[0.0, 0.0], [0.0, 0.0], [-0.672499, -0.218508]], [[0.0, -0.0], [0.0, 0.0], [-0.707107, 0.0]]], [[[-0.135521, 0.327333], [0.173809, -0.586752], [0.0, 0.0]], [[0.027737, 0.353191], [0.016014, -0.611744], [-0.0, 0.0]]], [[[-0.0, 0.0], [0.0, -0.0], [-0.672499, -0.218508]], [[0.0, 0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[-0.506136, -0.295913], [-0.381441, 0.103756], [-0.0, -0.0]], [[-0.572806, 0.125025], [-0.330709, -0.21655], [-0.0, 0.0]]], [[[-0.308146, 0.247606], [0.058101, -0.583405], [-0.0, -0.0]], [[-0.21655, -0.33071], [-0.125025, 0.572806], [-0.0, 0.0]]]], [[[[-0.563599, -0.237809], [-0.341978, -0.094097], [0.0, 0.0]], [[0.611388, -0.020038], [0.352985, 0.034707], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, -0.0], [0.660141, 0.253404]], [[-0.0, -0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.1589, 0.317102], [0.200395, -0.577961], [-0.0, -0.0]], [[0.034707, 0.352985], [0.020038, -0.611388], [0.0, 0.0]]], [[[0.0, -0.0], [-0.0, 0.0], [-0.660141, -0.253404]], [[-0.0, -0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.472697, -0.33353], [-0.390415, 0.113542], [-0.0, -0.0]], [[-0.560827, 0.141977], [-0.323794, -0.245912], [-0.0, 0.0]]], [[[-0.345616, 0.21416], [0.068435, -0.574457], [-0.0, -0.0]], [[-0.245912, -0.323794], [-0.141977, 0.560827], [-0.0, 0.0]]]], [[[[-0.547972, -0.271105], [-0.339654, -0.10423], [0.0, 0.0]], [[0.610866, -0.024786], [0.352684, 0.042931], [-0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, -0.0], [0.645974, 0.287606]], [[-0.0, -0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.182669, 0.304731], [0.225818, -0.568135], [-0.0, -0.0]], [[0.042931, 0.352683], [0.024786, -0.610866], [0.0, 0.0]]], [[[0.0, -0.0], [-0.0, 0.0], [-0.645974, -0.287606]], [[-0.0, -0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.43884, -0.365904], [-0.399689, 0.117397], [-0.0, -0.0]], [[-0.549727, 0.155778], [-0.317385, -0.269816], [-0.0, 0.0]]], [[[-0.375581, 0.180202], [0.081284, -0.565561], [-0.0, -0.0]], [[-0.269816, -0.317385], [-0.155778, 0.549727], [-0.0, 0.0]]]], [[[[-0.529777, -0.304108], [-0.33779, -0.112924], [0.0, 0.0]], [[0.610097, -0.030448], [0.35224, 0.052738], [-0.0, 0.0]]], [[[-0.0, 0.0], [0.0, -0.0], [0.630037, 0.32102]], [[-0.0, -0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.206903, 0.289906], [0.249849, -0.557424], [-0.0, -0.0]], [[0.052738, 0.35224], [0.030448, -0.610097], [0.0, 0.0]]], [[[0.0, -0.0], [-0.0, 0.0], [-0.630037, -0.32102]], [[-0.0, -0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.405601, -0.393659], [-0.408859, 0.11556], [-0.0, -0.0]], [[-0.540111, 0.166614], [-0.311833, -0.288583], [-0.0, 0.0]]], [[[-0.398699, 0.146831], [0.096751, -0.556883], [-0.0, -0.0]], [[-0.288583, -0.311833], [-0.166614, 0.540111], [-0.0, 0.0]]]], [[[[-0.508743, -0.336754], [-0.336754, -0.119893], [0.0, 0.0]], [[0.608961, -0.037266], [0.351584, 0.064547], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, -0.0], [0.612372, 0.353553]], [[-0.0, -0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.231691, 0.272207], [0.272207, -0.546009], [-0.0, -0.0]], [[0.064547, 0.351584], [0.037266, -0.608961], [0.0, 0.0]]], [[[0.0, -0.0], [-0.0, 0.0], [-0.612372, -0.353553]], [[-0.0, -0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.373404, -0.417575], [-0.417575, 0.108771], [-0.0, -0.0]], [[-0.532165, 0.174929], [-0.307245, -0.302986], [-0.0, 0.0]]], [[[-0.416017, 0.114589], [0.114589, -0.548333], [-0.0, -0.0]], [[-0.302986, -0.307246], [-0.174929, 0.532165], [-0.0, 0.0]]]], [[[[0.484489, 0.368945], [0.337015, 0.124784], [-0.0, -0.0]], [[-0.607269, 0.045552], [-0.350607, -0.078898], [0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, -0.0], [0.59303, 0.385118]], [[-0.0, -0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.257124, 0.251072], [0.292539, -0.534108], [-0.0, -0.0]], [[0.078898, 0.350607], [0.045552, -0.607269], [0.0, 0.0]]], [[[-0.0, 0.0], [0.0, -0.0], [0.59303, 0.385118]], [[0.0, 0.0], [0.0, -0.0], [-0.707107, 0.0]]], [[[0.342227, 0.438372], [0.425572, -0.097974], [0.0, 0.0]], [[0.525771, -0.18126], [0.303554, 0.313951], [0.0, 0.0]]], [[[-0.428629, 0.083592], [0.134338, -0.539669], [-0.0, -0.0]], [[-0.313951, -0.303554], [-0.18126, 0.525771], [-0.0, 0.0]]]], [[[[0.456485, 0.400518], [0.339175, 0.127152], [-0.0, -0.0]], [[-0.604722, 0.055711], [-0.349137, -0.096494], [0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.572061, 0.415627]], [[-0.0, 0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[0.283283, -0.22574], [-0.310376, 0.521976], [0.0, 0.0]], [[-0.096494, -0.349137], [-0.055711, 0.604722], [-0.0, 0.0]]], [[[-0.0, 0.0], [0.0, -0.0], [0.572061, 0.415627]], [[-0.0, 0.0], [-0.0, -0.0], [-0.707107, 0.0]]], [[[-0.311742, -0.456615], [-0.4327, 0.084207], [-0.0, -0.0]], [[-0.520596, 0.186172], [-0.300566, -0.322459], [-0.0, 0.0]]], [[[0.437543, -0.053626], [-0.155383, 0.5306], [0.0, 0.0]], [[0.322459, 0.300566], [0.186172, -0.520596], [0.0, 0.0]]]], [[[[-0.423989, -0.431177], [-0.344, -0.126426], [0.0, 0.0]], [[0.60085, -0.068263], [0.346901, 0.118235], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.549525, 0.444997]], [[-0.0, 0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.310197, 0.195185], [0.325077, -0.509907], [0.0, 0.0]], [[0.118235, 0.346901], [0.068263, -0.60085], [-0.0, 0.0]]], [[[0.0, -0.0], [-0.0, 0.0], [0.549525, 0.444997]], [[-0.0, -0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[-0.281341, -0.472681], [-0.438989, 0.068617], [-0.0, -0.0]], [[-0.516111, 0.190289], [-0.297977, -0.32959], [-0.0, 0.0]]], [[[0.443662, -0.024154], [-0.176917, 0.520846], [-0.0, -0.0]], [[0.32959, 0.297977], [0.190289, -0.516111], [-0.0, 0.0]]]], [[[[0.385987, 0.460381], [0.352429, 0.121889], [-0.0, -0.0]], [[-0.5949, 0.083854], [-0.343465, -0.14524], [0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.525483, 0.473147]], [[-0.0, 0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.337757, 0.15806], [0.33575, -0.498206], [0.0, 0.0]], [[0.14524, 0.343465], [0.083854, -0.5949], [-0.0, 0.0]]], [[[0.0, -0.0], [-0.0, 0.0], [0.525483, 0.473147]], [[-0.0, -0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[-0.250108, -0.486724], [-0.44473, 0.05254], [-0.0, -0.0]], [[-0.511549, 0.194352], [-0.295343, -0.336627], [-0.0, 0.0]]], [[[0.447786, 0.005765], [-0.197861, 0.510202], [-0.0, -0.0]], [[0.336627, 0.295343], [0.194352, -0.511549], [-0.0, 0.0]]]], [[[[-0.34116, -0.487135], [-0.365526, -0.11269], [0.0, 0.0]], [[0.585694, -0.10322], [0.33815, 0.178782], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.5, 0.5]], [[-0.0, 0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.365526, 0.11269], [0.34116, -0.487135], [0.0, 0.0]], [[0.178782, 0.33815], [0.10322, -0.585694], [-0.0, 0.0]]], [[[0.0, -0.0], [-0.0, 0.0], [0.5, 0.5]], [[-0.0, -0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[-0.216811, -0.498591], [-0.450547, 0.03751], [-0.0, -0.0]], [[-0.505866, 0.199248], [-0.292062, -0.345108], [-0.0, 0.0]]], [[[-0.450547, -0.03751], [0.216811, -0.498591], [0.0, 0.0]], [[-0.345108, -0.292062], [-0.199248, 0.505866], [0.0, 0.0]]]], [[[[-0.288009, -0.50969], [-0.384271, -0.097991], [0.0, 0.0]], [[0.571489, -0.127017], [0.329949, 0.22], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.473147, 0.525483]], [[-0.0, 0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.392409, 0.057287], [0.339708, -0.476793], [0.0, 0.0]], [[0.22, 0.329949], [0.127017, -0.571489], [-0.0, 0.0]]], [[[0.0, -0.0], [-0.0, 0.0], [0.473147, 0.525483]], [[-0.0, -0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[-0.1801, -0.507722], [-0.457336, 0.025029], [-0.0, -0.0]], [[-0.497821, 0.205892], [-0.287417, -0.356615], [-0.0, 0.0]]], [[[-0.452214, -0.072697], [0.232185, -0.486115], [0.0, 0.0]], [[-0.356615, -0.287417], [-0.205892, 0.497821], [0.0, 0.0]]]], [[[[-0.225387, -0.525264], [-0.409031, -0.077409], [0.0, 0.0]], [[0.550047, -0.155401], [0.31757, 0.269162], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.444997, 0.549525]], [[-0.0, 0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.416187, -0.009325], [0.32967, -0.466925], [0.0, 0.0]], [[0.269162, 0.31757], [0.155401, -0.550047], [-0.0, 0.0]]], [[[0.0, 0.0], [-0.0, 0.0], [0.444997, 0.549525]], [[-0.0, -0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[-0.139081, -0.513158], [-0.465907, 0.015988], [-0.0, -0.0]], [[-0.486325, 0.214855], [-0.28078, -0.372139], [-0.0, 0.0]]], [[[-0.452402, -0.112506], [0.242733, -0.473028], [0.0, 0.0]], [[-0.37214, -0.28078], [-0.214855, 0.486325], [0.0, 0.0]]]], [[[[-0.153726, -0.530274], [-0.438733, -0.051879], [0.0, 0.0]], [[0.519358, -0.187321], [0.299852, 0.324448], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.415627, 0.572061]], [[-0.0, 0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.433291, -0.086236], [0.310066, -0.456817], [0.0, 0.0]], [[0.324448, 0.299852], [0.18732, -0.519359], [-0.0, 0.0]]], [[[0.0, 0.0], [-0.0, 0.0], [0.415627, 0.572061]], [[-0.0, -0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[-0.09409, -0.51387], [-0.476429, 0.009995], [-0.0, -0.0]], [[-0.471034, 0.225925], [-0.271952, -0.391314], [-0.0, 0.0]]], [[[-0.450022, -0.156731], [0.248279, -0.459644], [0.0, 0.0]], [[-0.391314, -0.271952], [-0.225925, 0.471034], [0.0, 0.0]]]], [[[[0.076493, 0.521825], [0.470369, 0.024495], [-0.0, -0.0]], [[-0.479301, 0.220054], [-0.276724, -0.381144], [0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.385118, 0.59303]], [[-0.0, 0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.439667, -0.168939], [0.282126, -0.445598], [0.0, 0.0]], [[0.381144, 0.276724], [0.220054, -0.479301], [-0.0, 0.0]]], [[[0.0, 0.0], [-0.0, 0.0], [0.385118, 0.59303]], [[-0.0, -0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[-0.046923, -0.509361], [-0.488181, 0.005355], [-0.0, -0.0]], [[-0.452742, 0.238065], [-0.261391, -0.41234], [-0.0, 0.0]]], [[[0.443797, 0.203454], [-0.250043, 0.446239], [-0.0, -0.0]], [[0.41234, 0.261391], [0.238065, -0.452742], [-0.0, 0.0]]]], [[[[-0.0, -0.5], [-0.5, 0.0], [0.0, 0.0]], [[0.008314, -0.499931], [0.499931, 0.008314], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, -0.0], [0.707096, -0.003973]], [[0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.309867, 0.392406], [-0.392406, -0.309867], [0.0, -0.0]], [[0.309867, -0.392406], [-0.392406, -0.309867], [-0.0, 0.0]]], [[[-0.0, 0.0], [0.0, 0.0], [0.707096, -0.003973]], [[0.0, 0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[-0.0, 0.5], [0.5, 0.0], [0.0, 0.0]], [[0.008314, -0.499931], [0.499931, 0.008314], [0.0, 0.0]]], [[[-0.004809, -0.499977], [0.499977, -0.004809], [-0.0, 0.0]], [[-0.004809, -0.499977], [-0.499977, 0.004809], [0.0, 0.0]]]], [[[[0.128731, 0.431807], [0.544324, 0.026135], [-0.0, 0.0]], [[0.342116, 0.293233], [-0.197521, 0.507894], [0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, -0.0], [-0.287606, 0.645974]], [[-0.0, 0.0], [0.0, 0.0], [-0.707107, 0.0]]], [[[-0.387023, 0.383646], [-0.19327, -0.407033], [0.0, -0.0]], [[0.507894, -0.197521], [-0.293233, -0.342116], [-0.0, 0.0]]], [[[0.0, 0.0], [0.0, 0.0], [0.287606, -0.645974]], [[-0.0, 0.0], [0.0, 0.0], [-0.707107, 0.0]]], [[[0.086801, 0.470213], [0.520637, -0.017408], [0.0, -0.0]], [[-0.394291, -0.270497], [0.227603, -0.468575], [0.0, 0.0]]], [[[-0.398535, 0.335464], [-0.250154, -0.407501], [0.0, -0.0]], [[-0.46856, 0.227633], [0.270523, 0.394273], [0.0, 0.0]]]], [[[[0.217048, 0.356808], [0.570244, 0.019997], [-0.0, 0.0]], [[0.272273, 0.316685], [-0.157197, 0.548514], [0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [-0.218508, 0.672498]], [[0.0, 0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[-0.319003, 0.473091], [-0.161086, -0.385322], [0.0, -0.0]], [[0.548514, -0.157197], [-0.316685, -0.272273], [-0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, -0.0], [-0.218508, 0.672498]], [[0.0, -0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[0.161838, 0.429511], [0.536138, -0.043417], [-0.0, 0.0]], [[-0.358479, -0.286643], [0.206968, -0.496481], [-0.0, 0.0]]], [[[0.350257, -0.408226], [0.252358, 0.383389], [0.0, -0.0]], [[0.49648, -0.20697], [-0.286645, -0.358477], [0.0, 0.0]]]], [[[[0.275497, 0.287078], [0.58449, -0.007692], [0.0, -0.0]], [[0.223523, 0.329165], [-0.12905, 0.570117], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [-0.147016, 0.691655]], [[0.0, 0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[0.244766, -0.530831], [0.150202, 0.368439], [-0.0, 0.0]], [[-0.570121, 0.129051], [0.329159, 0.223523], [0.0, 0.0]]], [[[-0.0, 0.0], [0.0, -0.0], [-0.147016, 0.691655]], [[0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.22615, -0.379205], [-0.547224, 0.074865], [0.0, -0.0]], [[0.3239, 0.300049], [-0.187004, 0.519701], [0.0, 0.0]]], [[[0.290978, -0.469454], [0.254429, 0.360847], [0.0, -0.0]], [[0.519702, -0.186988], [-0.300047, -0.323909], [0.0, 0.0]]]], [[[[0.314685, 0.223149], [0.590683, -0.047656], [0.0, -0.0]], [[0.189033, 0.336287], [-0.109138, 0.582466], [-0.0, 0.0]]], [[[0.0, 0.0], [0.0, -0.0], [0.073913, -0.703233]], [[-0.0, -0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[-0.169425, 0.567867], [-0.152846, -0.354204], [0.0, -0.0]], [[0.582466, -0.109138], [-0.336287, -0.189033], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.073913, -0.703233]], [[-0.0, -0.0], [0.0, -0.0], [-0.707107, 0.0]]], [[[0.279667, 0.320282], [0.554233, -0.109692], [-0.0, 0.0]], [[-0.289294, -0.311614], [0.167024, -0.539731], [-0.0, 0.0]]], [[[0.222526, -0.519315], [0.255137, 0.340146], [0.0, -0.0]], [[0.539731, -0.167024], [-0.311614, -0.289294], [0.0, 0.0]]]], [[[[-0.340749, -0.163312], [-0.590194, 0.094288], [-0.0, 0.0]], [[-0.163312, -0.340749], [0.094288, -0.590194], [0.0, 0.0]]], [[[0.0, 0.0], [0.0, -0.0], [0.0, -0.707107]], [[-0.0, -0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[-0.094288, 0.590194], [-0.163312, -0.340749], [0.0, 0.0]], [[0.590194, -0.094288], [-0.340749, -0.163312], [0.0, 0.0]]], [[[0.0, 0.0], [0.0, -0.0], [-0.0, 0.707107]], [[0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.321434, -0.25503], [-0.55674, 0.147242], [-0.0, -0.0]], [[0.25503, 0.321434], [-0.147242, 0.55674], [0.0, 0.0]]], [[[0.147242, -0.55674], [0.25503, 0.321434], [-0.0, -0.0]], [[0.55674, -0.147242], [-0.321434, -0.25503], [0.0, 0.0]]]], [[[[-0.35685, -0.106079], [-0.58361, 0.144239], [-0.0, -0.0]], [[-0.142799, -0.343806], [0.082445, -0.59549], [-0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [-0.073913, -0.703233]], [[0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.019747, 0.600846], [-0.177955, -0.326996], [-0.0, -0.0]], [[0.59549, -0.082445], [-0.343806, -0.142799], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, 0.0], [-0.073913, -0.703233]], [[-0.0, 0.0], [0.0, 0.0], [-0.707107, 0.0]]], [[[-0.350881, -0.18653], [-0.554109, 0.187224], [0.0, 0.0]], [[0.222185, 0.329461], [-0.128278, 0.570643], [-0.0, 0.0]]], [[[0.067927, -0.580926], [0.255406, 0.304432], [-0.0, -0.0]], [[0.570643, -0.128278], [-0.329461, -0.222185], [0.0, 0.0]]]], [[[[0.364571, 0.05071], [0.571244, -0.195439], [0.0, 0.0]], [[0.125401, 0.346061], [-0.0724, 0.599395], [0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [-0.147016, -0.691655]], [[0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[0.053804, 0.60135], [-0.194611, -0.312426], [-0.0, -0.0]], [[0.599395, -0.072401], [-0.346061, -0.1254], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, 0.0], [-0.147016, -0.691655]], [[-0.0, 0.0], [0.0, 0.0], [-0.707107, 0.0]]], [[[0.368298, 0.117525], [0.545948, -0.229095], [-0.0, -0.0]], [[-0.19153, -0.335816], [0.11058, -0.581649], [0.0, 0.0]]], [[[0.012769, 0.59193], [-0.257165, -0.288655], [-0.0, -0.0]], [[-0.581649, 0.110581], [0.335816, 0.19153], [0.0, 0.0]]]], [[[[-0.364788, 0.002787], [-0.553276, 0.246593], [-0.0, -0.0]], [[-0.110075, -0.347795], [0.063552, -0.602398], [-0.0, 0.0]]], [[[0.0, 0.0], [0.0, -0.0], [-0.218508, -0.672499]], [[-0.0, -0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[-0.12571, -0.592553], [0.212162, 0.296757], [0.0, 0.0]], [[-0.602398, 0.063552], [0.347795, 0.110075], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, 0.0], [-0.218508, -0.672499]], [[-0.0, 0.0], [0.0, 0.0], [-0.707107, 0.0]]], [[[0.374522, 0.049921], [0.532216, -0.272007], [0.0, 0.0]], [[-0.163212, -0.340765], [0.09423, -0.590222], [-0.0, 0.0]]], [[[0.09277, 0.590453], [-0.260526, -0.273651], [0.0, 0.0]], [[-0.590222, 0.09423], [0.340765, 0.163212], [-0.0, 0.0]]]], [[[[0.358174, -0.053931], [0.52981, -0.296824], [0.0, 0.0]], [[0.096418, 0.349143], [-0.055663, 0.604735], [0.0, 0.0]]], [[[-0.0, -0.0], [-0.0, 0.0], [0.287606, 0.645974]], [[0.0, 0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[0.195114, 0.575094], [-0.23009, -0.279743], [-0.0, -0.0]], [[0.604735, -0.055666], [-0.349144, -0.096416], [-0.0, 0.0]]], [[[0.0, 0.0], [-0.0, -0.0], [0.287606, 0.645974]], [[0.0, -0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[0.370549, -0.014915], [0.513038, -0.315059], [0.0, 0.0]], [[-0.137091, -0.34458], [0.079149, -0.59683], [-0.0, 0.0]]], [[[0.170446, 0.577424], [-0.265392, -0.25903], [0.0, 0.0]], [[-0.59683, 0.079149], [0.34458, 0.137091], [-0.0, 0.0]]]], [[[[-0.34539, 0.102153], [-0.500975, 0.34539], [0.0, 0.0]], [[-0.084228, -0.350193], [0.048629, -0.606552], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.353553, -0.612372]], [[-0.0, -0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[-0.261162, -0.549604], [0.24804, 0.261162], [-0.0, -0.0]], [[-0.606552, 0.048628], [0.350193, 0.084228], [-0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [-0.353553, -0.612372]], [[0.0, -0.0], [-0.0, -0.0], [-0.707107, 0.0]]], [[[-0.357504, 0.075708], [-0.488518, 0.357504], [-0.0, -0.0]], [[0.113187, 0.347462], [-0.065349, 0.601821], [0.0, 0.0]]], [[[-0.244317, -0.553867], [0.271754, 0.244317], [-0.0, -0.0]], [[0.601821, -0.065349], [-0.347462, -0.113187], [0.0, 0.0]]]], [[[[0.327032, -0.147062], [0.467005, -0.391573], [-0.0, -0.0]], [[0.073249, 0.351015], [-0.04229, 0.607976], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.415627, 0.572061]], [[0.0, -0.0], [-0.0, -0.0], [-0.707107, 0.0]]], [[[-0.323146, -0.51672], [0.265581, 0.240922], [-0.0, -0.0]], [[-0.607976, 0.04229], [0.351015, 0.073249], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.415627, 0.572061]], [[-0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[-0.336759, 0.131195], [-0.458665, 0.398757], [0.0, 0.0]], [[0.091805, 0.349558], [-0.053001, 0.605452], [-0.0, 0.0]]], [[[-0.312996, -0.520975], [0.279736, 0.228837], [-0.0, -0.0]], [[0.605452, -0.053003], [-0.349558, -0.091804], [0.0, 0.0]]]], [[[[0.303569, -0.188417], [0.428279, -0.434652], [-0.0, -0.0]], [[0.063106, 0.351671], [-0.036435, 0.609112], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.473147, -0.525483]], [[-0.0, -0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[-0.3805, -0.477038], [0.282211, 0.219116], [-0.0, -0.0]], [[-0.609112, 0.036435], [0.351671, 0.063106], [-0.0, 0.0]]], [[[0.0, 0.0], [-0.0, -0.0], [-0.473147, -0.525483]], [[0.0, -0.0], [-0.0, -0.0], [-0.707107, 0.0]]], [[[-0.309911, 0.180385], [-0.423484, 0.438267], [-0.0, -0.0]], [[0.073318, 0.35101], [-0.042331, 0.607967], [0.0, 0.0]]], [[[0.375352, 0.480132], [-0.289358, -0.211792], [0.0, 0.0]], [[-0.607967, 0.04233], [0.35101, 0.073318], [-0.0, 0.0]]]], [[[[0.275392, -0.225974], [0.38526, -0.473994], [0.0, 0.0]], [[0.05345, 0.352204], [-0.030859, 0.610035], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.525483, -0.473147]], [[-0.0, -0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[0.432696, 0.431126], [-0.297504, -0.195949], [-0.0, -0.0]], [[0.610035, -0.030859], [-0.352204, -0.05345], [-0.0, 0.0]]], [[[-0.0, -0.0], [0.0, -0.0], [-0.525483, -0.473147]], [[-0.0, 0.0], [0.0, 0.0], [-0.707107, 0.0]]], [[[0.27853, -0.222833], [0.383087, -0.475405], [0.0, 0.0]], [[-0.057884, -0.35197], [0.03342, -0.609631], [-0.0, 0.0]]], [[[0.430683, 0.432757], [-0.300297, -0.192497], [-0.0, -0.0]], [[-0.60963, 0.033421], [0.351971, 0.057883], [0.0, 0.0]]]], [[[[0.242966, -0.259355], [0.338401, -0.509104], [0.0, 0.0]], [[0.044118, 0.352635], [-0.025472, 0.610781], [0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [-0.572061, -0.415627]], [[0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.47916, -0.379615], [0.31122, 0.171581], [0.0, 0.0]], [[-0.610781, 0.025472], [0.352635, 0.044118], [0.0, 0.0]]], [[[0.0, 0.0], [-0.0, 0.0], [0.572061, 0.415627]], [[0.0, -0.0], [-0.0, -0.0], [0.707107, 0.0]]], [[[-0.243874, 0.258635], [-0.337814, 0.509426], [0.0, 0.0]], [[0.045272, 0.352586], [-0.026142, 0.610696], [-0.0, 0.0]]], [[[-0.478697, -0.380108], [0.311858, 0.170619], [-0.0, -0.0]], [[0.610697, -0.026135], [-0.352586, -0.045277], [0.0, 0.0]]]], [[[[-0.206949, 0.288092], [-0.288092, 0.539609], [-0.0, -0.0]], [[-0.035177, -0.35297], [0.020309, -0.611361], [-0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [-0.612372, -0.353553]], [[-0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[0.5193, 0.323269], [-0.323269, -0.146021], [-0.0, -0.0]], [[0.611361, -0.020309], [-0.35297, -0.035177], [-0.0, 0.0]]], [[[-0.0, -0.0], [0.0, 0.0], [-0.612372, -0.353553]], [[-0.0, 0.0], [0.0, 0.0], [-0.707107, 0.0]]], [[[-0.206765, 0.288207], [-0.288207, 0.539557], [0.0, 0.0]], [[0.03496, 0.352977], [-0.020184, 0.611374], [-0.0, 0.0]]], [[[-0.519373, -0.323167], [0.323167, 0.146212], [-0.0, -0.0]], [[0.611374, -0.020184], [-0.352977, -0.03496], [0.0, 0.0]]]], [[[[-0.168156, 0.311774], [-0.234696, 0.565189], [0.0, 0.0]], [[-0.026808, -0.353214], [0.015478, -0.611785], [0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [-0.645974, -0.287606]], [[-0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[-0.552598, -0.262975], [0.333581, 0.119175], [0.0, 0.0]], [[-0.611785, 0.015478], [0.353215, 0.026808], [0.0, 0.0]]], [[[-0.0, -0.0], [0.0, 0.0], [-0.645974, -0.287606]], [[-0.0, -0.0], [0.0, -0.0], [-0.707107, 0.0]]], [[[-0.167717, 0.311983], [-0.234959, 0.565095], [0.0, 0.0]], [[0.026323, 0.353227], [-0.015196, 0.611806], [-0.0, 0.0]]], [[[0.552732, 0.262728], [-0.333395, -0.119623], [0.0, 0.0]], [[-0.611806, 0.015197], [0.353227, 0.026323], [-0.0, 0.0]]]], [[[[-0.127422, 0.330164], [-0.17862, 0.585534], [0.0, 0.0]], [[-0.01916, -0.35338], [0.011062, -0.612073], [0.0, 0.0]]], [[[0.0, 0.0], [-0.0, -0.0], [-0.672499, -0.218508]], [[-0.0, 0.0], [0.0, 0.0], [0.707107, 0.0]]], [[[-0.578697, -0.199661], [0.342005, 0.090979], [0.0, 0.0]], [[-0.612073, 0.011062], [0.35338, 0.01916], [0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [-0.672499, -0.218508]], [[-0.0, -0.0], [0.0, -0.0], [-0.707107, 0.0]]], [[[-0.126948, 0.330334], [-0.178499, 0.585578], [0.0, 0.0]], [[0.01902, 0.353376], [-0.010561, 0.612088], [-0.0, 0.0]]], [[[0.578764, 0.199488], [-0.341911, -0.091287], [0.0, 0.0]], [[-0.612083, 0.010875], [0.353386, 0.018838], [-0.0, 0.0]]]], [[[[0.085477, -0.343211], [0.120375, -0.600341], [-0.0, -0.0]], [[0.012251, 0.353483], [-0.007073, 0.61225], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [-0.691655, -0.147016]], [[-0.0, -0.0], [0.0, -0.0], [0.707107, 0.0]]], [[[-0.5974, -0.134213], [0.348306, 0.061509], [0.0, 0.0]], [[-0.61225, 0.007073], [0.353483, 0.012251], [0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.691655, 0.147016]], [[0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[-0.085362, 0.343237], [-0.120444, 0.600329], [-0.0, -0.0]], [[0.012132, 0.353484], [-0.007007, 0.612252], [0.0, 0.0]]], [[[0.597416, 0.134148], [-0.348282, -0.061627], [0.0, 0.0]], [[-0.612252, 0.007003], [0.353484, 0.012134], [-0.0, 0.0]]]], [[[[0.042875, -0.350978], [0.060589, -0.609348], [-0.0, -0.0]], [[0.005953, 0.353537], [-0.003437, 0.612343], [-0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [0.703233, 0.073913]], [[0.0, 0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[0.60863, 0.067426], [-0.352222, -0.031035], [-0.0, -0.0]], [[0.612343, -0.003436], [-0.353537, -0.005953], [-0.0, 0.0]]], [[[0.0, -0.0], [0.0, -0.0], [0.703233, 0.073913]], [[0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]]], [[[0.042854, -0.35098], [0.060592, -0.609348], [0.0, 0.0]], [[-0.00594, -0.353537], [0.00342, -0.612344], [-0.0, 0.0]]], [[[0.60863, 0.067421], [-0.35222, -0.031054], [0.0, 0.0]], [[-0.612344, 0.003422], [0.353537, 0.005939], [-0.0, 0.0]]]], [[[[0.0, 0.0], [-0.707107, 0.0], [-0.0, 0.0]], [[-0.0, 0.0], [0.707107, 0.0], [-0.0, 0.0]]], [[[-0.0, 0.0], [-0.0, 0.0], [0.707107, 0.0]], [[0.0, 0.0], [-0.0, 0.0], [-0.707107, 0.0]]], [[[0.706128, 0.0], [-0.037171, 0.0], [-0.001408, 0.0]], [[0.706128, 0.0], [-0.037171, 0.0], [-0.001408, 0.0]]], [[[0.002139, 0.0], [0.013843, 0.0], [0.706968, 0.0]], [[0.002139, 0.0], [0.013843, 0.0], [0.706968, 0.0]]], [[[0.037136, 0.0], [0.705993, 0.0], [-0.013937, 0.0]], [[0.037136, 0.0], [0.705993, 0.0], [-0.013937, 0.0]]], [[[0.707107, 0.0], [0.0, 0.0], [-0.0, 0.0]], [[-0.707107, 0.0], [-0.0, 0.0], [-0.0, 0.0]]]]]}
@@ -0,0 +1,55 @@
1
+ declare module "weas" {
2
+ export class Atoms {
3
+ constructor(props: {
4
+ symbols: string[];
5
+ positions: number[][];
6
+ cell: number[][];
7
+ });
8
+ }
9
+
10
+ export class VFManager {
11
+ addSetting(props: {
12
+ origins: string;
13
+ vectors: string;
14
+ color: string;
15
+ radius: number;
16
+ }): void;
17
+ show: boolean;
18
+ }
19
+
20
+ export class AtomsViewer {
21
+ modelStyle: number;
22
+ bondedAtoms: boolean;
23
+ atomScale: number;
24
+ bondManager: {
25
+ hideLongBonds: boolean;
26
+ };
27
+ boundary: number[][];
28
+ frameDuration: number;
29
+ VFManager: VFManager;
30
+ showCell: boolean;
31
+ drawModels(): void;
32
+ fromPhononMode(props: {
33
+ atoms: Atoms;
34
+ eigenvectors: number[][][];
35
+ amplitude: number;
36
+ nframes: number;
37
+ kpoint: number[];
38
+ repeat: number[];
39
+ }): void;
40
+ tjs: {
41
+ updateCameraAndControls(props: { direction: number[] }): void;
42
+ };
43
+ }
44
+
45
+ export class WEAS {
46
+ constructor(props: {
47
+ domElement: HTMLDivElement | null;
48
+ guiConfig: object;
49
+ viewerConfig: object;
50
+ });
51
+ avr: AtomsViewer;
52
+ clear(): void;
53
+ render(): void;
54
+ }
55
+ }
package/index.html ADDED
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/favicon.png" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>MC | Phonon visualizer</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.tsx"></script>
12
+ </body>
13
+ </html>
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "mc-react-phonon-visualizer",
3
+ "private": false,
4
+ "version": "0.1.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "start": "npm run dev",
9
+ "build": "tsc -b && vite build",
10
+ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
11
+ "preview": "vite preview",
12
+ "predeploy": "vite build",
13
+ "deploy": "gh-pages -d build"
14
+ },
15
+ "dependencies": {
16
+ "bootstrap": "^5.3.3",
17
+ "bootstrap-icons": "^1.11.3",
18
+ "plotly.js": "^2.33.0",
19
+ "react": "^18.3.1",
20
+ "react-bootstrap": "^2.10.2",
21
+ "react-dom": "^18.3.1",
22
+ "react-plotly.js": "^2.6.0",
23
+ "sass": "^1.77.4",
24
+ "weas": "^0.1.11"
25
+ },
26
+ "devDependencies": {
27
+ "@types/react": "^18.3.3",
28
+ "@types/react-dom": "^18.3.0",
29
+ "@types/react-plotly.js": "^2.6.3",
30
+ "@typescript-eslint/eslint-plugin": "^7.13.1",
31
+ "@typescript-eslint/parser": "^7.13.1",
32
+ "@vitejs/plugin-react-swc": "^3.5.0",
33
+ "eslint": "^8.57.0",
34
+ "eslint-plugin-react-hooks": "^4.6.2",
35
+ "eslint-plugin-react-refresh": "^0.4.7",
36
+ "typescript": "^5.2.2",
37
+ "vite": "^5.3.1"
38
+ }
39
+ }
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
package/src/App.scss ADDED
@@ -0,0 +1,3 @@
1
+ :root {
2
+ margin: 1em;
3
+ }
package/src/App.tsx ADDED
@@ -0,0 +1,14 @@
1
+ import PhononVisualizer from "./components/PhononVisualizer";
2
+
3
+ import data from "../data/test.json";
4
+
5
+ import "./App.scss";
6
+
7
+ function App() {
8
+ return (
9
+ // @ts-expect-error otherwise, each part of data would need unpacking
10
+ <PhononVisualizer props={{ title: "Demo", ...data }} />
11
+ );
12
+ }
13
+
14
+ export default App;
@@ -0,0 +1,160 @@
1
+ import { memo, useState } from "react";
2
+ import { Card } from "react-bootstrap";
3
+ import Plot from "react-plotly.js";
4
+
5
+ import { PlotDatum, PlotMouseEvent } from "plotly.js";
6
+
7
+ import { HighSymPoint } from "./types";
8
+
9
+ const BandsView = ({
10
+ distances,
11
+ highSymPoints,
12
+ eigenvalues,
13
+ updateMode,
14
+ }: {
15
+ distances: number[];
16
+ highSymPoints: HighSymPoint[];
17
+ eigenvalues: number[][];
18
+ updateMode: (event: PlotMouseEvent) => void;
19
+ }) => {
20
+ const [hoveredPoint, setHoveredPoint] = useState<PlotDatum | null>(null);
21
+ const [selectedPoint, setSelectedPoint] = useState<PlotDatum | null>(null);
22
+
23
+ const bands = eigenvalues[0].map((_, colIndex) =>
24
+ eigenvalues.map((row) => row[colIndex])
25
+ );
26
+
27
+ const handleSelection = (event: PlotMouseEvent) => {
28
+ updateMode(event);
29
+ setSelectedPoint(event.points[0]);
30
+ };
31
+
32
+ return (
33
+ <Card>
34
+ <Card.Header>Phonon band structure (select phonon)</Card.Header>
35
+ <Card.Body>
36
+ <Plot
37
+ data={bands.map((band, index) => ({
38
+ x: distances,
39
+ y: band,
40
+ mode: "lines+markers",
41
+ hoverinfo: "none",
42
+ line: {
43
+ color: "#1f77b4",
44
+ width: hoveredPoint?.curveNumber === index ? 4 : 2,
45
+ },
46
+ marker: {
47
+ // size should be 2 if hovered on, 4 if selected, 0 otherwise; hover/selection is determined by both x and y, no border
48
+ size: band.map((_, index) =>
49
+ selectedPoint?.x === distances[index] &&
50
+ selectedPoint?.y === band[index]
51
+ ? 10
52
+ : hoveredPoint?.x === distances[index] &&
53
+ hoveredPoint?.y === band[index]
54
+ ? 14
55
+ : 0
56
+ ),
57
+ color: band.map((_, index) =>
58
+ selectedPoint?.x === distances[index] &&
59
+ selectedPoint?.y === band[index]
60
+ ? "red"
61
+ : hoveredPoint?.x === distances[index] &&
62
+ hoveredPoint?.y === band[index]
63
+ ? "blue"
64
+ : "#1f77b4"
65
+ ),
66
+ // add opaque border around marker of width 1 (black) if selected, width 10 (lightblue) if hovered on
67
+ line: {
68
+ width: band.map((_, index) =>
69
+ selectedPoint?.x === distances[index] &&
70
+ selectedPoint?.y === band[index]
71
+ ? 1
72
+ : hoveredPoint?.x === distances[index] &&
73
+ hoveredPoint?.y === band[index]
74
+ ? 8
75
+ : 0
76
+ ),
77
+ color: band.map((_, index) =>
78
+ selectedPoint?.x === distances[index] &&
79
+ selectedPoint?.y === band[index]
80
+ ? "black"
81
+ : hoveredPoint?.x === distances[index] &&
82
+ hoveredPoint?.y === band[index]
83
+ ? "lightblue"
84
+ : "transparent"
85
+ ),
86
+ },
87
+ opacity: 1,
88
+ },
89
+ }))}
90
+ layout={{
91
+ showlegend: false,
92
+ hovermode: "closest",
93
+ xaxis: {
94
+ linewidth: 0,
95
+ linecolor: "transparent",
96
+ tickvals: highSymPoints.map(([index]) => distances[index]),
97
+ ticktext: highSymPoints.map(([, label]) => label),
98
+ range: [
99
+ Math.min(...distances.flat()),
100
+ Math.max(...distances.flat()),
101
+ ],
102
+ },
103
+ yaxis: {
104
+ title: "Frequency (cm-1)",
105
+ linewidth: 0,
106
+ linecolor: "transparent",
107
+ ticklen: 5,
108
+ range: [
109
+ Math.min(...eigenvalues.flat()),
110
+ Math.max(...eigenvalues.flat()),
111
+ ],
112
+ },
113
+ // vertical lines at high-symmetry points
114
+ shapes: highSymPoints.map(([index]) => ({
115
+ type: "line",
116
+ yref: "paper",
117
+ x0: distances[index],
118
+ y0: 0,
119
+ x1: distances[index],
120
+ y1: 1,
121
+ line: {
122
+ width: 0.5,
123
+ },
124
+ })),
125
+ dragmode: "zoom",
126
+ autosize: true,
127
+ margin: {
128
+ l: 55,
129
+ r: 10,
130
+ b: 25,
131
+ t: 40,
132
+ },
133
+ }}
134
+ onClick={handleSelection}
135
+ onHover={(event) => {
136
+ setHoveredPoint(event.points[0]);
137
+ }}
138
+ onUnhover={() => {
139
+ setHoveredPoint(null);
140
+ }}
141
+ config={{
142
+ scrollZoom: false,
143
+ displayModeBar: true,
144
+ displaylogo: false,
145
+ modeBarButtons: [["toImage", "resetScale2d"]],
146
+ }}
147
+ useResizeHandler={true}
148
+ style={{
149
+ width: "100%",
150
+ height: "100%",
151
+ }}
152
+ />
153
+ </Card.Body>
154
+ </Card>
155
+ );
156
+ };
157
+
158
+ const MemoizedBandsView = memo(BandsView);
159
+
160
+ export default MemoizedBandsView;
@@ -0,0 +1,24 @@
1
+ .overlay-div {
2
+ display: table;
3
+ z-index: 10000;
4
+ position: absolute;
5
+ left: 0;
6
+ top: 40px;
7
+ height: calc(100% - 40px);
8
+ width: 100%;
9
+ cursor: pointer;
10
+ background-color: rgba(0, 0, 0, 0.1);
11
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
12
+ user-select: none;
13
+ -moz-user-select: none;
14
+
15
+ span {
16
+ display: table-cell;
17
+ text-align: center;
18
+ vertical-align: middle;
19
+ line-height: normal;
20
+ font-size: 24px;
21
+ font-weight: 700;
22
+ color: rgb(80, 80, 80);
23
+ }
24
+ }
@@ -0,0 +1,140 @@
1
+ import { useCallback, useContext, useEffect, useRef, useState } from "react";
2
+ import { Card } from "react-bootstrap";
3
+
4
+ import { Atoms, WEAS } from "weas";
5
+
6
+ import ParametersContext from "./ParametersContext";
7
+ import { VisualizerProps } from "./types";
8
+
9
+ import "./CellView.scss";
10
+
11
+ const defaultGuiConfig = {
12
+ enabled: false,
13
+ components: {
14
+ atomsControl: true,
15
+ colorControl: true,
16
+ cameraControls: false,
17
+ buttons: true,
18
+ },
19
+ buttons: {
20
+ fullscreen: true,
21
+ undo: false,
22
+ redo: false,
23
+ download: true,
24
+ measurement: false,
25
+ },
26
+ };
27
+
28
+ const CellView = ({
29
+ props,
30
+ mode,
31
+ }: {
32
+ props: VisualizerProps;
33
+ mode: number[];
34
+ }) => {
35
+ const [isInteractive, setIsInteractive] = useState(false);
36
+ const viewerRef = useRef<HTMLDivElement | null>(null);
37
+ const weasRef = useRef<WEAS | null>(null);
38
+ const {
39
+ nx,
40
+ ny,
41
+ nz,
42
+ cameraDirection,
43
+ showCell,
44
+ amplitude,
45
+ vectorLength,
46
+ showVectors,
47
+ speed,
48
+ // isAnimated,
49
+ } = useContext(ParametersContext);
50
+
51
+ const toggleOverlay = useCallback(() => {
52
+ setIsInteractive((prevState) => !prevState);
53
+ }, []);
54
+
55
+ const Overlay = () => (
56
+ <div className="overlay-div">
57
+ <span>
58
+ Double-click to toggle interactions on and off <br />{" "}
59
+ <small>(This feature is not available on iPad and iPhone)</small>
60
+ </span>
61
+ </div>
62
+ );
63
+
64
+ useEffect(() => {
65
+ const [q, e] = mode;
66
+
67
+ const atoms = new Atoms({
68
+ symbols: props.atom_types,
69
+ positions: props.atom_pos_car,
70
+ cell: props.lattice,
71
+ });
72
+
73
+ if (!weasRef.current) {
74
+ const weas = new WEAS({
75
+ domElement: viewerRef.current,
76
+ guiConfig: defaultGuiConfig,
77
+ viewerConfig: { backgroundColor: "#0000FF" },
78
+ });
79
+ weas.avr.modelStyle = 1;
80
+ weas.avr.bondedAtoms = true;
81
+ weas.avr.atomScale = 0.1;
82
+ weas.avr.bondManager.hideLongBonds = false;
83
+ weasRef.current = weas;
84
+ }
85
+
86
+ const weas: WEAS = weasRef.current;
87
+
88
+ weas.clear();
89
+ weas.avr.fromPhononMode({
90
+ atoms: atoms,
91
+ eigenvectors: props.vectors[q][e],
92
+ amplitude: amplitude * 5,
93
+ nframes: 20 / speed,
94
+ kpoint: props.qpoints[q],
95
+ repeat: [nx, ny, nz],
96
+ });
97
+ weas.avr.boundary = [
98
+ [-0.01, 1.01],
99
+ [-0.01, 1.01],
100
+ [-0.01, 1.01],
101
+ ];
102
+
103
+ weas.avr.frameDuration = 4 / speed;
104
+ weas.avr.tjs.updateCameraAndControls({ direction: cameraDirection });
105
+ weas.avr.VFManager.addSetting({
106
+ origins: "positions",
107
+ vectors: "movement",
108
+ color: "red",
109
+ radius: 0.1,
110
+ });
111
+ weas.avr.showCell = showCell;
112
+ weas.avr.VFManager.show = showVectors;
113
+ weas.avr.drawModels();
114
+ weas.render();
115
+ }, [
116
+ amplitude,
117
+ mode,
118
+ props,
119
+ speed,
120
+ showCell,
121
+ showVectors,
122
+ cameraDirection,
123
+ nx,
124
+ ny,
125
+ nz,
126
+ vectorLength,
127
+ ]);
128
+
129
+ return (
130
+ <Card>
131
+ <Card.Header>Drag to rotate, scroll to zoom</Card.Header>
132
+ <Card.Body onDoubleClick={toggleOverlay}>
133
+ {!isInteractive && <Overlay />}
134
+ <div ref={viewerRef} style={{ width: "100%", height: "100%" }}></div>
135
+ </Card.Body>
136
+ </Card>
137
+ );
138
+ };
139
+
140
+ export default CellView;
@@ -0,0 +1,19 @@
1
+ #cellRepetitions {
2
+ display: flex;
3
+
4
+ input:not(:last-child) {
5
+ margin-right: 1em;
6
+ }
7
+ }
8
+
9
+ .controls-group {
10
+ align-items: center;
11
+ margin-bottom: 1rem;
12
+ }
13
+
14
+ #cameraControls {
15
+ button {
16
+ width: 40px;
17
+ margin-right: 0.25em;
18
+ }
19
+ }
@@ -0,0 +1,234 @@
1
+ import { memo, useContext } from "react";
2
+ import { Button, Card, Col, Form, Row } from "react-bootstrap";
3
+
4
+ import ParametersContext from "./ParametersContext";
5
+
6
+ import "./ControlsPanel.scss";
7
+
8
+ const ControlsPanel = () => {
9
+ const {
10
+ nx,
11
+ setNx,
12
+ ny,
13
+ setNy,
14
+ nz,
15
+ setNz,
16
+ setCameraDirection,
17
+ showCell,
18
+ setShowCell,
19
+ amplitude,
20
+ setAmplitude,
21
+ vectorLength,
22
+ setVectorLength,
23
+ showVectors,
24
+ setShowVectors,
25
+ speed,
26
+ setSpeed,
27
+ } = useContext(ParametersContext);
28
+
29
+ const updateCellRepetitions = (event: React.FormEvent<HTMLFormElement>) => {
30
+ event.preventDefault();
31
+ const x = parseInt((event.target as HTMLFormElement).cellRepetitionX.value);
32
+ const y = parseInt((event.target as HTMLFormElement).cellRepetitionY.value);
33
+ const z = parseInt((event.target as HTMLFormElement).cellRepetitionZ.value);
34
+ setNx(x);
35
+ setNy(y);
36
+ setNz(z);
37
+ };
38
+
39
+ const updateCamera = (event: React.MouseEvent<HTMLButtonElement>) => {
40
+ const camera = event.currentTarget.value;
41
+ switch (camera) {
42
+ case "x":
43
+ setCameraDirection([1, 0, 0]);
44
+ break;
45
+ case "y":
46
+ setCameraDirection([0, 1, 0]);
47
+ break;
48
+ case "z":
49
+ setCameraDirection([0, 0, 1]);
50
+ break;
51
+ default:
52
+ break;
53
+ }
54
+ };
55
+
56
+ const toggleCell = (event: React.ChangeEvent<HTMLInputElement>) => {
57
+ setShowCell(event.target.checked);
58
+ };
59
+
60
+ const handleAmplitudeTextInput = (
61
+ event: React.FormEvent<HTMLFormElement>
62
+ ) => {
63
+ event.preventDefault();
64
+ const textInput = event.currentTarget.querySelector("#amplitudeText");
65
+ if (!textInput) {
66
+ throw new Error("Text input not found");
67
+ }
68
+ const inputValue = parseFloat((textInput as HTMLInputElement).value);
69
+ updateAmplitude(inputValue);
70
+ };
71
+
72
+ const handleAmplitudeSliderInput = (
73
+ event: React.ChangeEvent<HTMLInputElement>
74
+ ) => {
75
+ if (event.target.value === "" || isNaN(parseFloat(event.target.value))) {
76
+ return;
77
+ }
78
+ const inputValue = parseFloat(event.target.value);
79
+ updateAmplitude(inputValue);
80
+ };
81
+
82
+ const updateAmplitude = (inputValue: number) => {
83
+ const value = inputValue < 0 ? 0 : inputValue > 1 ? 1 : inputValue;
84
+ setAmplitude(value);
85
+ const range = document.getElementById("amplitudeRange") as HTMLInputElement;
86
+ const text = document.getElementById("amplitudeText") as HTMLInputElement;
87
+ if (range && text) {
88
+ range.value = String(value);
89
+ text.value = String(value);
90
+ }
91
+ };
92
+
93
+ const updateVectors = (event: React.ChangeEvent<HTMLInputElement>) => {
94
+ setVectorLength(parseFloat(event.target.value));
95
+ };
96
+
97
+ const toggleVectors = (event: React.ChangeEvent<HTMLInputElement>) => {
98
+ setShowVectors(event.target.checked);
99
+ };
100
+
101
+ const updateSpeed = (event: React.ChangeEvent<HTMLInputElement>) => {
102
+ setSpeed(parseFloat(event.target.value));
103
+ };
104
+
105
+ return (
106
+ <Card>
107
+ <Card.Header>Settings</Card.Header>
108
+ <Card.Body>
109
+ <Form onSubmit={updateCellRepetitions}>
110
+ <Form.Group as={Row} className="controls-group">
111
+ <Form.Label>Repetitions</Form.Label>
112
+ <Col xs="8" id="cellRepetitions">
113
+ <Form.Control
114
+ id="cellRepetitionX"
115
+ defaultValue={nx}
116
+ type="number"
117
+ min="1"
118
+ />
119
+ <Form.Control
120
+ id="cellRepetitionY"
121
+ defaultValue={ny}
122
+ type="number"
123
+ min="1"
124
+ />
125
+ <Form.Control
126
+ id="cellRepetitionZ"
127
+ defaultValue={nz}
128
+ type="number"
129
+ min="1"
130
+ />
131
+ </Col>
132
+ <Col>
133
+ <Button type="submit">
134
+ <i className="bi bi-repeat" />
135
+ </Button>
136
+ </Col>
137
+ </Form.Group>
138
+ </Form>
139
+ <Form>
140
+ <Form.Group as={Row} id="cameraControls" className="controls-group">
141
+ <Col xs="3">
142
+ <Form.Label>Camera</Form.Label>
143
+ </Col>
144
+ <Col>
145
+ <Button variant="secondary" value="x" onClick={updateCamera}>
146
+ X
147
+ </Button>
148
+ <Button variant="secondary" value="y" onClick={updateCamera}>
149
+ Y
150
+ </Button>
151
+ <Button variant="secondary" value="z" onClick={updateCamera}>
152
+ Z
153
+ </Button>
154
+ </Col>
155
+ </Form.Group>
156
+ <Form.Group as={Row} className="controls-group">
157
+ <Col xs="3">
158
+ <Form.Label>Cell</Form.Label>
159
+ </Col>
160
+ <Col xs="1">
161
+ <Form.Check
162
+ label="On"
163
+ defaultChecked={showCell}
164
+ onChange={toggleCell}
165
+ />
166
+ </Col>
167
+ </Form.Group>
168
+ </Form>
169
+ <Form id="amplitudeControls" onSubmit={handleAmplitudeTextInput}>
170
+ <Form.Group as={Row} className="controls-group">
171
+ <Form.Label>Amplitude</Form.Label>
172
+ <Col xs="8">
173
+ <Form.Range
174
+ id="amplitudeRange"
175
+ min="0"
176
+ max="1"
177
+ step="0.01"
178
+ defaultValue={amplitude}
179
+ onChange={handleAmplitudeSliderInput}
180
+ />
181
+ </Col>
182
+ <Col>
183
+ <Form.Control
184
+ id="amplitudeText"
185
+ type="number"
186
+ min="0.01"
187
+ max="1"
188
+ step="0.001"
189
+ defaultValue={amplitude}
190
+ />
191
+ </Col>
192
+ </Form.Group>
193
+ </Form>
194
+ <Form>
195
+ <Form.Group as={Row} className="controls-group">
196
+ <Form.Label>Vectors</Form.Label>
197
+ <Col xs="8">
198
+ <Form.Range
199
+ min="1"
200
+ max="5"
201
+ step="0.1"
202
+ defaultValue={vectorLength}
203
+ onChange={updateVectors}
204
+ />
205
+ </Col>
206
+ <Col>
207
+ <Form.Check
208
+ label="On"
209
+ defaultChecked={showVectors}
210
+ onChange={toggleVectors}
211
+ />
212
+ </Col>
213
+ </Form.Group>
214
+ <Form.Group as={Row} className="controls-group">
215
+ <Form.Label>Speed</Form.Label>
216
+ <Col xs="8">
217
+ <Form.Range
218
+ min="0.1"
219
+ max="1"
220
+ step="0.01"
221
+ defaultValue={speed}
222
+ onChange={updateSpeed}
223
+ />
224
+ </Col>
225
+ </Form.Group>
226
+ </Form>
227
+ </Card.Body>
228
+ </Card>
229
+ );
230
+ };
231
+
232
+ const MemoizedControlsPanel = memo(ControlsPanel);
233
+
234
+ export default MemoizedControlsPanel;
@@ -0,0 +1,7 @@
1
+ import { createContext } from "react";
2
+
3
+ import useParameters from "./useParameters";
4
+
5
+ const ParametersContext = createContext({} as ReturnType<typeof useParameters>);
6
+
7
+ export default ParametersContext;
@@ -0,0 +1,15 @@
1
+ @media (max-width: 1400px) {
2
+ .visualizer-panel:not(:last-child) {
3
+ margin-bottom: 1.5em;
4
+ }
5
+ }
6
+
7
+ .visualizer-panel {
8
+ .card {
9
+ height: 100%;
10
+ }
11
+
12
+ .card-header {
13
+ text-align: center;
14
+ }
15
+ }
@@ -0,0 +1,53 @@
1
+ import { useCallback, useState } from "react";
2
+ import { Col, Container, Row } from "react-bootstrap";
3
+
4
+ import { PlotMouseEvent } from "plotly.js";
5
+
6
+ import ParametersContext from "./ParametersContext";
7
+ import { VisualizerProps } from "./types";
8
+ import useParameters from "./useParameters";
9
+
10
+ import MemoizedBandsView from "./BandsView";
11
+ import CellView from "./CellView";
12
+ import MemoizedControlsPanel from "./ControlsPanel";
13
+
14
+ import "./PhononVisualizer.scss";
15
+
16
+ const PhononVisualizer = ({ props }: { props: VisualizerProps }) => {
17
+ const parameters = useParameters(props.repetitions);
18
+ const [mode, setMode] = useState<number[]>([0, 0]);
19
+
20
+ const updateMode = useCallback(
21
+ (event: PlotMouseEvent) => {
22
+ const q = props.distances.indexOf(event.points[0].x as number);
23
+ const e = props.eigenvalues[q].indexOf(event.points[0].y as number);
24
+ setMode([q, e]);
25
+ },
26
+ [props]
27
+ );
28
+
29
+ return (
30
+ <ParametersContext.Provider value={parameters}>
31
+ <Container fluid>
32
+ <Row className="mb-xxl-4">
33
+ <Col xxl="3" className="visualizer-panel">
34
+ <MemoizedControlsPanel />
35
+ </Col>
36
+ <Col xxl="4" className="visualizer-panel">
37
+ <CellView props={props} mode={mode} />
38
+ </Col>
39
+ <Col xxl="5" className="visualizer-panel">
40
+ <MemoizedBandsView
41
+ distances={props.distances}
42
+ highSymPoints={props.highsym_qpts}
43
+ eigenvalues={props.eigenvalues}
44
+ updateMode={updateMode}
45
+ />
46
+ </Col>
47
+ </Row>
48
+ </Container>
49
+ </ParametersContext.Provider>
50
+ );
51
+ };
52
+
53
+ export default PhononVisualizer;
@@ -0,0 +1,21 @@
1
+ export type LatticeVector = [number, number, number];
2
+ export type Vector = [number, number, number];
3
+ export type HighSymPoint = [number, string];
4
+
5
+ export interface VisualizerProps {
6
+ title: string;
7
+ name: string;
8
+ natoms: number;
9
+ lattice: LatticeVector[];
10
+ atom_types: string[];
11
+ atom_numbers: number[];
12
+ formula: string;
13
+ qpoints: Vector[];
14
+ repetitions: number[];
15
+ atom_pos_car: Vector[];
16
+ atom_pos_red: Vector[];
17
+ eigenvalues: number[][];
18
+ distances: number[];
19
+ highsym_qpts: HighSymPoint[];
20
+ vectors: number[][][][][];
21
+ }
@@ -0,0 +1,37 @@
1
+ import { useState } from "react";
2
+
3
+ const useParameters = (repetitions: number[]) => {
4
+ const [Nx, Ny, Nz] = repetitions;
5
+ const [nx, setNx] = useState(Nx);
6
+ const [ny, setNy] = useState(Ny);
7
+ const [nz, setNz] = useState(Nz);
8
+ const [cameraDirection, setCameraDirection] = useState([0, 0, 1]);
9
+ const [showCell, setShowCell] = useState(true);
10
+ const [amplitude, setAmplitude] = useState(0.65);
11
+ const [vectorLength, setVectorLength] = useState(3.5);
12
+ const [showVectors, setShowVectors] = useState(true);
13
+ const [speed, setSpeed] = useState(0.25);
14
+
15
+ return {
16
+ nx,
17
+ setNx,
18
+ ny,
19
+ setNy,
20
+ nz,
21
+ setNz,
22
+ cameraDirection,
23
+ setCameraDirection,
24
+ showCell,
25
+ setShowCell,
26
+ amplitude,
27
+ setAmplitude,
28
+ vectorLength,
29
+ setVectorLength,
30
+ showVectors,
31
+ setShowVectors,
32
+ speed,
33
+ setSpeed,
34
+ };
35
+ };
36
+
37
+ export default useParameters;
package/src/main.scss ADDED
@@ -0,0 +1,2 @@
1
+ @import url("bootstrap-icons/font/bootstrap-icons.css");
2
+ @import url("bootstrap/dist/css/bootstrap.min.css");
package/src/main.tsx ADDED
@@ -0,0 +1,7 @@
1
+ import ReactDOM from "react-dom/client";
2
+
3
+ import App from "./App.tsx";
4
+
5
+ import "./main.scss";
6
+
7
+ ReactDOM.createRoot(document.getElementById("root")!).render(<App />);
@@ -0,0 +1 @@
1
+ /// <reference types="vite/client" />
@@ -0,0 +1,30 @@
1
+ {
2
+ "compilerOptions": {
3
+ "composite": true,
4
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
5
+ "target": "ES2020",
6
+ "useDefineForClassFields": true,
7
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
8
+ "module": "ESNext",
9
+ "skipLibCheck": true,
10
+
11
+ /* Bundler mode */
12
+ "moduleResolution": "bundler",
13
+ "allowImportingTsExtensions": true,
14
+ "resolveJsonModule": true,
15
+ "isolatedModules": true,
16
+ "moduleDetection": "force",
17
+ "noEmit": true,
18
+ "jsx": "react-jsx",
19
+
20
+ /* Linting */
21
+ "strict": true,
22
+ "noUnusedLocals": true,
23
+ "noUnusedParameters": true,
24
+ "noFallthroughCasesInSwitch": true,
25
+
26
+ /* Types */
27
+ "typeRoots": ["./node_modules/@types", "./declarations.d.ts"]
28
+ },
29
+ "include": ["src", "declarations.d.ts"]
30
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ {
5
+ "path": "./tsconfig.app.json"
6
+ },
7
+ {
8
+ "path": "./tsconfig.node.json"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "compilerOptions": {
3
+ "composite": true,
4
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
5
+ "skipLibCheck": true,
6
+ "module": "ESNext",
7
+ "moduleResolution": "bundler",
8
+ "allowSyntheticDefaultImports": true,
9
+ "strict": true,
10
+ "noEmit": true
11
+ },
12
+ "include": ["vite.config.ts"]
13
+ }
package/vite.config.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react-swc'
3
+
4
+ // https://vitejs.dev/config/
5
+ export default defineConfig({
6
+ plugins: [react()],
7
+ })