Compare commits

...

703 Commits

Author SHA1 Message Date
Cmdr McDonald
99c0bfcee1 Merge branch 'hotfix/2.2.10b' 2017-01-23 14:17:50 +00:00
Cmdr McDonald
37bfc700e9 Fix for direct entering of modifications 2017-01-23 14:17:42 +00:00
Cmdr McDonald
fcf0494df6 Merge branch 'release/2.10' 2017-01-23 13:05:21 +00:00
Cmdr McDonald
20ba6eb822 Tidy-ups prior to release 2017-01-23 13:05:14 +00:00
Cmdr McDonald
0e2c0349e0 Merge branch 'feature/blueprints' into develop 2017-01-22 17:16:40 +00:00
Cmdr McDonald
c49e2cff03 Lint and test fixes 2017-01-22 17:12:48 +00:00
Cmdr McDonald
d79313bfbe Fix shield boost values; add tooltips 2017-01-22 14:15:33 +00:00
Cmdr McDonald
fd404b5155 Handle heavy duty shield booster special modification value 2017-01-22 10:59:36 +00:00
Cmdr McDonald
49e72146b4 Only update relevant modification parameters 2017-01-22 09:02:32 +00:00
Cmdr McDonald
9b534b62c8 Add modification functionality 2017-01-21 10:34:08 +00:00
Cmdr McDonald
0be59af9b0 Allow selection of blueprints type and grade 2017-01-20 17:53:49 +00:00
Cmdr McDonald
029ba63aa5 Use new-style modification information 2017-01-19 22:25:13 +00:00
Cmdr McDonald
99e9e0c76f Merge branch 'feature/fixes' into develop 2017-01-15 23:06:13 +00:00
Cmdr McDonald
5bbc6e1cbe Use damage distribution numbers 2017-01-15 17:10:46 +00:00
Cmdr McDonald
1e5f66e528 Fix detailed export of module reinforcement packages 2017-01-15 17:07:12 +00:00
Cmdr McDonald
cdb837a25a Merge branch 'release/2.2.9' into develop 2017-01-14 16:24:18 +00:00
Cmdr McDonald
dd1175abf4 Merge branch 'release/2.2.9' 2017-01-14 16:24:09 +00:00
Cmdr McDonald
619976230d Bump version 2017-01-14 16:24:04 +00:00
Cmdr McDonald
2cb0d5209b Merge branch 'feature/falloff' into develop 2017-01-14 16:23:12 +00:00
Cmdr McDonald
ad06e23afa Add total DPS and effectiveness information to 'Damage Dealt' section 2017-01-14 16:20:48 +00:00
Cmdr McDonald
3def84e435 Use better DPE calculation methodology 2017-01-14 13:15:15 +00:00
Cmdr McDonald
7f377d6345 Add and use range when calculating weapon effectiveness for damage dealt 2017-01-14 13:10:09 +00:00
Cmdr McDonald
53137e0ae1 Add falloff for weapons 2017-01-14 09:52:31 +00:00
Cmdr McDonald
792eda2572 Use SSL-enabled server for shortlinks 2017-01-13 20:05:45 +00:00
Cmdr McDonald
550c94fa94 Merge branch 'release/2.2.8' into develop 2017-01-13 11:42:36 +00:00
Cmdr McDonald
2a841281d4 Merge branch 'release/2.2.8' 2017-01-13 11:42:31 +00:00
Cmdr McDonald
260f29834a Update release notes 2017-01-13 11:35:01 +00:00
Cmdr McDonald
ddb35d321c Fix issue where filling all internals with cargo racks would include restricted slots 2017-01-13 11:34:18 +00:00
Cmdr McDonald
6017c1ecff Merge branch 'release/2.2.7' into develop 2017-01-11 21:59:09 +00:00
Cmdr McDonald
05e06f30f5 Merge branch 'release/2.2.7' 2017-01-11 21:59:01 +00:00
Cmdr McDonald
fb5ba6a0b2 Update damage dealt to use actual resistances 2017-01-11 21:57:49 +00:00
Cmdr McDonald
80656a7a78 Fix resistance diminishing return calculations 2017-01-11 21:33:31 +00:00
Cmdr McDonald
ce980cf091 Merge branch 'release/2.2.6' into develop 2017-01-10 19:34:18 +00:00
Cmdr McDonald
a4656e223a Merge branch 'release/2.2.6' 2017-01-10 19:34:10 +00:00
Cmdr McDonald
66d4b5ac4c Fix tests due to new module values 2017-01-10 19:30:43 +00:00
Cmdr McDonald
6961469ae5 Merge branch 'feature/changes' into develop 2017-01-10 19:15:56 +00:00
Cmdr McDonald
06f4abdf8b Import builds with military slots 2017-01-10 19:12:19 +00:00
Cmdr McDonald
7855d0e171 Reinstate jump range graph 2017-01-02 12:06:44 +00:00
Cmdr McDonald
40f213c883 Do not lose ship selector selection on narrow screens 2017-01-02 12:05:55 +00:00
Cmdr McDonald
be1bfeb6f3 Ensure that information is not lost on narrow screens. Fix for #48 2017-01-02 12:05:22 +00:00
Cmdr McDonald
b40a2e96e0 Fix for change to military slots 2016-12-24 23:49:33 +00:00
Cmdr McDonald
5f036c586c Use own URL shortener 2016-12-24 21:57:11 +00:00
Cmdr McDonald
091789c819 Revert overloading of 'reload' translation key 2016-12-24 20:57:51 +00:00
Cmdr McDonald
0ce8bfac79 Fixes for #46 2016-12-24 20:56:37 +00:00
Cmdr McDonald
e53ffd0273 Update shield recovery/regeneration calculations 2016-12-20 13:58:00 +00:00
Cmdr McDonald
bb7db144d6 Allow collapse/expand of damage sections 2016-12-19 21:50:53 +00:00
Cmdr McDonald
2e42a328e0 Add base resistances to defence summary tooltip 2016-12-19 17:56:54 +00:00
Cmdr McDonald
f82122f29f Add module copy functionality - drag module whilst holding 'alt' to copy 2016-12-18 21:37:21 +00:00
Cmdr McDonald
5bf907809d Make weapons real modules to benefits from standard DPS etc. calculations 2016-12-18 21:26:30 +00:00
Cmdr McDonald
51d7b6c9aa Add 'Piercing' information to hardpoints; add 'Hardness' information to ship summary 2016-12-18 09:36:33 +00:00
Cmdr McDonald
b8cff0c2fc Add 'Damage received' section 2016-12-17 10:46:52 +00:00
Cmdr McDonald
6ac69a6388 Add translation 2016-12-16 21:16:17 +00:00
Cmdr McDonald
32282141cf Use ship rather than ship ID 2016-12-16 21:09:11 +00:00
Cmdr McDonald
059c2badf4 Lint 2016-12-16 20:38:58 +00:00
Cmdr McDonald
fb090618da Add 'Damage dealt' section 2016-12-16 20:37:06 +00:00
Cmdr McDonald
9ed0e30538 Add hardness to shipyard 2016-12-16 16:25:57 +00:00
Cmdr McDonald
af82b8ca1e Fix up tests 2016-12-15 16:46:38 +00:00
Cmdr McDonald
6e18793d82 Lint fix 2016-12-14 22:41:10 +00:00
Cmdr McDonald
22e74164c5 Alternate (embedded) code versioning scheme; start to fix up tests 2016-12-14 22:38:21 +00:00
Cmdr McDonald
93ba1bf67a Do not include disabled shield boosters in calculations 2016-12-14 17:39:01 +00:00
Cmdr McDonald
46ed9003dd Tidy-ups 2016-12-14 13:31:20 +00:00
Cmdr McDonald
5603315bf0 Version URLs to handle changes to ship specifications over time 2016-12-14 13:23:54 +00:00
Cmdr McDonald
5bbc6be3d8 Obey restricted slot rules when adding all for internal slots 2016-12-14 13:23:19 +00:00
Cmdr McDonald
203e9c7b46 Fix for importing definitions with missing slots 2016-12-14 08:49:23 +00:00
Cmdr McDonald
2a6850ded0 Set initial shield boost correctly 2016-12-13 22:08:49 +00:00
Cmdr McDonald
041f873f97 Updates 2016-12-13 18:56:59 +00:00
Cmdr McDonald
b944035541 Use separate speed/rotation/acceleration multipliers for thrusters if available 2016-12-12 13:37:36 +00:00
Cmdr McDonald
7c6a4fc5f8 Do not rely on coriolis-data' internal ordering of modules for display purposes 2016-12-12 10:38:50 +00:00
Cmdr McDonald
5426b55637 Ensure module ordering is consistent 2016-12-12 10:28:54 +00:00
Cmdr McDonald
a6a10df39c Add movement summary; add standard internal class sizes to shipyard page; fix issue when importing Viper Mk IV 2016-12-11 21:52:49 +00:00
Cmdr McDonald
0dc58bad7e Beta version 2016-12-03 15:52:17 +00:00
Cmdr McDonald
794faacbd4 Merge branch 'release/2.2.5' into develop 2016-12-03 15:48:50 +00:00
Cmdr McDonald
0a37b36ec2 Merge branch 'release/2.2.5' 2016-12-03 15:48:45 +00:00
Cmdr McDonald
85e6796e88 Bump version 2016-12-03 15:48:39 +00:00
Cmdr McDonald
fa1ef47b71 Add note to disable ghostery in error situations 2016-12-01 13:26:33 +00:00
Cmdr McDonald
f31e3c09f4 Merge branch 'feature/rebalance' into develop 2016-12-01 10:28:21 +00:00
Cmdr McDonald
e6ab536601 Merge branch 'feature/rebalance' of https://github.com/EDCD/coriolis into feature/rebalance 2016-12-01 10:28:08 +00:00
Cmdr McDonald
5bced9fe56 Bump version number 2016-11-30 15:09:25 +00:00
Cmdr McDonald
67742060d3 Merge branch 'feature/burst' into develop 2016-11-30 15:09:04 +00:00
Cmdr McDonald
ca2136544c Handle unmodifiable values 2016-11-30 15:08:32 +00:00
Cmdr McDonald
ee19e9af50 Lint 2016-11-30 14:56:33 +00:00
Cmdr McDonald
f457fd0bff Fixes for burst calculations 2016-11-30 14:51:19 +00:00
Cmdr McDonald
c1ce07e039 Calculate rate of fire for multi-burst weapons 2016-11-30 12:19:40 +00:00
Cmdr McDonald
c8d1536f77 Bump version number 2016-11-29 13:53:23 +00:00
Cmdr McDonald
231ad4af59 Merge branch 'release/2.2.4' into develop 2016-11-28 16:54:35 +00:00
Cmdr McDonald
d5f61d7ae8 Merge branch 'release/2.2.4' 2016-11-28 16:54:32 +00:00
Cmdr McDonald
8a5d4a36bf Bumped revision 2016-11-28 16:51:24 +00:00
Cmdr McDonald
2c9237626d Show specials; handle import of specials 2016-11-27 19:43:43 +00:00
Cmdr McDonald
37f889e317 Merge branch 'feature/incendiary' into develop 2016-11-26 23:24:37 +00:00
Cmdr McDonald
f86ba48295 Fix tests 2016-11-26 18:58:29 +00:00
Cmdr McDonald
aac35633a3 Merge branch 'feature/incendiary' of https://github.com/EDCD/coriolis into feature/incendiary 2016-11-26 18:56:57 +00:00
Cmdr McDonald
e73e0a305d Use new-style modification data 2016-11-26 18:54:22 +00:00
Cmdr McDonald
4b2b0efe37 Allow non-numeric modifiers 2016-11-26 18:54:22 +00:00
Cmdr McDonald
8fe20f6f65 Checkpoint - handle non-numeric modifiers 2016-11-26 18:54:22 +00:00
Cmdr McDonald
11af7f567a Move to method for damage type to allow for modifications 2016-11-26 18:54:22 +00:00
Cmdr McDonald
3b8444482f Add URL shortlink for outfitting page 2016-11-26 18:53:47 +00:00
Cmdr McDonald
c09e1b1b3e Merge branch 'feature/incendiary' of https://github.com/EDCD/coriolis into feature/incendiary 2016-11-26 13:16:38 +00:00
Cmdr McDonald
5770cf8d39 Use new-style modification data 2016-11-26 13:15:43 +00:00
Cmdr McDonald
6da09f2e5d Allow non-numeric modifiers 2016-11-26 13:15:43 +00:00
Cmdr McDonald
294fadf7cd Checkpoint - handle non-numeric modifiers 2016-11-26 13:15:43 +00:00
Cmdr McDonald
2a97678574 Move to method for damage type to allow for modifications 2016-11-26 13:15:43 +00:00
Cmdr McDonald
76b3bd34f5 Use new-style modification data 2016-11-26 12:54:22 +00:00
Cmdr McDonald
02bfecb92d Allow non-numeric modifiers 2016-11-24 22:23:14 +00:00
Cmdr McDonald
719759ad56 Merge branch 'release/2.2.3' into develop 2016-11-24 14:37:43 +00:00
Cmdr McDonald
fd446b29ba Merge branch 'release/2.2.3' 2016-11-24 14:37:39 +00:00
Cmdr McDonald
e5552d3e10 Updates ready for release 2016-11-24 13:49:37 +00:00
Cmdr McDonald
50946eeeb8 Fix misnamed diamondbacks - issue #36 2016-11-24 13:19:14 +00:00
Cmdr McDonald
faab41117c Checkpoint - handle non-numeric modifiers 2016-11-24 12:50:33 +00:00
Cmdr McDonald
0ab59c1f9a Handle import of restricted slots - fix for #35 2016-11-24 11:10:41 +00:00
Cmdr McDonald
1067dceaa3 Move to method for damage type to allow for modifications 2016-11-23 13:02:23 +00:00
Cmdr McDonald
9042de422a patch 2016-11-23 01:05:13 +00:00
Cmdr McDonald
f0547feb93 Merge branch 'feature/blueprints' into develop 2016-11-23 00:56:19 +00:00
Cmdr McDonald
f863daa347 Fix hull boost calculation. Partial fix for #29 2016-11-23 00:54:42 +00:00
Cmdr McDonald
fdb202e7d6 Add blueprints 2016-11-22 15:52:31 +00:00
Cmdr McDonald
c6bde19052 Merge branch 'release/2.2.2' into develop 2016-11-21 16:44:19 +00:00
Cmdr McDonald
f6aff3d3bb Merge branch 'release/2.2.2' 2016-11-21 16:44:15 +00:00
Cmdr McDonald
2f4a2ebe03 Bumped release 2016-11-21 16:42:17 +00:00
Cmdr McDonald
ca20e94b93 Merge branch 'feature/res' into develop 2016-11-21 16:39:25 +00:00
Cmdr McDonald
40a87dceeb Update tooltip to match reality 2016-11-21 11:34:45 +00:00
Cmdr McDonald
95b7d60be4 Fix URL strings for query parameter method 2016-11-21 11:33:34 +00:00
Cmdr McDonald
24abd6583f Remove requirement for double encoding 2016-11-21 10:14:16 +00:00
Cmdr McDonald
8857aba53f Use query parameters rather than long path 2016-11-21 10:06:14 +00:00
Cmdr McDonald
e4830811b0 Fix up jitter 2016-11-17 14:23:40 +00:00
Cmdr McDonald
143380ac58 Tidy-ups 2016-11-16 20:58:35 +00:00
Cmdr McDonald
a2f6fb6ac0 Added help tooltip for modifications 2016-11-16 20:49:22 +00:00
Cmdr McDonald
0d3c128059 Lints and tests 2016-11-15 13:38:02 +00:00
Cmdr McDonald
930a555425 Update costs for reload 2016-11-15 13:33:59 +00:00
Cmdr McDonald
d6f213fbe7 Remove logging 2016-11-14 23:02:56 +00:00
Cmdr McDonald
0571e8e099 Added jitter for hardpoints 2016-11-14 22:58:09 +00:00
Cmdr McDonald
54c61ecb7d Fix base armour 2016-11-14 22:18:16 +00:00
Cmdr McDonald
030867c4f8 Update test results 2016-11-14 16:47:28 +00:00
Cmdr McDonald
33a7c71fec Tweaks for restoring data from previous builds 2016-11-14 16:39:58 +00:00
Cmdr McDonald
4e0f682ad6 Use forrked browserify-zlib as it has bug fixes 2016-11-14 12:17:30 +00:00
Cmdr McDonald
4486aa2e2b Handle saved builds and old URLs 2016-11-14 11:57:39 +00:00
Cmdr McDonald
0c94c81746 Remove explicit bulkheads name from slot 2016-11-13 21:02:39 +00:00
Cmdr McDonald
5b037e3a00 Additional info if import fails 2016-11-13 17:04:57 +00:00
Cmdr McDonald
42a2b907ce Linting 2016-11-13 16:51:07 +00:00
Cmdr McDonald
a65dae1631 Various fixes; allow direct import from URL 2016-11-13 16:42:59 +00:00
Cmdr McDonald
7d4c534956 Re-enable shields for comparison 2016-11-13 13:44:00 +00:00
Cmdr McDonald
8397d3505b Rework per-module resistance calculations 2016-11-13 13:13:57 +00:00
Cmdr McDonald
9556f28ba4 Add ability to import directly from companion API output 2016-11-12 12:02:52 +00:00
Cmdr McDonald
f489257f86 Update shield cell numbers when appropriate 2016-11-11 12:30:32 +00:00
Cmdr McDonald
c96693c439 Tidy up descriptions; allow total cost to be non-integer 2016-11-11 12:19:08 +00:00
Cmdr McDonald
3d4f6d7861 Slightly friendlier modifications 2016-11-11 12:04:30 +00:00
Cmdr McDonald
606eabfec7 Fix issues with losing precision due to using decimal modification values. Validate modification information 2016-11-11 11:15:56 +00:00
Cmdr McDonald
782603727a Re-add recovery/recharge times and tweak styling 2016-11-11 00:39:14 +00:00
Cmdr McDonald
ad570534a0 Update test outputs 2016-11-11 00:21:53 +00:00
Cmdr McDonald
87e903e473 Add 'Offence summary' and 'Defence summary' components 2016-11-11 00:15:49 +00:00
Cmdr McDonald
cf6d32ea04 Enable boost display even if power distributor is disabled 2016-11-10 22:15:42 +00:00
Cmdr McDonald
5b81a0b25f Fix modification value for additive modifications 2016-11-10 15:18:05 +00:00
Cmdr McDonald
0688faac93 Added offence and defence summary 2016-11-10 00:13:56 +00:00
Cmdr McDonald
3719bb9696 Merge branch 'feature/fixes' into develop 2016-11-09 19:05:43 +00:00
Cmdr McDonald
21582d1598 Handle potentially null modifications object 2016-11-09 18:57:45 +00:00
Cmdr McDonald
9a9607fcfb Merge branch 'gienkov-pl-language' into feature/fixes 2016-11-09 16:41:19 +00:00
Cmdr McDonald
8602c5667b Merge branch 'pl-language' of https://github.com/gienkov/coriolis into gienkov-pl-language 2016-11-09 16:40:43 +00:00
Cmdr McDonald
f13a987388 Lint tidy-ups 2016-11-09 16:40:22 +00:00
Cmdr McDonald
38eaebefc0 Fix import and export of ships with modifications, bump schema version to 4 2016-11-09 16:32:11 +00:00
Cmdr McDonald
c1bc514e6b Remove swapfile 2016-11-08 09:29:32 +00:00
Cmdr McDonald
42e98fd015 Fix tooltip DPS 2016-11-08 09:25:01 +00:00
Cmdr McDonald
5f0b851de7 Take modifications in to account when deciding whether to issue a
warning on a standard module.
Fix for #16.
2016-11-08 09:05:54 +00:00
Cmdr McDonald
616ed0bf10 Show modification icon for modified modules
Fix for #14
2016-11-07 17:11:39 +00:00
Cmdr McDonald
108ab3b1ee Update DPS/HPS/EPS in real-time as modifiers change 2016-11-07 10:15:20 +00:00
Cmdr McDonald
04caef9613 Merge branch 'release/2.2.1' into develop 2016-11-05 14:39:28 +00:00
Cmdr McDonald
cae7edbe01 Merge branch 'release/2.2.1' 2016-11-05 14:39:21 +00:00
Cmdr McDonald
2fa96fc1a5 Bump version 2016-11-05 14:37:37 +00:00
Cmdr McDonald
6b8a4d1f85 Merge branch 'feature/mods' into develop 2016-11-05 14:03:24 +00:00
Cmdr McDonald
07df44a907 Allow 3dp for ship and module discounts 2016-11-05 13:59:23 +00:00
Cmdr McDonald
be45637435 Use GZIP to decrease length of modifications URL string 2016-11-05 13:43:57 +00:00
Cmdr McDonald
87ab684ba3 Use degree symbol for jitter 2016-11-04 23:58:03 +00:00
Cmdr McDonald
916a6d5e48 Show shield boost decimal place 2016-11-04 23:00:19 +00:00
Cmdr McDonald
b99fbf07f5 Fix up name of shield boost 2016-11-04 22:34:08 +00:00
Cmdr McDonald
6d6ef2a93e Provide weights to 2dp 2016-11-04 20:53:05 +00:00
Cmdr McDonald
d08e5e2858 Fixes for serialization 2016-11-04 17:13:28 +00:00
Cmdr McDonald
c1f4a8d416 Add tooltips for icons; fix import of old-style modification strings 2016-11-04 13:12:44 +00:00
Cmdr McDonald
c17c7125e3 Tidy-ups 2016-11-04 11:34:39 +00:00
Cmdr McDonald
97fc4ce45d Fixes and tidy-ups 2016-11-04 11:31:48 +00:00
Cmdr McDonald
abfc338240 Tidy-ups 2016-11-03 16:19:13 +00:00
Cmdr McDonald
3d129946ce Updates module diff details 2016-11-03 12:23:25 +00:00
Cmdr McDonald
2aab31d317 Fix typo 2016-11-03 11:33:00 +00:00
Cmdr McDonald
f8ff9a6a87 Add more fillouts 2016-11-03 11:29:41 +00:00
Cmdr McDonald
6727c2fc13 Move to pure damage/distdraw/thermload numbers 2016-11-03 10:52:54 +00:00
Cmdr McDonald
ba1f11a88b Updates for shield strength 2016-11-02 14:14:15 +00:00
Cmdr McDonald
c88e4369c8 Update to handle armour 2016-11-02 13:32:49 +00:00
Cmdr McDonald
c490f97c22 Use modifiers when calculating regen rates 2016-11-02 11:11:45 +00:00
Cmdr McDonald
7c71555384 Added facing limit and range for fsdi 2016-11-02 11:03:29 +00:00
Cmdr McDonald
35538f971a Tidy-ups 2016-11-02 10:47:10 +00:00
Cmdr McDonald
b3c82ac2de Added (non-functional) resistances 2016-11-02 10:35:55 +00:00
Cmdr McDonald
ff0d8dccea Handle bulkheads 2016-11-02 09:54:52 +00:00
Cmdr McDonald
06841b1485 Change arc to facinglimit 2016-11-01 12:22:03 +00:00
Cmdr McDonald
f55448c0a8 Ensure that fuel tank mass is displayed 2016-11-01 07:24:38 +00:00
Cmdr McDonald
258701c377 Separate modification slider in to its own component 2016-10-31 23:19:22 +00:00
Cmdr McDonald
1a0f05511b Various bug fixes 2016-10-31 21:08:15 +00:00
Cmdr McDonald
3ec9679893 Tidy up diff 2016-10-31 12:13:03 +00:00
Cmdr McDonald
e5cc3e269e Updates for modifications 2016-10-31 11:22:36 +00:00
Cmdr McDonald
4b14f617ec Changes for mods 2016-10-30 20:54:36 +00:00
Cmdr McDonald
0df051e40f Move more values to functions over direct variable access 2016-10-29 23:32:52 +01:00
Cmdr McDonald
2b464f34e5 Use react-number-editor for modifications 2016-10-29 14:14:57 +01:00
Cmdr McDonald
7a33bd64f8 Updates to modifications menu 2016-10-28 01:46:21 +01:00
Cmdr McDonald
3656c7a18f Update naming to match Elite names 2016-10-27 15:11:23 +01:00
Cmdr McDonald
3114852c63 Updates for mods UI 2016-10-27 13:26:09 +01:00
Cmdr McDonald
45337913ba Make modifications icon clickable 2016-10-25 13:36:46 +01:00
Cmdr McDonald
adc5d1c039 Only show modifications icon if the module has valid modifications. Use no more than two decimal places for modification values. 2016-10-24 18:40:12 +01:00
Cmdr McDonald
183f22c223 Updates to internal representation of modification information. Temporary power usage slider with standard modules for testing 2016-10-24 00:38:12 +01:00
Cmdr McDonald
43eb4935e6 Merge branch 'master' into develop 2016-10-22 21:03:35 +01:00
Cmdr McDonald
2c45011664 Rework modules to be individual objects rather than references to templates 2016-10-22 09:47:43 +01:00
Cmdr McDonald
f29f3f4f8f Merge branch 'release/2.2.0' into develop 2016-10-22 09:31:08 +01:00
Cmdr McDonald
c347336055 Merge branch 'release/2.2.0' 2016-10-22 09:31:05 +01:00
Cmdr McDonald
cd87184169 Apply discounts when ship updates 2016-10-17 19:30:58 +01:00
Cmdr McDonald
09895852c3 Fixes for tests 2016-10-17 15:12:05 +01:00
Cmdr McDonald
32759d3e0e Fix lint issues 2016-10-17 14:33:24 +01:00
Cmdr McDonald
965134fc02 Fix serializer for named standard modules - #2 2016-10-17 14:33:12 +01:00
Cmdr McDonald
7da5360349 Bumped release number 2016-10-16 13:50:45 +01:00
Cmdr McDonald
bf0701340c Use UTF-8 glyph for infinity rather than custom SVG 2016-10-15 09:10:40 +01:00
Cmdr McDonald
a3a490f442 Merge branch 'feature/cabins' into develop 2016-10-14 17:12:57 +01:00
Cmdr McDonald
33b22b8280 Use correct i18n formatting methods. Update note to 2.2 2016-10-14 14:53:20 +01:00
Cmdr McDonald
e6278858b9 Added drag and drop logic for special compartments 2016-10-14 12:09:54 +01:00
Cmdr McDonald
ed7a9ef037 Display new-style hardpoint information 2016-10-14 01:04:05 +01:00
Cmdr McDonald
9c42179617 Handle fighter bays and luxury passenger cabins 2016-10-12 11:48:42 +01:00
Grzegorz
5634fbd568 pl language 2016-10-10 17:47:37 +02:00
Grzegorz
7d99d59790 pl option in menu 2016-10-10 17:39:17 +02:00
Paul Heisig
5f75c9d32b final changes before coriolis.edcd.io launch 2016-10-09 20:49:29 +02:00
Jonathan Harris
fe1d16415e Update links 2016-10-09 11:35:59 +01:00
Jonathan Harris
ed8cbb403e Point badges to this fork 2016-10-09 11:24:17 +01:00
Jonathan Harris
58182bddce Pass lint 2016-10-09 11:21:06 +01:00
Jonathan Harris
771ba7e692 Remove debugging statement 2016-10-09 11:18:36 +01:00
Paul Heisig
ed0d4ddc48 making coriolis enhanced deploy ready... 2016-10-07 21:26:27 +02:00
Paul Heisig
266c63bc0c test commit 2016-10-07 19:21:01 +02:00
Colin McLeod
ebcc92f7d4 Allow external webpack hotloading 2016-06-18 19:59:29 -07:00
Colin McLeod
a1f280cf62 Allow middle click, Fixes #173 2016-06-18 19:59:09 -07:00
Colin McLeod
0306167e6e Cleanup wepback devserver output 2016-06-18 19:47:20 -07:00
Colin McLeod
162136194a Add build name to title, Fixes #171 2016-06-18 19:46:20 -07:00
Colin McLeod
3600a4862f Merge pull request #172 from w0rm49/translation-fixes
fix some typos and errors in russian translation
2016-06-15 20:19:50 -07:00
w0rm49
65fdad64b2 fix some typos and errors in russian translation 2016-06-08 16:23:10 +03:00
Colin McLeod
b49eb06101 Use IDs for standard components instead of [class][rating]. Update tests accordingly 2016-06-06 00:07:21 -07:00
Colin McLeod
eeb4a86a13 Allow 'named' standard module (special case for bulkheads) 2016-06-05 00:56:09 -07:00
Colin McLeod
3a265b2804 Update version to 2.0.0. Update react to v15 2016-06-05 00:54:35 -07:00
Colin McLeod
5ebabd6e6e Tweak string interpolation based on React v15 changes 2016-06-05 00:54:02 -07:00
Colin McLeod
6e6c337bbb Use table to align settings. Fixes #163 2016-06-05 00:52:23 -07:00
Colin McLeod
31b56354e0 Update French translations 2016-06-05 00:51:41 -07:00
Colin McLeod
fd1adbe55c Update German translations 2016-06-05 00:51:19 -07:00
Colin McLeod
3d0259c304 Fix lint issues 2016-04-04 13:02:26 -07:00
Colin McLeod
6f1b86118e Bump beta version 2016-04-04 12:52:31 -07:00
Colin McLeod
b3fcfa7808 Improve scrolling overview of shipyard page 2016-04-04 12:52:05 -07:00
Colin McLeod
4ead80a37c Improve touch detection 2016-04-04 12:51:46 -07:00
Colin McLeod
72dc73e090 Include discounts on comparison page 2016-04-04 12:31:54 -07:00
Colin McLeod
bb19dc25c0 Autofill sensor bug fix 2016-04-04 12:31:27 -07:00
Colin McLeod
1729636657 Make boost speed 0 when unable to boost 2016-04-04 12:30:18 -07:00
Colin McLeod
92809d1d24 Fix scrolling and hover issues on tablet 2016-04-04 12:29:59 -07:00
Colin McLeod
4e81c828df Fix JEST mock issue 2016-03-20 00:36:21 -07:00
Colin McLeod
f5bd7d2ecb Lint fix 2016-03-20 00:35:40 -07:00
Colin McLeod
a989bd5b5d Include migrate.html with prod build 2016-03-19 23:28:02 -07:00
Colin McLeod
1bedbb1909 Take discount into consideration for module tool tip 2016-03-19 23:27:43 -07:00
Colin McLeod
9775e1c742 Refactor footer, UI tweaks 2016-03-19 23:27:26 -07:00
Colin McLeod
19228a9c56 Change hold alt messaging 2016-03-19 23:25:42 -07:00
Colin McLeod
363bf7fd2a Shipyard page changes - in progress 2016-03-10 12:29:19 -08:00
Colin McLeod
15748066c9 Bulkhead refactoring 2016-03-10 12:29:02 -08:00
Colin McLeod
c3fe0a0cef UI Tweaks 2016-03-10 12:28:35 -08:00
Colin McLeod
1544deb350 Update tests for eagle changes 2016-03-07 09:14:48 -08:00
Colin McLeod
f060eb1b62 Fix standalone router bugs 2016-03-06 22:39:33 -08:00
Colin McLeod
32795ea678 Hide ALT text for mobile 2016-03-06 22:39:17 -08:00
Colin McLeod
d744d15132 Tweak touch module select tooltip 2016-03-06 21:33:25 -08:00
Colin McLeod
bfcef18c02 Fix Cost section discount label 2016-03-06 20:24:48 -08:00
Colin McLeod
b04c2ed2f5 Fix thruster warning bug 2016-03-06 20:24:33 -08:00
Colin McLeod
f51998b1c2 Update German, French, and Russian translations 2016-03-06 17:22:42 -08:00
Colin McLeod
d7000bfebf Update test to work with Jest 0.9.0 2016-03-06 17:22:26 -08:00
Colin McLeod
3e2b3e33fb Add localstorage migration for iframe 2016-03-04 11:15:51 -08:00
Colin McLeod
87dd52c043 Tweak and refactor build/role preset functions 2016-03-03 19:58:47 -08:00
Colin McLeod
05bc8ebb93 Fix find lightest shield generator min mass bug 2016-03-03 19:58:08 -08:00
Colin McLeod
09b945d29e tweak comments 2016-03-03 19:57:41 -08:00
Colin McLeod
67b5d749df Add can mount 2016-03-03 19:55:52 -08:00
Colin McLeod
a19fd69d0b Tweak internal slot labels 2016-03-03 19:55:04 -08:00
Colin McLeod
cfb65396ab fix max speed/boost, use lightest FSD and fuel tank 2016-03-02 10:08:16 -08:00
Colin McLeod
a4a0f96502 Add fuel tank to optimize 2016-03-02 10:07:49 -08:00
Colin McLeod
1390339024 Hull reinforcement will always clobber, fix 2016-03-02 10:07:05 -08:00
Colin McLeod
43d19f1dbb Fix phrase case 2016-03-02 10:06:41 -08:00
Colin McLeod
c20439264a Tweak GA tracking 2016-03-02 10:06:28 -08:00
Colin McLeod
61c3941618 Tweak reload on update message positioning 2016-02-29 09:35:55 -08:00
Colin McLeod
da277e4eaa Bump Beta version 2 2016-02-29 09:28:50 -08:00
Colin McLeod
51d24a1105 Fix Planetary Vehicle Hangar typo. Fixes #153 2016-02-26 09:04:47 -08:00
Colin McLeod
138931c0cf fix deploy script 2016-02-24 13:23:30 -08:00
Colin McLeod
7b3c3a1236 Correct test data 2016-02-24 12:30:35 -08:00
Colin McLeod
524b05159e Merge branch 'react' 2016-02-24 12:21:58 -08:00
Colin McLeod
e2170c9d2f Update tests and correct beta version 2016-02-24 12:13:51 -08:00
Colin McLeod
34b4690e1a Tweak module diff tooltip 2016-02-24 12:13:32 -08:00
Colin McLeod
f25152f378 Support new discounts import 2016-02-24 12:13:17 -08:00
Colin McLeod
3491d62b99 Language corrections 2016-02-24 12:13:04 -08:00
Colin McLeod
36bffe1758 Add variable discount support 2016-02-24 12:11:46 -08:00
Colin McLeod
33fd30a377 Shipyard page now scales based on font size 2016-02-24 12:10:09 -08:00
Colin McLeod
78ff84630e Facet drag improvements 2016-02-19 15:17:52 -08:00
Colin McLeod
b357573add Linting improvements 2016-02-19 15:17:40 -08:00
Colin McLeod
05e160f702 Tweaks supporting standard modules schema changes 2016-02-17 17:52:58 -08:00
Colin McLeod
9175fb60af 2.0.1 Beta 2016-02-13 22:48:48 -08:00
Colin McLeod
d783a38588 Continued porting to react 2016-02-02 09:13:59 -08:00
Colin McLeod
b42a812a45 React port nearing completetion. Adding tests 2016-01-27 00:52:57 -08:00
Colin McLeod
9af87ae88e Bump version to 1.10.4 2016-01-24 12:15:02 -08:00
Colin McLeod
a2f91cf620 Fix 146. Fix #143 2016-01-24 12:14:19 -08:00
Colin McLeod
8227a4e361 Continued porting to react, approaching beta 2016-01-21 22:06:05 -08:00
Colin McLeod
653cb30dd9 Continued porting to React 2016-01-11 18:04:38 -08:00
Colin McLeod
8e28408a8d Bumping version to 1.10.3 2015-12-26 17:42:50 -08:00
Colin McLeod
eb70eb417a Use latest data, rename vehicles to bays 2015-12-26 17:40:39 -08:00
Colin McLeod
126e8ca59b Update serialization json schema to support rating G, H 2015-12-26 17:34:26 -08:00
Colin McLeod
c81d7bf302 Bumping version to 1.10.2 2015-12-19 22:28:00 -08:00
Colin McLeod
78e85f2c6a Update data. Closes #131 2015-12-19 21:49:37 -08:00
Colin McLeod
973af84b73 Update imperial cutter boost pwoer 2015-12-18 01:20:27 -08:00
Colin McLeod
3c8b1f7d6a Adding 2.5% discount 2015-12-18 01:05:49 -08:00
Colin McLeod
62d9749660 Adding agility/maneuverability to shipyard overview 2015-12-13 12:31:06 -08:00
Colin McLeod
7db185e635 Bumping version to 1.10.0 2015-12-13 12:20:56 -08:00
Colin McLeod
e69bdac75c Add Cobra MK IV, FdL power plant update, PV Hangar 2015-12-13 12:19:22 -08:00
Colin McLeod
231f7e9267 Add planetary vechile hanger support 2015-12-13 12:19:22 -08:00
Colin McLeod
ab0019424f More refactoring and porting to React 2015-12-13 11:51:58 -08:00
Colin McLeod
2ef44e38b3 Merge pull request #123 from fawick/master
Fix typo in languages.js
2015-12-07 10:31:23 -08:00
Fabian Wickborn
d051829f98 Fix typo in languages.js 2015-12-07 19:16:00 +01:00
Colin McLeod
01e8e71b28 Updating data reference, bumping version to 1.9.4 2015-11-30 23:38:06 -08:00
Colin McLeod
14681aa9fa Update tests to include bulkheads 2015-11-30 22:56:28 -08:00
Colin McLeod
035f6b3efa More react changes 2015-11-30 22:55:53 -08:00
Colin McLeod
79224f4f9a more react changes, incomplete 2015-11-29 18:44:59 -08:00
Colin McLeod
b93572b18d Merge pull request #120 from sf302/master
Heat Sink Launcher utility auto-fill
2015-11-19 16:28:51 -08:00
Kevin Chang
41c4b4243a Remove arg overloading in useUtility 2015-11-16 16:36:15 -08:00
Kevin Chang
f5127c2475 Typo fix 2015-11-16 15:37:55 -08:00
Kevin Chang
db4303d3c8 Add Heat Sink auto-fill given new SCB heat output 2015-11-16 15:35:36 -08:00
Colin McLeod
8bc100714f Fix Viper Mk4 data. Bumping version to 1.9.3 2015-11-14 12:04:55 -08:00
Colin McLeod
fabd370f4a Update serializer test fixtures 2015-11-14 10:59:15 -08:00
Colin McLeod
769c20154d Updating Hull Reinforcement packages. Bumping to 1.9.2 2015-11-14 10:48:47 -08:00
Colin McLeod
2b5edd75cb Fix keelback boost/speed. Bump to 1.9.1 2015-11-14 10:37:38 -08:00
Colin McLeod
1b56d39356 Update tests to support latest data changes 2015-11-14 00:15:59 -08:00
Colin McLeod
8d1d6d63ad Merge pull request #119 from sf302/master
Handle new Bi-Weave Shield Generator
2015-11-13 22:38:26 -08:00
Colin McLeod
ed637addb8 Initial Commit for React 2015-11-13 17:43:45 -08:00
Kevin Chang
a713105878 Handle new Bi-Weave Shield Generator 2015-11-13 16:54:00 -08:00
Colin McLeod
c527a62ce6 Tweak loader 2015-11-12 11:27:56 -08:00
Colin McLeod
16c76b2598 Added EDDB IDs to data. Updating submodule 2015-10-27 12:00:25 -07:00
Colin McLeod
ad134330c4 Fix common -> standard for outfitting page 2015-10-27 12:00:25 -07:00
Colin McLeod
05438daf48 Merge pull request #113 from richardbuckle/fix-112
#112 lower-case 'k' in 'kg/s'
2015-10-25 18:45:33 -08:00
Richard Buckle
afebf68cae #112 lower-case 'k' in 'kg/s' 2015-10-26 01:51:52 +00:00
Colin McLeod
ab4bdf355c Fix submodule reference 2015-10-23 09:44:42 -07:00
Colin McLeod
0f4abd6ace Updating data submodule reference 2015-10-23 09:18:53 -07:00
Colin McLeod
2901c978dc Use HTTPS instead of SSH for submodule 2015-10-23 09:10:01 -07:00
Colin McLeod
21e9dbc381 Adding data through submodule 2015-10-22 20:38:28 -07:00
Colin McLeod
b2ceafa89e removing data folder 2015-10-22 20:37:14 -07:00
Colin McLeod
d8633a8411 Rename common to standard for consistency 2015-10-22 20:19:56 -07:00
Colin McLeod
f4bf09eaab fix discount minus sign placement 2015-10-22 20:19:56 -07:00
Colin McLeod
f0c40aae34 Handle erroneous data better 2015-10-22 20:19:55 -07:00
Colin McLeod
90ed8ed198 error page fix 2015-10-22 20:19:55 -07:00
Colin McLeod
9af6a529dd Adding station icons 2015-10-22 20:19:55 -07:00
Colin McLeod
269dfbdc1d Merge pull request #107 from sf302/master
Reload costs refinements
2015-10-14 00:15:43 -07:00
Kevin Chang
d01cd24b0d Updated comment to reflect changes to fuel logic 2015-10-13 15:58:44 -07:00
Kevin Chang
93ac3b217f Clean up unnecessary fuel costs logic 2015-10-13 15:56:17 -07:00
Colin McLeod
a38d6cf839 Merge pull request #109 from Toxicat/patch-1
Correct bad translation
2015-10-13 13:32:29 -07:00
PanzerKadaver
bd656b46ef Correct bad translation
Correct error reported in #108
2015-10-13 22:29:48 +02:00
Kevin Chang
20cce4dcda More logical limpet ammo display, fuel tied to slider 2015-10-12 20:54:47 -07:00
Kevin Chang
d286dda07f Refinements, limpet ammo display added to reloads 2015-10-12 19:38:33 -07:00
Colin McLeod
45b6dabcd2 Bumping version to 1.8.3 2015-10-10 11:47:46 -07:00
Colin McLeod
d476c58a9c Workaround for UI-router bug for build with slash in the name. Fixes #105 2015-10-09 18:29:04 -07:00
Colin McLeod
e837bb68fb Bumping version to 1.8.2 2015-10-09 15:48:54 -07:00
Colin McLeod
e2adc7bdc4 Tweak AFMU for explorer build 2015-10-09 15:44:10 -07:00
Colin McLeod
22716517c5 Remove A-rated build type, now redundant 2015-10-09 15:23:59 -07:00
Colin McLeod
8b82965c12 Fix section quick-fit menu z-index / overlap 2015-10-09 15:23:43 -07:00
Colin McLeod
65cf975a35 Merge pull request #104 from sf302/master
Hull reinforcement auto-fill, hardpoint clobber behavior tweak
2015-10-09 15:09:10 -07:00
Kevin Chang
1c78fea48f Fix behavior for hull reinforcement max at 5D 2015-10-08 22:51:00 -07:00
Kevin Chang
08f49c8339 Fix SCB internal clobber 2015-10-08 19:29:46 -07:00
Kevin Chang
bed81d26b2 Alter auto-fill clobbering behavior for hardpoints 2015-10-08 19:20:17 -07:00
Kevin Chang
38b13fca27 Add armor autofill, prevent internal fill clobber 2015-10-08 18:06:01 -07:00
Colin McLeod
0869230b13 Fix to standard fit all class B. Closes #103 2015-10-08 15:32:01 -07:00
Colin McLeod
80d4b6b431 fix power bug when swapping disabled components 2015-10-07 20:34:52 -07:00
Colin McLeod
fb7e9136d4 Merge pull request #102 from sf302/master
Additional auto-fill for SCB and other weapons
2015-10-07 20:25:38 -07:00
Colin McLeod
059ff367ff Price changes for 1.4 2015-10-07 20:13:21 -07:00
Kevin Chang
d322e062ad Trimming back down to just laser/MC/cannon fills 2015-10-07 20:09:51 -07:00
Kevin Chang
f807f4222f Less hacks to get the same thing done 2015-10-07 20:06:04 -07:00
Kevin Chang
1d4b046723 Tweaked to reenable slot if previously disabled 2015-10-07 19:51:36 -07:00
Kevin Chang
b9fc114e02 Additional auto-fill for SCB and other weapons 2015-10-07 19:43:39 -07:00
Colin McLeod
50047411c3 Correct Viper boost speed 2015-10-07 17:57:22 -07:00
Colin McLeod
610ded2f83 Fix ammo sorting by qty and unit price 2015-10-07 11:35:36 -07:00
Colin McLeod
2a644e787a Merge pull request #100 from sf302/master
Added new 'Reload Costs' tab for ammo, digit display cleanup
2015-10-07 11:33:05 -07:00
Colin McLeod
90b339e5c3 Correct 50% warning on power band 2015-10-07 11:32:52 -07:00
Colin McLeod
a213ad12d0 lint fix 2015-10-07 02:17:49 -07:00
Colin McLeod
a4b8b942a1 Show warning when Power priority group 1 exceeds 50%. 2015-10-07 02:16:00 -07:00
Colin McLeod
df7ef0fbdb Adding more outiftting sub section menu options 2015-10-07 02:14:45 -07:00
Colin McLeod
f42dc481df Added Outfitting section sub-menu 2015-10-06 22:49:09 -07:00
Colin McLeod
623be748c0 New and improved shipyard/home page 2015-10-06 20:06:13 -07:00
Colin McLeod
35c84ee0f0 Handle rounding erros on priority bands 2015-10-06 20:06:13 -07:00
Colin McLeod
4d84f271be Update tests for ignore auto generated property 2015-10-06 20:06:13 -07:00
Colin McLeod
5458c548fb Detailed discover scanner does not use any power 2015-10-06 20:06:12 -07:00
Colin McLeod
a9be057fe8 Readbility changes for fsd, fuel tank, and ls data 2015-10-06 20:06:12 -07:00
Colin McLeod
564c228d41 Massive refactoring to Ship class 2015-10-06 20:06:12 -07:00
Colin McLeod
3f6875abb6 Add find lightest shield generator 2015-10-06 20:06:12 -07:00
Colin McLeod
a2aa829b45 Add/impromve find compoonent functions 2015-10-06 20:06:12 -07:00
Colin McLeod
08b6ec9e31 Add size map 2015-10-06 20:06:12 -07:00
Colin McLeod
ee99d33275 Bumping version to 1.8.0 2015-10-06 20:06:12 -07:00
Colin McLeod
7b9e8dbc7d Sort ships by actual name not file name 2015-10-06 20:06:12 -07:00
Colin McLeod
44f45e7e93 Handle comparison when build is missing. Closes #96 2015-10-06 20:06:12 -07:00
Colin McLeod
a49f7ec594 Handle special characters in build or comparison name. Closes #101 2015-10-06 20:06:12 -07:00
Colin McLeod
9ee12e4167 Rename DBS file 2015-10-06 20:06:11 -07:00
Kevin Chang
33ad7d909a Fix torpedo ammo cost data 2015-10-05 20:27:22 -07:00
Kevin Chang
e5e29dc6cb Cleaned up lint errors 2015-10-05 20:15:46 -07:00
Kevin Chang
34dd40bcbf Added new 'Reload Costs' tab for ammo, digit display cleanup 2015-10-05 20:08:36 -07:00
Colin McLeod
0e8e9f5cbc Merge pull request #97 from SmokyBird/patch-1
Update fr.js
2015-10-05 16:30:00 -07:00
SmokyBird
d39cbb3ef5 Update fr.js
Finally found the full French translation for the Hull Reinforcement.
2015-10-06 00:47:07 +02:00
Colin McLeod
5470b241f6 Merge pull request #94 from koreldan/master
Minor corrections
2015-09-28 09:24:49 -07:00
enrico
6507c22355 minor corrections 2015-09-27 15:36:11 +02:00
Enrico
96c2f4b3b6 Merge pull request #1 from cmmcleod/master
updating
2015-09-27 15:26:35 +02:00
Colin McLeod
b0c521246e Bumping version to 1.7.3 2015-09-22 11:53:08 -07:00
Colin McLeod
5c0616ad47 Display clip + ammo reserve more intelligently 2015-09-22 11:52:44 -07:00
Colin McLeod
523f37ccc1 Correct Torpedo Pylon ammo reserve 2015-09-22 11:52:13 -07:00
Colin McLeod
5e2768bbf6 Correct Pack-Hound cost 2015-09-22 11:51:56 -07:00
Colin McLeod
61b3e7d47d Corrected Federal Gunship hull cost 2015-09-22 11:51:25 -07:00
Colin McLeod
ed6fc32d76 Correct Shield Cell Bank recharge values 2015-09-22 11:50:00 -07:00
Colin McLeod
4c74675edd Bumping version to 1.7.2 2015-09-22 09:27:39 -07:00
Colin McLeod
d43ee25e71 Use full name for Advanced Plasma Accelerator 2015-09-22 09:27:19 -07:00
Colin McLeod
46f00e0bc7 Lint fixes 2015-09-22 09:14:47 -07:00
Colin McLeod
d3cea71e50 Bumping version to 1.7.1 2015-09-22 09:13:43 -07:00
Colin McLeod
0516a6f54d Use calculated boost speed in comparisons. Fixes #91 2015-09-22 09:13:21 -07:00
Colin McLeod
eb8373f8b4 Line chart UI tweaks 2015-09-22 01:43:54 -07:00
Colin McLeod
202bbbd357 Use power icons for power management 2015-09-22 00:43:55 -07:00
Colin McLeod
b9e404c4da Adding italian number format support 2015-09-21 23:44:24 -07:00
Colin McLeod
e16ce83c03 Adding Spanish support 2015-09-21 23:44:05 -07:00
Colin McLeod
83c266d083 Bumping version to 1.7.0 2015-09-21 21:43:56 -07:00
Colin McLeod
349b8f436c Import/export fixture fixes for FSD Interdictor 2015-09-21 21:43:17 -07:00
Colin McLeod
e9a0a01e14 Lint fixes 2015-09-21 21:42:48 -07:00
Colin McLeod
457b8920f2 Partial Italian translation 2015-09-21 21:00:29 -07:00
Colin McLeod
31b63e9a87 en.js formatting 2015-09-21 21:00:17 -07:00
Colin McLeod
8dc3725b47 Chart UI Tweaks 2015-09-21 20:58:13 -07:00
Colin McLeod
e2096ba9f4 Display calculate boost speed 2015-09-21 20:47:59 -07:00
Colin McLeod
231fcbb3bc Calculate top boost speed 2015-09-21 20:47:31 -07:00
Colin McLeod
75c22de166 Use true base boost speeds 2015-09-21 20:45:44 -07:00
Colin McLeod
d196127392 Improve Shield Cell bank readability 2015-09-20 10:56:39 -07:00
Colin McLeod
fb4dc906aa Empty Spanish translations for now 2015-09-20 10:56:18 -07:00
Colin McLeod
9937ba8039 Merge pull request #93 from koreldan/master
added italian language
2015-09-19 22:10:06 -07:00
enrico
d92722f1c2 added italian language 2015-09-20 01:13:07 +02:00
Colin McLeod
69096d7816 Merge pull request #92 from SmokyBird/patch-1
Update fr.js
2015-09-19 14:48:55 -07:00
SmokyBird
2846827959 Update fr.js
Changed a few translations to keep the real ones, coming from the game.
2015-09-19 14:50:53 +02:00
Colin McLeod
67bd56e692 Top speed display and test tweaks 2015-09-17 22:09:30 -07:00
Colin McLeod
95f5e8e5ae Bumping version to 1.6.0 2015-09-17 01:00:38 -07:00
Colin McLeod
eb52a7548c Improve multi series tooltips for line chart 2015-09-17 01:00:10 -07:00
Colin McLeod
b479b61926 Minor bar chart UI tweak 2015-09-17 00:59:29 -07:00
Colin McLeod
726a08b05b Calculate speed based on Thrusters. Closes #16 2015-09-17 00:59:09 -07:00
Colin McLeod
fc2f76c31c Updating ships and thrusters for speed calculation support 2015-09-17 00:57:31 -07:00
Colin McLeod
839e1a5cbd Removing unused icon 2015-09-17 00:55:26 -07:00
Colin McLeod
12beeffae0 Hack to component select. Closes #89 2015-09-14 10:45:06 -07:00
Colin McLeod
83ad7d9f6c Correct price of Federal Gunship 2015-09-07 12:43:52 -07:00
Colin McLeod
6e65d67f14 Bumping version to 1.5.5 2015-09-05 23:01:19 -07:00
Colin McLeod
a127e2f5a5 Merge pull request #85 from gbiobob/master
Corrections for French localisation
2015-09-05 11:01:13 -07:00
gbiobob
9154b7f38c Corrections for French localisation 2015-09-05 11:13:26 +02:00
Colin McLeod
c2d8cad249 Bumping version to 1.5.4 2015-09-04 17:31:08 -07:00
Colin McLeod
e9ffe5baec Fix to Russian language name 2015-09-04 17:30:41 -07:00
Colin McLeod
fffa325e83 Corrections to French translation 2015-09-04 12:45:14 -07:00
Colin McLeod
ed14ed2bb7 Bumping version to 1.5.2 2015-09-03 12:19:59 -07:00
Colin McLeod
7c9e020b88 Minor french translation correction 2015-09-03 12:10:21 -07:00
Colin McLeod
d711d1519b Correct base shield strength on fed assault and gun ship 2015-09-03 12:07:50 -07:00
Colin McLeod
3361f7e435 Another russian translation correction 2015-09-03 12:01:13 -07:00
Colin McLeod
3a79f99f77 Correct Russian translations 2015-09-03 11:58:29 -07:00
Colin McLeod
ff25b55c1f Lint fix 2015-09-03 00:22:50 -07:00
Colin McLeod
ae6f6b0da1 Bumping version to 1.5.1 2015-09-03 00:21:23 -07:00
Colin McLeod
6dc714371d Update Shield Strength calculation 2015-09-03 00:19:58 -07:00
Colin McLeod
5762b133e5 Fix Orca first interal compartment restrictions 2015-09-03 00:19:30 -07:00
Colin McLeod
50741657a5 Merge pull request #82 from michaelhue/beta-ships
Include v1.4-beta ships
2015-09-02 16:31:23 -07:00
michaelhue
ff9a38f23f Include v1.4-beta ships.
Adds the Federal Assault Ship, Federal Gunship and Imperial Eagle to the ship selection.

Note: Values for `boostEnergy` and `masslock` attributes are currently based on their parent ships. Should be updated as soon as data is available.
2015-09-02 17:48:42 +02:00
Colin McLeod
3b11b31e7c Add all english terms due to angular translate workaround 2015-09-02 01:50:49 -07:00
Colin McLeod
44e5dfb4d4 Lint fix 2015-09-01 20:55:07 -07:00
Colin McLeod
30ea10830c Fix to slider reset event 2015-09-01 20:47:43 -07:00
Colin McLeod
eb0f611d78 Fix slider event 2015-09-01 20:38:28 -07:00
Colin McLeod
96ef192738 Fix max fuel label 2015-09-01 20:38:13 -07:00
Colin McLeod
1970616443 Add cargo hatch priority and status to be included in detailed export 2015-09-01 18:36:57 -07:00
Colin McLeod
aac4c9a872 Fix to slider events 2015-09-01 18:05:35 -07:00
Colin McLeod
aebfb62ac4 Correct Select DOM generation 2015-09-01 18:02:17 -07:00
Colin McLeod
9748043466 Update sensors 2015-09-01 17:59:33 -07:00
Colin McLeod
b6f98e741b UI tweak 2015-09-01 02:53:15 -07:00
Colin McLeod
b513cca4b5 Minor code clean up 2015-09-01 02:49:03 -07:00
Colin McLeod
65f53a3fa4 Fixes for language and scaling 2015-09-01 02:20:05 -07:00
Colin McLeod
bf217e7fdd Updating DE, FR and RU 2015-08-31 17:41:45 -07:00
Colin McLeod
09e646ee95 Power warning when at 100% 2015-08-31 17:39:04 -07:00
Colin McLeod
ab18228131 Further improvement to size ratio 2015-08-31 17:39:04 -07:00
Colin McLeod
164e9f5c8a Another improvement to font-size adjustments 2015-08-31 17:37:04 -07:00
Colin McLeod
faa8759851 More changes for font size adjustment 2015-08-31 17:35:14 -07:00
Colin McLeod
c2a84606a1 Inital commit for font size adjust slider 2015-08-31 17:34:28 -07:00
Colin McLeod
42d51b7612 Merge pull request #81 from Marginal/priorities
Include module status and priority in JSON import and export.
2015-08-31 17:29:54 -07:00
Jonathan Harris
38dc4319c0 Test import/export of module state and priority. 2015-08-30 06:52:44 +01:00
Jonathan Harris
fda966be02 Pass tests. 2015-08-30 06:05:12 +01:00
Jonathan Harris
bf47a81dc1 More cosmetic issues. 2015-08-30 05:29:25 +01:00
Jonathan Harris
eef4e06f29 Fix cosmetic issues. 2015-08-30 05:26:22 +01:00
Jonathan Harris
2d2c2b75e3 Include module status and priority in JSON import and export. 2015-08-30 05:02:59 +01:00
Colin McLeod
0066e7fd40 Bumping version to 1.5.0 2015-08-23 12:40:34 -07:00
Colin McLeod
d596723b7b Major refactor for language support, EN, DE, ES, FR, RU 2015-08-23 12:38:17 -07:00
Colin McLeod
c7269423ed Handle select edge-case 2015-08-20 14:09:07 -07:00
Colin McLeod
ee60e4d043 Fix Diamondback Explorer MLF 2015-08-20 14:08:46 -07:00
Colin McLeod
c98a73c6a8 Bumping version to 1.4.1 2015-08-15 16:35:30 -07:00
Colin McLeod
0116523c63 Merge pull request #75 from sf302/master
Additional refinement to "Optimize Mass" preset
2015-08-14 22:36:17 -07:00
Kevin Chang
c1afa7c385 Additional refinement to "Optimize Mass" preset 2015-08-14 19:16:49 -07:00
Colin McLeod
6630ff8fee Adding another E:D import test case 2015-08-14 11:41:53 -07:00
Colin McLeod
14f303c581 Merge pull request #74 from sf302/master
Adding powerplant capacity warnings
2015-08-14 00:42:50 -07:00
Colin McLeod
0728af14dd Support import of E:D shipyard text exports 2015-08-13 23:22:13 -07:00
Colin McLeod
1edacf3eba Corrected thurster selection and warnings 2015-08-13 23:21:40 -07:00
Colin McLeod
3d6d210563 updating linting params 2015-08-13 23:18:35 -07:00
Colin McLeod
df09da4b0a Remove redundant statements 2015-08-13 23:14:48 -07:00
Colin McLeod
b02de43b50 Updating dependencies 2015-08-13 23:14:33 -07:00
Kevin Chang
1b3ca2f697 Fix lint error 2015-08-13 22:22:46 -07:00
Colin McLeod
886614527f Improved low weight build logic 2015-08-10 15:12:59 -07:00
Colin McLeod
5f05bf0dc5 Lint fix 2015-08-10 15:12:18 -07:00
Colin McLeod
59710ce2cf Adding button for class A oufit 2015-08-10 10:50:46 -07:00
Colin McLeod
b533191bc9 Adding loader for later use 2015-08-10 10:50:16 -07:00
Kevin Chang
4fa1115e8f Extend PD Boost warning to PP Retracted power (TODO: extend to two-stage warning for DEP/RET) 2015-08-06 20:58:11 -07:00
Colin McLeod
be5a069b23 Merge pull request #71 from sf302/master
Add build preset button and correct/improve SCB info
2015-07-30 20:48:17 -07:00
Kevin Chang
80da41c866 Another fix to lint errors 2015-07-30 20:18:33 -07:00
Kevin Chang
d278a7c1fd Correcting CI errors 2015-07-30 20:14:46 -07:00
Kevin Chang
69de209aba A-rated uses largest eligible shield slot; dirty hacks rewritten 2015-07-30 19:50:08 -07:00
Kevin Chang
15616d112f Add per-slot total SCB capacity in MJ 2015-07-30 19:04:52 -07:00
Kevin Chang
95adca5cde Incremented all shield cell bank counts -- "Munitions" tab shows actual cell counts 2015-07-30 18:54:57 -07:00
kchang
82c5460936 Shortcut to A-rated common components and shield generator 2015-07-28 23:21:46 -07:00
Colin McLeod
b850695715 Bumping version to 1.3.1 2015-07-26 22:42:06 -07:00
Colin McLeod
d5af972272 Add 8A pristmatic shield generator 2015-07-26 22:39:13 -07:00
Colin McLeod
8946f9b97c Add component group filtering for Orca special case internal slots 2015-07-21 12:34:35 -07:00
Colin McLeod
348339520d Improve comparison import validation 2015-07-21 12:34:07 -07:00
Colin McLeod
f0bdcd5557 Bumping version to 1.3.0 2015-07-20 13:42:38 -07:00
Colin McLeod
b1ee0e44f3 Linting fixes, update unit test 2015-07-20 13:42:21 -07:00
Colin McLeod
c96e6afbd7 Power Distributor required for Boost. Resolves #17 2015-07-20 13:37:03 -07:00
Colin McLeod
77334341ea Armour value improved by bulkhead 2015-07-20 00:55:51 -07:00
Colin McLeod
5f22743778 Bumping to version 1.2.0 2015-07-19 22:30:30 -07:00
Colin McLeod
03986cb88a Massive refactor for 3rd party import 2015-07-19 21:32:14 -07:00
Colin McLeod
c796adf40d Add Persist.getAll for backup purposes 2015-07-18 16:50:50 -07:00
Colin McLeod
2890ff5537 Add description to export modal 2015-07-18 16:50:03 -07:00
Colin McLeod
a6ba61a2bf Change loadout schema slightly 2015-07-18 14:46:22 -07:00
Colin McLeod
db5e080992 Change meta description 2015-07-18 14:45:36 -07:00
Colin McLeod
63d7f98e2c Fix total jump range calculation bug 2015-07-18 14:45:08 -07:00
Colin McLeod
7997ff6ae9 Correct Beta insurance rate 2015-07-17 09:07:16 -07:00
Colin McLeod
b3126cf6b6 Renaming data test for consistency 2015-07-15 21:11:23 -07:00
Colin McLeod
ab1ea53ce3 Implement export for 3rd Party sites 2015-07-15 16:13:17 -07:00
Colin McLeod
82a87cb653 Adjust select menu size for smaller windows 2015-07-15 15:31:40 -07:00
Colin McLeod
d2fc526039 Don't cachebust JSON files.. 2015-07-14 21:58:27 -07:00
Colin McLeod
88587c6487 Bumping version to 1.1.0 2015-07-14 21:48:11 -07:00
Colin McLeod
4578dbf906 Refactor many variable names, adding detailed json dump and schema 2015-07-14 21:44:12 -07:00
Colin McLeod
cd48ef6f86 Removing ship purpose 2015-07-13 12:33:40 -07:00
Colin McLeod
0f0e67ec9c Adding mass lock factor 2015-07-13 11:08:49 -07:00
Colin McLeod
bbb2a223af Updating price for mining lance 2015-07-13 10:58:05 -07:00
Colin McLeod
5278e52e2f Updating price for Pack-hound 2015-07-13 10:57:52 -07:00
Colin McLeod
e6290abef7 Correcting prices 2015-07-11 00:17:21 -07:00
Colin McLeod
346fee1208 Improve readbility of power distributor and thruster data 2015-07-07 18:29:25 -07:00
Colin McLeod
1b9f5f870e Change component select hover color 2015-07-07 18:29:07 -07:00
Colin McLeod
26b624d1dd Use default right-click action when SHIFT key is held 2015-07-07 15:34:28 -07:00
Colin McLeod
7cbd9732b7 List Utility mounts in alphabetical order 2015-07-07 14:51:23 -07:00
Colin McLeod
44152116b4 Linting fix 2015-07-07 11:30:38 -07:00
Colin McLeod
3ad35992fc Use full names for limpet controllers 2015-07-07 11:20:48 -07:00
Colin McLeod
e963eb24a0 Adding Imperial Hammer rail gun 2015-07-07 11:20:26 -07:00
Colin McLeod
827e2b403c Adding Distrupoter pulse laser 2015-07-07 11:20:07 -07:00
Colin McLeod
0fd4712021 Adding Advanced Plasma Accelerator 2015-07-07 11:19:49 -07:00
Colin McLeod
ae0af05e78 Adding Enforcer Multi-cannon 2015-07-07 11:19:31 -07:00
Colin McLeod
dd00f283e6 Adding Pack-Hound missle rack 2015-07-07 11:19:12 -07:00
Colin McLeod
eddf968629 Adding Mining Lance laser 2015-07-07 11:18:50 -07:00
Colin McLeod
7fdd83ba84 Adding Pacifier frag cannon 2015-07-07 11:18:28 -07:00
Colin McLeod
1bb4f6850e Clean up cannon data 2015-07-07 11:18:05 -07:00
Colin McLeod
f47b931380 Adding Cryptoscrambler burst laser 2015-07-07 11:17:45 -07:00
Colin McLeod
d9f686f0d6 Adding Retributor beam laser 2015-07-07 11:17:25 -07:00
Colin McLeod
73cef20073 Format for readability 2015-07-07 11:17:05 -07:00
Colin McLeod
fd68565d8e Adding prismatic Shield Generators 2015-07-07 11:16:40 -07:00
Colin McLeod
a45d165d33 UI Tweaks 2015-07-06 15:45:56 -07:00
Colin McLeod
904f828d83 Change cargo rack order, remove long name 2015-07-06 11:20:34 -07:00
Colin McLeod
f00420c92f UI Tweaks 2015-07-06 11:20:08 -07:00
Colin McLeod
457705014c Bumping version to 1.0.4 2015-07-03 18:25:54 -07:00
Colin McLeod
6faf3765e0 Fix to scroll to top on iOS 2015-07-03 18:23:19 -07:00
Colin McLeod
4abdce2b70 Fix button wrapping issue on small screens 2015-07-03 15:42:08 -07:00
Colin McLeod
3b44f5fe27 Bumping version 1.0.3 2015-07-03 15:33:47 -07:00
Colin McLeod
7332dc69ed Linting issues 2015-07-03 15:31:52 -07:00
Colin McLeod
381387c04f UI Tweaks, persist cost tab open, revert outfitting order to original 2015-07-03 15:30:49 -07:00
Colin McLeod
e0db9fdfb0 Fix scrolling on iOS 2015-07-03 12:15:35 -07:00
Colin McLeod
a8d66b22af Bumping version to 1.0.2 2015-07-02 20:43:13 -07:00
Colin McLeod
bdc1e622f9 UI Tweaks, scrolling fixes and improvements 2015-07-02 20:42:46 -07:00
Colin McLeod
ad8130ae9b Add missing class 7 & 8 internal fuel tanks 2015-07-02 19:24:52 -07:00
Colin McLeod
394a3bb9f1 Revert to ui-router-extras 0.0.13 due to bug introduced in 0.0.14 2015-07-02 10:41:24 -07:00
Colin McLeod
54907b462c Tweak select look and feel on firefox, safari 2015-07-01 23:41:32 -07:00
Colin McLeod
1350de1910 Empty retrofitting table color fix 2015-06-30 21:55:38 -07:00
Colin McLeod
89d3fd69e1 UI tweaks for mobile 2015-06-30 21:46:05 -07:00
Colin McLeod
7325081ec9 Version 1.0.0 :D 2015-06-30 21:09:19 -07:00
Colin McLeod
680872a302 Retrofitting costs added to outfit page 2015-06-30 21:06:12 -07:00
Colin McLeod
a3c65d6c69 Code comments 2015-06-30 19:25:57 -07:00
Colin McLeod
a189265326 Fix svg click bug in Chrome 2015-06-30 19:25:36 -07:00
Colin McLeod
b447e913ff no need to abbreviate shield details 2015-06-29 16:28:41 -07:00
Colin McLeod
b5a249fb4b Change latest version date format 2015-06-29 16:27:56 -07:00
Colin McLeod
ae081c147e Fix negative power for limpet controllers 2015-06-29 15:42:35 -07:00
Colin McLeod
3ce0d0bdd8 Add dps to outfit page 2015-06-29 15:03:04 -07:00
Colin McLeod
a71abd9fe3 Bumping version to 0.14.1 2015-06-29 14:59:30 -07:00
Colin McLeod
f1d804e3a1 Adding total DPS to outfit page and comparisons 2015-06-29 11:57:29 -07:00
Colin McLeod
aa7479d111 Updating Federal Dropship agility 2015-06-29 10:36:49 -07:00
Colin McLeod
7c23fb3884 Bumping version to 0.14.0 2015-06-26 11:00:46 -07:00
Colin McLeod
b707015d9c Fix power plant toggle power bug 2015-06-26 11:00:11 -07:00
Colin McLeod
10d5611dcd Seperate discounts for ship and components, added discounts for 5,10,15,20,25 percent off 2015-06-25 20:26:22 -07:00
Colin McLeod
9009a2a434 Bumping to 0.13.4, fixing courier bulkhead mass 2015-06-24 13:17:23 -07:00
Colin McLeod
8b98a98faf lint fix 2015-06-23 23:47:27 -07:00
Colin McLeod
44de3e4bbc Minor CSS refactor, outfit page tweak 2015-06-23 23:45:30 -07:00
Colin McLeod
ba2e9a12b0 Tweak chart axis labels 2015-06-23 11:47:23 -07:00
Colin McLeod
57304f55c1 Merge pull request #62 from Maverick-JM/master
Fixes for Windows phone and IE
2015-06-23 11:47:09 -07:00
Maverick
1eea358c35 Typo in the comments :). 2015-06-23 23:10:04 +10:00
Maverick
f671b7c34f Fix for the top menu not working in IE 11 (and probably older IE too). 2015-06-23 23:04:07 +10:00
Maverick
211028d80d Fix for the whole app not working on Windows phones as a Windows phone, this was somewhat vexing :)). 2015-06-23 22:27:24 +10:00
Justin Murtagh
c79359ea2f Merge pull request #6 from cmmcleod/master
Update my fork.
2015-06-23 22:04:34 +10:00
Colin McLeod
93f92da1df Adding line chart, adding speed function 2015-06-19 19:04:45 -07:00
Colin McLeod
25020293ec Fix unique internal component regression bug, add tests, bump to 0.13.3 2015-06-19 10:29:26 -07:00
Colin McLeod
4e7f1d3e8b Updating README and disclaimer text 2015-06-18 16:32:45 -07:00
Colin McLeod
e6ba0a14e8 Minor tweak to slot size position 2015-06-18 15:51:58 -07:00
Colin McLeod
b285a433b2 Bumping version to 0.13.2 2015-06-18 09:52:48 -07:00
Colin McLeod
f19c786f64 Update ship armour stats 2015-06-18 09:52:18 -07:00
Colin McLeod
806e545361 Fix charts in comparison page 2015-06-17 23:32:56 -07:00
Colin McLeod
ae62781d53 Bump version to 0.13.0 2015-06-17 23:17:15 -07:00
Colin McLeod
3abfcf7c95 Tweak chart axis UI 2015-06-17 23:12:27 -07:00
Colin McLeod
dc8b829d8a fix: total range calculation bug 2015-06-17 20:41:54 -07:00
Colin McLeod
353396398b Linting fix 2015-06-17 20:41:11 -07:00
Colin McLeod
bf99b34596 Tweak outfit page charts responsiveness 2015-06-16 15:28:06 -07:00
Colin McLeod
f3af0f3a99 Toggling shield and boosters updates shield strength 2015-06-16 15:27:41 -07:00
Colin McLeod
0fd4a8395e Tweak area chart tooltip 2015-06-16 15:26:47 -07:00
Colin McLeod
cb664003a5 Tweak slider 2015-06-16 15:26:22 -07:00
Colin McLeod
4686f17d18 Strip build should reset bulkheads 2015-06-16 15:26:05 -07:00
Colin McLeod
45c96dc136 Icon tweaks, added feather icon 2015-06-16 15:25:25 -07:00
Colin McLeod
389fdc8dfa Removing unused svg icon 2015-06-15 23:25:42 -07:00
Colin McLeod
b94e6126cd Chart performance tweaks, UI tweaks 2015-06-15 21:46:55 -07:00
Colin McLeod
bee4f7e6bc Fix strip build bug, and update state 2015-06-15 18:18:27 -07:00
Colin McLeod
345b7f5ffe Removing codeship, adding travis build status to readme 2015-06-15 18:08:41 -07:00
Colin McLeod
f1b40eb38c Adding gulp back to package.json 2015-06-15 18:06:09 -07:00
Colin McLeod
f459c26bd7 Locking down npm dependencies, add caching to travis 2015-06-15 18:03:02 -07:00
Colin McLeod
825b678fb0 Total Range chart feature added 2015-06-15 17:43:28 -07:00
Colin McLeod
ce3818f99a Use Travis CI instead of Codeship 2015-06-15 17:32:18 -07:00
Colin McLeod
94e2b60cd1 Changing version link 2015-06-15 17:31:27 -07:00
Colin McLeod
3bbef71a5e Merge pull request #58 from shearn89/strip-ship
Adding in 'Strip Ship' functionality.
2015-06-15 16:26:01 -07:00
Alex Shearn
ca280673d1 Fixing indentation 2015-06-15 22:09:18 +01:00
Alex Shearn
ff477c035a Moving button as per comments 2015-06-15 20:28:15 +01:00
Alex Shearn
1c0b76a8c2 Adding in 'Strip Ship' functionality.
This commit adds a simple button next to the save/reload icons that strips the ship to maximum class, D-rated modules, and no optional modules. Still needs a custom icon! May try to add in future things like 'all cargo' or 'fill empty with...' options.
2015-06-15 20:07:13 +01:00
Colin McLeod
bef741332d Bumping version to 0.12.1 2015-06-15 10:11:34 -07:00
Colin McLeod
f54620ee24 Imperial Courier shield correction 2015-06-15 10:11:12 -07:00
Colin McLeod
7d28e69b1c Bumping version to 0.12.0 2015-06-15 09:32:59 -07:00
Colin McLeod
abfe1b4a68 Updating base shield strength for Diamondback ships 2015-06-15 09:31:33 -07:00
Colin McLeod
59e400d7b8 Detailed suface scanner power management special case 2015-06-14 18:58:27 -07:00
Colin McLeod
4b3bb3bcde License readme tweak 2015-06-14 18:58:05 -07:00
Colin McLeod
a4a562bd40 Linting fixes 2015-06-14 17:47:16 -07:00
Colin McLeod
a1506d4f37 Selectable power bands, with right click to clear feature 2015-06-14 17:26:21 -07:00
Colin McLeod
8b0f58cb69 Right-click to clear slots feature 2015-06-14 17:26:04 -07:00
Colin McLeod
1a14674352 Updating License details to comply with Frontier terms and conditions 2015-06-14 17:25:28 -07:00
Colin McLeod
a2c32dd908 Bumping version to 0.11.1 2015-06-13 00:56:08 -07:00
Colin McLeod
eb7383b31e Lint fix 2015-06-13 00:44:15 -07:00
Colin McLeod
2106ec0e93 Ship building edge case, plus unit test to cover change 2015-06-13 00:43:10 -07:00
Colin McLeod
5649dc9079 Adding founders world discount 2015-06-12 23:40:32 -07:00
Colin McLeod
0d09607d30 Ship build, reset bug 2015-06-12 23:38:33 -07:00
Colin McLeod
d7415ea44a Updating hull prices for diamondback scout+exp, imperial courier 2015-06-12 20:14:56 -07:00
Colin McLeod
31579213b1 Responsive build menu improvements, donate button tweak 2015-06-11 23:01:14 -07:00
Colin McLeod
c1ae75e2b0 Merge pull request #55 from cmmcleod/karma-testing
Karma testing
2015-06-11 21:12:52 -07:00
Colin McLeod
2498c0e0b1 Fix tests to pass build 2015-06-11 21:10:57 -07:00
Colin McLeod
3b02536cf7 Fix some power bugs 2015-06-11 21:05:39 -07:00
Colin McLeod
cc2d91cc51 Adding karma and unit tests to get started 2015-06-11 21:05:09 -07:00
Colin McLeod
3f8cf106a1 Linting fixes 2015-06-11 17:23:13 -07:00
Colin McLeod
c80e0a51bf Use eslint instead of JShint 2015-06-11 17:17:42 -07:00
Colin McLeod
9d3e009013 Align power plant pct 2015-06-11 15:01:23 -07:00
Justin Murtagh
6fb2247dd7 Merge pull request #5 from cmmcleod/master
Merge back post-responsive priority stuff.
2015-06-12 07:12:13 +10:00
Colin McLeod
2f9473b3d7 Linting should use an exit error code on failure 2015-06-11 14:02:27 -07:00
Colin McLeod
604ef89067 Update README.md 2015-06-11 13:55:01 -07:00
Colin McLeod
456c63fe55 Changes for Codeship CI 2015-06-11 13:51:28 -07:00
Colin McLeod
df77d7680c Updating Imperial Courirer bulkhead mass 2015-06-11 11:27:43 -07:00
Colin McLeod
ae0b9a8a09 Symbol and responsive tweaks 2015-06-11 11:14:56 -07:00
Colin McLeod
b552f2c8f1 Merge pull request #53 from Maverick-JM/master
Responsive fixes (mostly power-priority related)
2015-06-11 10:48:35 -07:00
Maverick
e3d8dfa457 More fixes since I re-merged to my fork :). 2015-06-11 20:23:50 +10:00
Maverick
9b1767dade Merge of changes to responsive solutions for component power priority module. 2015-06-11 20:14:10 +10:00
Maverick
6d1adb28f3 Merge branch 'master' of https://github.com/cmmcleod/coriolis into cmmcleod-master 2015-06-11 20:11:08 +10:00
Maverick
ff119789ac Refinements to power-priority widget. Works from original iPhone size on up pretty smoothly. As screens get smaller, non-essential columns get smaller. Click targets also get a bit larger. 2015-06-11 20:00:08 +10:00
Colin McLeod
4540082232 Reducing power bands min size to 500 2015-06-11 00:54:30 -07:00
Colin McLeod
bfed9f3c61 Fix persist power bug 2015-06-11 00:40:45 -07:00
Colin McLeod
b37e4644b6 Bumping to 0.11.0 2015-06-11 00:23:37 -07:00
Colin McLeod
2f3ee50ec8 Persist power and priority changes 2015-06-11 00:08:56 -07:00
Colin McLeod
f77443156d Sort power management by type by default 2015-06-10 22:55:15 -07:00
Colin McLeod
2ea5c64256 Improve power management UI 2015-06-10 22:51:36 -07:00
Colin McLeod
0d3e156346 Adding percent formatter fixed to 1 decimal place 2015-06-10 22:50:06 -07:00
Colin McLeod
8fd0297091 Adding Settings label to menu 2015-06-10 22:49:01 -07:00
Colin McLeod
ba9c80ff05 Build menu wrapping fix 2015-06-10 22:48:42 -07:00
Maverick
ff133c2f3d Fix for non-html encoded triangle arrows 2015-06-11 15:42:23 +10:00
Maverick-JM
2e29676313 Merge pull request #3 from cmmcleod/master
Merge from cmmcleod => Maverick-JM
2015-06-11 15:04:38 +10:00
Maverick
300f5921e8 Fix for I'm a dumbass. 2015-06-11 13:11:03 +10:00
Maverick
7ba5f1ef68 Undo an unnessecary change. 2015-06-11 13:09:32 +10:00
Colin McLeod
7140dcce95 Linting fixes 2015-06-10 00:23:21 -07:00
Colin McLeod
1367418fb2 Total range, priority management, other tweaks 2015-06-10 00:17:55 -07:00
Colin McLeod
4fb1ad11ca Responsive tweaks and refactoring 2015-06-10 00:17:08 -07:00
Colin McLeod
3cdb576140 Removing unused files 2015-06-10 00:06:08 -07:00
Colin McLeod
ba9051783a Adding unit tests for data validation 2015-06-10 00:05:32 -07:00
Colin McLeod
a253c488a5 Component data corrections, refactoring 2015-06-10 00:02:33 -07:00
Colin McLeod
318f6f2fcb Adding retail cost to ship data for display purposes 2015-06-10 00:01:40 -07:00
Colin McLeod
fde6ddf985 Responsive UI Improvements across the board 2015-06-07 16:35:07 -07:00
Colin McLeod
3bb88a5c03 Unit display/metrics improvement 2015-06-07 16:34:46 -07:00
Colin McLeod
534a843df1 Linting fixes 2015-06-07 16:31:12 -07:00
Colin McLeod
fb35918839 Adding new limpet controllers 2015-06-07 16:28:12 -07:00
Colin McLeod
850a4931c3 Fix fuel scoop time to calc refuel with internal fuel tanks 2015-06-07 15:43:43 -07:00
Colin McLeod
b5e1c86a93 Improving D3 component event handling, responsiveness 2015-06-07 15:42:59 -07:00
Colin McLeod
e876732ce0 Replaving EuroCaps with Eurostile 2015-06-07 15:41:34 -07:00
Colin McLeod
2b822176e4 Removing uncecessary console.log 2015-06-07 15:40:37 -07:00
Colin McLeod
03eb66a4d0 Area chart tooltip dragging added 2015-06-06 16:48:01 -07:00
Colin McLeod
b449bb3724 Fix slider axis for small screens 2015-06-06 15:19:15 -07:00
Colin McLeod
0d1fa7904e Set default standalone app homepage 2015-06-06 13:58:33 -07:00
Colin McLeod
dbd1060cb3 Persist state when running and restarting the app in standalone mode 2015-06-06 13:25:35 -07:00
Colin McLeod
5b7a4edab4 Adding paypal donate button 2015-06-05 21:18:31 -07:00
Colin McLeod
827fb3c97a Adding internal fuel tanks, jump range tweaks 2015-06-05 21:14:40 -07:00
Colin McLeod
a5015b243b Minor responsive less tweak 2015-06-05 21:12:26 -07:00
Colin McLeod
e5ef190f3c Adding meta description 2015-06-05 21:09:34 -07:00
Maverick
1057277355 Build list now gets bigger before cutting off (overflow also scrolls) - this fix is primarily for those that have a few of every ship in their builds list. 2015-06-06 13:58:09 +10:00
Maverick-JM
12896a6325 Merge pull request #2 from cmmcleod/master
Merge back my way.
2015-06-06 09:14:24 +10:00
Colin McLeod
63ebbbf932 Merge pull request #44 from Maverick-JM/master
Responsive CSS for Outfitting screen
2015-06-05 14:13:44 -07:00
Maverick
3fe369d59d Font-size bump for tablets and phones on the outfitting screen. Seems to make life a bit easier. Also added a small-tablet size option which will fix a tiny visual bug on the outfitting screen with long ship names. Fixed a few other minor visual bugs. Also made clickable menu items bigger on tablets and phones. 2015-06-06 00:42:33 +10:00
Maverick
27c9f53649 4-to-2 spaces :) 2015-06-05 20:39:59 +10:00
Maverick
440d126579 Refactored responsive stuff. 2015-06-05 20:24:09 +10:00
Colin McLeod
4a5992dab7 Gulp-rev-all 0.8.20+ seems to break everything 2015-06-04 23:05:43 -07:00
Maverick
40d026c7cd Fixes for sub-350px screens (eg: really old iPhones) 2015-06-04 20:48:03 +10:00
Maverick
cc1018c62c Other responsive changes. Outfitting screen now works pretty well on phone-sized displays. Summary is currently just a horizontal-scrolling thing (because it's a table atm) but everything else scales down and collapses pretty nicely. 2015-06-04 20:40:43 +10:00
Maverick
6e9990831d More responsive outfitting screen (still work to do though). 2015-06-04 20:29:38 +10:00
Maverick-JM
7772880eff Merge pull request #1 from cmmcleod/master
If I'm doing this right, this will take updates to my fork
2015-06-04 19:46:48 +10:00
318 changed files with 28022 additions and 13810 deletions

3
.babelrc Normal file
View File

@@ -0,0 +1,3 @@
{
"presets": ["es2015", "react", "stage-0"]
}

61
.eslintrc Normal file
View File

@@ -0,0 +1,61 @@
{
"parser": "babel-eslint",
"parserOptions": {
"ecmaFeatures": {
"jsx": true,
"classes": true,
"modules": true
},
},
"env": {
"browser": true,
"node": true
},
"plugins": [
"react"
],
"extends": "plugin:react/recommended",
"settings": {
"react": {
"pragma": "React"
}
},
"rules": {
"strict": 0,
"no-underscore-dangle": 0,
"valid-jsdoc": [2, {
"requireReturn": false
}],
"require-jsdoc": [2, {
"require": {
"FunctionDeclaration": true,
"MethodDefinition": true,
"ClassDeclaration": true
}
}],
"no-console": 2,
"brace-style": [2, "1tbs", { "allowSingleLine": true }],
"comma-style": [2, "last"],
"indent": [2, 2, { "SwitchCase": 1, "VariableDeclarator": 2 }],
"quotes": [2, "single"],
"no-spaced-func": 2,
"operator-linebreak": [2, "after"],
"padded-blocks": [2, "never"],
"semi": [2, "always"],
"no-undef": 2,
"semi-spacing": [2, { "before": false, "after": true }],
"space-before-blocks": [2, "always"],
"space-before-function-paren": [2, "never"],
"object-curly-spacing": [2, "always"],
"array-bracket-spacing": [2, "never"],
"computed-property-spacing": [2, "never"],
"space-in-parens": [2, "never"],
"space-infix-ops": 2,
"spaced-comment": [2, "always"],
"no-var": 2,
"object-shorthand": [2, "always"],
"react/jsx-uses-react": 2,
"react/jsx-uses-vars": 2,
"react/react-in-jsx-scope": 2
}
}

7
.gitignore vendored
View File

@@ -1,9 +1,8 @@
node_modules
bower_components
bower_components/*
build
.DS_Store
*.log
app/js/db.js
nginx.pid
template_cache.js
.idea
/bin
env

View File

@@ -1,20 +0,0 @@
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*) /index.html [NC,L]
<IfModule mod_expires.c>
# Activate mod_expires for this directory
ExpiresActive on
ExpiresDefault "access"
ExpiresByType text/html "access"
ExpiresByType application/json "access"
</IfModule>
<IfModule mod_headers.c>
Header add Access-Control-Allow-Origin "*"
</IfModule>

View File

@@ -1 +0,0 @@
app/js/db.js

15
.travis.yml Normal file
View File

@@ -0,0 +1,15 @@
language: node_js
notifications:
email: false
sudo: false
node_js:
- "4.2.6"
cache:
directories:
- node_modules
before_script:
script:
- npm run lint
- npm test

126
ChangeLog.md Normal file
View File

@@ -0,0 +1,126 @@
#2.2.10
* Fix detailed export of module reinforcement packages
* Use damagedist for exact breakdown of weapons that have more than one type of damage
* Use new-style modification validity data
* Provide ability to select engineering blueprint and roll sample values for them
* Use coriolis-data 2.2.10:
* Fix incorrect base shield values for Cutter and Corvette
* Update weapons to have %-based damage distributions
* Remove power draw for detailed surface scanner - although shown in outfitting it is not part of active power
* Fix incorrect names for lightweight and kinetic armour
* Add engineering blueprints
#2.2.9
* Use SSL-enabled server for shortlinks
* Add falloff for weapons
* Use falloff when calculating weapon effectiveness in damage dealt
* Add engagement range slider to 'Damage Dealt' section to allow user to see change in weapon effectiveness with range
* Use better DPE calculation methodology
* Add total DPS and effectiveness information to 'Damage Dealt' section
* Use coriolis-data 2.2.9:
* Add falloff metric for weapons
* Add falloff from range modification
#2.2.8
* Fix issue where filling all internals with cargo racks would include restricted slots
* Use coriolis-data 2.2.8:
* Set military slot of Viper Mk IV to class 3; was incorrectly set as class 2
* Update base regeneration rate of prismatic shield generators to values in 2.2.03
* Update specials with information in 2.2.03
#2.2.7
* Fix resistance diminishing return calculations
* Do not allow -100% to be entered as a modification value
#2.2.6
* Add pitch/roll/yaw information
* Use combination of pitch, roll and yaw to provide a more useful agility metric
* Add movement summary to outfitting page
* Add standard internal class sizes to shipyard page
* Fix issue when importing Viper Mk IV
* Ensure ordering of all types of modules (standard, internal, utilities) is consistent
* Add rebuilds per bay information for fighter hangars
* Add ability to show military compartments
* Show module reinforcement package results in defence summary
* Use separate speed/rotation/acceleration multipliers for thrusters if available
* Obey restricted slot rules when adding all for internal slots
* Version URLs to handle changes to ship specifications over time
* Do not include disabled shield boosters in calculations
* Add 'Damage dealt' section
* Add 'Damage received' section
* Add 'Piercing' information to hardpoints
* Add 'Hardness' information to ship summary
* Add module copy functionality - drag module whilst holding 'alt' to copy
* Add base resistances to defence summary tooltip
* Update shield recovery/regeneration calculations
* Pin menu to top of page
* Switch to custom shortlink method to avoid google length limitations
* Ensure that information is not lost on narrow screens
* Do not lose ship selector selection on narrow screens
* Reinstate jump range graph
* Use coriolis-data 2.2.6:
* Update weapons with changed values for 2.2.03
* Add individual pitch/roll/yaw statistics for each ship
* Remove old and meaningless agility stat
* Use sane order for multi-module JSON - coriolis can re-order as it sees fit when displaying modules
* Fix cost of fighter hangars
* Update Powerplay weapons with current statistics
* Add separate min/opt/max multipliers for enhanced thrusters for speed, acceleration and rotation
* Add module reinforcement packages
* Add military compartments
* Fix missing damage value for 2B dumbfires
* Update shield recharge rates
* Reduce hull mass of Viper to 50T
* Fix incorrect optimal mass value for 8A thrusters
* Add power draw for detailed surface scanner
#2.2.5
* Calculate rate of fire for multi-burst weapons
* Add note to disable ghostery in error situation
* Use coriolis-data 2.2.5:
* Fix incorrect ID for emissive munitions special
* Fix rate of fire for burst lasers
* Add fragment cannon modifications
* Fix internal name of dazzle shell
#2.2.4
* Add shortlink for outfitting page
* Use coriolis-data 2.2.4:
* Fix incorrect ID for class 5 luxury passenger cabin
* Add damage type modifier
* Change modifications from simple strings to objects, to allow more data-driven behaviour
* Add special effects
* Modification tooltip now shows special effect
#2.2.3
* Fix hull boost calculation - now shows correct % modifier and total armour
* Fix import of DiamondBack - can now be imported
* Fix import of Beluga - can now be imported
* Use coriolis-data 2.2.3:
* Fix mismatch between class 5 and class 7 fighter hangars - now shows correct module
* Add details for concordant sequence special effect - now shows correct damage
* Fix details for thermal shock special effect - now shows correct damage
* Add engineer blueprints
* Modification tooltip now shows name and grade of modifications for imported builds
* Retain import URL unless user changes the build - allows future updates of Coriolis to take advantage of additional build information
#2.2.2
* Update DPS/HPS/EPS in real-time as modifiers change
* Use coriolis-data 2.2.2:
* Add distributor draw modifier to shield generators
* Remove modifiers for sensors
* Add initial loadout passenger cabins for Beluga
* Add initial loadout passenger cabins for Orca
* Update costs and initial loadouts for Keelback and Type-7
* Add resistances for hull reinforcement packages
* Added modifier actions to create modifications from raw data
* Show modification icon for modified modules
* Take modifications in to account when deciding whether to issue a warning on a standard module
* Fix hardpoint comparison DPS number when selecting an alternate module
* Ensure that retrofit tab only shows changed modules
* Fix import and export of ships with modifications, bump schema version to 4
* Enable boost display even if power distributor is disabled
* Calculate breakdown of ship offensive and defensive stats
* Add 'Offence summary' and 'Defence summary' components
* Add ability to import from companion API output through import feature
* Add ability to import from companion API output through URL

View File

@@ -1,37 +1,40 @@
[![Tasks in Ready](https://badge.waffle.io/cmmcleod/coriolis.png?label=ready&title=Ready)](https://waffle.io/cmmcleod/coriolis) [![Tasks in Progress](https://badge.waffle.io/cmmcleod/coriolis.svg?label=in%20progress&title=In%20Progress)](http://waffle.io/cmmcleod/coriolis)
![Latest Release](https://img.shields.io/github/release/EDCD/coriolis.svg) [![Build Status](https://travis-ci.org/EDCD/coriolis.svg?branch=master)](https://travis-ci.org/EDCD/coriolis) [![Chat to us on Discord](https://img.shields.io/badge/Discord-EDCD%20%23coriolis-blue.svg?style=social)](https://discord.gg/0uwCh6R62aPRjk9w)
## About
The Coriolis project was inspired by [E:D Shipyard](http://www.edshipyard.com/) and, of course, [Elite Dangerous](http://www.elitedangerous.com). The ultimate goal of Coriolis is to provide rich features to support in-game play and planning while engaging the E:D community to support its development.
Coriolis was created for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments.
Coriolis was created using assets and imagery from Elite: Dangerous, with the permission of Frontier Developments plc, for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments and no employee of Frontier Developments was involved in the making of it.
## Contributing
Please [submit issues](https://github.com/cmmcleod/coriolis/issues), or better yet [pull requests](http://www.elitedangerous.com) for any corrections or additions to the database or the code.
Please [submit issues](https://github.com/EDCD/coriolis/issues), or better yet [pull requests](https://github.com/EDCD/coriolis/pulls) for any corrections or additions to the database or the code.
### Feature Requests, Suggestions & Bugs
All such requests are managed and tracked through [issues](https://github.com/cmmcleod/coriolis/issues). An overview of these can be found [here](https://waffle.io/cmmcleod/coriolis).
Chat to us on [Discord](https://discord.gg/0uwCh6R62aPRjk9w)!
## Development
See the [Developer's Guide](https://github.com/cmmcleod/coriolis/wiki/Developer's-Guide) in the wiki.
### Ship and Component Database
### Ship and Module Database
See [Data wiki](https://github.com/cmmcleod/coriolis/wiki/Database) for details on structure, etc.
See the [Data wiki](https://github.com/cmmcleod/coriolis-data/wiki) for details on structure, etc.
## License
The MIT License
All Data and [associated JSON](https://github.com/EDCD/coriolis-data) files are intellectual property and copyright of Frontier Developments plc ('Frontier', 'Frontier Developments') and are subject to their
[terms and conditions](https://www.frontierstore.net/terms-and-conditions/).
The code (Javascript, CSS, HTML, and SVG files only) specificially for Coriolis.io is released under the MIT License.
Copyright (c) 2015 Coriolis.io, Colin McLeod
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
of this software (Javascript, CSS, HTML, and SVG files only), 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

View File

@@ -0,0 +1,30 @@
{
"adder": {
"t3": {"speed": 205, "boost": 298, "pitch": 35.37, "roll": 93.09, "yaw": 13.03},
"t2": {"speed": 209, "boost": 304, "pitch": 36.06, "roll": 94.90, "yaw": 13.29},
"t1": {"speed": 213, "boost": 310, "pitch": 36.80, "roll": 96.84, "yaw": 13.56},
"t0": {"speed": 218, "boost": 317, "pitch": 37.70, "roll": 99.20, "yaw": 13.89},
"t9": {"speed": 220, "boost": 321, "pitch": 38.08, "roll": 100.21, "yaw": 14.03},
"t8": {"speed": 225, "boost": 327, "pitch": 38.86, "roll": 102.26, "yaw": 14.32},
"t7": {"speed": 230, "boost": 334, "pitch": 39.69, "roll": 104.44, "yaw": 14.62},
"t6": {"speed": 234, "boost": 340, "pitch": 40.41, "roll": 106.34, "yaw": 14.89},
"t5": {"speed": 242, "boost": 351, "pitch": 41.71, "roll": 109.78, "yaw": 15.37}
},
"eagle": {
"t2": {"speed": 223, "boost": 325, "pitch": 46.45, "roll": 111.48, "yaw": 16.72},
"t1": {"speed": 229, "boost": 334, "pitch": 47.69, "roll": 114.46, "yaw": 17.17},
"t0": {"speed": 235, "boost": 343, "pitch": 49.00, "roll": 117.60, "yaw": 17.64},
"t9": {"speed": 239, "boost": 349, "pitch": 49.80, "roll": 119.53, "yaw": 17.93},
"t8": {"speed": 243, "boost": 355, "pitch": 50.70, "roll": 121.69, "yaw": 18.25},
"t7": {"speed": 248, "boost": 361, "pitch": 51.62, "roll": 123.89, "yaw": 18.58},
"t6": {"speed": 252, "boost": 367, "pitch": 52.46, "roll": 125.91, "yaw": 18.89},
"t5": {"speed": 259, "boost": 378, "pitch": 53.99, "roll": 129.56, "yaw": 19.43}
},
"hauler": {
"t4": {"speed": 203, "boost": 305, "pitch": 36.61, "roll": 101.71, "yaw": 14.24},
"t3": {"speed": 209, "boost": 314, "pitch": 37.63, "roll": 104.54, "yaw": 14.64},
"t2": {"speed": 216, "boost": 324, "pitch": 38.89, "roll": 108.03, "yaw": 15.12},
"t1": {"speed": 222, "boost": 333, "pitch": 39.97, "roll": 111.02, "yaw": 15.54},
"t0": {"speed": 232, "boost": 348, "pitch": 41.76, "roll": 116.00, "yaw": 16.24}
}
}

View File

@@ -0,0 +1,289 @@
{
"$schema": "http://cdn.coriolis.io/schemas/ship-loadout/3.json#",
"name": "Test My Ship",
"ship": "Anaconda",
"references": [
{
"name": "Coriolis.io",
"url": "http://localhost:3300/outfit/anaconda/48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.AwRj4zNKqA==.CwBhCYzBGW9qCTSqs5xA?bn=Test%20My%20Ship",
"old-code": "48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.AwRj4zNKqA==.CwBhCYzBGW9qCTSqs5xA",
"code": "4putkFklkdzsuf52c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.AwRj4zNKqA==.CwBhCYzBGW9qCTSqs5xA",
"shipId": "anaconda"
}
],
"components": {
"standard": {
"bulkheads": "Reactive Surface Composite",
"cargoHatch": {
"enabled": false,
"priority": 5
},
"powerPlant": {
"class": 8,
"rating": "A",
"enabled": true,
"priority": 1
},
"thrusters": {
"class": 6,
"rating": "A",
"enabled": true,
"priority": 1
},
"frameShiftDrive": {
"class": 6,
"rating": "A",
"enabled": true,
"priority": 3
},
"lifeSupport": {
"class": 5,
"rating": "A",
"enabled": true,
"priority": 1
},
"powerDistributor": {
"class": 8,
"rating": "A",
"enabled": true,
"priority": 1
},
"sensors": {
"class": 8,
"rating": "A",
"enabled": true,
"priority": 1
},
"fuelTank": {
"class": 5,
"rating": "C",
"enabled": true,
"priority": 1
}
},
"hardpoints": [
{
"class": 4,
"rating": "A",
"enabled": true,
"priority": 2,
"group": "Plasma Accelerator",
"mount": "Fixed"
},
{
"class": 3,
"rating": "D",
"enabled": true,
"priority": 2,
"group": "Beam Laser",
"mount": "Turret"
},
{
"class": 3,
"rating": "D",
"enabled": true,
"priority": 2,
"group": "Beam Laser",
"mount": "Turret"
},
{
"class": 3,
"rating": "D",
"enabled": true,
"priority": 2,
"group": "Beam Laser",
"mount": "Turret"
},
{
"class": 2,
"rating": "E",
"enabled": true,
"priority": 2,
"group": "Cannon",
"mount": "Turret"
},
{
"class": 2,
"rating": "E",
"enabled": true,
"priority": 2,
"group": "Cannon",
"mount": "Turret"
},
{
"class": 1,
"rating": "F",
"enabled": true,
"priority": 2,
"group": "Beam Laser",
"mount": "Turret"
},
{
"class": 1,
"rating": "F",
"enabled": true,
"priority": 2,
"group": "Beam Laser",
"mount": "Turret"
}
],
"utility": [
{
"class": 0,
"rating": "A",
"enabled": true,
"priority": 1,
"group": "Shield Booster"
},
{
"class": 0,
"rating": "A",
"enabled": true,
"priority": 1,
"group": "Shield Booster"
},
null,
{
"class": 0,
"rating": "C",
"enabled": true,
"priority": 2,
"group": "Kill Warrant Scanner"
},
{
"class": 0,
"rating": "C",
"enabled": true,
"priority": 2,
"group": "Cargo Scanner"
},
{
"class": 0,
"rating": "F",
"enabled": false,
"priority": 1,
"group": "Countermeasure",
"name": "Electronic Countermeasure"
},
{
"class": 0,
"rating": "I",
"enabled": true,
"priority": 1,
"group": "Countermeasure",
"name": "Chaff Launcher"
},
{
"class": 0,
"rating": "I",
"enabled": true,
"priority": 2,
"group": "Countermeasure",
"name": "Point Defence"
}
],
"internal": [
{
"class": 7,
"rating": "A",
"enabled": true,
"priority": 1,
"group": "Shield Generator"
},
{
"class": 6,
"rating": "A",
"enabled": true,
"priority": 1,
"group": "Shield Cell Bank"
},
{
"class": 6,
"rating": "E",
"enabled": true,
"priority": 1,
"group": "Cargo Rack"
},
{
"class": 5,
"rating": "D",
"enabled": true,
"priority": 1,
"group": "Hull Reinforcement Package"
},
{
"class": 5,
"rating": "E",
"enabled": true,
"priority": 1,
"group": "Cargo Rack"
},
null,
null,
{
"class": 4,
"rating": "E",
"enabled": true,
"priority": 1,
"group": "Cargo Rack"
},
{
"class": 4,
"rating": "E",
"enabled": true,
"priority": 1,
"group": "Cargo Rack"
},
{
"class": 4,
"rating": "A",
"enabled": true,
"priority": 3,
"group": "Fuel Scoop"
},
{
"class": 2,
"rating": "A",
"enabled": true,
"priority": 3,
"group": "Frame Shift Drive Interdictor"
}
]
},
"stats": {
"class": 3,
"hullCost": 141889930,
"speed": 180,
"topSpeed": 186.5,
"boost": 240,
"boostEnergy": 29,
"topBoost": 248.66,
"agility": 2,
"baseShieldStrength": 350,
"baseArmour": 945,
"hullMass": 400,
"masslock": 23,
"pipSpeed": 0.14,
"moduleCostMultiplier": 1,
"fuelCapacity": 32,
"cargoCapacity": 128,
"ladenMass": 1339.2,
"armour": 2228,
"armourAdded": 390,
"armourMultiplier": 1.95,
"shieldMultiplier": 1.4,
"totalCost": 882362060,
"unladenMass": 1179.2,
"totalDps": 29,
"powerAvailable": 36,
"powerRetracted": 23.33,
"powerDeployed": 34.76,
"unladenRange": 18.49,
"fullTankRange": 18.12,
"ladenRange": 16.39,
"unladenFastestRange": 73.21,
"ladenFastestRange": 66.15,
"maxJumpCount": 4,
"shieldStrength": 833
}
}

View File

@@ -0,0 +1,322 @@
{
"$schema": "http://cdn.coriolis.io/schemas/ship-loadout/4.json#",
"name": "Test My Ship",
"ship": "Anaconda",
"references": [
{
"name": "Coriolis.io",
"url": "http://localhost:3300/outfit/anaconda/48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.AwRj4zNKqA==.CwBhCYzBGW9qCTSqs5xA.H4sIAAAAAAAAA2MUe8HMwPD-PwDDhxeuCAAAAA==?bn=Test%20My%20Ship",
"old-code": "48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.AwRj4zNKqA==.CwBhCYzBGW9qCTSqs5xA.H4sIAAAAAAAAA2MUe8HMwPD-PwDDhxeuCAAAAA==",
"code": "4putkFklkdzsuf52c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b.AwRj4zNKqA==.CwBhCYzBGW9qCTSqs5xA.H4sIAAAAAAAAA2MUe8HMwPD-PwDDhxeuCAAAAA==",
"shipId": "anaconda"
}
],
"components": {
"standard": {
"bulkheads": "Reactive Surface Composite",
"cargoHatch": {
"enabled": false,
"priority": 5
},
"powerPlant": {
"class": 8,
"rating": "A",
"enabled": true,
"priority": 1,
"modifications": {
"pgen": 1000
}
},
"thrusters": {
"class": 6,
"rating": "A",
"enabled": true,
"priority": 1
},
"frameShiftDrive": {
"class": 6,
"rating": "A",
"enabled": true,
"priority": 3
},
"lifeSupport": {
"class": 5,
"rating": "A",
"enabled": true,
"priority": 1
},
"powerDistributor": {
"class": 8,
"rating": "A",
"enabled": true,
"priority": 1
},
"sensors": {
"class": 8,
"rating": "A",
"enabled": true,
"priority": 1
},
"fuelTank": {
"class": 5,
"rating": "C",
"enabled": true,
"priority": 1
}
},
"hardpoints": [
{
"class": 4,
"rating": "A",
"enabled": true,
"priority": 2,
"group": "Plasma Accelerator",
"mount": "Fixed"
},
{
"class": 3,
"rating": "D",
"enabled": true,
"priority": 2,
"group": "Beam Laser",
"mount": "Turret"
},
{
"class": 3,
"rating": "D",
"enabled": true,
"priority": 2,
"group": "Beam Laser",
"mount": "Turret"
},
{
"class": 3,
"rating": "D",
"enabled": true,
"priority": 2,
"group": "Beam Laser",
"mount": "Turret"
},
{
"class": 2,
"rating": "E",
"enabled": true,
"priority": 2,
"group": "Cannon",
"mount": "Turret"
},
{
"class": 2,
"rating": "E",
"enabled": true,
"priority": 2,
"group": "Cannon",
"mount": "Turret"
},
{
"class": 1,
"rating": "F",
"enabled": true,
"priority": 2,
"group": "Beam Laser",
"mount": "Turret"
},
{
"class": 1,
"rating": "F",
"enabled": true,
"priority": 2,
"group": "Beam Laser",
"mount": "Turret"
}
],
"utility": [
{
"class": 0,
"rating": "A",
"enabled": true,
"priority": 1,
"group": "Shield Booster"
},
{
"class": 0,
"rating": "A",
"enabled": true,
"priority": 1,
"group": "Shield Booster"
},
null,
{
"class": 0,
"rating": "C",
"enabled": true,
"priority": 2,
"group": "Kill Warrant Scanner"
},
{
"class": 0,
"rating": "C",
"enabled": true,
"priority": 2,
"group": "Cargo Scanner"
},
{
"class": 0,
"rating": "F",
"enabled": false,
"priority": 1,
"group": "Electronic Countermeasure",
"name": "Electronic Countermeasure"
},
{
"class": 0,
"rating": "I",
"enabled": true,
"priority": 1,
"group": "Chaff Launcher",
"name": "Chaff Launcher"
},
{
"class": 0,
"rating": "I",
"enabled": true,
"priority": 2,
"group": "Point Defence",
"name": "Point Defence"
}
],
"internal": [
{
"class": 7,
"rating": "A",
"enabled": true,
"priority": 1,
"group": "Shield Generator"
},
{
"class": 6,
"rating": "A",
"enabled": true,
"priority": 1,
"group": "Shield Cell Bank"
},
{
"class": 6,
"rating": "E",
"enabled": true,
"priority": 1,
"group": "Cargo Rack"
},
{
"class": 5,
"rating": "D",
"enabled": true,
"priority": 1,
"group": "Hull Reinforcement Package"
},
{
"class": 5,
"rating": "E",
"enabled": true,
"priority": 1,
"group": "Cargo Rack"
},
null,
null,
null,
{
"class": 4,
"rating": "E",
"enabled": true,
"priority": 1,
"group": "Cargo Rack"
},
{
"class": 4,
"rating": "E",
"enabled": true,
"priority": 1,
"group": "Cargo Rack"
},
{
"class": 4,
"rating": "A",
"enabled": true,
"priority": 3,
"group": "Fuel Scoop"
},
{
"class": 2,
"rating": "A",
"enabled": true,
"priority": 3,
"group": "Frame Shift Drive Interdictor"
}
]
},
"stats": {
"class": 3,
"fighterHangars": 1,
"hullCost": 141889930,
"speed": 180,
"topSpeed": 186.5,
"boost": 240,
"boostEnergy": 27,
"topBoost": 249.34,
"topPitch": 25.97,
"topRoll": 62.34,
"topYaw": 10.39,
"topSpeed": 187.01,
"totalCost": 882362058,
"totalDpe": 142.68,
"totalDps": 103.8,
"totalEps": 22.71,
"totalHps": 677.29,
"totalExplDpe": 0,
"totalExplDps": 0,
"totalExplSDps": 0,
"totalHps": 33.62,
"totalKinDpe": 117.48,
"totalKinDps": 24.94,
"totalKinSDps": 18.76,
"totalSDps": 91.84,
"totalThermDpe": 21.63,
"totalThermDps": 60.08,
"totalThermSDps": 58.64,
"baseShieldStrength": 350,
"baseArmour": 945,
"hullExplRes": 0.22,
"hullKinRes": 0.27,
"hullMass": 400,
"hullThermRes": -0.36,
"masslock": 23,
"pipSpeed": 0.14,
"pitch": 25,
"moduleCostMultiplier": 1,
"modulearmour": 0,
"moduleprotection": 0,
"fuelCapacity": 32,
"cargoCapacity": 128,
"ladenMass": 1323.2,
"armour": 2227.5,
"baseArmour": 525,
"unladenMass": 1163.2,
"powerAvailable": 39.6,
"powerRetracted": 23.33,
"powerDeployed": 34.13,
"roll": 60,
"unladenRange": 18.74,
"yaw": 10,
"fullTankRange": 18.36,
"hardness": 65,
"ladenRange": 16.59,
"unladenFastestRange": 74.2,
"ladenFastestRange": 66.96,
"maxJumpCount": 4,
"shield": 833,
"shieldCells": 1840,
"shieldExplRes": 0.5,
"shieldKinRes": 0.4,
"shieldThermRes": -0.2
}
}

View File

@@ -0,0 +1,255 @@
{
"$schema": "http://cdn.coriolis.io/schemas/ship-loadout/4.json#",
"name": "Multi-purpose Asp Explorer",
"ship": "Asp Explorer",
"references": [
{
"name": "Coriolis.io",
"url": "https://coriolis.edcd.io/outfit/asp?code=0pftiFflfddsnf5------020202033c044002v62f2i.AwRj4yvI.CwRgDBldHnJA.H4sIAAAAAAAAA2P858DAwPCXEUhwHPvx%2F78YG5AltB7I%2F8%2F0TwImJboDSPJ%2F%2B%2Ff%2Fv%2FKlX%2F%2F%2Fi3AwMTBIfARK%2FGf%2BJwVSxArStVAYqOjvz%2F%2F%2FJVo5GRhE2IBc4SKQSSz%2FDGEmCa398P8%2F%2F2%2BgTf%2F%2FAwDFxwtofAAAAA%3D%3D&bn=Multi-purpose%20Asp%20Explorer",
"code": "0pftiFflfddsnf5------020202033c044002v62f2i.AwRj4yvI.CwRgDBldHnJA.H4sIAAAAAAAAA2P858DAwPCXEUhwHPvx/78YG5AltB7I/8/0TwImJboDSPJ/+/f/v/KlX///i3AwMTBIfARK/Gf+JwVSxArStVAYqOjvz///JVo5GRhE2IBc4SKQSSz/DGEmCa398P8//2+gTf//AwDFxwtofAAAAA==",
"shipId": "asp"
}
],
"components": {
"standard": {
"bulkheads": "Lightweight Alloy",
"cargoHatch": {
"enabled": false,
"priority": 5
},
"powerPlant": {
"class": 5,
"rating": "A",
"enabled": true,
"priority": 2,
"modifications": {
"eff": -1850,
"pgen": 6,
"mass": 431
},
"blueprint": {
"id": 64,
"name": "Low emissions",
"grade": 1
}
},
"thrusters": {
"class": 5,
"rating": "D",
"enabled": true,
"priority": 1,
"modifications": {
"optmul": 440,
"integrity": -266,
"thermload": -1326,
"optmass": 520,
"power": 241
},
"blueprint": {
"id": 24,
"name": "Clean",
"grade": 1
}
},
"frameShiftDrive": {
"class": 5,
"rating": "A",
"enabled": true,
"priority": 1,
"modifications": {
"mass": 5025,
"integrity": -1539,
"power": 2437,
"optmass": 4870,
"maxfuel": 370
},
"blueprint": {
"id": 26,
"name": "Increased range",
"grade": 5
}
},
"lifeSupport": {
"class": 4,
"rating": "A",
"enabled": true,
"priority": 1,
"modifications": {
"mass": -3923,
"integrity": -1797
},
"blueprint": {
"id": 49,
"name": "Lightweight",
"grade": 1
}
},
"powerDistributor": {
"class": 3,
"rating": "D",
"enabled": true,
"priority": 1
},
"sensors": {
"class": 5,
"rating": "D",
"enabled": true,
"priority": 1
},
"fuelTank": {
"class": 5,
"rating": "C",
"enabled": true,
"priority": 1
}
},
"hardpoints": [
null,
null,
null,
null,
null,
null
],
"utility": [
{
"class": 0,
"rating": "I",
"enabled": true,
"priority": 1,
"group": "Heat Sink Launcher",
"name": "Heat Sink Launcher"
},
{
"class": 0,
"rating": "I",
"enabled": true,
"priority": 1,
"group": "Heat Sink Launcher",
"name": "Heat Sink Launcher"
},
{
"class": 0,
"rating": "I",
"enabled": true,
"priority": 1,
"group": "Heat Sink Launcher",
"name": "Heat Sink Launcher"
},
{
"class": 0,
"rating": "I",
"enabled": true,
"priority": 1,
"group": "Point Defence",
"name": "Point Defence"
}
],
"internal": [
{
"class": 6,
"rating": "A",
"enabled": true,
"priority": 1,
"group": "Fuel Scoop"
},
{
"class": 5,
"rating": "E",
"enabled": true,
"priority": 2,
"group": "Cargo Rack"
},
{
"class": 3,
"rating": "A",
"enabled": true,
"priority": 1,
"group": "Shield Generator"
},
{
"class": 3,
"rating": "E",
"enabled": true,
"priority": 2,
"group": "Cargo Rack"
},
{
"class": 2,
"rating": "G",
"enabled": true,
"priority": 1,
"group": "Planetary Vehicle Hangar"
},
{
"class": 1,
"rating": "C",
"enabled": true,
"priority": 2,
"group": "Scanner",
"name": "Advanced Discovery Scanner"
},
{
"class": 1,
"rating": "C",
"enabled": true,
"priority": 2,
"group": "Scanner",
"name": "Detailed Surface Scanner"
}
]
},
"stats": {
"class": 2,
"hullCost": 6135660,
"speed": 250,
"boost": 340,
"boostEnergy": 13,
"agility": 6,
"baseShieldStrength": 140,
"baseArmour": 210,
"hullMass": 280,
"masslock": 11,
"pipSpeed": 0.13,
"moduleCostMultiplier": 1,
"fuelCapacity": 32,
"cargoCapacity": 40,
"ladenMass": 435.26,
"armour": 378,
"shield": 113.43,
"shieldCells": 0,
"totalCost": 48402550,
"unladenMass": 363.26,
"totalDpe": 0,
"totalExplDpe": 0,
"totalKinDpe": 0,
"totalThermDpe": 0,
"totalDps": 0,
"totalExplDps": 0,
"totalKinDps": 0,
"totalThermDps": 0,
"totalSDps": 0,
"totalExplSDps": 0,
"totalKinSDps": 0,
"totalThermSDps": 0,
"totalEps": 1.2,
"totalHps": 1,
"shieldExplRes": 0.5,
"shieldKinRes": 0.6,
"shieldThermRes": 1.2,
"hullExplRes": 1.4,
"hullKinRes": 1.2,
"hullThermRes": 1,
"powerAvailable": 20.41,
"powerRetracted": 11.91,
"powerDeployed": 11.91,
"unladenRange": 50.45,
"fullTankRange": 47.03,
"ladenRange": 42.71,
"unladenFastestRange": 317.24,
"ladenFastestRange": 287.02,
"maxJumpCount": 7,
"topSpeed": 274.01,
"topBoost": 372.65
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,552 @@
{
"cargo": {
"capacity": 32
},
"free": false,
"fuel": {
"main": {
"capacity": 128
},
"reserve": {
"capacity": 0.81
}
},
"id": 31,
"modules": {
"Armour": {
"module": {
"free": false,
"id": 128049346,
"name": "BelugaLiner_Armour_Grade1",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 0
}
},
"Bobble01": [],
"Bobble02": [],
"Bobble03": [],
"Bobble04": [],
"Bobble05": [],
"Bobble06": [],
"Bobble07": [],
"Bobble08": [],
"Bobble09": [],
"Bobble10": [],
"Decal1": {
"module": {
"free": false,
"id": 128667757,
"name": "Decal_Explorer_Ranger",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 0
}
},
"Decal2": {
"module": {
"free": false,
"id": 128667742,
"name": "Decal_Combat_Deadly",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 0
}
},
"Decal3": {
"module": {
"free": false,
"id": 128667750,
"name": "Decal_Trade_Tycoon",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 0
}
},
"EngineColour": [],
"FrameShiftDrive": {
"module": {
"free": false,
"id": 128064132,
"modifiers": {
"engineerID": 300100,
"id": 175,
"modifiers": [
{
"name": "mod_mass",
"type": 1,
"value": 0.4457540512085
},
{
"name": "mod_health",
"type": 1,
"value": -0.24584779143333
},
{
"name": "mod_passive_power",
"type": 1,
"value": 0.24457727372646
},
{
"name": "mod_fsd_optimised_mass",
"type": 1,
"value": 0.49257898330688
},
{
"name": "mod_fsd_max_fuel_per_jump",
"type": 2,
"value": 0.028505677357316
},
{
"name": "mod_fsd_heat_rate",
"type": 2,
"value": -0.079360365867615
}
],
"moduleTags": [
16
],
"recipeID": 128673694,
"slotIndex": 53
},
"name": "Int_Hyperdrive_Size7_Class5",
"on": true,
"priority": 0,
"recipeLevel": 5,
"recipeName": "FSD_LongRange",
"recipeValue": 0,
"unloaned": 0,
"value": 46160201
}
},
"FuelTank": {
"module": {
"free": false,
"id": 128064352,
"name": "Int_FuelTank_Size7_Class3",
"on": true,
"priority": 1,
"unloaned": 1602822,
"value": 1602822
}
},
"LifeSupport": {
"module": {
"free": false,
"id": 128064174,
"name": "Int_LifeSupport_Size8_Class2",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 1569565
}
},
"MainEngines": {
"module": {
"free": false,
"id": 128064094,
"modifiers": {
"engineerID": 300100,
"id": 253,
"modifiers": [
{
"name": "mod_engine_mass_curve_multiplier",
"type": 1,
"value": 0.098235413432121
},
{
"name": "mod_engine_heat",
"type": 1,
"value": 0.18069696426392
},
{
"name": "mod_passive_power",
"type": 1,
"value": 0.033788848668337
},
{
"name": "mod_health",
"type": 1,
"value": -0.056404989212751
},
{
"name": "mod_engine_mass_curve",
"type": 1,
"value": -0.027384582906961
},
{
"name": "mod_engine_heat",
"type": 2,
"value": -0.072683908045292
}
],
"moduleTags": [
17
],
"recipeID": 128673655,
"slotIndex": 52
},
"name": "Int_Engine_Size7_Class2",
"on": true,
"priority": 0,
"recipeLevel": 1,
"recipeName": "Engine_Dirty",
"recipeValue": 0,
"unloaned": 0,
"value": 1709638
}
},
"MediumHardpoint1": {
"module": {
"free": false,
"id": 128049436,
"name": "Hpt_BeamLaser_Turret_Medium",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 1889910
}
},
"MediumHardpoint2": {
"module": {
"free": false,
"id": 128049436,
"name": "Hpt_BeamLaser_Turret_Medium",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 1889910
}
},
"MediumHardpoint3": {
"module": {
"free": false,
"id": 128049460,
"name": "Hpt_MultiCannon_Gimbal_Medium",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 51300
}
},
"MediumHardpoint4": {
"module": {
"free": false,
"id": 128049460,
"name": "Hpt_MultiCannon_Gimbal_Medium",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 51300
}
},
"MediumHardpoint5": {
"module": {
"free": false,
"id": 128049460,
"name": "Hpt_MultiCannon_Gimbal_Medium",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 51300
}
},
"PaintJob": {
"module": {
"free": false,
"id": 128732290,
"name": "PaintJob_BelugaLiner_Tactical_White",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 0
}
},
"PlanetaryApproachSuite": {
"module": {
"free": false,
"id": 128672317,
"name": "Int_PlanetApproachSuite",
"on": true,
"priority": 1,
"unloaned": 450,
"value": 450
}
},
"PowerDistributor": {
"module": {
"free": false,
"id": 128064207,
"name": "Int_PowerDistributor_Size6_Class5",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 3128120
}
},
"PowerPlant": {
"module": {
"free": false,
"id": 128064057,
"modifiers": {
"engineerID": 300100,
"id": 277,
"modifiers": [
{
"name": "mod_powerplant_power",
"type": 1,
"value": 0.054692290723324
},
{
"name": "mod_health",
"type": 1,
"value": -0.033690698444843
},
{
"name": "mod_powerplant_heat",
"type": 1,
"value": 0.027470717206597
},
{
"name": "mod_powerplant_heat",
"type": 2,
"value": -0.056317910552025
}
],
"moduleTags": [
18
],
"recipeID": 128673765,
"slotIndex": 51
},
"name": "Int_Powerplant_Size6_Class5",
"on": true,
"priority": 1,
"recipeLevel": 1,
"recipeName": "PowerPlant_Boosted",
"recipeValue": 0,
"unloaned": 0,
"value": 14561578
}
},
"Radar": {
"module": {
"free": false,
"id": 128064239,
"name": "Int_Sensors_Size5_Class2",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 71500
}
},
"Slot01_Size6": {
"module": {
"free": false,
"id": 128666681,
"name": "Int_FuelScoop_Size6_Class5",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 25887249
}
},
"Slot02_Size6": {
"module": {
"free": false,
"id": 128064287,
"name": "Int_ShieldGenerator_Size6_Class5",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 14561578
}
},
"Slot03_Size6": {
"module": {
"free": false,
"id": 128727927,
"name": "Int_PassengerCabin_Size6_Class2",
"on": true,
"priority": 1,
"unloaned": 165808,
"value": 165808
}
},
"Slot04_Size6": {
"module": {
"free": false,
"id": 128727928,
"name": "Int_PassengerCabin_Size6_Class3",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 497429
}
},
"Slot05_Size5": {
"module": {
"free": false,
"id": 128727925,
"name": "Int_PassengerCabin_Size5_Class4",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 1492286
}
},
"Slot06_Size5": {
"module": {
"free": false,
"id": 128064342,
"name": "Int_CargoRack_Size5_Class1",
"on": true,
"priority": 1,
"unloaned": 100409,
"value": 100409
}
},
"Slot07_Size4": {
"module": {
"free": false,
"id": 128727922,
"name": "Int_PassengerCabin_Size4_Class1",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 17059
}
},
"Slot08_Size3": {
"module": {
"free": false,
"id": 128667632,
"name": "Int_Repairer_Size3_Class5",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 2361960
}
},
"Slot09_Size3": {
"module": {
"free": false,
"id": 128672289,
"name": "Int_BuggyBay_Size2_Class2",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 19440
}
},
"Slot10_Size3": {
"module": {
"free": false,
"id": 128666634,
"name": "Int_DetailedSurfaceScanner_Tiny",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 225000
}
},
"Slot11_Size3": {
"module": {
"free": false,
"id": 128663561,
"name": "Int_StellarBodyDiscoveryScanner_Advanced",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 1390500
}
},
"TinyHardpoint1": {
"module": {
"free": false,
"id": 128049513,
"name": "Hpt_ChaffLauncher_Tiny",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 7650
}
},
"TinyHardpoint2": {
"module": {
"free": false,
"id": 128668536,
"name": "Hpt_ShieldBooster_Size0_Class5",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 252900
}
},
"TinyHardpoint3": {
"module": {
"free": false,
"id": 128668536,
"name": "Hpt_ShieldBooster_Size0_Class5",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 252900
}
},
"TinyHardpoint4": {
"module": {
"free": false,
"id": 128668536,
"name": "Hpt_ShieldBooster_Size0_Class5",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 281000
}
},
"TinyHardpoint5": {
"module": {
"free": false,
"id": 128668536,
"name": "Hpt_ShieldBooster_Size0_Class5",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 281000
}
},
"TinyHardpoint6": {
"module": {
"free": false,
"id": 128668536,
"name": "Hpt_ShieldBooster_Size0_Class5",
"on": true,
"priority": 0,
"unloaned": 0,
"value": 281000
}
},
"WeaponColour": {
"module": {
"free": false,
"id": 128732194,
"name": "WeaponCustomisation_Purple",
"on": true,
"priority": 1,
"unloaned": 0,
"value": 0
}
}
},
"name": "BelugaLiner",
"value": {
"hull": 71688743,
"modules": 120812762,
"unloaned": 1869489
}
}

View File

@@ -0,0 +1,327 @@
{
"$schema": "http://cdn.coriolis.io/schemas/ship-loadout/4.json#",
"name": "Multi-purpose Imperial Courier",
"ship": "Imperial Courier",
"references": [
{
"name": "Coriolis.io",
"url": "https://coriolis.edcd.io/outfit/imperial_courier?code=0patzF5l0das8f31a1a270202000e402t0101-2f.AwRj4zKA.CwRgDBldLiQ%3D.H4sIAAAAAAAAA12OP0tCYRjFj9fuVbvF1du9ekkT8s%2FkIg4NElyIBBd321yaGvwUQTS3N7UFfYygIT9EoyQUJA36ns47XJCWA%2B%2Fz%2Bz3Pe3ImBbDNKaqNPSBoGrL4ngfomKpFGiJ%2BLgHteR1IPjxJT5pF11uSeXNsJVcRfgdC92syWUuK0iMdKZqrjJ%2F0aoA71lJ5oKf38knWcCiptCPdhJIerdS00vlK0qktlqoj983UmqqHjQ33VsW8eazFmaTyULP2hQ4lX8LBme6g%2F6v0TTdbxJ2KhdEIaCw15MF%2FNB0L%2BS2hwEwyFM8KgP%2BqEpWWA3Qu9Z3z9kPWHzakt7Dt%2BAeD7ghSTgEAAA%3D%3D&bn=Multi-purpose%20Imperial%20Courier",
"code": "0patzF5l0das8f31a1a270202000e402t0101-2f.AwRj4zKA.CwRgDBldLiQ=.H4sIAAAAAAAAA12OP0tCYRjFj9fuVbvF1du9ekkT8s/kIg4NElyIBBd321yaGvwUQTS3N7UFfYygIT9EoyQUJA36ns47XJCWA+/z+z3Pe3ImBbDNKaqNPSBoGrL4ngfomKpFGiJ+LgHteR1IPjxJT5pF11uSeXNsJVcRfgdC92syWUuK0iMdKZqrjJ/0aoA71lJ5oKf38knWcCiptCPdhJIerdS00vlK0qktlqoj983UmqqHjQ33VsW8eazFmaTyULP2hQ4lX8LBme6g/6v0TTdbxJ2KhdEIaCw15MF/NB0L+S2hwEwyFM8KgP+qEpWWA3Qu9Z3z9kPWHzakt7Dt+AeD7ghSTgEAAA==",
"shipId": "imperial_courier"
}
],
"components": {
"standard": {
"bulkheads": "Lightweight Alloy",
"cargoHatch": {
"enabled": false,
"priority": 5
},
"powerPlant": {
"class": 4,
"rating": "A",
"enabled": true,
"priority": 2,
"modifications": {
"pgen": 1052,
"integrity": -482,
"eff": 974
},
"blueprint": {
"id": 63,
"name": "Overcharged",
"grade": 1
}
},
"thrusters": {
"class": 3,
"rating": "A",
"enabled": true,
"priority": 1,
"name": "Enhanced Performance",
"modifications": {
"optmul": 2476,
"thermload": 7023,
"power": 1763,
"integrity": 165,
"optmass": -667
},
"blueprint": {
"id": 22,
"name": "Dirty",
"grade": 4
}
},
"frameShiftDrive": {
"class": 3,
"rating": "A",
"enabled": true,
"priority": 1,
"modifications": {
"mass": 4082,
"integrity": -2422,
"power": 1782,
"optmass": 4927
},
"blueprint": {
"id": 26,
"name": "Increased range",
"grade": 5
}
},
"lifeSupport": {
"class": 1,
"rating": "A",
"enabled": true,
"priority": 1
},
"powerDistributor": {
"class": 3,
"rating": "A",
"enabled": true,
"priority": 1
},
"sensors": {
"class": 2,
"rating": "D",
"enabled": true,
"priority": 1
},
"fuelTank": {
"class": 3,
"rating": "C",
"enabled": true,
"priority": 1
}
},
"hardpoints": [
{
"class": 2,
"rating": "F",
"enabled": true,
"priority": 1,
"group": "Pulse Laser",
"mount": "Fixed",
"modifications": {
"rof": 5931,
"damage": -184,
"jitter": 50,
"distdraw": -4689,
"piercing": 3328
},
"blueprint": {
"id": 89,
"name": "Rapid fire",
"grade": 5
}
},
{
"class": 2,
"rating": "F",
"enabled": true,
"priority": 1,
"group": "Pulse Laser",
"mount": "Fixed",
"modifications": {
"rof": 4715,
"damage": -97,
"jitter": 30,
"distdraw": -4548,
"piercing": 1057,
"integrity": 319
},
"blueprint": {
"id": 89,
"name": "Rapid fire",
"grade": 5
}
},
{
"class": 2,
"rating": "F",
"enabled": true,
"priority": 1,
"group": "Multi-cannon",
"mount": "Gimballed",
"modifications": {
"damage": 2437,
"distdraw": 5487,
"rof": 1120,
"jitter": 58,
"thermload": 1346,
"power": 1009,
"integrity": -202,
"ammo": -2000
},
"blueprint": {
"id": 88,
"name": "Overcharged",
"grade": 3,
"special": {
"id": 3,
"name": "Corrosive shell"
}
}
}
],
"utility": [
{
"class": 0,
"rating": "I",
"enabled": true,
"priority": 1,
"group": "Heat Sink Launcher",
"name": "Heat Sink Launcher",
"modifications": {
"ammo": 5000,
"mass": 17684,
"reload": 9707
},
"blueprint": {
"id": 37,
"name": "Ammo capacity",
"grade": 3
}
},
{
"class": 0,
"rating": "I",
"enabled": true,
"priority": 1,
"group": "Heat Sink Launcher",
"name": "Heat Sink Launcher",
"modifications": {
"ammo": 5000,
"mass": 18520,
"reload": 8715
},
"blueprint": {
"id": 37,
"name": "Ammo capacity",
"grade": 3
}
},
{
"class": 0,
"rating": "I",
"enabled": true,
"priority": 1,
"group": "Chaff Launcher",
"name": "Chaff Launcher"
},
{
"class": 0,
"rating": "A",
"enabled": true,
"priority": 1,
"group": "Frame Shift Wake Scanner"
}
],
"internal": [
{
"class": 3,
"rating": "A",
"enabled": true,
"priority": 1,
"group": "Shield Generator",
"modifications": {
"optmul": 1888,
"explres": 455,
"kinres": 546,
"thermres": 1092,
"brokenregen": -2614,
"regen": -876,
"distdraw": 463
},
"blueprint": {
"id": 77,
"name": "Reinforced",
"grade": 3
}
},
{
"class": 3,
"rating": "A",
"enabled": true,
"priority": 1,
"group": "Fuel Scoop"
},
{
"class": 2,
"rating": "E",
"enabled": true,
"priority": 2,
"group": "Cargo Rack"
},
{
"class": 2,
"rating": "E",
"enabled": true,
"priority": 2,
"group": "Cargo Rack"
},
null,
{
"class": 1,
"rating": "C",
"enabled": true,
"priority": 2,
"group": "Scanner",
"name": "Advanced Discovery Scanner"
}
]
},
"stats": {
"class": 1,
"hullCost": 2481550,
"speed": 280,
"boost": 380,
"boostEnergy": 10,
"agility": 6,
"baseShieldStrength": 200,
"baseArmour": 80,
"hullMass": 35,
"masslock": 7,
"pipSpeed": 0.05,
"moduleCostMultiplier": 1,
"fuelCapacity": 8,
"cargoCapacity": 8,
"ladenMass": 104.25,
"armour": 144,
"shield": 404.19,
"shieldCells": 0,
"totalCost": 14059860,
"unladenMass": 88.25,
"totalDpe": 32.25,
"totalExplDpe": 0,
"totalKinDpe": 9.41,
"totalThermDpe": 22.84,
"totalDps": 53.8,
"totalExplDps": 0,
"totalKinDps": 17.44,
"totalThermDps": 36.35,
"totalSDps": 48.99,
"totalExplSDps": 0,
"totalKinSDps": 12.64,
"totalThermSDps": 36.35,
"totalEps": 9.84,
"totalHps": 12.28,
"shieldExplRes": 0.48,
"shieldKinRes": 0.55,
"shieldThermRes": 1.09,
"hullExplRes": 1.4,
"hullKinRes": 1.2,
"hullThermRes": 1,
"powerAvailable": 17.24,
"powerRetracted": 11.3,
"powerDeployed": 16.41,
"unladenRange": 25.57,
"fullTankRange": 23.92,
"ladenRange": 22.09,
"unladenFastestRange": 116.23,
"ladenFastestRange": 107,
"maxJumpCount": 5,
"topSpeed": 386.56,
"topBoost": 524.62
}
}

View File

@@ -0,0 +1,22 @@
[
{
"buildText": "[Imaginary Ship]\nbla bla",
"errorMsg": "No such ship found: \"Imaginary Ship\""
},
{
"buildText": "[Viper]\nS: 1F/F Pulse Laser\nsome un-parseable nonsense\nS: 1F/F Pulse Laser\n",
"errorMsg": "Error parsing: \"some un-parseable nonsense\""
},
{
"buildText": "[Sidewinder]\nS: 2F/F Pulse Laser\nS: 1F/F Pulse Laser\n",
"errorMsg": "2F Pulse Laser exceeds slot size: \"S: 2F/F Pulse Laser\""
},
{
"buildText": "[Sidewinder]\nL: 2F/F Pulse Laser\nS: 1F/F Pulse Laser\n",
"errorMsg": "No hardpoint slot available for: \"L: 2F/F Pulse Laser\""
},
{
"buildText": "[Sidewinder]\nS: 1F/F Magic Thing\nS: 1F/F Pulse Laser\n",
"errorMsg": "Unknown component: \"S: 1F/F Magic Thing\""
}
]

View File

@@ -0,0 +1,32 @@
[
{
"shipId": "anaconda",
"buildName": "Imported Anaconda",
"buildCode": "0pyttFolodDsyf5------1717--------05044j-03--2h--00.Iw18ZlA=.Aw18ZlA=.",
"buildText": "[Anaconda]\nS: 1F/F Pulse Laser\nS: 1F/F Pulse Laser\n\nBH: 1I Lightweight Alloy\nRB: 8E Power Plant\nTM: 7E Thrusters\nFH: 6E Frame Shift Drive\nEC: 5E Life Support\nPC: 8E Power Distributor\nSS: 8E Sensors\nFS: 5C Fuel Tank (Capacity: 32)\n\n7: 6E Cargo Rack (Capacity: 64)\n6: 5E Cargo Rack (Capacity: 32)\n6: 6E Shield Generator\n5: 4E Cargo Rack (Capacity: 16)\n4: 1E Basic Discovery Scanner\n2: 1E Cargo Rack (Capacity: 2)\n"
},
{
"shipId": "anaconda",
"buildName": "Imported Anaconda",
"buildCode": "0pyttFolodDsyf5------1717--------05044j-03--2h--00.Iw18ZlA=.Aw18ZlA=.",
"buildText": "\n\n \t[Anaconda]\nS: 1F/F Pulse Laser\nS: 1F/F Pulse Laser\n\nBH: 1I Lightweight Alloy\nRB: 8E Power Plant\nTM: 7E Thrusters\nFH: 6E Frame Shift Drive\nEC: 5E Life Support\nPC: 8E Power Distributor\nSS: 8E Sensors\nFS: 5C Fuel Tank (Capacity: 32)\n\n7: 6E Cargo Rack (Capacity: 64)\n6: 5E Cargo Rack (Capacity: 32)\n6: 6E Shield Generator\n5: 4E Cargo Rack (Capacity: 16)\n4: 1E Basic Discovery Scanner\n2: 1E Cargo Rack (Capacity: 2)\n"
},
{
"shipId": "cobra_mk_iii",
"buildName": "Imported Cobra Mk III",
"buildCode": "0patcFeldd5sdf41712222503040202490f242h.Iw1-kA==.Aw1-kA==.",
"buildText": "[Cobra Mk III]\nM: 1F/F Pulse Laser\nM: 1G/G Burst Laser\nS: 1E/T Fragment Cannon\nS: 1G/T Multi-cannon\nU: 0I Point Defence\nU: 0A Shield Booster\n\nBH: 1I Lightweight Alloy\nRB: 4A Power Plant\nTM: 4C Thrusters\nFH: 4E Frame Shift Drive\nEC: 3D Life Support\nPC: 2A Power Distributor\nSS: 3D Sensors\nFS: 4C Fuel Tank (Capacity: 16)\n\n4: 3E Cargo Rack (Capacity: 8)\n4: 3E Cargo Rack (Capacity: 8)\n4: 4E Shield Generator\n2: 2C Auto Field-Maintenance Unit\n2: 1E Standard Docking Computer\n2: 1E Basic Discovery Scanner\n---\nShield: 112.29 MJ\nPower : 10.45 MW retracted (67%)\n 12.16 MW deployed (78%)\n 15.60 MW available\nCargo : 16 T\nFuel : 16 T\nMass : 235.5 T empty\n 267.5 T full\nRange : 10.69 LY unladen\n 10.05 LY laden\nPrice : 2,929,040 CR\nRe-Buy: 146,452 CR @ 95% insurance\n"
},
{
"shipId": "type_9_heavy",
"buildName": "Imported Type-9 Heavy",
"buildCode": "3pftsFklkdisif57e2k2f2h110001020306054j03022f01242i.Iw18eQ==.Aw18eQ==.",
"buildText": "[Type-9 Heavy]\nM: 2D/G Fragment Cannon\nM: 2I/F Mine Launcher\nM: 2B/FD Missile Rack\nS: 1I/FS Torpedo Pylon\nS: 1F/F Burst Laser\nU: 0I Chaff Launcher\nU: 0F Electronic Countermeasure\nU: 0I Heat Sink Launcher\nU: 0I Point Defence\n\nBH: 1I Mirrored Surface Composite\nRB: 5A Power Plant\nTM: 7D Thrusters\nFH: 6A Frame Shift Drive\nEC: 5A Life Support\nPC: 4D Power Distributor\nSS: 4D Sensors\nFS: 5C Fuel Tank (Capacity: 32)\n\n8: 7E Cargo Rack (Capacity: 128)\n7: 6E Cargo Rack (Capacity: 64)\n6: 6E Shield Generator\n5: 4E Cargo Rack (Capacity: 16)\n4: 3E Cargo Rack (Capacity: 8)\n4: 1C Advanced Discovery Scanner\n3: 2E Cargo Rack (Capacity: 4)\n3: 1E Standard Docking Computer\n2: 1C Detailed Surface Scanner\n"
},
{
"shipId": "vulture",
"buildName": "Imported Vulture",
"buildCode": "4patfFalddksif31e1e0e0j04044a0n532jf1.Iw19kA==.Aw19kA==.",
"buildText": "[Vulture]\nL: 3E/G Pulse Laser\nL: 3E/G Pulse Laser\nU: 0A Frame Shift Wake Scanner\nU: 0A Kill Warrant Scanner\nU: 0A Shield Booster\nU: 0A Shield Booster\n\nBH: 1I Reactive Surface Composite\nRB: 4A Power Plant\nTM: 5A Thrusters\nFH: 4A Frame Shift Drive\nEC: 3D Life Support\nPC: 5A Power Distributor\nSS: 4D Sensors\nFS: 3C Fuel Tank (Capacity: 8)\n\n5: 5A Shield Generator\n4: 4A Auto Field-Maintenance Unit\n2: 2A Shield Cell Bank\n1: 1A Fuel Scoop\n1: 1C Fuel Tank (Capacity: 2)"
}
]

View File

@@ -0,0 +1,50 @@
{
"type_6_transporter": {
"Cargo": "A0p0tdFal8d8s8f4-----04040303430101.Iw1/kA==.Aw1/kA==.",
"Miner": "A0p5tdFal8d8s8f42l2l---040403451q0101.Iw1/kA==.Aw1/kA==.",
"Hopper": "A0p0tdFal8d0s8f41717---030302024300-.Iw1/kA==.Aw1/kA==."
},
"type_7_transport": {
"Cargo": "A0p0tiFfliddsdf5--------0505040403480101.Iw18aQ==.Aw18aQ==.",
"Miner": "A0pdtiFflid8sdf5--2l2l----0505041v03450000.Iw18aQ==.Aw18aQ==."
},
"federal_dropship": {
"Cargo": "A0pdtiFflnddsif4-1717------05040448--020201.Iw18eQ==.Aw18eQ==."
},
"asp": {
"Miner": "A2pftfFflidfskf50s0s24242l2l---04054a1q02022o27.Iw18WQ==.Aw18WQ==."
},
"imperial_clipper": {
"Cargo": "A0p5tiFflndisnf4--0s0s----0605450302020101.Iw18aQ==.Aw18aQ==.",
"Dream": "A2pktkFflndpskf40v0v0s0s0404040n4k5n5d2b29292o-.AwRj4yWU1I==.CwBhCYy6YRigzLIA.",
"Current": "A0patkFflndfskf4----------------.AwRj4yWU1I==.CwBhCYy6YRigzLIA."
},
"type_9_heavy": {
"Current": "A0patsFklndnsif6---------0706054a0303020224.AwRj4yoo.EwBhEYy6dsg=."
},
"python": {
"Cargo": "A0patnFflidsssf5---------050505040448020201.Iw18eQ==.Aw18eQ==.",
"Miner": "A0pktkFflidpspf50v0v0v2m2m0404--050505Ce4a1v02022o.Iw18eQ==.IwBhBYy6dkCYg===.",
"Dream": "A2pptkFfliduspf50v0v0v27270404040m5n5n4f2d2d032t0201.Iw1+gDBxA===.EwBhEYy6e0WEA===.",
"Missile": "A0pttoFjljdystf52f2g2d2ePh----04044j03---002h.Iw18eQ==.Aw18eQ==."
},
"anaconda": {
"Dream": "A4putpFklndzsuf52c0o0o0o1m1m0q0q0404040l0b0100004k5n5n112d2d04-0303326b.AwRj4yo5dyg=.MwBhCYy6duvARiA=.",
"Cargo": "A0patnFklndnsxf5----------------06050505040404-45030301.Iw18ZVA=.Aw18ZVA=.",
"Current": "A0patnFklndksxf5----------------06050505040404-03034524.Iw18ZVA=.Aw18ZVA=.",
"Explorer": "A0patnFklndksxf5--------0202------f7050505040s37-2f2i4524.AwRj4yVKJ9hA.AwhMIyumQRhEA===.",
"Test": "A4putkFklkdzsuf52c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04---0303326b.Iw18ZVA=.Aw18ZVA=."
},
"diamondback_explorer": {
"Explorer": "A0p0tdFfldddsdf5---0202--320p432i2f.AwRj4zTI.AwiMIypI."
},
"vulture": {
"Bounty Hunter": "A3patcFalddksff31e1e0404-0l4a-5d27662j.AwRj4z2I.MwBhBYy6oJmAjLIA."
},
"fer_de_lance": {
"Attack": "A2pfthFalidpsff31r0s0s0s0s000404-04-4a-5d27-.Iw18aQ==.CwBhrSu8EZyA."
},
"eagle": {
"Figther": "A4p0t5F5l3d5s5f20p0p24-4053-2j-.Iw18kA==.Aw18kA==."
}
}

View File

@@ -0,0 +1,50 @@
{
"builds": {
"type_6_transporter": {
"Cargo": "02A4D4A2D2D2D4C-----04040303430101",
"Miner": "03A4D4A2D2D2D4C2l2l---040403451q0101",
"Hopper": "02A4D4A2D1A2D4C1717---030302024300-"
},
"type_7_transport": {
"Cargo": "02A5D5A4D3D3D5C--------0505040403480101",
"Miner": "04D5D5A4D2D3D5C--2l2l----0505041v03450000"
},
"federal_dropship": {
"Cargo": "04D5D5A5D3D4D4C-1717------05040448020201"
},
"asp": {
"Miner": "25A5A5A4D4A5A5C0s0s24242l2l---04054a1q02022o27"
},
"imperial_clipper": {
"Cargo": "03A5D5A5D4D5D4C--0s0s----0605450302020101",
"Dream": "26A6A5A5D6A5A4C0v0v0s0s0404040n4k5n5d2b29292o-.AwRj4yWU1I==.CwBhCYy6YRigzLIA",
"Current": "04A6A5A5D4A5A4C----------------.AwRj4yWU1I==.CwBhCYy6YRigzLIA"
},
"type_9_heavy": {
"Current": "04A7D6A5D5D4D6C---------0706054a0303020224.AwRj4yoo.EwBhEYy6dsg="
},
"python": {
"Cargo": "04A6D5A4D6D6D5C---------050505040448020201.Iw18eQ==.Aw18eQ==",
"Miner": "06A6A5A4D6A6A5C0v0v0v2m2m0404--050505Ce4a1v02022o.Iw18eQ==.IwBhBYy6dkCYg===",
"Dream": "27A6A5A4D7A6A5C0v0v0v27270404040m5n5n4f2d2d032t0201.Iw1+gDBxA===.EwBhEYy6e0WEA==="
},
"anaconda": {
"Dream": "48A7A6A5D8A8A5C2c0o0o0o1m1m0q0q0404040l0b0100004k5n5n112d2d040303326b.AwRj4yo5dig=.MwBhCYy6du3ARiA=",
"Cargo": "04A6D6A5D5D8D5C----------------0605050504040445030301.Iw18ZlA=.Aw18ZlA=",
"Current": "04A6D6A5D5A8D5C----------------0605050504040403034524.Iw18ZlA=.Aw18ZlA=",
"Explorer": "04A6D6A5D5A8D5C--------0202------f7050505040s372f2i4524.AwRj4yVKJthA.AwhMIyungRhEA==="
},
"diamondback_explorer": {
"Explorer": "02A4D5A3D3D3D5C---0202--320p432i2f.AwRj4zTI.AwiMIypI"
},
"vulture": {
"Bounty Hunter": "34A4C4A3D5A4A3C1e1e0404-0l4a5d27662j.AwRj4y2I.MwBhBYy6wJmAjLIA"
},
"fer_de_lance": {
"Attack": "25A5C4A4D6A4A3C1r0s0s0s0s000404-04-4a-5d27-.Iw18aQ==.CwBhrSu8EZyA"
},
"eagle": {
"Figther": "42A3A3A1D2A2A2C0p0p24-40532j.AwRj49iA.AwgsIkEZigmIA==="
}
}
}

View File

@@ -0,0 +1,67 @@
{
"builds": {
"type_6_transporter": {
"Cargo": "02A4D4A2D2D2D4C-----04040303430101",
"Miner": "03A4D4A2D2D2D4C2l2l---040403451q0101",
"Hopper": "02A4D4A2D1A2D4C1717---030302024300-"
},
"type_7_transport": {
"Cargo": "02A5D5A4D3D3D5C--------0505040403480101",
"Miner": "04D5D5A4D2D3D5C--2l2l----0505041v03450000"
},
"federal_dropship": {
"Cargo": "04D5D5A5D3D4D4C-1717------05040448020201"
},
"asp": {
"Miner": "25A5A5A4D4A5A5C0s0s24242l2l---04054a1q02022o27"
},
"cobra_mk_iii": {
"Example": "24A4A4A3D3A3A4C0s0s2d2d0m0445032b2o2753.AwRj4yKA.CwBhEYyrKhmMQ==="
},
"imperial_clipper": {
"Cargo": "03A5D5A5D4D5D4C--0s0s----0605450302020101",
"Multi-purpose": "26A4A5A5D6A5A4C0v0v272704090j0h064f2c0302020101",
"Current": "05A6D5A5D6A5A4C0v0v27270404050n4m05035d29292o01.AwRj4yrI.AwhMIyuBGNiA",
"Dream": "26A6A5A5D6A5A4C0v0v0s0s04040c0n064f5d2b02022o0d.AwRj49UlmI==.AwiMIyuo"
},
"type_9_heavy": {
"Cargo": "04A6D6A5D4D4D5C---------07064f040303010201.AwRj4yoo.EwBhEYy6dsg="
},
"python": {
"Cargo": "04A6D5A4D6D6D5C---------050505044a03020201",
"Miner": "04A6D5A4D6D6D5C---2m2m----050505044d1v02022o"
},
"anaconda": {
"Dream": "48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404040l0b0100034k5n05050404040303326b.AwRj4yo5dig=.MwBhEYy6duwEziA=",
"Cargo": "03A7D6A5D4D8D5C----------------060505054d040403030301.AwRj4yuqg===.Aw18ZlA=",
"Modified": "0pyttFolodDsyf5------1717--------05044j-03----2h00.Iw18ZlA=.Aw18ZlA=.H4sIAAAAAAAAA2MUe8HMwPD-PwDDhxeuCAAAAA=="
},
"diamondback_explorer": {
"Explorer": "02A4D5A3D3D3D5C-------320p432i2f.AwRj4zTI.AwiMIypI"
}
},
"comparisons": {
"Test": {
"facets": [ 9, 6, 4, 1, 3, 2 ],
"builds": [
{
"shipId": "anaconda",
"buildName": "Dream"
},
{
"shipId": "asp",
"buildName": "Miner"
},
{
"shipId": "diamondback_explorer",
"buildName": "Explorer"
}
]
}
},
"insurance": "Beta",
"discounts": [
1,
1
]
}

File diff suppressed because it is too large Load Diff

90
__tests__/test-agility.js Normal file
View File

@@ -0,0 +1,90 @@
import Ship from '../src/app/shipyard/Ship';
import { Ships } from 'coriolis-data/dist';
import * as ModuleUtils from '../src/app/shipyard/ModuleUtils';
describe("Agility", function() {
it("correctly calculates speed", function() {
let agilityData = require('./fixtures/agility-data');
for (let shipId in agilityData) {
for (let thrusterId in agilityData[shipId]) {
const thrusterData = agilityData[shipId][thrusterId];
let shipData = Ships[shipId];
let ship = new Ship(shipId, shipData.properties, shipData.slots);
ship.buildWith(shipData.defaults);
ship.use(ship.standard[1], ModuleUtils.findModule('t', thrusterId));
expect(Math.round(ship.topSpeed)).toBe(thrusterData.speed);
}
}
});
it("correctly calculates boost", function() {
let agilityData = require('./fixtures/agility-data');
for (let shipId in agilityData) {
for (let thrusterId in agilityData[shipId]) {
const thrusterData = agilityData[shipId][thrusterId];
let shipData = Ships[shipId];
let ship = new Ship(shipId, shipData.properties, shipData.slots);
ship.buildWith(shipData.defaults);
// Turn off internals to ensure we have enough power to boost
for (let internal in ship.internal) {
ship.internal[internal].enabled = 0;
}
ship.use(ship.standard[1], ModuleUtils.findModule('t', thrusterId));
expect(Math.round(ship.topBoost)).toBe(thrusterData.boost);
}
}
});
it("correctly calculates pitch", function() {
let agilityData = require('./fixtures/agility-data');
for (let shipId in agilityData) {
for (let thrusterId in agilityData[shipId]) {
const thrusterData = agilityData[shipId][thrusterId];
let shipData = Ships[shipId];
let ship = new Ship(shipId, shipData.properties, shipData.slots);
ship.buildWith(shipData.defaults);
ship.use(ship.standard[1], ModuleUtils.findModule('t', thrusterId));
expect(Math.round(ship.pitches[4] * 100) / 100).toBeCloseTo(thrusterData.pitch, 1);
}
}
});
it("correctly calculates roll", function() {
let agilityData = require('./fixtures/agility-data');
for (let shipId in agilityData) {
for (let thrusterId in agilityData[shipId]) {
const thrusterData = agilityData[shipId][thrusterId];
let shipData = Ships[shipId];
let ship = new Ship(shipId, shipData.properties, shipData.slots);
ship.buildWith(shipData.defaults);
ship.use(ship.standard[1], ModuleUtils.findModule('t', thrusterId));
expect(Math.round(ship.rolls[4] * 100) / 100).toBeCloseTo(thrusterData.roll, 1);
}
}
});
it("correctly calculates yaw", function() {
let agilityData = require('./fixtures/agility-data');
for (let shipId in agilityData) {
for (let thrusterId in agilityData[shipId]) {
const thrusterData = agilityData[shipId][thrusterId];
let shipData = Ships[shipId];
let ship = new Ship(shipId, shipData.properties, shipData.slots);
ship.buildWith(shipData.defaults);
ship.use(ship.standard[1], ModuleUtils.findModule('t', thrusterId));
expect(Math.round(ship.yaws[4] * 100) / 100).toBeCloseTo(thrusterData.yaw, 1);
}
}
});
});

301
__tests__/test-import.js Normal file
View File

@@ -0,0 +1,301 @@
jest.dontMock('../src/app/stores/Persist');
jest.dontMock('../src/app/components/TranslatedComponent');
jest.dontMock('../src/app/components/ModalImport');
import React from 'react';
import ReactDOM from 'react-dom';
import TU from 'react-testutils-additions';
import Utils from './testUtils';
import { getLanguage } from '../src/app/i18n/Language';
describe('Import Modal', function() {
let MockRouter = require('../src/app/Router').default;
const Persist = require('../src/app/stores/Persist').default;
const ModalImport = require('../src/app/components/ModalImport').default;
const mockContext = {
language: getLanguage('en'),
sizeRatio: 1,
openMenu: jest.genMockFunction(),
closeMenu: jest.genMockFunction(),
showModal: jest.genMockFunction(),
hideModal: jest.genMockFunction(),
tooltip: jest.genMockFunction(),
termtip: jest.genMockFunction(),
onWindowResize: jest.genMockFunction()
};
let modal, render, ContextProvider = Utils.createContextProvider(mockContext);
/**
* Clear saved builds, and reset React DOM
*/
function reset() {
MockRouter.go.mockClear();
Persist.deleteAll();
render = TU.renderIntoDocument(<ContextProvider><ModalImport /></ContextProvider>);
modal = TU.findRenderedComponentWithType(render, ModalImport);
}
/**
* Simulate user import text entry / paste
* @param {string} text Import text / raw data
*/
function pasteText(text) {
let textarea = TU.findRenderedDOMComponentWithTag(render, 'textarea');
TU.Simulate.change(textarea, { target: { value: text } });
}
/**
* Simulate click on Proceed button
*/
function clickProceed() {
let proceedButton = TU.findRenderedDOMComponentWithId(render, 'proceed');
TU.Simulate.click(proceedButton);
}
/**
* Simulate click on Import button
*/
function clickImport() {
let importButton = TU.findRenderedDOMComponentWithId(render, 'import');
TU.Simulate.click(importButton);
}
describe('Import Backup', function() {
beforeEach(reset);
it('imports a valid backup', function() {
let importData = require('./fixtures/valid-backup');
let importString = JSON.stringify(importData);
expect(modal.state.importValid).toEqual(false);
expect(modal.state.errorMsg).toEqual(null);
pasteText(importString);
expect(modal.state.importValid).toBe(true);
expect(modal.state.errorMsg).toEqual(null);
expect(modal.state.builds).toEqual(importData.builds);
expect(modal.state.comparisons).toEqual(importData.comparisons);
expect(modal.state.shipDiscount).toEqual(importData.discounts[0]);
expect(modal.state.moduleDiscount).toEqual(importData.discounts[1]);
expect(modal.state.insurance).toBe(importData.insurance.toLowerCase());
clickProceed();
expect(modal.state.processed).toBe(true);
expect(modal.state.errorMsg).toEqual(null);
clickImport();
expect(Persist.getBuilds()).toEqual(importData.builds);
expect(Persist.getComparisons()).toEqual(importData.comparisons);
expect(Persist.getInsurance()).toEqual(importData.insurance.toLowerCase());
expect(Persist.getShipDiscount()).toEqual(importData.discounts[0]);
expect(Persist.getModuleDiscount()).toEqual(importData.discounts[1]);
});
it('imports an old valid backup', function() {
const importData = require('./fixtures/old-valid-export');
const importStr = JSON.stringify(importData);
pasteText(importStr);
expect(modal.state.builds).toEqual(importData.builds);
expect(modal.state.importValid).toBe(true);
expect(modal.state.errorMsg).toEqual(null);
clickProceed();
expect(modal.state.processed).toBeTruthy();
clickImport();
expect(Persist.getBuilds()).toEqual(importData.builds);
});
it('catches an invalid backup', function() {
const importData = require('./fixtures/valid-backup');
let invalidImportData = Object.assign({}, importData);
//invalidImportData.builds.asp = null; // Remove Asp Miner build used in comparison
delete(invalidImportData.builds.asp);
pasteText('"this is not valid"');
expect(modal.state.importValid).toBeFalsy();
expect(modal.state.errorMsg).toEqual('Must be an object or array!');
pasteText('{ "builds": "Should not be a string" }');
expect(modal.state.importValid).toBeFalsy();
expect(modal.state.errorMsg).toEqual('builds must be an object!');
pasteText(JSON.stringify(importData).replace('anaconda', 'invalid_ship'));
expect(modal.state.importValid).toBeFalsy();
expect(modal.state.errorMsg).toEqual('"invalid_ship" is not a valid Ship Id!');
pasteText(JSON.stringify(importData).replace('Dream', ''));
expect(modal.state.importValid).toBeFalsy();
expect(modal.state.errorMsg).toEqual('Imperial Clipper build "" must be a string at least 1 character long!');
pasteText(JSON.stringify(invalidImportData));
expect(modal.state.importValid).toBeFalsy();
expect(modal.state.errorMsg).toEqual('asp build "Miner" data is missing!');
});
});
describe('Import Detailed V3 Build', function() {
beforeEach(reset);
it('imports a valid v3 build', function() {
const importData = require('./fixtures/anaconda-test-detailed-export-v3');
pasteText(JSON.stringify(importData));
expect(modal.state.importValid).toBeTruthy();
expect(modal.state.errorMsg).toEqual(null);
expect(modal.state.singleBuild).toBe(true);
clickProceed();
expect(MockRouter.go.mock.calls.length).toBe(1);
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/anaconda?code=A4putkFklkdzsuf52c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04---0303326b.AwRj4zNLaA%3D%3D.CwBhCYzBGW9qCTSqq5xA.&bn=Test%20My%20Ship');
});
it('catches an invalid build', function() {
const importData = require('./fixtures/anaconda-test-detailed-export-v3');
pasteText(JSON.stringify(importData).replace('references', 'refs'));
expect(modal.state.importValid).toBeFalsy();
expect(modal.state.errorMsg).toEqual('Anaconda Build "Test My Ship": Invalid data');
});
});
describe('Import Detailed V4 Build', function() {
beforeEach(reset);
it('imports a valid v4 build', function() {
const importData = require('./fixtures/anaconda-test-detailed-export-v4');
pasteText(JSON.stringify(importData));
expect(modal.state.importValid).toBeTruthy();
expect(modal.state.errorMsg).toEqual(null);
expect(modal.state.singleBuild).toBe(true);
clickProceed();
expect(MockRouter.go.mock.calls.length).toBe(1);
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/anaconda?code=A4putkFklkdzsuf52c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04---0303326b.AwRj4zNLaA%3D%3D.CwBhCYzBGW9qCTSqq5xA.H4sIAAAAAAAAA2MUe8HMwPD%2FPwMcAABTINwTEgAAAA%3D%3D&bn=Test%20My%20Ship');
});
});
describe('Import Detailed Engineered V4 Build', function() {
beforeEach(reset);
it('imports a valid v4 build', function() {
const importData = require('./fixtures/asp-test-detailed-export-v4');
pasteText(JSON.stringify(importData));
expect(modal.state.importValid).toBeTruthy();
expect(modal.state.errorMsg).toEqual(null);
expect(modal.state.singleBuild).toBe(true);
clickProceed();
expect(MockRouter.go.mock.calls.length).toBe(1);
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/asp?code=A0pftiFflfddsnf5------020202033c044002v62f2i.AwRj4yvI.CwRgDBldHnJA.H4sIAAAAAAAAA2P858DAwPCXEUhwHPvx%2F78YG5AltB7I%2F8%2F0TwImJboDSPJ%2F%2B%2Ff%2Fv%2FKlX%2F%2F%2Fi3AwMTBIfARK%2FGf%2BJwVSxArStVAYqOjvz%2F%2F%2FJVo5GRhE2IBc4SKQSSz%2FDGEmCa398P8%2F%2F2%2BgTf%2F%2FAwDFxwtofAAAAA%3D%3D&bn=Multi-purpose%20Asp%20Explorer');
});
it('imports a valid v4 build with modifications', function() {
const importData = require('./fixtures/courier-test-detailed-export-v4');
pasteText(JSON.stringify(importData));
expect(modal.state.importValid).toBeTruthy();
expect(modal.state.errorMsg).toEqual(null);
expect(modal.state.singleBuild).toBe(true);
clickProceed();
expect(MockRouter.go.mock.calls.length).toBe(1);
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/imperial_courier?code=A0patzF5l0das8f31a1a270202000e402t0101-2f.AwRj4zKA.CwRgDBldLiQ%3D.H4sIAAAAAAAAA12OP0tCYRjFj9fuVbvF1du9ekkT8s%2FkIg4NElyIBBd321yaGvwUQTS3N7UFfYygIT9EoyQUJA36ns47XJCWA%2B%2Fz%2Bz3Pe3ImBbDNKaqNPSBoGrL4ngfomKpFGiJ%2BLgHteR1IPjxJT5pF11uSeXNsJVcRfgdC92syWUuK0iMdKZqrjJ%2F0aoA71lJ5oKf38knWcCiptCPdhJIerdS00vlK0qktlqoj983UmqqHjQ33VsW8eazFmaTyULP2hQ4lX8LBme6g%2F6v0TTdbxJ2KhdEIaCw15MF%2FNB0L%2BS2hwEwyFM8KgP%2BqEpWWA3Qu9Z3z9kPWHzakt7Dt%2BAeD7ghSTgEAAA%3D%3D&bn=Multi-purpose%20Imperial%20Courier');
});
});
describe('Import Detaild Builds Array', function() {
beforeEach(reset);
it('imports all builds', function() {
const importData = require('./fixtures/valid-detailed-export');
const expectedBuilds = require('./fixtures/expected-builds');
pasteText(JSON.stringify(importData));
expect(modal.state.importValid).toBeTruthy();
expect(modal.state.errorMsg).toEqual(null);
clickProceed();
expect(modal.state.processed).toBeTruthy();
clickImport();
let builds = Persist.getBuilds();
for (let s in builds) {
for (let b in builds[s]) {
expect(builds[s][b]).toEqual(expectedBuilds[s][b]);
}
}
});
});
describe('Import Companion API Build', function() {
beforeEach(reset);
it('imports a valid v4 build', function() {
const importData = require('./fixtures/companion-api-import-1');
pasteText(JSON.stringify(importData));
expect(modal.state.importValid).toBeTruthy();
expect(modal.state.errorMsg).toEqual(null);
expect(modal.state.singleBuild).toBe(true);
clickProceed();
expect(MockRouter.go.mock.calls.length).toBe(1);
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/federal_corvette?code=A2putsFklndzsxf50x0x7l28281919040404040402020l06p05sf63c5ifr--v66g2f.AwRj4zNaqA%3D%3D.CwRgDBldUExuBiIlUA%3D%3D.H4sIAAAAAAAAA02Svy9DURTHT1vvtfoat32eekVV9fm1kBgwSIw0YWYgBqmpMZkMBomFVfwFEoZKhBjE1qWTgegiDX%2BCQdKI1j2%2BR%2FJ4yzfnvu%2FnfO%2B979yQXiCi7xAkbRpEqsLMsRKWHNZpsSKQnppJVLAdIvc6DGiwxexMaWb7GDZHdJ%2BQaCf71Ia%2F88XsOp1EThk9bOh5P2kkahGN3qPM1wANbyOk87zNHH%2FBUs0gnWN61T9TOwfJ7EWJjMcms1lEo30Gx11BD8f1mh%2FcTkCMMvY0HZcoe4Wk5By%2BFcrrRL0N0OOlrd0Ntv57jGoc%2BH4%2F8EqHj3%2FCUXc4FicC5NFvsJBVIWeFvESlpuXSuCS5RRyLlV70z%2B4uQaw6ypSIJ6KOJDgZgFpQ60YgEU9EPQmUCkAfAj0IJOKJqC4wuYMY9rQD5CuubT0LSag8qdShxHUHoElcyWrAT4l4IsoCw65e%2BRv5BqKtC0mSJu8LH8OFT%2Bb%2BE8SZb0CcEn4AZ3TRDx5q4l1EJ%2BCP1bEM1WSaAwH%2FFkOLPoofwTo0LY8nr7O%2B37cp4yWIu4zHlHiXGfMPmat5gqMCAAA%3D&bn=Imported%20Federal%20Corvette');
});
it('imports a valid v4 build', function() {
const importData = require('./fixtures/companion-api-import-2');
pasteText(JSON.stringify(importData));
expect(modal.state.importValid).toBeTruthy();
expect(modal.state.errorMsg).toEqual(null);
expect(modal.state.singleBuild).toBe(true);
clickProceed();
expect(MockRouter.go.mock.calls.length).toBe(1);
expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/beluga?code=A0pktsFplCdpsnf70t0t2727270004040404043c4fmimlmm04mc0iv62i2f.AwRj4yukg%3D%3D%3D.CwRgDBldHi8IUA%3D%3D.H4sIAAAAAAAAA2P8Z8%2FAwPCXEUiIKTMxMPCv%2F%2Ff%2FP8cFIPGf6Z8YTEr0GjMDg%2FJWICERBOTzn%2Fn7%2F7%2FIO5Ai5n9SIEWsQEIoSxAolfbt%2F3%2BJPk4GBhE7YQYGYVmgcuVnf4Aq%2FwMAIrEcGGsAAAA%3D&bn=Imported%20Beluga%20Liner');
});
});
describe('Import E:D Shipyard Builds', function() {
// it('imports a valid build', function() {
// const imports = require('./fixtures/ed-shipyard-import-valid');
//
// for (let i = 0; i < imports.length; i++ ) {
// reset();
// let fixture = imports[i];
// pasteText(fixture.buildText);
// expect(modal.state.importValid).toBeTruthy();
// expect(modal.state.errorMsg).toEqual(null);
// clickProceed();
// expect(MockRouter.go.mock.calls.length).toBe(1);
// expect(MockRouter.go.mock.calls[0][0]).toBe('/outfit/' + fixture.shipId + '?code=' + encodeURIComponent(fixture.buildCode) + '&bn=' + encodeURIComponent(fixture.buildName));
// }
// });
it('catches invalid builds', function() {
const imports = require('./fixtures/ed-shipyard-import-invalid');
for (let i = 0; i < imports.length; i++ ) {
reset();
pasteText(imports[i].buildText);
expect(modal.state.importValid).toBeFalsy();
expect(modal.state.errorMsg).toEqual(imports[i].errorMsg);
}
});
});
describe('Imports from a Comparison', function() {
it('imports a valid comparison', function() {
const importBuilds = require('./fixtures/valid-backup').builds;
Persist.deleteAll();
render = TU.renderIntoDocument(<ContextProvider><ModalImport builds={importBuilds} /></ContextProvider>);
modal = TU.findRenderedComponentWithType(render, ModalImport);
expect(modal.state.processed).toBe(true);
expect(modal.state.errorMsg).toEqual(null);
clickImport();
expect(Persist.getBuilds()).toEqual(importBuilds);
});
});
});

143
__tests__/test-persist.js Normal file
View File

@@ -0,0 +1,143 @@
jest.dontMock('../src/app/stores/Persist');
import React from 'react';
import ReactDOM from 'react-dom';
import TU from 'react-testutils-additions';
let origAddEventListener = window.addEventListener;
let storageListener;
let ls = {};
// Implment mock localStorage
let localStorage = {
getItem: function(key) {
return ls[key];
},
setItem: function(key, value) {
ls[key] = value;
},
removeItem: function(key) {
delete ls[key];
},
clear: function() {
ls = {};
}
}
window.addEventListener = function(eventName, listener) {
if(eventName == 'storage') {
storageListener = listener; // Keep track of latest storage listener
} else {
origAddEventListener.apply(arguments);
}
}
describe('Persist', function() {
const Persist = require('../src/app/stores/Persist').Persist;
describe('Multi tab/window', function() {
it("syncs builds", function() {
window.localStorage = localStorage;
ls = {};
let p = new Persist();
let newBuilds = {
anaconda: { test: '1234' }
};
storageListener({ key: 'builds', newValue: JSON.stringify(newBuilds) });
expect(p.getBuild('anaconda', 'test')).toBe('1234');
});
});
describe('General and Settings', function() {
it("has defaults", function() {
window.localStorage = localStorage;
ls = {};
let p = new Persist();
expect(p.getLangCode()).toBe('en');
expect(p.showTooltips()).toBe(true);
expect(p.getInsurance()).toBe('standard');
expect(p.getShipDiscount()).toBe(0);
expect(p.getModuleDiscount()).toBe(0);
expect(p.getSizeRatio()).toBe(1);
});
it("loads from localStorage correctly", function() {
window.localStorage = localStorage;
let savedData = require('./fixtures/valid-backup');
ls = {};
ls.builds = JSON.stringify(savedData.builds);
ls.NG_TRANSLATE_LANG_KEY = 'de';
ls.insurance = 'Standard';
ls.shipDiscount = 0.25;
ls.moduleDiscount = 0.15;
let p = new Persist();
expect(p.getInsurance()).toBe('standard');
expect(p.getShipDiscount()).toBe(0.25);
expect(p.getModuleDiscount()).toBe(0.15);
expect(p.getLangCode()).toEqual('de');
expect(p.getBuilds('anaconda')).toEqual(savedData.builds.anaconda);
expect(p.getBuilds('python')).toEqual(savedData.builds.python);
expect(p.getBuildsNamesFor('imperial_clipper')).toEqual(['Cargo', 'Current', 'Dream', 'Multi-purpose']);
expect(p.getBuild('type_7_transport', 'Cargo')).toEqual('02A5D5A4D3D3D5C--------0505040403480101');
});
it("uses defaults from a corrupted localStorage", function() {
window.localStorage = localStorage;
ls = {};
ls.builds = "not valid json";
ls.comparisons = "1, 3, 4";
ls.insurance = 'this insurance does not exist';
ls.shipDiscount = 'this is not a number';
ls.moduleDiscount = 10; // Way to big
let p = new Persist();
expect(p.getLangCode()).toBe('en');
expect(p.showTooltips()).toBe(true);
expect(p.getInsurance()).toBe('standard');
expect(p.getShipDiscount()).toBe(0);
expect(p.getModuleDiscount()).toBe(0);
expect(p.getBuilds()).toEqual({});
expect(p.getComparisons()).toEqual({});
});
it("works without localStorage", function() {
window.localStorage = null;
let p = new Persist();
expect(p.getLangCode()).toBe('en');
expect(p.showTooltips()).toBe(true);
expect(p.getInsurance()).toBe('standard');
expect(p.getShipDiscount()).toBe(0);
expect(p.getModuleDiscount()).toBe(0);
expect(p.getSizeRatio()).toBe(1);
p.saveBuild('anaconda', 'test', '12345');
expect(p.getBuild('anaconda', 'test')).toBe('12345');
p.deleteBuild('anaconda', 'test');
expect(p.hasBuilds()).toBe(false);
});
it("generates the backup", function() {
window.localStorage = localStorage;
let savedData = require('./fixtures/valid-backup');
ls = {};
ls.builds = JSON.stringify(savedData.builds);
ls.insurance = 'Beta';
ls.shipDiscount = 0.25;
ls.moduleDiscount = 0.15;
let p = new Persist();
let backup = p.getAll();
expect(backup.insurance).toBe('beta');
expect(backup.shipDiscount).toBe(0.25);
expect(backup.moduleDiscount).toBe(0.15);
expect(backup.builds).toEqual(savedData.builds);
expect(backup.comparisons).toEqual({});
});
});
})

View File

@@ -0,0 +1,63 @@
import Ship from '../src/app/shipyard/Ship';
import { Ships } from 'coriolis-data/dist';
import * as Serializer from '../src/app/shipyard/Serializer';
import jsen from 'jsen';
describe("Serializer", function() {
const anacondaTestExport = require.requireActual('./fixtures/anaconda-test-detailed-export-v4');
const code = anacondaTestExport.references[0].code;
const anaconda = Ships.anaconda;
const validate = jsen(require('../src/schemas/ship-loadout/4'));
describe("To Detailed Build", function() {
let testBuild = new Ship('anaconda', anaconda.properties, anaconda.slots).buildFrom(code);
let exportData = Serializer.toDetailedBuild('Test My Ship', testBuild);
it("conforms to the v4 ship-loadout schema", function() {
expect(validate(exportData)).toBe(true);
});
it("contains the correct components and stats", function() {
expect(exportData.components).toEqual(anacondaTestExport.components);
expect(exportData.stats).toEqual(anacondaTestExport.stats);
expect(exportData.ship).toEqual(anacondaTestExport.ship);
expect(exportData.name).toEqual(anacondaTestExport.name);
});
});
describe("Export Detailed Builds", function() {
const expectedExport = require('./fixtures/valid-detailed-export');
const builds = require('./fixtures/expected-builds');
const exportData = Serializer.toDetailedExport(builds);
it("conforms to the v4 ship-loadout schema", function() {
expect(exportData instanceof Array).toBe(true);
for (let detailedBuild of exportData) {
expect(validate(detailedBuild)).toBe(true);
}
});
});
describe("From Detailed Build", function() {
it("builds the ship correctly", function() {
let testBuildA = new Ship('anaconda', anaconda.properties, anaconda.slots);
testBuildA.buildFrom(code);
let testBuildB = Serializer.fromDetailedBuild(anacondaTestExport);
for(var p in testBuildB) {
if (p == 'availCS') {
continue;
}
expect(testBuildB[p]).toEqual(testBuildA[p], p + ' does not match');
}
});
});
});

156
__tests__/test-ship.js Normal file
View File

@@ -0,0 +1,156 @@
import Ship from '../src/app/shipyard/Ship';
import { Ships } from 'coriolis-data/dist';
import * as ModuleUtils from '../src/app/shipyard/ModuleUtils';
describe("Ship", function() {
it("can build all ships", function() {
for (let s in Ships) {
let shipData = Ships[s];
let ship = new Ship(s, shipData.properties, shipData.slots);
for (let p in shipData.properties) {
expect(ship[p]).toEqual(shipData.properties[p], s + ' property [' + p + '] does not match when built');
}
ship.buildWith(shipData.defaults);
expect(ship.totalCost).toEqual(shipData.retailCost, s + ' retail cost does not match default build cost');
expect(ship.cargoCapacity).toBeDefined();
expect(ship.priorityBands[0].retracted).toBeGreaterThan(0, s + ' priorityBands');
expect(ship.powerAvailable).toBeGreaterThan(0, s + ' powerAvailable');
expect(ship.unladenRange).toBeGreaterThan(0, s + ' unladenRange');
expect(ship.ladenRange).toBeGreaterThan(0, s + ' ladenRange');
expect(ship.fuelCapacity).toBeGreaterThan(0, s + ' fuelCapacity');
expect(ship.unladenFastestRange).toBeGreaterThan(0, s + ' unladenFastestRange');
expect(ship.ladenFastestRange).toBeGreaterThan(0, s + ' ladenFastestRange');
expect(ship.shield).toBeGreaterThan(0, s + ' shield');
expect(ship.armour).toBeGreaterThan(0, s + ' armour');
expect(ship.topSpeed).toBeGreaterThan(0, s + ' topSpeed');
}
});
it("resets and rebuilds properly", function() {
var id = 'cobra_mk_iii';
var cobra = Ships[id];
var shipA = new Ship(id, cobra.properties, cobra.slots);
var shipB = new Ship(id, cobra.properties, cobra.slots);
var testShip = new Ship(id, cobra.properties, cobra.slots);
var buildA = cobra.defaults;
var buildB = {
standard:['4A', '4A', '4A', '3D', '3A', '3A', '4C'],
hardpoints: ['0s', '0s', '2d', '2d', 0, '04'],
internal: ['45', '03', '2b', '2o', '27', '53']
};
shipA.buildWith(buildA); // Build A
shipB.buildWith(buildB);// Build B
testShip.buildWith(buildA);
for(var p in testShip) {
if (p == 'availCS') {
continue;
}
expect(testShip[p]).toEqual(shipA[p], p + ' does not match');
}
testShip.buildWith(buildB);
for(var p in testShip) {
if (p == 'availCS') {
continue;
}
expect(testShip[p]).toEqual(shipB[p], p + ' does not match');
}
testShip.buildWith(buildA);
for(var p in testShip) {
if (p == 'availCS') {
continue;
}
expect(testShip[p]).toEqual(shipA[p], p + ' does not match');
}
});
it("discounts hull and components properly", function() {
var id = 'cobra_mk_iii';
var cobra = Ships[id];
var testShip = new Ship(id, cobra.properties, cobra.slots);
testShip.buildWith(cobra.defaults);
var originalHullCost = testShip.hullCost;
var originalTotalCost = testShip.totalCost;
var discount = 0.1;
expect(testShip.m.discountedCost).toEqual(originalHullCost, 'Hull cost does not match');
testShip.applyDiscounts(discount, discount);
// Floating point errors cause miniscule decimal places which are handled in the app by rounding/formatting
expect(Math.floor(testShip.m.discountedCost)).toEqual(Math.floor(originalHullCost * (1 - discount)), 'Discounted Hull cost does not match');
expect(Math.floor(testShip.totalCost)).toEqual(Math.floor(originalTotalCost * (1 - discount)), 'Discounted Total cost does not match');
testShip.applyDiscounts(0, 0); // No discount, 100% of cost
expect(testShip.m.discountedCost).toEqual(originalHullCost, 'Hull cost does not match');
expect(testShip.totalCost).toEqual(originalTotalCost, 'Total cost does not match');
testShip.applyDiscounts(discount, 0); // Only discount hull
expect(Math.floor(testShip.m.discountedCost)).toEqual(Math.round(originalHullCost * (1 - discount)), 'Discounted Hull cost does not match');
expect(testShip.totalCost).toEqual(originalTotalCost - originalHullCost + testShip.m.discountedCost, 'Total cost does not match');
});
it("enforces a single shield generator", function() {
var id = 'anaconda';
var anacondaData = Ships[id];
var anaconda = new Ship(id, anacondaData.properties, anacondaData.slots);
anaconda.buildWith(anacondaData.defaults);
expect(anaconda.internal[2].m.grp).toEqual('sg', 'Anaconda default shield generator slot');
anaconda.use(anaconda.internal[1], ModuleUtils.internal('4j')); // 6E Shield Generator
expect(anaconda.internal[2].m).toEqual(null, 'Anaconda default shield generator slot is empty');
expect(anaconda.internal[1].m.id).toEqual('4j', 'Slot 1 should have SG 4j in it');
expect(anaconda.internal[1].m.grp).toEqual('sg','Slot 1 should have SG 4j in it');
});
it("enforces a single shield fuel scoop", function() {
var id = 'anaconda';
var anacondaData = Ships[id];
var anaconda = new Ship(id, anacondaData.properties, anacondaData.slots);
anaconda.buildWith(anacondaData.defaults);
anaconda.use(anaconda.internal[4], ModuleUtils.internal('32')); // 4A Fuel Scoop
expect(anaconda.internal[4].m.grp).toEqual('fs', 'Anaconda fuel scoop slot');
anaconda.use(anaconda.internal[3], ModuleUtils.internal('32'));
expect(anaconda.internal[4].m).toEqual(null, 'Anaconda original fuel scoop slot is empty');
expect(anaconda.internal[3].m.id).toEqual('32', 'Slot 1 should have FS 32 in it');
expect(anaconda.internal[3].m.grp).toEqual('fs','Slot 1 should have FS 32 in it');
});
it("enforces a single refinery", function() {
var id = 'anaconda';
var anacondaData = Ships[id];
var anaconda = new Ship(id, anacondaData.properties, anacondaData.slots);
anaconda.buildWith(anacondaData.defaults);
anaconda.use(anaconda.internal[4], ModuleUtils.internal('23')); // 4E Refinery
expect(anaconda.internal[4].m.grp).toEqual('rf', 'Anaconda refinery slot');
anaconda.use(anaconda.internal[3], ModuleUtils.internal('23'));
expect(anaconda.internal[4].m).toEqual(null, 'Anaconda original refinery slot is empty');
expect(anaconda.internal[3].m.id).toEqual('23', 'Slot 1 should have RF 23 in it');
expect(anaconda.internal[3].m.grp).toEqual('rf','Slot 1 should have RF 23 in it');
});
});

24
__tests__/testUtils.js Normal file
View File

@@ -0,0 +1,24 @@
import React from 'react';
const TestUtils = {
createContextProvider: function(context) {
var _contextTypes = {};
Object.keys(context).forEach(function(key) {
_contextTypes[key] = React.PropTypes.any;
});
return React.createClass({
displayName: 'ContextProvider',
childContextTypes: _contextTypes,
getChildContext() { return context; },
render() {
return React.Children.only(this.props.children);
}
});
}
};
export default TestUtils;

Binary file not shown.

View File

@@ -1,913 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<metadata></metadata>
<defs>
<font id="euro_capsregular" horiz-adv-x="1024" >
<font-face units-per-em="2048" ascent="1536" descent="-512" />
<missing-glyph horiz-adv-x="616" />
<glyph horiz-adv-x="0" />
<glyph unicode="&#xd;" horiz-adv-x="616" />
<glyph unicode=" " horiz-adv-x="616" />
<glyph unicode="&#x09;" horiz-adv-x="616" />
<glyph unicode="&#xa0;" horiz-adv-x="616" />
<glyph unicode="!" horiz-adv-x="533" d="M171 1365h192l-23 -969h-149zM175 0v212h185v-212h-185z" />
<glyph unicode="&#x22;" horiz-adv-x="662" d="M104 1365h138l-20 -546h-99zM419 1365h138l-19 -546h-99z" />
<glyph unicode="#" horiz-adv-x="1049" d="M68 355l17 110h187l37 235h-186l17 110h187l55 351h119l-55 -351h230l56 351h119l-55 -351h185l-18 -110h-185l-37 -235h187l-18 -110h-186l-57 -355h-119l56 355h-230l-57 -355h-118l56 355h-187zM391 465h231l37 235h-231z" />
<glyph unicode="$" horiz-adv-x="1186" d="M93 374v14h156v-20q1 -77 5 -114q6 -57 38.5 -85t97.5 -32q111 -3 143 -4v401q-188 1 -263 26q-97 32 -133 113q-31 68 -31 190q0 166 68 236q72 76 257 86q39 2 102 3v108h125v-108q26 -1 35 -1q160 -1 217 -21q94 -33 132 -118q26 -58 26 -161q0 -20 -1 -51h-153l-1 22 q-2 89 -6 107q-10 39 -30 53q-39 27 -144 30q-27 1 -75 1v-376q191 -2 278 -34q103 -37 137 -143q21 -64 21 -162q0 -126 -40 -199q-51 -94 -182 -121q-42 -8 -214 -14v-131h-125v131h-47q-109 -1 -159 6t-95 29q-63 31 -94 83t-40 140q-4 44 -5 116zM258 873 q0 -140 59 -172q45 -24 160 -27q19 -1 56 -1v377q-79 -1 -123 -3q-95 -4 -124 -46q-28 -38 -28 -128zM658 132h27q147 0 204 42q54 41 54 171q0 81 -24 124q-24 45 -107 56q-42 6 -154 7v-400z" />
<glyph unicode="%" horiz-adv-x="1813" d="M68 832q0 175 12 224q18 74 87 106q61 28 134 31q54 3 132 3q142 0 199 -15q106 -29 135 -111q16 -46 16 -237q0 -176 -12 -224q-18 -74 -87 -106q-60 -28 -134 -31q-52 -3 -124 -3q-150 0 -207 15q-106 29 -135 111q-16 46 -16 237zM201 833q2 -129 4 -147q7 -77 66 -89 q42 -9 155 -9q112 0 154 9q59 12 66 89q2 18 4 146q-2 129 -4 147q-8 77 -66 89q-42 9 -157 9q-110 0 -152 -9q-59 -12 -66 -89q-2 -18 -4 -146zM514 0l649 1188h136l-654 -1188h-131zM1030 354q0 175 12 224q18 75 87 106q61 28 134 31q54 3 132 3q141 0 199 -15 q106 -29 135 -111q16 -46 16 -237q0 -175 -12 -223q-18 -74 -87 -106q-60 -28 -134 -31q-52 -3 -124 -3q-150 0 -207 15q-106 29 -135 111q-16 46 -16 236zM1163 355q2 -129 4 -146q7 -77 66 -89q42 -9 155 -9q112 0 154 9q59 12 66 89q2 18 4 146q-2 128 -4 146 q-8 77 -66 89q-42 9 -157 9q-110 0 -152 -9q-59 -12 -66 -89q-2 -18 -4 -146z" />
<glyph unicode="&#x26;" horiz-adv-x="1308" d="M102 371q0 196 85 257q50 36 160 51q-37 33 -56 63q-28 47 -28 128q0 172 78 232q79 60 286 60q104 0 165 -15t101 -51q71 -64 71 -218q0 -31 -2 -88h-156q-1 45 -1 58q-1 115 -25 141q-29 31 -155 31q-141 0 -176 -31q-26 -24 -26 -93q0 -66 23 -99q16 -22 66 -63 l405 -338q1 31 1 46q0 26 -4 92h158q3 -78 3 -103q0 -87 -12 -156l204 -168l-90 -114l-165 137q-32 -63 -91 -97q-68 -37 -143 -43q-69 -6 -180 -6q-211 0 -285 18q-148 35 -190 174q-21 69 -21 195zM262 365q0 -169 52 -209q34 -26 118 -28q82 -1 168 -1q142 0 192 14 q76 21 97 87l-431 355q-107 -15 -142 -33q-29 -15 -41.5 -58t-12.5 -127z" />
<glyph unicode="'" horiz-adv-x="347" d="M104 1365h138l-20 -546h-99z" />
<glyph unicode="(" horiz-adv-x="673" d="M151 573q0 516 8 594q12 119 46.5 189.5t99.5 110.5q76 47 205 47q19 0 54 -1v-148q-112 -1 -160 -31q-50 -35 -63 -152q-10 -87 -9 -411v-395q2 -420 20 -476q21 -80 86 -103q44 -15 126 -15v-148q-41 -2 -61 -2q-235 0 -310 185q-34 84 -40 250q-2 51 -2 506z" />
<glyph unicode=")" horiz-adv-x="673" d="M109 -218q113 0 160 31q50 35 63 152q10 83 9 411v395q-2 419 -20 476q-21 80 -86 103q-44 15 -126 15v148q35 1 54 1q125 0 201.5 -44.5t115.5 -140.5q34 -84 40 -250q2 -51 2 -506q0 -516 -8 -594q-12 -119 -46.5 -189.5t-99.5 -110.5q-77 -47 -198 -47q-20 0 -61 2 v148z" />
<glyph unicode="*" horiz-adv-x="998" d="M82 1032l40 115l320 -115v333h115v-333l318 115l41 -115l-321 -119l191 -273l-92 -68l-193 282l-209 -282l-91 68l200 273z" />
<glyph unicode="+" horiz-adv-x="1079" d="M66 509v129h403v408h140v-408h403v-129h-403v-409h-140v409h-403z" />
<glyph unicode="," horiz-adv-x="454" d="M123 -140q53 3 75 19q28 21 28 76q0 15 -2 45h-78v212h185v-228q0 -111 -26 -152q-38 -62 -133 -62q-18 0 -49 2v88z" />
<glyph unicode="-" horiz-adv-x="513" d="M20 493v152h473v-152h-473z" />
<glyph unicode="." horiz-adv-x="431" d="M123 0v212h185v-212h-185z" />
<glyph unicode="/" horiz-adv-x="1212" d="M14 -195l1054 1560h131l-1054 -1560h-131z" />
<glyph unicode="0" horiz-adv-x="1152" d="M107 590q0 253 6 317q16 158 104 225q74 56 192 63q69 4 178 4q189 0 264 -25q135 -46 172 -181q19 -66 20 -185q1 -92 1 -215q0 -249 -6 -313q-16 -158 -104 -224q-73 -56 -192 -64q-67 -4 -166 -4q-201 0 -276 25q-135 46 -172 181q-18 66 -20 184q-1 91 -1 212z M259 594q0 -195 6 -272q6 -82 27.5 -122t68.5 -54q60 -18 215 -18t215 18q67 20 87 106q15 64 15 346q0 187 -6 267q-7 98 -37 136q-34 46 -130 53q-67 5 -150 5q-148 0 -209 -18q-67 -20 -87 -106q-15 -63 -15 -341z" />
<glyph unicode="1" horiz-adv-x="1150" d="M296 837l351 351h207v-1188h-157v1010l-287 -287z" />
<glyph unicode="2" horiz-adv-x="1074" d="M101 0v231q0 95 17 150.5t57 93.5q57 51 164 73q58 12 188 26q154 16 192 29q66 22 82 77q15 50 15 158q0 136 -39 176q-44 46 -216 46q-150 0 -217 -18q-33 -9 -50 -25.5t-27 -50.5q-9 -30 -9 -133v-68h-155v68q0 226 95 298q89 68 361 68q243 0 330 -85q56 -54 69 -152 q9 -63 9 -143q0 -137 -27 -205q-41 -101 -153 -140q-71 -25 -234 -42q-129 -13 -165 -21q-52 -11 -77 -28t-36 -51q-16 -47 -17 -142v-53h706v-137h-863z" />
<glyph unicode="3" horiz-adv-x="1112" d="M97 337v68h154v-68q0 -135 38 -175q24 -24 100 -30q52 -4 199 -4q175 0 215 46q31 36 31 182q0 102 -37 141q-29 31 -79 37q-34 4 -80 4h-205v140h205q115 0 149 47q25 34 25 125q0 98 -19 148q-10 27 -32.5 39t-71.5 18q-43 4 -154 4t-159.5 -7t-71.5 -27 q-36 -30 -36 -153v-68h-151v68q0 196 89 265q64 49 173 57q70 5 163 5q173 0 243 -19q128 -34 164 -137q20 -57 20 -151q0 -163 -49 -222q-32 -39 -96 -59q65 -16 99 -46q68 -59 68 -227q0 -197 -77 -270q-55 -52 -143 -66q-94 -14 -218 -14q-204 0 -288 28 q-110 37 -148 140q-20 54 -20 181z" />
<glyph unicode="4" horiz-adv-x="1114" d="M62 268v173l586 747h221v-782h174v-138h-174v-268h-157v268h-650zM212 406h500v647z" />
<glyph unicode="5" horiz-adv-x="1116" d="M122 291v68h151v-41q0 -112 33 -144q42 -40 149 -44q40 -2 85 -2q203 0 261 43q32 24 39 116q3 39 3 164q0 139 -47 185q-48 46 -226 46q-149 0 -201 -16q-61 -18 -76 -67q-2 -7 -6 -27h-143v616h808v-138h-656v-302q39 38 85 51q78 22 212 22q231 0 322 -88 q69 -68 81 -189q4 -48 4 -114q0 -144 -16.5 -221t-58.5 -127q-42 -49 -128.5 -71.5t-236.5 -22.5q-180 0 -261 26q-115 38 -154 133q-23 54 -23 144z" />
<glyph unicode="6" horiz-adv-x="1122" d="M117 621q5 256 5 270q3 98 30 155.5t87 95.5q89 57 303 57q197 0 279 -26q159 -50 159 -251v-55h-155v55q0 78 -28 102q-40 35 -185 35q-176 0 -235 -15q-59 -16 -77 -59q-18 -44 -18 -124v-200q39 41 81 55q74 25 240 25q182 0 258 -33q92 -39 125 -135q25 -74 25 -191 q0 -220 -75 -306q-59 -67 -165 -79q-79 -9 -190 -9q-137 0 -206.5 11.5t-119.5 43.5q-94 58 -119 154q-15 54 -17 212zM274 407q0 -191 45 -233q48 -46 255 -46q203 0 244 37q42 38 42 192q0 167 -37 203q-41 41 -262 41q-189 0 -246 -44q-41 -31 -41 -150z" />
<glyph unicode="7" horiz-adv-x="1069" d="M90 1050v138h873v-184l-567 -1004h-188l609 1050h-727z" />
<glyph unicode="8" horiz-adv-x="1112" d="M109 342q0 147 39 200q36 49 120 75q-61 20 -84 42q-60 60 -60 228q0 180 73 242q63 54 177 63q84 7 185 7q191 0 262 -20q116 -32 150 -141q18 -59 18 -155q0 -141 -42 -203q-24 -35 -103 -64q60 -17 88 -41q48 -41 60 -103q10 -55 10 -123q0 -119 -17 -183t-60 -102 q-44 -40 -128 -58t-226 -18q-205 0 -297 27q-103 31 -141 127q-24 60 -24 200zM260 351q0 -122 15 -155q22 -46 87 -58q53 -10 206 -10q198 0 244 43q39 35 39 182q0 108 -37 146q-26 28 -93 37q-49 7 -181 7q-137 0 -190 -15q-63 -19 -80 -70q-10 -28 -10 -107zM276 885 q0 -105 14 -136q21 -44 78 -56q55 -12 231 -12q163 0 204 40q35 34 35 156q0 123 -38 152q-38 30 -243 30q-121 0 -174 -7t-75 -26q-32 -27 -32 -141z" />
<glyph unicode="9" horiz-adv-x="1118" d="M106 282v41h150v-41q0 -99 39 -126q36 -24 112 -26q75 -2 142 -2q152 0 214 22q54 19 67 97q8 43 8 146v135q-27 -32 -53 -43q-80 -35 -286 -35q-201 0 -287 61q-71 50 -88 143q-12 65 -12 148q0 164 30 238q50 120 208 147q70 12 204 12q192 0 275 -34q132 -53 156 -204 q15 -95 15 -433q0 -185 -9 -266q-12 -101 -48 -157.5t-107 -85.5q-78 -31 -283 -31q-192 0 -263 18q-140 36 -172 145q-12 41 -12 131zM263 830q0 -159 40 -200q40 -40 213 -40q164 0 226 15q54 13 74 42q23 33 23 137q0 130 -12 168q-21 70 -84 90q-55 17 -217 17 q-182 0 -222 -38q-41 -39 -41 -191z" />
<glyph unicode=":" horiz-adv-x="431" d="M123 0v212h185v-212h-185zM123 880v212h185v-212h-185z" />
<glyph unicode=";" horiz-adv-x="454" d="M123 -140q53 3 75 19q28 21 28 76q0 15 -2 45h-78v212h185v-228q0 -111 -26 -152q-38 -62 -133 -62q-18 0 -49 2v88zM135 880v212h185v-212h-185z" />
<glyph unicode="&#x3c;" d="M68 504v140l887 420v-163l-713 -328l713 -328v-162z" />
<glyph unicode="=" horiz-adv-x="1079" d="M66 338v129h946v-129h-946zM66 680v129h946v-129h-946z" />
<glyph unicode="&#x3e;" d="M69 83v162l713 328l-713 328v163l887 -420v-140z" />
<glyph unicode="?" horiz-adv-x="976" d="M123 1022v37q0 103 12 152q25 102 118 141q72 31 226 31q156 0 228 -26q110 -39 135 -141q11 -46 11 -184q0 -151 -17 -195q-20 -52 -55 -78q-36 -26 -200 -87q-43 -17 -53 -35q-10 -15 -10 -65v-176h-157v192q0 128 65 172q36 23 173 70q71 25 90 65q13 25 13 102 q0 135 -9 165q-19 61 -86 72q-34 6 -127 6q-95 0 -129 -11q-60 -18 -72 -92q-3 -21 -3 -86v-29h-153zM348 0v212h185v-212h-185z" />
<glyph unicode="@" horiz-adv-x="1499" d="M102 674q0 306 45 450q41 129 136 176q133 66 505 66q270 0 385 -36q117 -37 161 -121q63 -120 63 -377q0 -279 -39 -414q-26 -90 -92 -115q-32 -13 -78 -13q-167 0 -193 128h-3q-25 -61 -77 -92q-69 -42 -206 -42q-184 0 -249 107q-51 85 -51 289q0 153 21 237 q29 109 122 148q63 26 164 26q113 0 182 -32q44 -20 70 -77h4v109h115v-544q4 -91 7 -108q12 -59 90 -59q54 0 74 35q18 33 29 138.5t11 240.5q0 221 -30 320q-36 115 -181 136q-106 15 -309 15q-263 0 -370 -22q-113 -23 -148 -96q-58 -119 -58 -438q0 -259 30 -391 q32 -134 135 -175q76 -31 172 -37q132 -9 285 -9q208 0 285 25q33 11 61 53l79 -56q-42 -73 -119 -95q-88 -26 -322 -26q-196 0 -310 16q-158 22 -241 81q-95 68 -128 231q-27 137 -27 348zM531 693q0 -206 51 -267q37 -45 157 -45q113 0 159 29q61 38 67 150q6 94 6 196 q0 144 -55 195q-48 44 -172 44q-74 0 -122 -16q-66 -23 -82 -129q-9 -60 -9 -157z" />
<glyph unicode="A" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625z" />
<glyph unicode="B" horiz-adv-x="1170" d="M143 0v1170h550q102 0 142 -5q120 -15 173 -103q40 -68 40 -209q0 -143 -59 -201q-28 -28 -105 -38q79 -5 118 -34q81 -63 81 -242q0 -224 -117 -293q-75 -45 -219 -45h-604zM302 142h288q147 1 175 3q122 6 145 68q14 40 14 110q0 84 -15 128q-19 60 -105 72 q-25 4 -156 4h-346v-385zM302 669h354q128 0 174 24q39 22 52 71q7 30 7 90q0 81 -15 113q-22 49 -89 58q-24 3 -95 3h-388v-359z" />
<glyph unicode="C" horiz-adv-x="1151" d="M94 569q0 273 13 358q21 136 143 204q76 43 203 51q62 4 225 4q154 0 215 -20q138 -45 166 -200q10 -57 10 -144q0 -10 -1 -32h-157q-1 39 -1 51q-2 142 -48 175q-40 29 -185 29q-192 0 -276 -11q-52 -7 -80.5 -29.5t-43.5 -68.5q-16 -50 -16 -166q0 -412 22 -514 q13 -66 48 -93q40 -31 130 -35q55 -2 118 -2q145 0 212.5 9.5t92.5 33.5q35 34 35 153q0 39 -2 90h159v-58v-12q0 -136 -22 -195q-46 -127 -205 -153q-60 -10 -301 -10q-108 0 -154 4.5t-91 20.5q-176 59 -199 311q-10 116 -10 249z" />
<glyph unicode="D" horiz-adv-x="1243" d="M143 0v1170h573q111 0 190 -20q121 -29 185 -149q59 -111 59 -363q0 -207 -9 -288q-25 -227 -171 -303q-55 -28 -169 -43q-30 -4 -52 -4h-606zM302 142h387q185 0 240 66q46 55 57 185q5 59 5 169q0 198 -10 278q-18 134 -117 169q-54 19 -149 19h-413v-886z" />
<glyph unicode="E" horiz-adv-x="1036" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794z" />
<glyph unicode="F" horiz-adv-x="960" d="M143 0v1170h761v-142h-602v-365h587v-139h-587v-524h-159z" />
<glyph unicode="G" horiz-adv-x="1192" d="M94 600v48q0 157 12.5 239.5t45.5 146.5q59 115 208 142q59 10 219 10q180 0 242 -4.5t108 -19.5q152 -53 165 -229q3 -31 3 -124h-158q-1 131 -21 174q-21 45 -112 55q-65 7 -241 7q-144 0 -207 -18q-71 -20 -91 -118q-11 -51 -14 -321q1 -212 3 -249q4 -90 28.5 -135.5 t77.5 -59.5q67 -19 292 -19q117 0 174.5 11.5t79.5 39.5q33 42 33 220q0 20 -1 59h-363v142h518q5 -58 5 -128q0 -128 -3 -185q-12 -208 -159 -269q-76 -31 -343 -31q-178 0 -260 18.5t-139 70.5q-88 81 -98 241q-3 51 -3 124v38t-1 124z" />
<glyph unicode="H" horiz-adv-x="1271" d="M143 0v1170h159v-502h668v502h159v-1170h-159v529h-668v-529h-159z" />
<glyph unicode="I" horiz-adv-x="445" d="M143 0v1170h159v-1170h-159z" />
<glyph unicode="J" horiz-adv-x="967" d="M57 296q0 79 4 150h156q-1 -52 -1 -69q0 -144 11 -181q15 -48 71 -61q36 -9 151 -9q121 0 158 23q48 31 55 124q4 46 4 99v798h159v-819q0 -102 -11 -157t-39 -96q-48 -68 -130 -93q-68 -21 -190 -21q-176 0 -259 34q-98 40 -125 135q-14 48 -14 143z" />
<glyph unicode="K" horiz-adv-x="1159" d="M143 0v1170h159v-498h106l482 498h210l-551 -567l615 -603h-220l-536 527h-106v-527h-159z" />
<glyph unicode="L" horiz-adv-x="958" d="M143 0v1170h159v-1019h618v-151h-777z" />
<glyph unicode="M" horiz-adv-x="1598" d="M143 0v1170h248l407 -999l406 999h251v-1170h-159v1023l-421 -1023h-150l-423 1023v-1023h-159z" />
<glyph unicode="N" horiz-adv-x="1321" d="M143 0v1170h234l643 -1023v1023h159v-1170h-235l-642 1023v-1023h-159z" />
<glyph unicode="O" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181z" />
<glyph unicode="P" horiz-adv-x="1121" d="M143 0v1170h524q112 0 159 -5.5t87 -23.5q146 -66 146 -336q0 -148 -40 -224q-52 -97 -160 -123q-38 -9 -212 -11h-345v-447h-159zM302 589h320q147 0 198 18q54 20 71 84q9 32 9 96q0 121 -15 169q-17 52 -78 65q-26 6 -144 7h-361v-439z" />
<glyph unicode="Q" horiz-adv-x="1220" d="M94 642q0 159 8 220q28 220 176 285q65 29 170 35q69 4 162 4q143 0 212.5 -8t120.5 -31q148 -65 176 -285q8 -61 8 -229q0 -278 -10 -346q-3 -24 -9 -50l117 -78l-70 -114l-102 67q-51 -70 -146 -102q-63 -22 -183 -25q-60 -1 -119 -1q-153 0 -219 8.5t-122 35.5 q-114 56 -149 204q-17 70 -19 173q-2 57 -2 237zM253 585q0 -213 4 -253q8 -82 28.5 -123.5t63.5 -59.5q38 -17 107 -20q55 -3 138 -3q130 0 205 5q88 7 127 65l-342 223l77 114l303 -201q4 64 4 253q0 217 -4 253q-8 82 -29 124t-62 60q-39 16 -112 19q-58 3 -151 3 q-125 0 -177.5 -4.5t-84.5 -18.5q-60 -26 -81 -113q-14 -61 -14 -142v-181z" />
<glyph unicode="R" horiz-adv-x="1193" d="M143 0v1170h590q156 0 237 -53q71 -46 97 -140q15 -56 15 -147q0 -150 -39 -218q-41 -74 -150 -84q172 -11 173 -222v-306h-159v276q0 108 -49 148q-48 35 -142 35h-10h-404v-459h-159zM302 601h388q119 0 172 32q61 37 61 151q0 155 -28 195q-35 49 -161 49h-432v-427z " />
<glyph unicode="S" horiz-adv-x="1097" d="M87 383h159v-44q1 -86 13 -126.5t43 -61.5q29 -20 92 -22q69 -3 164 -3q130 0 184 10t78 39q30 35 30 176q0 68 -15 101q-20 47 -99 57q-39 5 -197 11q-157 7 -198 12q-131 19 -193 100q-53 68 -53 210q0 204 91 274q70 54 181 64q79 6 183 6q199 0 273 -25 q151 -50 164 -240q1 -21 1 -91h-159q0 83 -7 117q-13 66 -82 85q-44 12 -157 12q-159 0 -205 -8q-86 -14 -110 -77q-14 -38 -14 -100q0 -79 19 -121q22 -47 109 -58q32 -4 189 -10q174 -7 237 -19q126 -26 172 -123q29 -62 29 -192q0 -189 -62 -259q-64 -72 -183 -84 q-91 -9 -246 -9q-188 0 -252 20q-150 48 -172 231q-5 39 -7 148z" />
<glyph unicode="T" horiz-adv-x="1007" d="M38 1019v151h930v-151h-384v-1019h-159v1019h-387z" />
<glyph unicode="U" horiz-adv-x="1251" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218z" />
<glyph unicode="V" horiz-adv-x="1096" d="M14 1170h170l367 -1000l361 1000h171l-429 -1170h-207z" />
<glyph unicode="W" horiz-adv-x="1801" d="M14 1170h165l308 -1014l304 1014h213l302 -1014l315 1014h167l-377 -1170h-218l-296 1014l-301 -1014h-215z" />
<glyph unicode="X" horiz-adv-x="1101" d="M1 0l433 605l-401 565h194l331 -469l326 469h189l-390 -565l418 -605h-190l-353 506l-361 -506h-196z" />
<glyph unicode="Y" horiz-adv-x="1068" d="M1 1170h187l345 -516l344 516h190l-459 -683v-487h-159v487z" />
<glyph unicode="Z" horiz-adv-x="1076" d="M63 0v135l733 893h-713v142h916v-132l-736 -896h751v-142h-951z" />
<glyph unicode="[" horiz-adv-x="673" d="M165 -352v1850h399v-133h-225v-1583h225v-134h-399z" />
<glyph unicode="\" horiz-adv-x="1212" d="M14 1365h131l1054 -1560h-132z" />
<glyph unicode="]" horiz-adv-x="673" d="M109 -219h225v1584h-225v134h399v-1851h-399v133z" />
<glyph unicode="^" d="M64 765l356 604h185l356 -604h-154l-296 492l-294 -492h-153z" />
<glyph unicode="_" d="M0 -145h1024v-107h-1024v107z" />
<glyph unicode="`" d="M254 1518l82 112l310 -234l-56 -85z" />
<glyph unicode="a" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625z" />
<glyph unicode="b" horiz-adv-x="1170" d="M143 0v1170h550q102 0 142 -5q120 -15 173 -103q40 -68 40 -209q0 -143 -59 -201q-28 -28 -105 -38q79 -5 118 -34q81 -63 81 -242q0 -224 -117 -293q-75 -45 -219 -45h-604zM302 142h288q147 1 175 3q122 6 145 68q14 40 14 110q0 84 -15 128q-19 60 -105 72 q-25 4 -156 4h-346v-385zM302 669h354q128 0 174 24q39 22 52 71q7 30 7 90q0 81 -15 113q-22 49 -89 58q-24 3 -95 3h-388v-359z" />
<glyph unicode="c" horiz-adv-x="1151" d="M94 569q0 273 13 358q21 136 143 204q76 43 203 51q62 4 225 4q154 0 215 -20q138 -45 166 -200q10 -57 10 -144q0 -10 -1 -32h-157q-1 39 -1 51q-2 142 -48 175q-40 29 -185 29q-192 0 -276 -11q-52 -7 -80.5 -29.5t-43.5 -68.5q-16 -50 -16 -166q0 -412 22 -514 q13 -66 48 -93q40 -31 130 -35q55 -2 118 -2q145 0 212.5 9.5t92.5 33.5q35 34 35 153q0 39 -2 90h159v-58v-12q0 -136 -22 -195q-46 -127 -205 -153q-60 -10 -301 -10q-108 0 -154 4.5t-91 20.5q-176 59 -199 311q-10 116 -10 249z" />
<glyph unicode="d" horiz-adv-x="1243" d="M143 0v1170h573q111 0 190 -20q121 -29 185 -149q59 -111 59 -363q0 -207 -9 -288q-25 -227 -171 -303q-55 -28 -169 -43q-30 -4 -52 -4h-606zM302 142h387q185 0 240 66q46 55 57 185q5 59 5 169q0 198 -10 278q-18 134 -117 169q-54 19 -149 19h-413v-886z" />
<glyph unicode="e" horiz-adv-x="1036" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794z" />
<glyph unicode="f" horiz-adv-x="960" d="M143 0v1170h761v-142h-602v-365h587v-139h-587v-524h-159z" />
<glyph unicode="g" horiz-adv-x="1192" d="M94 600v48q0 157 12.5 239.5t45.5 146.5q59 115 208 142q59 10 219 10q180 0 242 -4.5t108 -19.5q152 -53 165 -229q3 -31 3 -124h-158q-1 131 -21 174q-21 45 -112 55q-65 7 -241 7q-144 0 -207 -18q-71 -20 -91 -118q-11 -51 -14 -321q1 -212 3 -249q4 -90 28.5 -135.5 t77.5 -59.5q67 -19 292 -19q117 0 174.5 11.5t79.5 39.5q33 42 33 220q0 20 -1 59h-363v142h518q5 -58 5 -128q0 -128 -3 -185q-12 -208 -159 -269q-76 -31 -343 -31q-178 0 -260 18.5t-139 70.5q-88 81 -98 241q-3 51 -3 124v38t-1 124z" />
<glyph unicode="h" horiz-adv-x="1271" d="M143 0v1170h159v-502h668v502h159v-1170h-159v529h-668v-529h-159z" />
<glyph unicode="i" horiz-adv-x="445" d="M143 0v1170h159v-1170h-159z" />
<glyph unicode="j" horiz-adv-x="967" d="M57 296q0 79 4 150h156q-1 -52 -1 -69q0 -144 11 -181q15 -48 71 -61q36 -9 151 -9q121 0 158 23q48 31 55 124q4 46 4 99v798h159v-819q0 -102 -11 -157t-39 -96q-48 -68 -130 -93q-68 -21 -190 -21q-176 0 -259 34q-98 40 -125 135q-14 48 -14 143z" />
<glyph unicode="k" horiz-adv-x="1159" d="M143 0v1170h159v-498h106l482 498h210l-551 -567l615 -603h-220l-536 527h-106v-527h-159z" />
<glyph unicode="l" horiz-adv-x="958" d="M143 0v1170h159v-1019h618v-151h-777z" />
<glyph unicode="m" horiz-adv-x="1598" d="M143 0v1170h248l407 -999l406 999h251v-1170h-159v1023l-421 -1023h-150l-423 1023v-1023h-159z" />
<glyph unicode="n" horiz-adv-x="1321" d="M143 0v1170h234l643 -1023v1023h159v-1170h-235l-642 1023v-1023h-159z" />
<glyph unicode="o" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181z" />
<glyph unicode="p" horiz-adv-x="1121" d="M143 0v1170h524q112 0 159 -5.5t87 -23.5q146 -66 146 -336q0 -148 -40 -224q-52 -97 -160 -123q-38 -9 -212 -11h-345v-447h-159zM302 589h320q147 0 198 18q54 20 71 84q9 32 9 96q0 121 -15 169q-17 52 -78 65q-26 6 -144 7h-361v-439z" />
<glyph unicode="q" horiz-adv-x="1220" d="M94 642q0 159 8 220q28 220 176 285q65 29 170 35q69 4 162 4q143 0 212.5 -8t120.5 -31q148 -65 176 -285q8 -61 8 -229q0 -278 -10 -346q-3 -24 -9 -50l117 -78l-70 -114l-102 67q-51 -70 -146 -102q-63 -22 -183 -25q-60 -1 -119 -1q-153 0 -219 8.5t-122 35.5 q-114 56 -149 204q-17 70 -19 173q-2 57 -2 237zM253 585q0 -213 4 -253q8 -82 28.5 -123.5t63.5 -59.5q38 -17 107 -20q55 -3 138 -3q130 0 205 5q88 7 127 65l-342 223l77 114l303 -201q4 64 4 253q0 217 -4 253q-8 82 -29 124t-62 60q-39 16 -112 19q-58 3 -151 3 q-125 0 -177.5 -4.5t-84.5 -18.5q-60 -26 -81 -113q-14 -61 -14 -142v-181z" />
<glyph unicode="r" horiz-adv-x="1193" d="M143 0v1170h590q156 0 237 -53q71 -46 97 -140q15 -56 15 -147q0 -150 -39 -218q-41 -74 -150 -84q172 -11 173 -222v-306h-159v276q0 108 -49 148q-48 35 -142 35h-10h-404v-459h-159zM302 601h388q119 0 172 32q61 37 61 151q0 155 -28 195q-35 49 -161 49h-432v-427z " />
<glyph unicode="s" horiz-adv-x="1097" d="M87 383h159v-44q1 -86 13 -126.5t43 -61.5q29 -20 92 -22q69 -3 164 -3q130 0 184 10t78 39q30 35 30 176q0 68 -15 101q-20 47 -99 57q-39 5 -197 11q-157 7 -198 12q-131 19 -193 100q-53 68 -53 210q0 204 91 274q70 54 181 64q79 6 183 6q199 0 273 -25 q151 -50 164 -240q1 -21 1 -91h-159q0 83 -7 117q-13 66 -82 85q-44 12 -157 12q-159 0 -205 -8q-86 -14 -110 -77q-14 -38 -14 -100q0 -79 19 -121q22 -47 109 -58q32 -4 189 -10q174 -7 237 -19q126 -26 172 -123q29 -62 29 -192q0 -189 -62 -259q-64 -72 -183 -84 q-91 -9 -246 -9q-188 0 -252 20q-150 48 -172 231q-5 39 -7 148z" />
<glyph unicode="t" horiz-adv-x="1007" d="M38 1019v151h930v-151h-384v-1019h-159v1019h-387z" />
<glyph unicode="u" horiz-adv-x="1251" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218z" />
<glyph unicode="v" horiz-adv-x="1096" d="M14 1170h170l367 -1000l361 1000h171l-429 -1170h-207z" />
<glyph unicode="w" horiz-adv-x="1801" d="M14 1170h165l308 -1014l304 1014h213l302 -1014l315 1014h167l-377 -1170h-218l-296 1014l-301 -1014h-215z" />
<glyph unicode="x" horiz-adv-x="1101" d="M1 0l433 605l-401 565h194l331 -469l326 469h189l-390 -565l418 -605h-190l-353 506l-361 -506h-196z" />
<glyph unicode="y" horiz-adv-x="1068" d="M1 1170h187l345 -516l344 516h190l-459 -683v-487h-159v487z" />
<glyph unicode="z" horiz-adv-x="1076" d="M63 0v135l733 893h-713v142h916v-132l-736 -896h751v-142h-951z" />
<glyph unicode="{" horiz-adv-x="673" d="M46 508v130q61 16 94 56q41 53 40 158v297q0 173 47 250q34 58 119 84q50 15 103 15h102v-127q-45 0 -87 -9t-64 -24q-18 -12 -34 -36.5t-21 -46.5q-3 -14 -6.5 -52t-3.5 -57v-301q0 -124 -39 -187q-33 -51 -103 -85q76 -36 110 -98q32 -63 32 -174v-301q0 -102 24 -144 q46 -81 178 -81h14v-127h-102q-81 0 -143 31q-66 32 -92 93q-34 82 -34 225v297q1 106 -40 158q-32 39 -94 56z" />
<glyph unicode="|" horiz-adv-x="594" d="M216 -341v1706h163v-1706h-163z" />
<glyph unicode="}" horiz-adv-x="659" d="M109 -225q45 0 86.5 9t63.5 24q19 12 35 36.5t21 46.5q3 14 6.5 52t3.5 57v301q0 124 39 187q33 51 103 85q-76 36 -110 98q-32 63 -32 174v301q0 102 -24 144q-46 81 -178 81h-14v127h103q80 0 142 -31q66 -32 92 -93q34 -82 34 -225v-297q-1 -105 40 -158 q32 -39 94 -56v-130q-61 -16 -94 -56q-41 -54 -40 -158v-297q0 -173 -47 -250q-34 -58 -119 -84q-50 -15 -102 -15h-103v127z" />
<glyph unicode="~" horiz-adv-x="1365" d="M193 1256q37 77 81 131q81 99 195 99q79 0 235 -79q89 -44 119 -55q43 -14 77 -14q67 0 119 56q33 36 68 97l87 -69q-111 -232 -277 -232q-51 0 -123 30q-38 16 -111 52q-137 67 -200 67q-68 0 -119 -59q-30 -34 -64 -93z" />
<glyph unicode="&#xa1;" horiz-adv-x="533" d="M171 -195l23 969h149l20 -969h-192zM174 958v212h185v-212h-185z" />
<glyph unicode="&#xa2;" horiz-adv-x="990" d="M116 565q0 187 40 268q70 140 269 144v113h127v-113q101 -2 171 -38q114 -58 114 -219q0 -10 -1 -43h-145q-1 87 -8 111q-22 61 -131 65v-609q70 3 107 23q29 17 38 49q9 27 10 76q0 19 1 58h146q-1 -21 -1 -45q-2 -113 -31 -167q-69 -119 -270 -119v-125h-127v125 q-116 3 -185 45q-80 49 -107 174q-17 79 -17 227zM267 583q0 -266 61 -313q27 -20 97 -24v609q-71 -6 -103 -31q-55 -44 -55 -241z" />
<glyph unicode="&#xa3;" horiz-adv-x="1074" d="M49 453v138h144v163q0 9 -1 48q-1 27 -1 50q0 181 71 260q52 58 143 73q81 14 179 14q167 0 239 -27q118 -45 149 -160q11 -42 11 -131v-68h-152v68q0 101 -30 134q-39 44 -198 44q-136 0 -187 -20q-43 -16 -55 -63q-8 -30 -11 -165v-220h330v-138h-330v-40v-47 q1 -35 1 -46q0 -98 -30 -145q-11 -19 -36 -39h721v-136h-928v124q65 14 90 56q20 38 23 117q2 41 2 74v82h-144z" />
<glyph unicode="&#xa4;" horiz-adv-x="1338" d="M100 1057l80 80l193 -193q143 106 296 106q154 0 293 -105l194 191l79 -79l-192 -192q105 -141 105 -293q0 -149 -103 -289l193 -193l-79 -80l-193 193q-135 -105 -294 -105q-149 0 -296 105l-192 -193l-79 79l190 193q-104 137 -104 292q0 150 104 290zM321 574 q0 -145 102 -248q102 -102 246 -102t247 103q101 101 101 245q0 149 -101 249q-105 103 -251 103q-140 0 -243 -104q-101 -102 -101 -246z" />
<glyph unicode="&#xa5;" horiz-adv-x="1048" d="M25 1188h184l314 -531l312 531h188l-226 -367h147v-137h-231l-89 -143h320v-138h-347v-403h-157v403h-336v138h310l-87 143h-223v137h142z" />
<glyph unicode="&#xa6;" horiz-adv-x="594" d="M216 314h163v-655h-163v655zM216 680v685h163v-685h-163z" />
<glyph unicode="&#xa7;" horiz-adv-x="1164" d="M96 551q0 145 62 200q36 32 108 48q-64 40 -84 97q-20 55 -20 145q0 197 65 263q73 75 336 75q274 0 353 -44q87 -49 104 -172q6 -43 6 -146h-147q0 40 -1 54q0 88 -32 120q-37 37 -142 45q-59 4 -123 4q-152 0 -201 -19q-40 -15 -55 -57q-11 -33 -11 -100q0 -99 28 -128 q21 -22 62 -35q29 -10 80 -25l306 -90q116 -34 151 -50q89 -38 114 -120q14 -43 14 -109q0 -118 -35 -184q-22 -43 -59 -65q-17 -10 -52 -23q74 -35 98 -73q38 -63 38 -197q0 -246 -123 -312q-62 -33 -178 -41q-63 -5 -161 -5q-255 0 -336 38q-115 52 -138 195q-7 42 -6 146 h151q1 -90 6 -119q14 -82 118 -99q70 -12 169 -12q180 0 240 11q104 19 104 190q0 95 -35 127q-29 27 -136 55l-420 111q-87 24 -122 44q-96 59 -96 257zM244 552q0 -77 32 -112q22 -23 56 -35q22 -7 63 -19l308 -86q61 -17 99 -17q77 0 106 68q19 46 19 141q0 67 -49 100 q-32 23 -118 48l-295 87q-67 20 -98 20q-71 0 -100 -54q-23 -42 -23 -141z" />
<glyph unicode="&#xa8;" d="M213 1366v155h184v-155h-184zM628 1366v155h184v-155h-184z" />
<glyph unicode="&#xa9;" horiz-adv-x="1526" d="M68 681q0 197 102 366q101 165 279 256q148 76 324 76q186 0 353 -103q168 -103 256 -277q76 -150 76 -317q0 -138 -53 -266t-150 -226q-98 -98 -226 -151t-265 -53q-138 0 -266 53t-225 150q-98 98 -151.5 226.5t-53.5 265.5zM183 683q0 -245 171 -417 q170 -172 410 -172q239 0 409 172q170 173 170 415q0 119 -45 229t-125 190q-174 171 -416 171q-110 0 -216 -45t-187 -126q-82 -82 -126.5 -191t-44.5 -226zM437 685q0 184 8 231q15 90 97 134q50 27 140 33q44 3 138 3q123 0 175 -28q69 -36 79 -127q3 -29 6 -100h-116 q-1 21 -1 28q-1 87 -32 108q-27 18 -120 18q-103 0 -158 -6q-65 -8 -84 -63q-11 -31 -11 -99q0 -270 14 -337q10 -43 33 -61q32 -25 155 -25q161 0 190 27q24 22 24 97q0 7 -1 51h117q-1 -27 -1 -36q1 -86 -11 -127t-45 -67q-46 -38 -125 -43q-59 -4 -157 -4q-119 0 -171 16 q-121 38 -136 204q-7 79 -7 173z" />
<glyph unicode="&#xaa;" horiz-adv-x="764" d="M82 697q0 137 67 186q59 43 205 43q150 0 203 -43v42q0 84 -16 123q-20 46 -143 46q-110 0 -140 -23q-23 -17 -23 -64q0 -6 1 -34h-126q0 11 1 31q1 106 52 146q59 47 226 47q129 0 188 -27q88 -39 100 -149q5 -44 5 -75v-454h-125v45q-35 -30 -69 -41q-48 -14 -142 -14 q-149 0 -210 55q-54 48 -54 160zM212 709q0 -73 27 -94q32 -23 131 -23q127 0 169 35q23 20 23 74q0 66 -26 89q-36 30 -151 30q-122 0 -153 -27q-20 -17 -20 -84z" />
<glyph unicode="&#xab;" horiz-adv-x="981" d="M109 576l223 472l120 -73l-188 -399l209 -404l-113 -76zM493 576l223 472l120 -73l-188 -399l210 -404l-114 -76z" />
<glyph unicode="&#xac;" d="M68 425v143h887v-568h-158v425h-729z" />
<glyph unicode="&#xad;" horiz-adv-x="513" d="M14 493l3 152h483v-152h-486z" />
<glyph unicode="&#xae;" horiz-adv-x="1526" d="M68 681q0 197 102 366q101 165 279 256q148 76 324 76q186 0 353 -103q168 -103 256 -277q76 -150 76 -317q0 -138 -53 -266t-150 -226q-98 -98 -226 -151t-265 -53q-138 0 -266 53t-225 150q-98 98 -151.5 226.5t-53.5 265.5zM183 683q0 -245 171 -417 q170 -172 410 -172q239 0 409 172q170 173 170 415q0 119 -45 229t-125 190q-174 171 -416 171q-110 0 -216 -45t-187 -126q-82 -82 -126.5 -191t-44.5 -226zM452 300v779h384q107 0 162 -34q76 -48 76 -192q0 -96 -26 -144q-21 -38 -81 -57q96 -31 96 -150v-202h-116v182 q0 75 -35 103q-37 26 -108 24h-236v-309h-116zM568 710h224q84 0 122 22q44 26 44 102q0 81 -20 109q-25 35 -115 35h-255v-268z" />
<glyph unicode="&#xaf;" d="M0 1511v107h1024v-107h-1024z" />
<glyph unicode="&#xb0;" horiz-adv-x="767" d="M102 1100q0 119 92 202q80 72 194 72q122 0 206 -93q71 -78 71 -183q0 -121 -92 -204q-80 -72 -190 -72q-119 0 -202 85q-79 80 -79 193zM201 1098q0 -72 51 -124q54 -55 131 -55q82 0 137 60q46 51 46 120q0 77 -59 131q-52 47 -126 47q-79 0 -134 -60q-46 -50 -46 -119 z" />
<glyph unicode="&#xb1;" horiz-adv-x="1079" d="M60 10v143h960v-143h-960zM60 640v143h404v354h151v-354h405v-143h-405v-350h-151v350h-404z" />
<glyph unicode="&#xb2;" horiz-adv-x="853" d="M80 341v172q0 69 13.5 110t45.5 68q45 37 126 53q23 4 138 17q153 16 178 37q29 23 29 136q0 90 -25 114q-31 29 -147 29q-184 0 -207 -34q-16 -25 -16 -90q0 -21 2 -81h-136v14q2 80 4 109q14 142 120 176q78 25 225 25q185 0 252 -62q61 -56 61 -212q0 -98 -21 -148 q-32 -74 -120 -103q-56 -19 -176 -30q-127 -11 -167 -28q-30 -14 -38 -63q-4 -16 -4 -84v-7h523v-118h-660z" />
<glyph unicode="&#xb3;" horiz-adv-x="853" d="M76 630v14h135v-14v-53q0 -79 25 -103q15 -16 68 -19q37 -3 144 -3q129 0 154 28q20 23 20 120q0 88 -54 106q-24 9 -186 9l-43 -1h-14v120q39 -1 49 -1q175 0 202 17q30 18 30 95q0 62 -12 94q-12 30 -70 35q-8 0 -124 3q-94 -2 -124 -8q-36 -10 -46 -41q-6 -15 -6 -78 v-26v-24h-134l1 14q0 87 5 125q12 77 66 112q55 36 132 41q53 4 121 4q131 0 184 -13q100 -26 128 -102q16 -42 16 -109q0 -118 -39 -162q-16 -19 -42 -33q42 -18 60 -42q37 -48 37 -148q0 -142 -61 -196q-43 -38 -111 -48q-71 -10 -162 -10q-153 0 -217 20 q-105 33 -126 134q-6 28 -6 143z" />
<glyph unicode="&#xb4;" d="M379 1396l309 234l83 -112l-337 -207z" />
<glyph unicode="&#xb5;" horiz-adv-x="1223" d="M115 -273l14 630v677h159v-677q0 -124 21 -161q26 -46 105 -61q47 -9 181 -9q198 0 258 20q56 19 73 90q9 40 9 121v677h159v-677q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -270 -18q-130 0 -190 5t-103 19q-41 14 -80 40l11 -321h-138z" />
<glyph unicode="&#xb6;" horiz-adv-x="1256" d="M102 882q0 223 66 333q65 108 191 136q61 14 258 14h482v-1560h-156v1414h-187v-1414h-156v612h-68q-225 0 -331 109q-52 54 -75.5 139t-23.5 217z" />
<glyph unicode="&#xb7;" horiz-adv-x="431" d="M123 468v212h185v-212h-185z" />
<glyph unicode="&#xb8;" d="M345 -258h51q80 1 119 42.5t40 129.5v47h123v-62q-1 -174 -72 -239t-193 -70h-68v152z" />
<glyph unicode="&#xb9;" horiz-adv-x="853" d="M214 932l256 256h168v-847h-137v707l-202 -202z" />
<glyph unicode="&#xba;" horiz-adv-x="783" d="M82 834q0 169 26 236q39 98 154 119q44 8 135 8q164 0 225 -51q55 -45 68 -136q11 -75 11 -171q0 -162 -27 -230q-38 -98 -153 -119q-44 -8 -129 -8q-171 0 -231 50q-55 47 -68 137q-11 73 -11 165zM212 847q0 -137 13 -183q12 -43 38 -56q33 -16 129 -16q112 0 140 24 q39 33 39 218q0 135 -13 181q-11 43 -38 56q-33 16 -131 16q-110 0 -138 -24q-39 -33 -39 -216z" />
<glyph unicode="&#xbb;" horiz-adv-x="981" d="M123 172l209 404l-187 399l120 73l222 -472l-251 -480zM507 172l209 404l-187 399l120 73l223 -472l-251 -480z" />
<glyph unicode="&#xbc;" horiz-adv-x="1946" d="M96 932l256 256h168v-847h-137v707l-202 -202zM543 0l649 1188h135l-653 -1188h-131zM1102 186v134l440 527h179v-544h129v-117h-129v-186h-137v186h-482zM1246 303h338v410z" />
<glyph unicode="&#xbd;" horiz-adv-x="1946" d="M98 932l256 256h168v-847h-137v707l-202 -202zM484 0l649 1188h135l-653 -1188h-131zM1186 0v172q0 69 13.5 110t45.5 68q45 37 126 53q23 4 138 17q153 16 178 37q29 23 29 136q0 90 -25 114q-31 29 -147 29q-184 0 -207 -34q-16 -25 -16 -90q0 -17 1 -51q0 -19 1 -30 h-136v14q2 80 4 109q14 142 120 176q79 25 225 25q184 0 252 -62q61 -56 61 -212q0 -98 -21 -148q-32 -74 -120 -103q-57 -19 -176 -29q-127 -12 -167 -29q-30 -14 -38 -63q-4 -16 -4 -84v-7h523v-118h-660z" />
<glyph unicode="&#xbe;" horiz-adv-x="1946" d="M71 630v14h135v-14v-53q0 -79 25 -103q15 -16 68 -19q37 -3 144 -3q129 0 154 28q20 23 20 120q0 88 -54 106q-24 9 -186 9l-43 -1h-14v120q39 -1 49 -1q175 0 202 17q30 18 30 95q0 62 -12 94q-12 30 -70 35q-8 0 -124 3q-94 -2 -124 -8q-36 -10 -46 -41q-6 -15 -6 -78 v-26v-24h-134l1 14q0 87 5 125q12 77 66 112q55 36 132 41q53 4 121 4q131 0 184 -13q100 -26 128 -102q16 -42 16 -109q0 -118 -39 -162q-16 -19 -42 -33q42 -18 60 -42q37 -48 37 -148q0 -142 -61 -196q-43 -38 -111 -48q-71 -10 -162 -10q-153 0 -217 20 q-105 33 -126 134q-6 28 -6 143zM578 0l649 1188h135l-653 -1188h-131zM1137 186v134l440 527h179v-544h129v-117h-129v-186h-137v186h-482zM1281 303h338v410z" />
<glyph unicode="&#xbf;" horiz-adv-x="976" d="M123 155q0 151 17 195q20 52 55 78q36 27 200 88q43 16 53 34q10 16 10 66v176h157v-192q0 -128 -65 -173q-35 -22 -173 -70q-71 -24 -90 -64q-13 -26 -13 -103q0 -135 9 -165q19 -61 86 -72q33 -6 127 -6q95 0 129 11q60 18 72 92q3 21 3 86v29h153v-37q0 -103 -12 -152 q-25 -102 -118 -141q-72 -31 -225 -31q-157 0 -229 26q-110 39 -135 141q-11 46 -11 184zM443 976v212h185v-212h-185z" />
<glyph unicode="&#xc0;" horiz-adv-x="1442" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM454 1605l34 135l375 -101l-20 -100z" />
<glyph unicode="&#xc1;" horiz-adv-x="1442" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM578 1639l375 101l34 -135l-390 -66z" />
<glyph unicode="&#xc2;" horiz-adv-x="1442" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM358 1580l367 208l358 -208l-49 -88l-309 142l-324 -142z" />
<glyph unicode="&#xc3;" horiz-adv-x="1442" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM367 1589q34 61 59 90q56 65 139 65q47 0 155 -46q104 -45 142 -45q63 0 122 92l89 -57q-97 -157 -214 -157q-52 0 -159 47q-95 42 -139 42q-38 0 -62 -26q-15 -17 -37 -58z" />
<glyph unicode="&#xc4;" horiz-adv-x="1442" d="M20 -195l571 1560h248l582 -1560h-184l-121 331h-790l-119 -331h-187zM376 276h688l-346 946zM421 1563v155h184v-155h-184zM836 1563v155h184v-155h-184z" />
<glyph unicode="&#xc5;" horiz-adv-x="1442" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM541 1655q0 78 59 132q51 46 124 46q76 0 130 -59q46 -51 46 -120q0 -80 -59 -133q-52 -46 -120 -46q-80 0 -134 59q-46 51 -46 121zM619 1654q0 -45 34 -75q28 -26 68 -26 q45 0 75 33q26 29 26 69q0 44 -34 74q-28 26 -69 26q-43 0 -74 -33q-26 -29 -26 -68z" />
<glyph unicode="&#xc6;" horiz-adv-x="1729" d="M19 0l651 1170h960v-142h-612v-357h586v-139h-586v-390h612v-142h-771v239h-522l-130 -239h-188zM414 381h445v647h-94z" />
<glyph unicode="&#xc7;" horiz-adv-x="1151" d="M94 569q0 273 13 358q21 136 143 204q76 43 203 51q62 4 225 4q154 0 215 -20q138 -45 166 -200q10 -57 10 -144q0 -10 -1 -32h-157q-1 39 -1 51q-2 142 -48 175q-40 29 -185 29q-192 0 -276 -11q-52 -7 -80.5 -29.5t-43.5 -68.5q-16 -50 -16 -166q0 -412 22 -514 q13 -66 48 -93q40 -31 130 -35q55 -2 118 -2q145 0 212.5 9.5t92.5 33.5q35 34 35 153q0 39 -2 90h159v-58q1 -145 -22 -207q-46 -127 -205 -153q-60 -10 -301 -10q-108 0 -154 4.5t-91 20.5q-176 59 -199 311q-10 116 -10 249zM409 -258h51q80 1 119 42.5t40 129.5v47h123 v-62q-1 -174 -72 -239t-193 -70h-68v152z" />
<glyph unicode="&#xc8;" horiz-adv-x="1268" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM387 1605l34 135l375 -101l-20 -100z" />
<glyph unicode="&#xc9;" horiz-adv-x="1268" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM512 1639l375 101l34 -135l-390 -66z" />
<glyph unicode="&#xca;" horiz-adv-x="1268" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM291 1580l367 208l358 -208l-49 -88l-309 142l-324 -142z" />
<glyph unicode="&#xcb;" horiz-adv-x="1268" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM355 1563v155h184v-155h-184zM770 1563v155h184v-155h-184z" />
<glyph unicode="&#xcc;" horiz-adv-x="489" d="M-19 1605l34 135l375 -101l-20 -100zM143 0v1170h159v-1170h-159z" />
<glyph unicode="&#xcd;" horiz-adv-x="489" d="M157 -195v1560h175v-1560h-175z" />
<glyph unicode="&#xce;" horiz-adv-x="445" d="M-77 1377l300 240l300 -240l-64 -80l-236 173l-235 -173zM143 0v1170h159v-1170h-159z" />
<glyph unicode="&#xcf;" horiz-adv-x="489" d="M33 1563v155h176v-155h-176zM143 0v1170h159v-1170h-159zM284 1563v155h176v-155h-176z" />
<glyph unicode="&#xd0;" horiz-adv-x="1265" d="M49 531v117h116v522h573q110 0 190 -20q121 -29 185 -149q59 -111 59 -362q0 -207 -9 -289q-25 -227 -171 -303q-55 -28 -169 -43q-31 -4 -53 -4h-605v531h-116zM324 142h386q186 0 241 66q46 55 57 186q5 57 5 166q0 199 -10 280q-18 134 -117 169q-54 19 -149 19h-413 v-380h300v-117h-300v-389z" />
<glyph unicode="&#xd1;" horiz-adv-x="1647" d="M143 0v1170h234l643 -1023v1023h159v-1170h-235l-642 1023v-1023h-159zM471 1589q34 61 59 90q56 65 139 65q47 0 155 -46q104 -45 142 -45q63 0 122 92l89 -57q-97 -157 -214 -157q-52 0 -159 47q-95 42 -139 42q-38 0 -62 -26q-15 -17 -37 -58z" />
<glyph unicode="&#xd2;" horiz-adv-x="1534" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM500 1605l34 135l375 -101l-20 -100z" />
<glyph unicode="&#xd3;" horiz-adv-x="1534" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM625 1639l375 101l34 -135l-390 -66z" />
<glyph unicode="&#xd4;" horiz-adv-x="1534" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM404 1580l367 208l358 -208l-49 -88l-309 142l-324 -142z" />
<glyph unicode="&#xd5;" horiz-adv-x="1534" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM414 1589q34 61 59 90q56 65 139 65q47 0 155 -46q104 -45 142 -45q63 0 122 92l89 -57q-97 -157 -214 -157q-52 0 -159 47q-95 42 -139 42q-38 0 -62 -26q-15 -17 -37 -58z" />
<glyph unicode="&#xd6;" horiz-adv-x="1534" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM467 1563v155h184v-155h-184zM882 1563v155h184v-155h-184z" />
<glyph unicode="&#xd7;" horiz-adv-x="1079" d="M105 235l339 338l-339 339l95 95l339 -338l339 338l95 -95l-339 -339l339 -338l-95 -95l-339 338l-339 -338z" />
<glyph unicode="&#xd8;" horiz-adv-x="1124" d="M38 -55v164l51 54q-15 39 -22 72q-18 85 -20 172q-1 65 -1 208q0 189 8 247q29 220 176 285q65 29 168 35q65 4 152 4q142 0 213 -7t118 -26q49 -19 88 -54l118 126v-164l-53 -56q19 -46 28 -87q17 -83 17 -267q0 -278 -9 -348q-15 -114 -52 -177t-110 -98 q-75 -36 -187 -41q-56 -3 -133 -3q-160 0 -226 6t-115 24q-51 20 -93 55zM204 766l1 -181q0 -230 8 -290l653 695q-31 29 -74 39q-48 11 -273 11q-145 0 -195 -15q-46 -13 -69.5 -40t-36.5 -79q-14 -60 -14 -140zM259 180q31 -29 74 -39q48 -11 272 -11q163 0 219 23 q61 24 82 111q14 61 14 140v181q0 229 -8 290z" />
<glyph unicode="&#xd9;" horiz-adv-x="1550" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM507 1605l34 135l375 -101 l-20 -100z" />
<glyph unicode="&#xda;" horiz-adv-x="1550" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM632 1639l375 101l34 -135 l-390 -66z" />
<glyph unicode="&#xdb;" horiz-adv-x="1550" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM411 1580l367 208 l358 -208l-49 -88l-309 142l-324 -142z" />
<glyph unicode="&#xdc;" horiz-adv-x="1550" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM475 1563v155h184v-155 h-184zM890 1563v155h184v-155h-184z" />
<glyph unicode="&#xdd;" horiz-adv-x="1365" d="M1 1170h187l345 -516l344 516h190l-459 -683v-487h-159v487zM541 1639l375 101l34 -135l-390 -66z" />
<glyph unicode="&#xde;" horiz-adv-x="1121" d="M143 0v1170h159v-218h365q112 0 159 -5.5t87 -23.5q146 -66 146 -336q0 -149 -40 -225q-51 -97 -160 -123q-38 -9 -212 -11h-345v-228h-159zM302 370h320q147 0 198 18q55 20 71 84q9 33 9 97q0 121 -15 168q-17 53 -78 66q-26 6 -144 7h-361v-440z" />
<glyph unicode="&#xdf;" horiz-adv-x="1112" d="M116 -80l1 952q0 196 89 265q64 49 173 57q70 5 163 5q173 0 243 -19q128 -34 164 -137q20 -57 20 -151q0 -163 -49 -222q-32 -39 -96 -59q65 -16 99 -46q68 -59 68 -227q0 -197 -77 -270q-55 -52 -143 -66q-94 -14 -218 -14h-123v140h158q175 0 215 46q31 36 31 182 q0 102 -37 141q-29 31 -79 37q-34 4 -80 4h-205v140h205q115 0 149 47q25 34 25 125q0 98 -19 148q-10 27 -32.5 39t-71.5 18q-43 4 -154 4t-159.5 -7t-71.5 -27q-36 -30 -36 -153v-952h-152z" />
<glyph unicode="&#xe0;" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM311 1518l82 112l310 -234l-56 -85zM332 376h474l-239 625z" />
<glyph unicode="&#xe1;" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM436 1396l309 234l83 -112l-337 -207z" />
<glyph unicode="&#xe2;" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM269 1377l300 240l300 -240l-64 -80l-236 173l-235 -173zM332 376h474l-239 625z" />
<glyph unicode="&#xe3;" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM253 1406q32 55 57 82q54 59 129 59q48 0 142 -44q98 -45 125 -45q45 0 88 85l91 -57q-81 -144 -180 -144q-54 0 -146 44q-89 43 -123 43q-36 0 -57 -26q-13 -15 -34 -56zM332 376h474l-239 625z" />
<glyph unicode="&#xe4;" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM270 1366v155h184v-155h-184zM332 376h474l-239 625zM685 1366v155h184v-155h-184z" />
<glyph unicode="&#xe5;" horiz-adv-x="1138" d="M20 0l444 1170h202l453 -1170h-168l-93 242h-577l-92 -242h-169zM332 376h474l-239 625zM390 1468q0 77 59 132q51 46 124 46q76 0 130 -59q46 -52 46 -120q0 -81 -59 -134q-52 -46 -120 -46q-81 0 -134 59q-46 51 -46 122zM468 1467q0 -46 34 -76q28 -26 68 -26 q45 0 75 34q26 28 26 68q0 44 -34 75q-28 26 -69 26q-44 0 -74 -34q-26 -29 -26 -67z" />
<glyph unicode="&#xe6;" horiz-adv-x="1729" d="M19 0l651 1170h960v-142h-612v-357h586v-139h-586v-390h612v-142h-771v239h-522l-130 -239h-188zM414 381h445v647h-94z" />
<glyph unicode="&#xe7;" horiz-adv-x="1151" d="M94 569q0 273 13 358q21 136 143 204q76 43 203 51q62 4 225 4q154 0 215 -20q138 -45 166 -200q10 -57 10 -144q0 -10 -1 -32h-157q-1 39 -1 51q-2 142 -48 175q-40 29 -185 29q-192 0 -276 -11q-52 -7 -80.5 -29.5t-43.5 -68.5q-16 -50 -16 -166q0 -412 22 -514 q13 -66 48 -93q40 -31 130 -35q55 -2 118 -2q145 0 212.5 9.5t92.5 33.5q35 34 35 153q0 39 -2 90h159v-58q1 -145 -22 -207q-46 -127 -205 -153q-60 -10 -301 -10q-108 0 -154 4.5t-91 20.5q-176 59 -199 311q-10 116 -10 249zM409 -258h51q80 1 119 42.5t40 129.5v47h123 v-62q-1 -174 -72 -239t-193 -70h-68v152z" />
<glyph unicode="&#xe8;" horiz-adv-x="1036" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM278 1518l82 112l310 -234l-56 -85z" />
<glyph unicode="&#xe9;" horiz-adv-x="1036" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM403 1396l309 234l83 -112l-337 -207z" />
<glyph unicode="&#xea;" horiz-adv-x="1036" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM236 1377l300 240l300 -240l-64 -80l-236 173l-235 -173z" />
<glyph unicode="&#xeb;" horiz-adv-x="1036" d="M143 0v1170h794v-142h-635v-354h610v-139h-610v-393h635v-142h-794zM237 1366v155h184v-155h-184zM652 1366v155h184v-155h-184z" />
<glyph unicode="&#xec;" horiz-adv-x="445" d="M-33 1518l82 112l310 -234l-56 -85zM143 0v1170h159v-1170h-159z" />
<glyph unicode="&#xed;" horiz-adv-x="445" d="M92 1396l309 234l83 -112l-337 -207zM143 0v1170h159v-1170h-159z" />
<glyph unicode="&#xee;" horiz-adv-x="445" d="M-77 1377l300 240l300 -240l-64 -80l-236 173l-235 -173zM143 0v1170h159v-1170h-159z" />
<glyph unicode="&#xef;" horiz-adv-x="445" d="M-13 1366v155h184v-155h-184zM143 0v1170h159v-1170h-159zM280 1366v155h184v-155h-184z" />
<glyph unicode="&#xf0;" horiz-adv-x="1265" d="M49 531v117h116v522h573q110 0 190 -20q121 -29 185 -149q59 -111 59 -362q0 -207 -9 -289q-25 -227 -171 -303q-55 -28 -169 -43q-31 -4 -53 -4h-605v531h-116zM324 142h386q186 0 241 66q46 55 57 186q5 57 5 166q0 199 -10 280q-18 134 -117 169q-54 19 -149 19h-413 v-380h300v-117h-300v-389z" />
<glyph unicode="&#xf1;" horiz-adv-x="1321" d="M143 0v1170h234l643 -1023v1023h159v-1170h-235l-642 1023v-1023h-159zM345 1406q32 55 57 82q54 59 129 59q48 0 142 -44q98 -45 125 -45q45 0 88 85l91 -57q-81 -144 -180 -144q-54 0 -146 44q-89 43 -123 43q-36 0 -57 -26q-13 -15 -34 -56z" />
<glyph unicode="&#xf2;" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM352 1518l82 112l310 -234l-56 -85z" />
<glyph unicode="&#xf3;" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM477 1396l309 234l83 -112l-337 -207z" />
<glyph unicode="&#xf4;" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM310 1377l300 240l300 -240l-64 -80l-236 173l-235 -173z" />
<glyph unicode="&#xf5;" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM294 1406q32 55 57 82q54 59 129 59q48 0 142 -44q98 -45 125 -45q45 0 88 85l91 -57q-81 -144 -180 -144q-54 0 -146 44q-89 43 -123 43q-36 0 -57 -26q-13 -15 -34 -56z" />
<glyph unicode="&#xf6;" horiz-adv-x="1220" d="M94 637q0 162 8 225q28 220 176 285q66 29 173 35q69 4 174 4q131 0 199 -8.5t119 -30.5q148 -64 176 -286q8 -60 8 -218q0 -270 -9 -340q-15 -114 -52 -177t-110 -98q-74 -36 -192 -41q-61 -3 -154 -3q-157 0 -223.5 8.5t-122.5 35.5q-105 52 -141 176q-25 86 -27 203 q-2 76 -2 230zM253 585q0 -212 4 -252q8 -81 28.5 -122t63.5 -59q38 -16 111 -19q58 -3 151 -3q124 0 177 4.5t85 17.5q60 25 81 112q14 61 14 140v181q0 212 -4 252q-8 82 -28.5 122.5t-63.5 58.5q-39 16 -114 19q-61 3 -164 3q-115 0 -164 -4.5t-82 -18.5 q-60 -25 -81 -111q-14 -60 -14 -140v-181zM311 1366v155h184v-155h-184zM726 1366v155h184v-155h-184z" />
<glyph unicode="&#xf7;" horiz-adv-x="1079" d="M66 509v129h946v-129h-946zM447 241q0 39 30 68q26 24 64 24q40 0 67 -31q24 -26 24 -61q0 -41 -31 -69q-26 -24 -61 -24q-41 0 -69 31q-24 26 -24 62zM447 908q0 39 30 68q26 24 64 24q40 0 67 -31q24 -27 24 -61q0 -41 -31 -69q-26 -24 -61 -24q-41 0 -69 31 q-24 27 -24 62z" />
<glyph unicode="&#xf8;" horiz-adv-x="1124" d="M38 -55v164l51 54q-15 39 -22 72q-18 85 -20 172q-1 65 -1 208q0 189 8 247q29 220 176 285q65 29 168 35q65 4 152 4q142 0 213 -7t118 -26q49 -19 88 -54l118 126v-164l-53 -56q19 -46 28 -87q17 -83 17 -267q0 -278 -9 -348q-15 -114 -52 -177t-110 -98 q-75 -36 -187 -41q-56 -3 -133 -3q-160 0 -226 6t-115 24q-51 20 -93 55zM204 766l1 -181q0 -230 8 -290l653 695q-31 29 -74 39q-48 11 -273 11q-145 0 -195 -15q-46 -13 -69.5 -40t-36.5 -79q-14 -60 -14 -140zM259 180q31 -29 74 -39q48 -11 272 -11q163 0 219 23 q61 24 82 111q14 61 14 140v181q0 229 -8 290z" />
<glyph unicode="&#xf9;" horiz-adv-x="1251" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM366 1518l82 112l310 -234 l-56 -85z" />
<glyph unicode="&#xfa;" horiz-adv-x="1251" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM491 1396l309 234l83 -112 l-337 -207z" />
<glyph unicode="&#xfb;" horiz-adv-x="1251" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM324 1377l300 240 l300 -240l-64 -80l-236 173l-235 -173z" />
<glyph unicode="&#xfc;" horiz-adv-x="1251" d="M143 357v813h159v-813q0 -124 21 -161q27 -46 105 -61q47 -9 181 -9q197 0 258 20q56 18 72 90q10 40 10 121v813h159v-813q0 -150 -33 -218q-49 -103 -176 -137q-69 -18 -267 -18q-141 0 -202.5 6t-108.5 24q-105 40 -145 125q-33 71 -33 218zM325 1366v155h184v-155 h-184zM740 1366v155h184v-155h-184z" />
<glyph unicode="&#xfd;" horiz-adv-x="1068" d="M1 1170h187l345 -516l344 516h190l-459 -683v-487h-159v487zM400 1396l309 234l83 -112l-337 -207z" />
<glyph unicode="&#xfe;" horiz-adv-x="1121" d="M143 0v1170h159v-218h365q112 0 159 -5.5t87 -23.5q146 -66 146 -336q0 -149 -40 -225q-51 -97 -160 -123q-38 -9 -212 -11h-345v-228h-159zM302 370h320q147 0 198 18q55 20 71 84q9 33 9 97q0 121 -15 168q-17 53 -78 66q-26 6 -144 7h-361v-440z" />
<glyph unicode="&#xff;" horiz-adv-x="1068" d="M1 1170h187l345 -516l344 516h190l-459 -683v-487h-159v487zM234 1366v155h184v-155h-184zM649 1366v155h184v-155h-184z" />
<glyph unicode="&#x152;" horiz-adv-x="1820" d="M94 443q0 159 1 293q1 194 50 284q66 124 233 154q64 12 192 12q195 0 268 -24q50 -18 113 -78v86h770v-142h-616v-354h591v-139h-591v-393h616v-142h-771l2 85q-78 -68 -140 -86q-52 -15 -202 -15q-197 0 -257 11q-97 19 -160.5 84.5t-84.5 169.5q-14 72 -14 194z M254 435q0 -154 32 -223q30 -67 135 -80q44 -6 170 -6q175 0 228 14q85 23 108 102q16 58 16 156v355q0 132 -25 200q-14 37 -43 56t-87 27q-65 9 -268 9q-164 0 -213 -52q-49 -53 -52 -253q-1 -91 -1 -305z" />
<glyph unicode="&#x153;" horiz-adv-x="1820" d="M94 443q0 159 1 293q1 194 50 284q66 124 233 154q64 12 192 12q195 0 268 -24q50 -18 113 -78v86h770v-142h-616v-354h591v-139h-591v-393h616v-142h-771l2 85q-78 -68 -140 -86q-52 -15 -202 -15q-197 0 -257 11q-97 19 -160.5 84.5t-84.5 169.5q-14 72 -14 194z M254 435q0 -154 32 -223q30 -67 135 -80q44 -6 170 -6q175 0 228 14q85 23 108 102q16 58 16 156v355q0 132 -25 200q-14 37 -43 56t-87 27q-65 9 -268 9q-164 0 -213 -52q-49 -53 -52 -253q-1 -91 -1 -305z" />
<glyph unicode="&#x178;" horiz-adv-x="1365" d="M1 1170h187l345 -516l344 516h190l-459 -683v-487h-159v487zM383 1563v155h184v-155h-184zM798 1563v155h184v-155h-184z" />
<glyph unicode="&#x2c6;" d="M212 1377l300 240l300 -240l-64 -80l-236 173l-235 -173z" />
<glyph unicode="&#x2dc;" d="M196 1406q32 55 57 82q54 59 129 59q48 0 142 -44q98 -45 125 -45q45 0 88 85l91 -57q-81 -144 -180 -144q-54 0 -146 44q-89 43 -123 43q-36 0 -57 -26q-13 -15 -34 -56z" />
<glyph unicode="&#x2000;" horiz-adv-x="916" />
<glyph unicode="&#x2001;" horiz-adv-x="1833" />
<glyph unicode="&#x2002;" horiz-adv-x="916" />
<glyph unicode="&#x2003;" horiz-adv-x="1833" />
<glyph unicode="&#x2004;" horiz-adv-x="611" />
<glyph unicode="&#x2005;" horiz-adv-x="458" />
<glyph unicode="&#x2006;" horiz-adv-x="305" />
<glyph unicode="&#x2007;" horiz-adv-x="305" />
<glyph unicode="&#x2008;" horiz-adv-x="229" />
<glyph unicode="&#x2009;" horiz-adv-x="366" />
<glyph unicode="&#x200a;" horiz-adv-x="101" />
<glyph unicode="&#x2010;" horiz-adv-x="513" d="M20 493v152h473v-152h-473z" />
<glyph unicode="&#x2011;" horiz-adv-x="513" d="M20 493v152h473v-152h-473z" />
<glyph unicode="&#x2012;" horiz-adv-x="513" d="M20 493v152h473v-152h-473z" />
<glyph unicode="&#x2013;" horiz-adv-x="1109" d="M96 493v152h918v-152h-918z" />
<glyph unicode="&#x2014;" horiz-adv-x="1647" d="M14 493l11 152h1609v-152h-1620z" />
<glyph unicode="&#x2018;" horiz-adv-x="454" d="M123 956v228q0 111 26 151q39 62 132 62q18 0 50 -3v-87q-53 -3 -74 -20q-28 -21 -28 -77q0 -14 1 -43h79v-211h-186z" />
<glyph unicode="&#x2019;" horiz-adv-x="454" d="M123 925v88q54 3 75 19q28 21 28 76q0 16 -2 45h-78v212h185v-229q0 -111 -26 -151q-39 -62 -133 -62q-18 0 -49 2z" />
<glyph unicode="&#x201a;" horiz-adv-x="454" d="M123 -140q53 3 75 19q28 21 28 76q0 15 -2 45h-78v212h185v-228q0 -111 -26 -152q-38 -62 -133 -62q-18 0 -49 2v88z" />
<glyph unicode="&#x201c;" horiz-adv-x="782" d="M123 956v228q0 111 26 151q39 62 132 62q18 0 50 -3v-87q-53 -3 -74 -20q-28 -21 -28 -77q0 -14 1 -43h79v-211h-186zM451 956v228q0 110 25 151q39 62 132 62q19 0 51 -3v-87q-53 -3 -75 -20q-28 -21 -28 -75q0 -15 2 -45h78v-211h-185z" />
<glyph unicode="&#x201d;" horiz-adv-x="782" d="M123 925v88q54 3 75 19q28 21 28 76q0 16 -2 45h-78v212h185v-229q0 -111 -26 -151q-39 -62 -133 -62q-18 0 -49 2zM451 925v88q54 3 75 19q28 22 28 77q0 15 -2 44h-78v212h185v-229q0 -111 -26 -151q-38 -62 -132 -62q-19 0 -50 2z" />
<glyph unicode="&#x201e;" horiz-adv-x="782" d="M123 -140q53 3 75 19q28 21 28 76q0 15 -2 45h-78v212h185v-228q0 -111 -26 -152q-38 -62 -133 -62q-18 0 -49 2v88zM451 -140q53 3 75 19q28 22 28 77q0 15 -2 44h-78v212h185v-228q0 -111 -26 -152q-38 -62 -133 -62q-18 0 -49 2v88z" />
<glyph unicode="&#x2022;" horiz-adv-x="1365" d="M401 570q0 121 84 202q85 83 204 83q113 0 196 -83q84 -83 84 -201t-84 -201q-82 -83 -200 -83t-200 83q-84 83 -84 200z" />
<glyph unicode="&#x2026;" horiz-adv-x="1292" d="M123 0v212h185v-212h-185zM554 0v212h185v-212h-185zM985 0v212h185v-212h-185z" />
<glyph unicode="&#x202f;" horiz-adv-x="366" />
<glyph unicode="&#x2039;" horiz-adv-x="597" d="M109 600l223 473l120 -74l-188 -399l209 -404l-113 -75z" />
<glyph unicode="&#x203a;" horiz-adv-x="597" d="M123 172l209 404l-187 399l120 73l222 -472l-251 -480z" />
<glyph unicode="&#x205f;" horiz-adv-x="458" />
<glyph unicode="&#x20ac;" horiz-adv-x="1011" d="M98 457l29 108h81v101h-108l27 109h88q1 87 11 175q24 185 144 260q79 52 216 54t281 -48l-65 -118q-57 18 -126 29t-147 3q-58 -12 -87 -47t-44 -86q-17 -56 -22 -221h394l-35 -108h-361v-103h320l-39 -111h-281q3 -118 21 -208q24 -84 68 -119t129 -40q74 -1 123 7.5 t117 45.5l80 -115q-122 -63 -268 -67t-221 26q-175 66 -201 322q-8 74 -7 151h-117z" />
<glyph unicode="&#x2122;" horiz-adv-x="1766" d="M127 1257v108h565v-108h-222v-670h-119v670h-224zM829 587v778h171l232 -605l232 605h174v-778h-120v591l-227 -591h-115l-228 591v-591h-119z" />
<glyph unicode="&#x25fc;" horiz-adv-x="1170" d="M0 0v1170h1170v-1170h-1170z" />
<hkern u1="&#x2c;" u2="&#x201d;" k="69" />
<hkern u1="&#x2c;" u2="&#x2019;" k="69" />
<hkern u1="&#x2c;" u2="&#x31;" k="154" />
<hkern u1="&#x2d;" u2="Y" k="123" />
<hkern u1="&#x2d;" u2="W" k="26" />
<hkern u1="&#x2d;" u2="V" k="42" />
<hkern u1="&#x2d;" u2="T" k="168" />
<hkern u1="&#x2d;" u2="A" k="33" />
<hkern u1="&#x2e;" u2="&#x201d;" k="70" />
<hkern u1="&#x2e;" u2="&#x2019;" k="70" />
<hkern u1="&#x2e;" u2="&#x31;" k="154" />
<hkern u1="&#x30;" u2="&#x37;" k="15" />
<hkern u1="&#x30;" u2="&#x34;" k="-15" />
<hkern u1="&#x30;" u2="&#x31;" k="-28" />
<hkern u1="&#x31;" u2="&#x39;" k="36" />
<hkern u1="&#x31;" u2="&#x38;" k="37" />
<hkern u1="&#x31;" u2="&#x37;" k="31" />
<hkern u1="&#x31;" u2="&#x36;" k="34" />
<hkern u1="&#x31;" u2="&#x35;" k="43" />
<hkern u1="&#x31;" u2="&#x34;" k="17" />
<hkern u1="&#x31;" u2="&#x33;" k="35" />
<hkern u1="&#x31;" u2="&#x32;" k="30" />
<hkern u1="&#x31;" u2="&#x31;" k="4" />
<hkern u1="&#x31;" u2="&#x30;" k="29" />
<hkern u1="&#x31;" u2="&#x2e;" k="34" />
<hkern u1="&#x31;" u2="&#x2c;" k="46" />
<hkern u1="&#x32;" u2="&#x37;" k="10" />
<hkern u1="&#x32;" u2="&#x34;" k="40" />
<hkern u1="&#x32;" u2="&#x31;" k="-29" />
<hkern u1="&#x33;" u2="&#x37;" k="23" />
<hkern u1="&#x33;" u2="&#x34;" k="-8" />
<hkern u1="&#x33;" u2="&#x31;" k="-10" />
<hkern u1="&#x34;" u2="&#x37;" k="66" />
<hkern u1="&#x34;" u2="&#x34;" k="-34" />
<hkern u1="&#x34;" u2="&#x31;" k="39" />
<hkern u1="&#x35;" u2="&#x37;" k="26" />
<hkern u1="&#x35;" u2="&#x34;" k="-12" />
<hkern u1="&#x35;" u2="&#x31;" k="47" />
<hkern u1="&#x36;" u2="&#x37;" k="22" />
<hkern u1="&#x36;" u2="&#x34;" k="-13" />
<hkern u1="&#x36;" u2="&#x31;" k="-2" />
<hkern u1="&#x37;" u2="&#x3a;" k="13" />
<hkern u1="&#x37;" u2="&#x38;" k="17" />
<hkern u1="&#x37;" u2="&#x37;" k="-2" />
<hkern u1="&#x37;" u2="&#x36;" k="19" />
<hkern u1="&#x37;" u2="&#x35;" k="24" />
<hkern u1="&#x37;" u2="&#x34;" k="135" />
<hkern u1="&#x37;" u2="&#x33;" k="15" />
<hkern u1="&#x37;" u2="&#x32;" k="11" />
<hkern u1="&#x37;" u2="&#x31;" k="13" />
<hkern u1="&#x37;" u2="&#x2e;" k="218" />
<hkern u1="&#x37;" u2="&#x2c;" k="226" />
<hkern u1="&#x38;" u2="&#x37;" k="13" />
<hkern u1="&#x38;" u2="&#x34;" k="-14" />
<hkern u1="&#x38;" u2="&#x31;" k="-20" />
<hkern u1="&#x39;" u2="&#x37;" k="20" />
<hkern u1="&#x39;" u2="&#x34;" k="-10" />
<hkern u1="&#x39;" u2="&#x31;" k="-21" />
<hkern u1="A" u2="&#x2039;" k="110" />
<hkern u1="A" u2="&#x201d;" k="170" />
<hkern u1="A" u2="&#x2019;" k="170" />
<hkern u1="A" u2="&#xe7;" k="52" />
<hkern u1="A" u2="&#xc7;" k="30" />
<hkern u1="A" u2="&#xab;" k="106" />
<hkern u1="A" u2="y" k="169" />
<hkern u1="A" u2="w" k="137" />
<hkern u1="A" u2="v" k="153" />
<hkern u1="A" u2="u" k="65" />
<hkern u1="A" u2="t" k="159" />
<hkern u1="A" u2="q" k="50" />
<hkern u1="A" u2="o" k="51" />
<hkern u1="A" u2="g" k="47" />
<hkern u1="A" u2="e" k="24" />
<hkern u1="A" u2="d" k="24" />
<hkern u1="A" u2="c" k="52" />
<hkern u1="A" u2="b" k="24" />
<hkern u1="A" u2="a" k="-36" />
<hkern u1="A" u2="Y" k="208" />
<hkern u1="A" u2="W" k="166" />
<hkern u1="A" u2="V" k="190" />
<hkern u1="A" u2="U" k="44" />
<hkern u1="A" u2="T" k="193" />
<hkern u1="A" u2="Q" k="30" />
<hkern u1="A" u2="O" k="30" />
<hkern u1="A" u2="G" k="26" />
<hkern u1="A" u2="C" k="30" />
<hkern u1="A" u2="&#x2e;" k="10" />
<hkern u1="A" u2="&#x2d;" k="36" />
<hkern u1="A" u2="&#x2c;" k="21" />
<hkern u1="B" u2="&#xd8;" k="-14" />
<hkern u1="B" u2="Y" k="39" />
<hkern u1="B" u2="W" k="24" />
<hkern u1="B" u2="V" k="28" />
<hkern u1="B" u2="A" k="9" />
<hkern u1="C" u2="O" k="-6" />
<hkern u1="C" u2="K" k="19" />
<hkern u1="C" u2="H" k="19" />
<hkern u1="C" u2="A" k="2" />
<hkern u1="D" u2="Y" k="57" />
<hkern u1="D" u2="X" k="70" />
<hkern u1="D" u2="W" k="29" />
<hkern u1="D" u2="V" k="36" />
<hkern u1="D" u2="T" k="27" />
<hkern u1="D" u2="J" k="-15" />
<hkern u1="D" u2="A" k="36" />
<hkern u1="F" u2="&#x153;" k="-8" />
<hkern u1="F" u2="&#xf8;" k="-31" />
<hkern u1="F" u2="&#xf6;" k="-8" />
<hkern u1="F" u2="&#xf3;" k="-8" />
<hkern u1="F" u2="&#xe9;" k="16" />
<hkern u1="F" u2="&#xe6;" k="99" />
<hkern u1="F" u2="&#xe5;" k="54" />
<hkern u1="F" u2="&#xe4;" k="54" />
<hkern u1="F" u2="&#xe1;" k="54" />
<hkern u1="F" u2="u" k="16" />
<hkern u1="F" u2="r" k="16" />
<hkern u1="F" u2="o" k="-8" />
<hkern u1="F" u2="j" k="2" />
<hkern u1="F" u2="i" k="16" />
<hkern u1="F" u2="e" k="16" />
<hkern u1="F" u2="a" k="54" />
<hkern u1="F" u2="O" k="-8" />
<hkern u1="F" u2="J" k="35" />
<hkern u1="F" u2="A" k="81" />
<hkern u1="F" u2="&#x2e;" k="119" />
<hkern u1="F" u2="&#x2d;" k="-52" />
<hkern u1="F" u2="&#x2c;" k="121" />
<hkern u1="G" u2="Y" k="15" />
<hkern u1="G" u2="W" k="2" />
<hkern u1="G" u2="V" k="6" />
<hkern u1="G" u2="T" k="-9" />
<hkern u1="G" u2="A" k="18" />
<hkern u1="J" u2="A" k="40" />
<hkern u1="K" u2="&#x152;" k="79" />
<hkern u1="K" u2="&#xfc;" k="95" />
<hkern u1="K" u2="&#xf6;" k="135" />
<hkern u1="K" u2="&#xf3;" k="135" />
<hkern u1="K" u2="&#xe6;" k="12" />
<hkern u1="K" u2="&#xe5;" k="12" />
<hkern u1="K" u2="&#xe4;" k="12" />
<hkern u1="K" u2="y" k="46" />
<hkern u1="K" u2="u" k="105" />
<hkern u1="K" u2="o" k="135" />
<hkern u1="K" u2="e" k="74" />
<hkern u1="K" u2="a" k="12" />
<hkern u1="K" u2="T" k="-36" />
<hkern u1="K" u2="S" k="56" />
<hkern u1="K" u2="O" k="79" />
<hkern u1="K" u2="G" k="78" />
<hkern u1="K" u2="C" k="78" />
<hkern u1="K" u2="&#x2d;" k="198" />
<hkern u1="L" u2="&#x201d;" k="371" />
<hkern u1="L" u2="&#x2019;" k="371" />
<hkern u1="L" u2="&#xfc;" k="385" />
<hkern u1="L" u2="&#xc7;" k="367" />
<hkern u1="L" u2="y" k="329" />
<hkern u1="L" u2="u" k="385" />
<hkern u1="L" u2="Y" k="330" />
<hkern u1="L" u2="W" k="336" />
<hkern u1="L" u2="V" k="336" />
<hkern u1="L" u2="U" k="382" />
<hkern u1="L" u2="T" k="345" />
<hkern u1="L" u2="S" k="369" />
<hkern u1="L" u2="O" k="368" />
<hkern u1="L" u2="G" k="367" />
<hkern u1="L" u2="C" k="367" />
<hkern u1="L" u2="A" k="369" />
<hkern u1="L" u2="&#x2d;" k="314" />
<hkern u1="N" u2="&#xfc;" k="37" />
<hkern u1="N" u2="&#xf8;" k="-8" />
<hkern u1="N" u2="&#xf6;" k="21" />
<hkern u1="N" u2="&#xf3;" k="21" />
<hkern u1="N" u2="&#xe9;" k="32" />
<hkern u1="N" u2="&#xe6;" k="-7" />
<hkern u1="N" u2="&#xe5;" k="-6" />
<hkern u1="N" u2="&#xe4;" k="-6" />
<hkern u1="N" u2="&#xe1;" k="-6" />
<hkern u1="N" u2="&#xc7;" k="19" />
<hkern u1="N" u2="u" k="37" />
<hkern u1="N" u2="o" k="21" />
<hkern u1="N" u2="e" k="32" />
<hkern u1="N" u2="a" k="-6" />
<hkern u1="N" u2="O" k="20" />
<hkern u1="N" u2="G" k="19" />
<hkern u1="N" u2="C" k="19" />
<hkern u1="N" u2="A" k="26" />
<hkern u1="N" u2="&#x2e;" k="27" />
<hkern u1="N" u2="&#x2c;" k="38" />
<hkern u1="O" u2="Y" k="38" />
<hkern u1="O" u2="X" k="62" />
<hkern u1="O" u2="W" k="19" />
<hkern u1="O" u2="V" k="25" />
<hkern u1="O" u2="T" k="10" />
<hkern u1="O" u2="A" k="30" />
<hkern u1="P" u2="&#x153;" k="-12" />
<hkern u1="P" u2="&#xf8;" k="-36" />
<hkern u1="P" u2="&#xf6;" k="-12" />
<hkern u1="P" u2="&#xf3;" k="-12" />
<hkern u1="P" u2="&#xe9;" k="9" />
<hkern u1="P" u2="&#xe6;" k="132" />
<hkern u1="P" u2="&#xe5;" k="82" />
<hkern u1="P" u2="&#xe4;" k="82" />
<hkern u1="P" u2="&#xe1;" k="82" />
<hkern u1="P" u2="o" k="-12" />
<hkern u1="P" u2="e" k="9" />
<hkern u1="P" u2="a" k="82" />
<hkern u1="P" u2="J" k="72" />
<hkern u1="P" u2="A" k="109" />
<hkern u1="P" u2="&#x2e;" k="156" />
<hkern u1="P" u2="&#x2d;" k="-44" />
<hkern u1="P" u2="&#x2c;" k="158" />
<hkern u1="R" u2="&#x153;" k="14" />
<hkern u1="R" u2="&#x152;" k="14" />
<hkern u1="R" u2="&#xfc;" k="37" />
<hkern u1="R" u2="&#xfa;" k="37" />
<hkern u1="R" u2="&#xf6;" k="15" />
<hkern u1="R" u2="&#xf3;" k="15" />
<hkern u1="R" u2="&#xe9;" k="31" />
<hkern u1="R" u2="&#xe6;" k="-13" />
<hkern u1="R" u2="&#xe5;" k="-12" />
<hkern u1="R" u2="&#xe4;" k="-12" />
<hkern u1="R" u2="&#xe1;" k="-12" />
<hkern u1="R" u2="&#xc7;" k="13" />
<hkern u1="R" u2="y" k="-14" />
<hkern u1="R" u2="u" k="37" />
<hkern u1="R" u2="o" k="15" />
<hkern u1="R" u2="e" k="30" />
<hkern u1="R" u2="a" k="-12" />
<hkern u1="R" u2="Y" k="39" />
<hkern u1="R" u2="W" k="19" />
<hkern u1="R" u2="V" k="24" />
<hkern u1="R" u2="U" k="39" />
<hkern u1="R" u2="T" k="10" />
<hkern u1="R" u2="O" k="13" />
<hkern u1="R" u2="G" k="13" />
<hkern u1="R" u2="C" k="13" />
<hkern u1="R" u2="&#x2d;" k="-14" />
<hkern u1="S" u2="t" k="-14" />
<hkern u1="S" u2="Y" k="24" />
<hkern u1="S" u2="W" k="11" />
<hkern u1="S" u2="V" k="15" />
<hkern u1="S" u2="A" k="10" />
<hkern u1="T" u2="&#x2039;" k="231" />
<hkern u1="T" u2="&#x152;" k="9" />
<hkern u1="T" u2="&#xf8;" k="85" />
<hkern u1="T" u2="&#xe6;" k="189" />
<hkern u1="T" u2="&#xd8;" k="3" />
<hkern u1="T" u2="&#xab;" k="231" />
<hkern u1="T" u2="y" k="183" />
<hkern u1="T" u2="w" k="189" />
<hkern u1="T" u2="v" k="189" />
<hkern u1="T" u2="u" k="239" />
<hkern u1="T" u2="s" k="223" />
<hkern u1="T" u2="r" k="229" />
<hkern u1="T" u2="o" k="225" />
<hkern u1="T" u2="j" k="208" />
<hkern u1="T" u2="i" k="229" />
<hkern u1="T" u2="g" k="224" />
<hkern u1="T" u2="e" k="229" />
<hkern u1="T" u2="c" k="225" />
<hkern u1="T" u2="a" k="190" />
<hkern u1="T" u2="Y" k="-67" />
<hkern u1="T" u2="W" k="-61" />
<hkern u1="T" u2="V" k="-61" />
<hkern u1="T" u2="S" k="-6" />
<hkern u1="T" u2="O" k="9" />
<hkern u1="T" u2="J" k="206" />
<hkern u1="T" u2="G" k="9" />
<hkern u1="T" u2="C" k="3" />
<hkern u1="T" u2="A" k="188" />
<hkern u1="T" u2="&#x3b;" k="243" />
<hkern u1="T" u2="&#x3a;" k="237" />
<hkern u1="T" u2="&#x2e;" k="226" />
<hkern u1="T" u2="&#x2d;" k="168" />
<hkern u1="T" u2="&#x2c;" k="236" />
<hkern u1="U" u2="r" k="34" />
<hkern u1="U" u2="p" k="34" />
<hkern u1="U" u2="n" k="34" />
<hkern u1="U" u2="m" k="34" />
<hkern u1="U" u2="A" k="44" />
<hkern u1="U" u2="&#x2e;" k="32" />
<hkern u1="U" u2="&#x2c;" k="43" />
<hkern u1="V" u2="&#x2039;" k="99" />
<hkern u1="V" u2="&#xf8;" k="19" />
<hkern u1="V" u2="&#xe6;" k="166" />
<hkern u1="V" u2="&#xd8;" k="16" />
<hkern u1="V" u2="&#xab;" k="103" />
<hkern u1="V" u2="y" k="-41" />
<hkern u1="V" u2="u" k="22" />
<hkern u1="V" u2="r" k="26" />
<hkern u1="V" u2="o" k="43" />
<hkern u1="V" u2="i" k="26" />
<hkern u1="V" u2="g" k="41" />
<hkern u1="V" u2="e" k="26" />
<hkern u1="V" u2="a" k="154" />
<hkern u1="V" u2="T" k="-62" />
<hkern u1="V" u2="S" k="8" />
<hkern u1="V" u2="O" k="24" />
<hkern u1="V" u2="G" k="22" />
<hkern u1="V" u2="C" k="18" />
<hkern u1="V" u2="A" k="185" />
<hkern u1="V" u2="&#x3b;" k="28" />
<hkern u1="V" u2="&#x3a;" k="26" />
<hkern u1="V" u2="&#x2e;" k="163" />
<hkern u1="V" u2="&#x2d;" k="42" />
<hkern u1="V" u2="&#x2c;" k="173" />
<hkern u1="W" u2="&#x2039;" k="87" />
<hkern u1="W" u2="&#xf8;" k="14" />
<hkern u1="W" u2="&#xe6;" k="142" />
<hkern u1="W" u2="&#xd8;" k="14" />
<hkern u1="W" u2="&#xab;" k="90" />
<hkern u1="W" u2="y" k="-44" />
<hkern u1="W" u2="u" k="20" />
<hkern u1="W" u2="r" k="23" />
<hkern u1="W" u2="o" k="38" />
<hkern u1="W" u2="i" k="23" />
<hkern u1="W" u2="g" k="37" />
<hkern u1="W" u2="e" k="23" />
<hkern u1="W" u2="a" k="141" />
<hkern u1="W" u2="T" k="-60" />
<hkern u1="W" u2="S" k="7" />
<hkern u1="W" u2="O" k="21" />
<hkern u1="W" u2="G" k="21" />
<hkern u1="W" u2="C" k="15" />
<hkern u1="W" u2="A" k="172" />
<hkern u1="W" u2="&#x3b;" k="24" />
<hkern u1="W" u2="&#x3a;" k="22" />
<hkern u1="W" u2="&#x2e;" k="143" />
<hkern u1="W" u2="&#x2d;" k="31" />
<hkern u1="W" u2="&#x2c;" k="154" />
<hkern u1="X" u2="y" k="3" />
<hkern u1="X" u2="u" k="63" />
<hkern u1="X" u2="o" k="97" />
<hkern u1="X" u2="e" k="50" />
<hkern u1="X" u2="a" k="-10" />
<hkern u1="X" u2="Q" k="57" />
<hkern u1="X" u2="O" k="58" />
<hkern u1="X" u2="C" k="54" />
<hkern u1="X" u2="&#x2d;" k="118" />
<hkern u1="Y" u2="&#x2039;" k="163" />
<hkern u1="Y" u2="&#xf8;" k="57" />
<hkern u1="Y" u2="&#xe6;" k="215" />
<hkern u1="Y" u2="&#xd8;" k="31" />
<hkern u1="Y" u2="&#xab;" k="170" />
<hkern u1="Y" u2="v" k="-12" />
<hkern u1="Y" u2="u" k="43" />
<hkern u1="Y" u2="p" k="49" />
<hkern u1="Y" u2="o" k="80" />
<hkern u1="Y" u2="i" k="49" />
<hkern u1="Y" u2="g" k="78" />
<hkern u1="Y" u2="e" k="49" />
<hkern u1="Y" u2="a" k="204" />
<hkern u1="Y" u2="T" k="-67" />
<hkern u1="Y" u2="S" k="16" />
<hkern u1="Y" u2="O" k="39" />
<hkern u1="Y" u2="G" k="37" />
<hkern u1="Y" u2="C" k="34" />
<hkern u1="Y" u2="A" k="198" />
<hkern u1="Y" u2="&#x3b;" k="62" />
<hkern u1="Y" u2="&#x3a;" k="62" />
<hkern u1="Y" u2="&#x2e;" k="251" />
<hkern u1="Y" u2="&#x2d;" k="129" />
<hkern u1="Y" u2="&#x2c;" k="262" />
<hkern u1="Z" u2="y" k="-19" />
<hkern u1="Z" u2="v" k="-13" />
<hkern u1="a" u2="&#x2019;" k="143" />
<hkern u1="a" u2="y" k="144" />
<hkern u1="a" u2="w" k="104" />
<hkern u1="a" u2="v" k="121" />
<hkern u1="a" u2="j" k="-16" />
<hkern u1="b" u2="y" k="16" />
<hkern u1="b" u2="w" k="6" />
<hkern u1="b" u2="v" k="10" />
<hkern u1="c" u2="k" k="18" />
<hkern u1="c" u2="h" k="18" />
<hkern u1="e" u2="&#x2019;" k="14" />
<hkern u1="e" u2="y" k="-39" />
<hkern u1="e" u2="x" k="-42" />
<hkern u1="e" u2="w" k="-33" />
<hkern u1="e" u2="v" k="-33" />
<hkern u1="e" u2="t" k="-23" />
<hkern u1="f" u2="&#x2019;" k="-6" />
<hkern u1="f" u2="&#x153;" k="-9" />
<hkern u1="f" u2="&#xf8;" k="-33" />
<hkern u1="f" u2="&#xf6;" k="-9" />
<hkern u1="f" u2="&#xf3;" k="-9" />
<hkern u1="f" u2="&#xe9;" k="8" />
<hkern u1="f" u2="&#xe6;" k="98" />
<hkern u1="f" u2="&#xe5;" k="53" />
<hkern u1="f" u2="&#xe4;" k="53" />
<hkern u1="f" u2="&#xe1;" k="53" />
<hkern u1="f" u2="t" k="-44" />
<hkern u1="f" u2="s" k="-8" />
<hkern u1="f" u2="o" k="-9" />
<hkern u1="f" u2="l" k="8" />
<hkern u1="f" u2="j" k="1" />
<hkern u1="f" u2="i" k="8" />
<hkern u1="f" u2="f" k="8" />
<hkern u1="f" u2="e" k="8" />
<hkern u1="f" u2="a" k="53" />
<hkern u1="g" u2="&#xf6;" k="1" />
<hkern u1="g" u2="&#xf3;" k="1" />
<hkern u1="g" u2="&#xe9;" k="17" />
<hkern u1="g" u2="&#xe6;" k="20" />
<hkern u1="g" u2="&#xe5;" k="9" />
<hkern u1="g" u2="&#xe4;" k="9" />
<hkern u1="g" u2="r" k="16" />
<hkern u1="g" u2="l" k="16" />
<hkern u1="g" u2="e" k="16" />
<hkern u1="g" u2="a" k="9" />
<hkern u1="h" u2="&#x2019;" k="16" />
<hkern u1="h" u2="y" k="-16" />
<hkern u1="i" u2="j" k="7" />
<hkern u1="i" u2="T" k="231" />
<hkern u1="k" u2="&#xfc;" k="9" />
<hkern u1="k" u2="&#xf6;" k="44" />
<hkern u1="k" u2="&#xf3;" k="44" />
<hkern u1="k" u2="&#xe9;" k="-16" />
<hkern u1="k" u2="&#xe6;" k="-78" />
<hkern u1="k" u2="&#xe5;" k="-78" />
<hkern u1="k" u2="&#xe4;" k="-78" />
<hkern u1="k" u2="&#xe1;" k="-78" />
<hkern u1="k" u2="u" k="9" />
<hkern u1="k" u2="s" k="24" />
<hkern u1="k" u2="o" k="44" />
<hkern u1="k" u2="g" k="40" />
<hkern u1="k" u2="e" k="-16" />
<hkern u1="k" u2="a" k="-78" />
<hkern u1="k" u2="&#x2e;" k="-31" />
<hkern u1="k" u2="&#x2d;" k="109" />
<hkern u1="k" u2="&#x2c;" k="-20" />
<hkern u1="l" u2="y" k="151" />
<hkern u1="l" u2="v" k="122" />
<hkern u1="m" u2="y" k="-15" />
<hkern u1="m" u2="w" k="-9" />
<hkern u1="m" u2="v" k="-9" />
<hkern u1="m" u2="p" k="27" />
<hkern u1="n" u2="&#x2019;" k="15" />
<hkern u1="n" u2="y" k="-16" />
<hkern u1="n" u2="w" k="-11" />
<hkern u1="n" u2="v" k="-11" />
<hkern u1="n" u2="p" k="25" />
<hkern u1="n" u2="T" k="231" />
<hkern u1="o" u2="&#x2019;" k="13" />
<hkern u1="o" u2="y" k="15" />
<hkern u1="o" u2="x" k="32" />
<hkern u1="o" u2="w" k="2" />
<hkern u1="o" u2="v" k="6" />
<hkern u1="o" u2="t" k="-6" />
<hkern u1="o" u2="T" k="227" />
<hkern u1="p" u2="y" k="-6" />
<hkern u1="p" u2="t" k="-26" />
<hkern u1="q" u2="u" k="-9" />
<hkern u1="q" u2="c" k="-22" />
<hkern u1="r" u2="&#x2019;" k="15" />
<hkern u1="r" u2="&#x153;" k="12" />
<hkern u1="r" u2="&#xf8;" k="-18" />
<hkern u1="r" u2="&#xf6;" k="12" />
<hkern u1="r" u2="&#xf4;" k="12" />
<hkern u1="r" u2="&#xf3;" k="12" />
<hkern u1="r" u2="&#xf2;" k="12" />
<hkern u1="r" u2="&#xea;" k="22" />
<hkern u1="r" u2="&#xe9;" k="22" />
<hkern u1="r" u2="&#xe8;" k="22" />
<hkern u1="r" u2="&#xe7;" k="12" />
<hkern u1="r" u2="&#xe6;" k="-19" />
<hkern u1="r" u2="&#xe5;" k="-18" />
<hkern u1="r" u2="&#xe4;" k="-18" />
<hkern u1="r" u2="&#xe2;" k="-18" />
<hkern u1="r" u2="&#xe1;" k="-18" />
<hkern u1="r" u2="&#xe0;" k="-18" />
<hkern u1="r" u2="z" k="2" />
<hkern u1="r" u2="y" k="19" />
<hkern u1="r" u2="x" k="-28" />
<hkern u1="r" u2="w" k="5" />
<hkern u1="r" u2="v" k="9" />
<hkern u1="r" u2="u" k="30" />
<hkern u1="r" u2="t" k="-3" />
<hkern u1="r" u2="s" k="11" />
<hkern u1="r" u2="r" k="22" />
<hkern u1="r" u2="q" k="12" />
<hkern u1="r" u2="p" k="22" />
<hkern u1="r" u2="o" k="12" />
<hkern u1="r" u2="n" k="22" />
<hkern u1="r" u2="m" k="22" />
<hkern u1="r" u2="l" k="22" />
<hkern u1="r" u2="k" k="22" />
<hkern u1="r" u2="i" k="22" />
<hkern u1="r" u2="h" k="22" />
<hkern u1="r" u2="g" k="12" />
<hkern u1="r" u2="f" k="22" />
<hkern u1="r" u2="e" k="22" />
<hkern u1="r" u2="d" k="22" />
<hkern u1="r" u2="c" k="12" />
<hkern u1="r" u2="a" k="-18" />
<hkern u1="r" u2="&#x3b;" k="28" />
<hkern u1="r" u2="&#x3a;" k="21" />
<hkern u1="r" u2="&#x2e;" k="8" />
<hkern u1="r" u2="&#x2d;" k="-31" />
<hkern u1="r" u2="&#x2c;" k="19" />
<hkern u1="s" u2="&#x2019;" k="19" />
<hkern u1="s" u2="t" k="-12" />
<hkern u1="t" u2="&#x2019;" k="-15" />
<hkern u1="t" u2="&#xf6;" k="-5" />
<hkern u1="t" u2="&#xf3;" k="-5" />
<hkern u1="t" u2="&#xe6;" k="129" />
<hkern u1="t" u2="&#xe5;" k="130" />
<hkern u1="t" u2="&#xe4;" k="130" />
<hkern u1="t" u2="&#xe1;" k="130" />
<hkern u1="t" u2="o" k="-5" />
<hkern u1="t" u2="a" k="130" />
<hkern u1="t" u2="S" k="-23" />
<hkern u1="t" u2="&#x3b;" k="-9" />
<hkern u1="t" u2="&#x3a;" k="-15" />
<hkern u1="u" u2="&#x2019;" k="16" />
<hkern u1="v" u2="&#xf8;" k="-17" />
<hkern u1="v" u2="&#xf6;" k="6" />
<hkern u1="v" u2="&#xf3;" k="6" />
<hkern u1="v" u2="&#xf2;" k="6" />
<hkern u1="v" u2="&#xea;" k="-13" />
<hkern u1="v" u2="&#xe9;" k="-13" />
<hkern u1="v" u2="&#xe8;" k="-13" />
<hkern u1="v" u2="&#xe6;" k="137" />
<hkern u1="v" u2="&#xe5;" k="117" />
<hkern u1="v" u2="&#xe4;" k="117" />
<hkern u1="v" u2="&#xe3;" k="117" />
<hkern u1="v" u2="&#xe2;" k="117" />
<hkern u1="v" u2="&#xe1;" k="117" />
<hkern u1="v" u2="&#xe0;" k="117" />
<hkern u1="v" u2="s" k="-6" />
<hkern u1="v" u2="o" k="6" />
<hkern u1="v" u2="l" k="-13" />
<hkern u1="v" u2="g" k="5" />
<hkern u1="v" u2="e" k="-13" />
<hkern u1="v" u2="a" k="117" />
<hkern u1="v" u2="&#x3b;" k="-8" />
<hkern u1="v" u2="&#x3a;" k="-10" />
<hkern u1="v" u2="&#x2e;" k="129" />
<hkern u1="v" u2="&#x2d;" k="6" />
<hkern u1="v" u2="&#x2c;" k="139" />
<hkern u1="w" u2="&#xf8;" k="-19" />
<hkern u1="w" u2="&#xf6;" k="4" />
<hkern u1="w" u2="&#xf3;" k="4" />
<hkern u1="w" u2="&#xf2;" k="4" />
<hkern u1="w" u2="&#xea;" k="-10" />
<hkern u1="w" u2="&#xe9;" k="-10" />
<hkern u1="w" u2="&#xe8;" k="-10" />
<hkern u1="w" u2="&#xe6;" k="112" />
<hkern u1="w" u2="&#xe5;" k="106" />
<hkern u1="w" u2="&#xe4;" k="106" />
<hkern u1="w" u2="&#xe3;" k="106" />
<hkern u1="w" u2="&#xe2;" k="106" />
<hkern u1="w" u2="&#xe1;" k="106" />
<hkern u1="w" u2="&#xe0;" k="106" />
<hkern u1="w" u2="s" k="-7" />
<hkern u1="w" u2="o" k="4" />
<hkern u1="w" u2="l" k="-10" />
<hkern u1="w" u2="g" k="3" />
<hkern u1="w" u2="e" k="-10" />
<hkern u1="w" u2="a" k="106" />
<hkern u1="w" u2="&#x3b;" k="-8" />
<hkern u1="w" u2="&#x3a;" k="-11" />
<hkern u1="w" u2="&#x2e;" k="108" />
<hkern u1="w" u2="&#x2d;" k="-5" />
<hkern u1="w" u2="&#x2c;" k="119" />
<hkern u1="x" u2="&#xe9;" k="-16" />
<hkern u1="x" u2="q" k="29" />
<hkern u1="x" u2="o" k="29" />
<hkern u1="x" u2="e" k="-16" />
<hkern u1="x" u2="c" k="25" />
<hkern u1="x" u2="a" k="-78" />
<hkern u1="y" u2="&#xf8;" k="-7" />
<hkern u1="y" u2="&#xf6;" k="14" />
<hkern u1="y" u2="&#xf3;" k="14" />
<hkern u1="y" u2="&#xf2;" k="14" />
<hkern u1="y" u2="&#xea;" k="-15" />
<hkern u1="y" u2="&#xe9;" k="-15" />
<hkern u1="y" u2="&#xe8;" k="-15" />
<hkern u1="y" u2="&#xe6;" k="148" />
<hkern u1="y" u2="&#xe5;" k="138" />
<hkern u1="y" u2="&#xe4;" k="138" />
<hkern u1="y" u2="&#xe3;" k="138" />
<hkern u1="y" u2="&#xe2;" k="138" />
<hkern u1="y" u2="&#xe1;" k="138" />
<hkern u1="y" u2="&#xe0;" k="138" />
<hkern u1="y" u2="s" k="-2" />
<hkern u1="y" u2="o" k="14" />
<hkern u1="y" u2="l" k="-15" />
<hkern u1="y" u2="g" k="12" />
<hkern u1="y" u2="e" k="-15" />
<hkern u1="y" u2="c" k="10" />
<hkern u1="y" u2="a" k="138" />
<hkern u1="y" u2="&#x3b;" k="-3" />
<hkern u1="y" u2="&#x3a;" k="-2" />
<hkern u1="y" u2="&#x2e;" k="175" />
<hkern u1="y" u2="&#x2d;" k="69" />
<hkern u1="y" u2="&#x2c;" k="186" />
<hkern u1="&#xbb;" u2="Y" k="169" />
<hkern u1="&#xbb;" u2="W" k="84" />
<hkern u1="&#xbb;" u2="V" k="103" />
<hkern u1="&#xbb;" u2="T" k="232" />
<hkern u1="&#xbb;" u2="A" k="102" />
<hkern u1="&#xc7;" u2="A" k="2" />
<hkern u1="&#xd8;" u2="A" k="20" />
<hkern u1="&#xe0;" u2="y" k="144" />
<hkern u1="&#xe0;" u2="w" k="104" />
<hkern u1="&#xe0;" u2="v" k="121" />
<hkern u1="&#xe1;" u2="y" k="144" />
<hkern u1="&#xe1;" u2="w" k="104" />
<hkern u1="&#xe1;" u2="v" k="121" />
<hkern u1="&#xe4;" u2="y" k="144" />
<hkern u1="&#xe4;" u2="w" k="104" />
<hkern u1="&#xe4;" u2="v" k="121" />
<hkern u1="&#xe5;" u2="y" k="144" />
<hkern u1="&#xe5;" u2="w" k="104" />
<hkern u1="&#xe5;" u2="v" k="121" />
<hkern u1="&#xe6;" u2="y" k="-36" />
<hkern u1="&#xe6;" u2="w" k="-31" />
<hkern u1="&#xe6;" u2="v" k="-31" />
<hkern u1="&#xe9;" u2="y" k="-39" />
<hkern u1="&#xe9;" u2="w" k="-33" />
<hkern u1="&#xe9;" u2="v" k="-33" />
<hkern u1="&#xea;" u2="y" k="-39" />
<hkern u1="&#xea;" u2="w" k="-33" />
<hkern u1="&#xea;" u2="v" k="-33" />
<hkern u1="&#xf2;" u2="y" k="15" />
<hkern u1="&#xf2;" u2="w" k="2" />
<hkern u1="&#xf2;" u2="v" k="6" />
<hkern u1="&#xf3;" u2="y" k="15" />
<hkern u1="&#xf3;" u2="w" k="2" />
<hkern u1="&#xf3;" u2="v" k="6" />
<hkern u1="&#xf4;" u2="t" k="-6" />
<hkern u1="&#xf6;" u2="y" k="15" />
<hkern u1="&#xf6;" u2="x" k="32" />
<hkern u1="&#xf6;" u2="w" k="2" />
<hkern u1="&#xf6;" u2="v" k="6" />
<hkern u1="&#xf6;" u2="t" k="-6" />
<hkern u1="&#x2018;" u2="Y" k="-31" />
<hkern u1="&#x2018;" u2="W" k="-25" />
<hkern u1="&#x2018;" u2="V" k="-25" />
<hkern u1="&#x2018;" u2="T" k="-16" />
<hkern u1="&#x2018;" u2="A" k="184" />
<hkern u1="&#x2019;" u2="y" k="-31" />
<hkern u1="&#x2019;" u2="w" k="-26" />
<hkern u1="&#x2019;" u2="v" k="-26" />
<hkern u1="&#x2019;" u2="t" k="-16" />
<hkern u1="&#x2019;" u2="s" k="10" />
<hkern u1="&#x2019;" u2="r" k="19" />
<hkern u1="&#x2019;" u2="o" k="20" />
<hkern u1="&#x2019;" u2="d" k="19" />
<hkern u1="&#x2019;" u2="A" k="180" />
<hkern u1="&#x2019;" u2="&#x2e;" k="84" />
<hkern u1="&#x2019;" u2="&#x2c;" k="94" />
<hkern u1="&#x201c;" u2="Y" k="-31" />
<hkern u1="&#x201c;" u2="W" k="-25" />
<hkern u1="&#x201c;" u2="V" k="-25" />
<hkern u1="&#x201c;" u2="T" k="-16" />
<hkern u1="&#x201c;" u2="A" k="186" />
<hkern u1="&#x201d;" u2="Y" k="-31" />
<hkern u1="&#x201d;" u2="W" k="-25" />
<hkern u1="&#x201d;" u2="V" k="-25" />
<hkern u1="&#x201d;" u2="T" k="-16" />
<hkern u1="&#x201d;" u2="A" k="181" />
<hkern u1="&#x201e;" u2="Y" k="242" />
<hkern u1="&#x201e;" u2="W" k="134" />
<hkern u1="&#x201e;" u2="V" k="162" />
<hkern u1="&#x201e;" u2="T" k="226" />
<hkern u1="&#x201e;" u2="A" k="7" />
<hkern u1="&#x203a;" u2="Y" k="169" />
<hkern u1="&#x203a;" u2="W" k="84" />
<hkern u1="&#x203a;" u2="V" k="103" />
<hkern u1="&#x203a;" u2="T" k="232" />
<hkern u1="&#x203a;" u2="A" k="102" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,397 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<metadata></metadata>
<defs>
<font id="orbitronregular" horiz-adv-x="1695" >
<font-face units-per-em="2048" ascent="1536" descent="-512" />
<missing-glyph horiz-adv-x="557" />
<glyph horiz-adv-x="0" />
<glyph unicode="&#xd;" horiz-adv-x="681" />
<glyph unicode=" " horiz-adv-x="557" />
<glyph unicode="&#x09;" horiz-adv-x="557" />
<glyph unicode="&#xa0;" horiz-adv-x="557" />
<glyph unicode="!" horiz-adv-x="450" d="M119 0v168h168v-168h-168zM119 416v1059h168v-1059h-168z" />
<glyph unicode="&#x22;" horiz-adv-x="761" d="M121 1188v287h168v-287h-168zM438 1188v287h168v-287h-168z" />
<glyph unicode="#" horiz-adv-x="1632" d="M66 350v168h260l145 451h-340v168h393l115 336h166l-117 -336h535l114 336h166l-117 -336h197v-168h-248l-145 -451h326v-168h-379l-109 -350h-168l111 350h-533l-108 -350h-168l110 350h-206zM494 518h530l145 451h-532z" />
<glyph unicode="$" horiz-adv-x="1613" d="M70 248v59h168v-59q0 -33 23.5 -56.5t55.5 -23.5h414v487h-414q-102 0 -174.5 72t-72.5 176v324q0 104 72.5 177t174.5 73h414v233h168v-233h412q104 0 177 -73t73 -177v-58h-170v58q0 33 -24 56.5t-56 23.5h-412v-484h412q104 0 177 -72.5t73 -175.5v-327 q0 -102 -73 -175t-177 -73h-412v-233h-168v233h-414q-102 0 -174.5 72.5t-72.5 175.5zM238 903q0 -33 23.5 -56.5t55.5 -23.5h414v484h-414q-33 0 -56 -23.5t-23 -56.5v-324zM899 168h412q33 0 56.5 23.5t23.5 56.5v327q0 33 -23.5 56.5t-56.5 23.5h-412v-487z" />
<glyph unicode="%" horiz-adv-x="1978" d="M98 1053v172q0 104 73 177t177 73h193q104 0 177 -73t73 -177v-172q0 -102 -73 -175t-177 -73h-193q-104 0 -177 72.5t-73 175.5zM223 1010q0 -33 23.5 -56.5t56.5 -23.5h283q33 0 56.5 23.5t23.5 56.5v258q0 33 -24 56.5t-56 23.5h-283q-33 0 -56.5 -24t-23.5 -56v-258z M281 0v221l1491 1256v-220zM1219 246v174q0 102 71.5 175t175.5 73h195q102 0 175 -73t73 -175v-174q0 -102 -73 -175t-175 -73h-195q-104 0 -175.5 72.5t-71.5 175.5zM1343 203q0 -33 23.5 -56.5t56.5 -23.5h281q33 0 56.5 23.5t23.5 56.5v260q0 33 -23.5 56.5t-56.5 23.5 h-281q-33 0 -56.5 -23.5t-23.5 -56.5v-260z" />
<glyph unicode="&#x26;" horiz-adv-x="1921" d="M109 248v440q0 45 55 89t147 44q-117 88 -116 197v205q0 104 72.5 177t174.5 73h842q84 0 154.5 -62.5t95.5 -146.5v-113h-170v70q0 33 -23.5 56t-56.5 23h-842q-33 0 -56.5 -23.5t-23.5 -55.5v-285l1068 -539v285h167v-340l275 -162v-147l-281 157q-35 -86 -99.5 -138 t-141.5 -52h-994q-102 0 -174.5 72.5t-72.5 175.5zM276 248q0 -33 23.5 -56.5t56.5 -23.5h994q23 0 45 20.5t37 53.5l-1045 526h-31q-33 0 -56.5 -23.5t-23.5 -56.5v-440z" />
<glyph unicode="'" horiz-adv-x="458" d="M121 1188v287h168v-287h-168z" />
<glyph unicode="(" horiz-adv-x="567" d="M106 248v977q0 104 73 177t175 73h60v-170h-60q-33 0 -56.5 -24t-23.5 -56v-977q0 -33 23.5 -56.5t56.5 -23.5h60v-168h-60q-102 0 -175 72.5t-73 175.5z" />
<glyph unicode=")" horiz-adv-x="569" d="M115 0v168h57q33 0 56.5 23.5t23.5 56.5v977q0 33 -23.5 56.5t-56.5 23.5h-57v170h57q102 0 176 -73t74 -177v-977q0 -102 -74 -175t-176 -73h-57z" />
<glyph unicode="*" horiz-adv-x="1005" d="M51 1096l49 161l301 -100v316h168v-314l297 98l56 -161l-299 -97l184 -256q-25 -18 -67 -48.5t-68 -49.5l-187 252l-184 -252q-31 23 -74 52.5t-63 43.5l184 258z" />
<glyph unicode="+" horiz-adv-x="886" d="M35 522v168h311v314h168v-314h320v-168h-320v-317h-168v317h-311z" />
<glyph unicode="," horiz-adv-x="395" d="M111 168h168v-201q0 -82 -47.5 -146.5t-120.5 -88.5v436z" />
<glyph unicode="-" horiz-adv-x="1058" d="M121 522v168h799v-168h-799z" />
<glyph unicode="." horiz-adv-x="438" d="M111 0v168h168v-168h-168z" />
<glyph unicode="/" horiz-adv-x="1067" d="M12 0v217l1037 1258v-213z" />
<glyph unicode="0" horiz-adv-x="1708" d="M117 248v977q0 104 72 177t176 73h993q102 0 175 -73t73 -177v-977q0 -102 -73 -175t-175 -73h-993q-104 0 -176 72.5t-72 175.5zM285 371l1130 934h-1050q-33 0 -56.5 -24t-23.5 -56v-854zM305 168h1053q33 0 56.5 23.5t23.5 56.5v854z" />
<glyph unicode="1" horiz-adv-x="800" d="M2 1014l387 461h229v-1475h-169v1286q-29 -37 -114 -137t-114 -135h-219z" />
<glyph unicode="2" horiz-adv-x="1699" d="M117 0v553q0 104 71.5 176t176.5 72h993q33 0 56.5 23.5t23.5 56.5v346q0 33 -23.5 56.5t-56.5 23.5h-993q-33 0 -56.5 -23.5t-23.5 -56.5v-58h-168v58q0 104 72 177t176 73h993q102 0 175 -73t73 -177v-346q0 -102 -73 -175t-175 -73h-993q-33 0 -56.5 -23.5 t-23.5 -56.5v-305q0 -33 23.5 -56.5t56.5 -23.5h1241v-168h-1489z" />
<glyph unicode="3" horiz-adv-x="1691" d="M109 248v33h170v-33q0 -33 23.5 -56.5t55.5 -23.5h994q33 0 56.5 23.5t23.5 56.5v342q0 33 -24 56.5t-56 23.5h-961v168h895q33 0 56.5 23.5t23.5 56.5v309q0 33 -23.5 56.5t-56.5 23.5h-928q-33 0 -56 -23.5t-23 -56.5v-53h-170v53q0 104 72.5 177t176.5 73h928 q104 0 176 -73t72 -177v-309q0 -54 -25 -107l9 -37q82 -76 81 -184v-342q0 -102 -72.5 -175t-174.5 -73h-994q-104 0 -176.5 72.5t-72.5 175.5z" />
<glyph unicode="4" horiz-adv-x="1495" d="M12 381v188l1008 908h188v-928h230v-168h-230v-381h-168v381h-1028zM227 549h813v659z" />
<glyph unicode="5" horiz-adv-x="1699" d="M117 248v59h168v-59q0 -33 23.5 -56.5t56.5 -23.5h993q33 0 56.5 23.5t23.5 56.5v348q0 33 -23.5 56.5t-56.5 23.5h-1241v801h1489v-170h-1241q-33 0 -56.5 -23.5t-23.5 -56.5v-301q0 -33 23.5 -57.5t56.5 -24.5h993q102 0 175 -72t73 -176v-348q0 -102 -73 -175 t-175 -73h-993q-104 0 -176 72.5t-72 175.5z" />
<glyph unicode="6" horiz-adv-x="1679" d="M117 248v979q0 104 71.5 177t176.5 73h983v-170h-983q-33 0 -56.5 -23.5t-23.5 -56.5v-295q0 -33 23.5 -57.5t56.5 -24.5h993q102 0 175 -71.5t73 -176.5v-354q0 -102 -73 -175t-175 -73h-993q-104 0 -176 72.5t-72 175.5zM285 248q0 -33 23.5 -56.5t56.5 -23.5h993 q33 0 56.5 23.5t23.5 56.5v354q0 33 -23.5 56.5t-56.5 23.5h-1073v-434z" />
<glyph unicode="7" horiz-adv-x="1351" d="M6 1307v170h983q102 0 175 -73t73 -177v-1227h-168v1227q0 33 -23.5 56.5t-56.5 23.5h-983z" />
<glyph unicode="8" horiz-adv-x="1708" d="M117 248v348q0 84 61 164q-61 84 -61 166v301q0 104 71.5 177t176.5 73h993q82 0 152.5 -62.5t95.5 -146.5v-342q0 -82 -62 -166q61 -80 62 -164v-348q0 -102 -73 -175t-175 -73h-993q-104 0 -176 72.5t-72 175.5zM285 248q0 -33 23.5 -56.5t56.5 -23.5h993 q33 0 56.5 23.5t23.5 56.5v348q0 33 -23.5 56.5t-56.5 23.5h-993q-33 0 -56.5 -23.5t-23.5 -56.5v-348zM285 901q0 -33 23.5 -56.5t56.5 -23.5h993q33 0 56.5 23.5t23.5 56.5v324q0 33 -23.5 56.5t-56.5 23.5h-993q-33 0 -56.5 -24t-23.5 -56v-324z" />
<glyph unicode="9" d="M104 872v355q0 104 73 177t177 73h994q102 0 174.5 -73t72.5 -177v-979q0 -102 -72.5 -175t-174.5 -73h-994q-80 0 -145.5 47t-89.5 121h1229q33 0 56 23.5t23 56.5v297q0 33 -23 56.5t-56 23.5h-994q-104 0 -177 72.5t-73 174.5zM274 872q0 -33 24 -56t56 -23h1073v434 q0 33 -23.5 56.5t-55.5 23.5h-994q-33 0 -56.5 -23.5t-23.5 -56.5v-355z" />
<glyph unicode=":" horiz-adv-x="438" d="M111 0v168h168v-168h-168zM111 1036v168h168v-168h-168z" />
<glyph unicode=";" horiz-adv-x="395" d="M104 168h168v-201q0 -82 -47 -146.5t-121 -88.5v436zM104 1036v168h168v-168h-168z" />
<glyph unicode="&#x3c;" horiz-adv-x="968" d="M10 508v199l824 473v-195l-656 -379l656 -379v-194z" />
<glyph unicode="=" horiz-adv-x="1306" d="M121 309v168h1059v-168h-1059zM121 719v168h1059v-168h-1059z" />
<glyph unicode="&#x3e;" horiz-adv-x="972" d="M121 29v194l655 379l-655 379v195l823 -474v-198z" />
<glyph unicode="?" horiz-adv-x="1388" d="M63 1303v172l1059 -2q102 0 175 -73t73 -177v-398q0 -102 -72.5 -174.5t-175.5 -72.5h-561q-33 0 -56.5 -24t-23.5 -56v-86h-168v86q0 104 73 175.5t175 71.5h561q33 0 56.5 24t23.5 56v398q0 33 -23.5 56.5t-56.5 23.5h-1059zM313 0v168h168v-168h-168z" />
<glyph unicode="@" horiz-adv-x="1701" d="M117 248v977q0 104 71.5 177t176.5 73h993q102 0 175 -73t73 -177v-832h-842q-104 0 -176 73t-72 177v172q0 102 72 175t176 73h194q102 0 175 -72.5t73 -175.5v-295h232v705q0 33 -23.5 56.5t-56.5 23.5h-993q-33 0 -56.5 -24t-23.5 -56v-977q0 -33 23.5 -56.5 t56.5 -23.5h1241v-168h-1241q-104 0 -176 72.5t-72 175.5zM641 600q0 -33 23.5 -56.5t56.5 -23.5h360v338q0 33 -23.5 56.5t-56.5 23.5h-280q-33 0 -56.5 -23.5t-23.5 -56.5v-258z" />
<glyph unicode="A" horiz-adv-x="1712" d="M119 0v1229q0 102 72 174t174 72h983q102 0 173.5 -72t71.5 -174v-1229h-166v539h-1142v-539h-166zM285 705h1142v524q0 33 -23.5 56.5t-55.5 23.5h-983q-33 0 -56.5 -23.5t-23.5 -56.5v-524z" />
<glyph unicode="B" horiz-adv-x="1703" d="M121 0v1475h1165q102 0 174 -72t72 -174v-314q0 -55 -27 -108l8 -35q82 -76 82 -182v-344q0 -102 -71.5 -174t-173.5 -72h-1229zM287 246q0 -33 23.5 -56.5t56.5 -23.5h983q33 0 56.5 23.5t23.5 56.5v344q0 33 -24 56.5t-56 23.5h-983q-33 0 -56.5 -23.5t-23.5 -56.5 v-344zM287 915q0 -33 23.5 -56t56.5 -23h919q33 0 55.5 23.5t22.5 55.5v314q0 33 -22.5 56.5t-55.5 23.5h-919q-33 0 -56.5 -23.5t-23.5 -56.5v-314z" />
<glyph unicode="C" horiz-adv-x="1683" d="M115 246v983q0 102 71.5 174t173.5 72h1225v-166h-1225q-33 0 -56 -23.5t-23 -56.5v-983q0 -33 23.5 -56.5t55.5 -23.5h1225v-166h-1225q-102 0 -173.5 71.5t-71.5 174.5z" />
<glyph unicode="D" horiz-adv-x="1708" d="M119 0v1475h1229q102 0 173.5 -72t71.5 -174v-983q0 -102 -71.5 -174t-173.5 -72h-1229zM285 246q0 -33 23.5 -56.5t56.5 -23.5h983q33 0 56 23.5t23 56.5v983q0 33 -23.5 56.5t-55.5 23.5h-983q-33 0 -56.5 -23.5t-23.5 -56.5v-983z" />
<glyph unicode="E" horiz-adv-x="1568" d="M119 0v1475h1345v-166h-1179v-488h948v-168h-948v-487h1179v-166h-1345z" />
<glyph unicode="F" horiz-adv-x="1480" d="M119 0v1475h1345v-166h-1179v-488h948v-168h-948v-653h-166z" />
<glyph unicode="G" horiz-adv-x="1699" d="M115 246v983q0 102 71.5 174t173.5 72h983q102 0 174 -72t72 -174v-60h-166v60q0 33 -23.5 56.5t-56.5 23.5h-983q-33 0 -56 -23.5t-23 -56.5v-983q0 -33 23.5 -56.5t55.5 -23.5h983q33 0 56.5 23.5t23.5 56.5v364h-364v168h530v-532q0 -102 -71.5 -174t-174.5 -72h-983 q-102 0 -173.5 71.5t-71.5 174.5z" />
<glyph unicode="H" horiz-adv-x="1742" d="M117 0v1475h166v-654h1177v654h168v-1475h-168v653h-1177v-653h-166z" />
<glyph unicode="I" horiz-adv-x="450" d="M117 0v1475h166v-1475h-166z" />
<glyph unicode="J" horiz-adv-x="1597" d="M8 246v116h166v-116q0 -33 23.5 -56.5t56.5 -23.5h983q33 0 56.5 23.5t23.5 56.5v1229h166v-1229q0 -102 -72 -174t-174 -72h-983q-102 0 -174 71.5t-72 174.5z" />
<glyph unicode="K" horiz-adv-x="1632" d="M117 0v1475h168v-654h475l549 654h213l-617 -738l619 -737h-215l-549 653h-475v-653h-168z" />
<glyph unicode="L" horiz-adv-x="1595" d="M117 0v1477h166v-1311h1308v-166h-1474z" />
<glyph unicode="M" horiz-adv-x="1900" d="M115 0v1475h227l612 -730l613 730h227v-1475h-166v1286l-674 -801l-673 801v-1286h-166z" />
<glyph unicode="N" horiz-adv-x="1703" d="M115 0v1475h227l1081 -1287v1287h166v-1475h-227l-1081 1286v-1286h-166z" />
<glyph unicode="O" d="M111 246v983q0 102 71.5 174t173.5 72h983q102 0 174 -72t72 -174v-983q0 -102 -71.5 -174t-174.5 -72h-983q-102 0 -173.5 71.5t-71.5 174.5zM276 246q0 -33 23.5 -56.5t56.5 -23.5h983q33 0 56.5 23.5t23.5 56.5v983q0 33 -23.5 56.5t-56.5 23.5h-983 q-33 0 -56.5 -23.5t-23.5 -56.5v-983z" />
<glyph unicode="P" horiz-adv-x="1619" d="M115 0v1473h1228q102 0 174 -72t72 -174v-432q0 -102 -71.5 -174t-174.5 -72h-983q-18 0 -79 8v-557h-166zM281 795q0 -33 23.5 -55.5t55.5 -22.5h983q33 0 56.5 22.5t23.5 55.5v432q0 33 -23.5 56.5t-56.5 23.5h-983q-33 0 -56 -23.5t-23 -56.5v-432z" />
<glyph unicode="Q" horiz-adv-x="1810" d="M111 246v983q0 102 71.5 174t173.5 72h983q102 0 174 -72t72 -174v-983q0 -19 -8 -80h201v-166h-1422q-102 0 -173.5 71.5t-71.5 174.5zM276 246q0 -33 23.5 -56.5t56.5 -23.5h983q33 0 56.5 23.5t23.5 56.5v983q0 33 -23.5 56.5t-56.5 23.5h-983q-33 0 -56.5 -23.5 t-23.5 -56.5v-983z" />
<glyph unicode="R" horiz-adv-x="1689" d="M113 0v1473h1228q102 0 174 -72t72 -174v-432q0 -102 -71.5 -174t-174.5 -72h-225l463 -549h-219l-461 549h-541q-18 0 -79 8v-557h-166zM279 795q0 -33 23 -55.5t56 -22.5h983q33 0 55.5 22.5t22.5 55.5v432q0 33 -22.5 56.5t-55.5 23.5h-983q-33 0 -56 -23.5t-23 -56.5 v-432z" />
<glyph unicode="S" horiz-adv-x="1683" d="M104 246v57h166v-57q0 -33 23.5 -56.5t56.5 -23.5h983q33 0 56.5 23.5t23.5 56.5v329q0 33 -23.5 55.5t-56.5 22.5h-983q-102 0 -174 72t-72 174v330q0 102 72 174t174 72h983q102 0 174 -72t72 -174v-58h-166v58q0 33 -23.5 56.5t-56.5 23.5h-983q-33 0 -56.5 -23.5 t-23.5 -56.5v-330q0 -33 23.5 -55.5t56.5 -22.5h983q102 0 174 -71.5t72 -174.5v-329q0 -102 -71.5 -174t-174.5 -72h-983q-102 0 -174 71.5t-72 174.5z" />
<glyph unicode="T" horiz-adv-x="1554" d="M41 1309v166h1475v-166h-654v-1309h-166v1309h-655z" />
<glyph unicode="U" d="M111 246v1229h165v-1229q0 -33 24 -56.5t56 -23.5h983q33 0 56.5 23.5t23.5 56.5v1229h166v-1229q0 -102 -71.5 -174t-174.5 -72h-983q-102 0 -173.5 71.5t-71.5 174.5z" />
<glyph unicode="V" horiz-adv-x="2054" d="M72 1475h194l756 -1313l754 1313h194l-852 -1475h-192z" />
<glyph unicode="W" horiz-adv-x="2414" d="M72 1475h176l432 -1184l430 1184h201l432 -1184l428 1184h180l-536 -1475h-146l-459 1260l-458 -1260h-144z" />
<glyph unicode="X" horiz-adv-x="1662" d="M94 0l619 737l-619 738h213l514 -609l512 609h213l-618 -738l620 -737h-215l-512 608l-514 -608h-213z" />
<glyph unicode="Y" horiz-adv-x="1650" d="M35 1475h190l572 -721l565 721h194l-677 -920v-555h-166v555z" />
<glyph unicode="Z" horiz-adv-x="1681" d="M104 0v227l1287 1082h-1287v166h1475v-228l-1286 -1081h1286v-166h-1475z" />
<glyph unicode="[" horiz-adv-x="563" d="M111 0v1477h307v-170h-139v-1139h139v-168h-307z" />
<glyph unicode="\" horiz-adv-x="1064" d="M10 1272v213l1037 -1266v-217z" />
<glyph unicode="]" horiz-adv-x="565" d="M104 0v168h138v1139h-138v170h308v-1477h-308z" />
<glyph unicode="_" d="M111 0h1491v-168h-1491v168z" />
<glyph unicode="`" horiz-adv-x="436" d="M66 2071h165l70 -285h-164z" />
<glyph unicode="a" horiz-adv-x="1421" d="M106 248v430h1041v262q0 33 -23.5 56.5t-56.5 23.5h-961v168h961q104 0 177 -73t73 -175v-940h-963q-102 0 -175 72.5t-73 175.5zM274 248q0 -33 24 -56.5t56 -23.5h793v342h-873v-262z" />
<glyph unicode="b" horiz-adv-x="1366" d="M111 0v1577h168v-389h794q102 0 175 -73t73 -175v-692q0 -102 -72.5 -175t-175.5 -73h-962zM279 248q0 -33 24.5 -56.5t56.5 -23.5h713q33 0 56.5 23.5t23.5 56.5v692q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -57 -23.5t-24 -56.5v-692z" />
<glyph unicode="c" horiz-adv-x="1423" d="M104 248v692q0 102 73 175t175 73h959v-168h-959q-33 0 -56.5 -23.5t-23.5 -56.5v-692q0 -33 23.5 -56.5t56.5 -23.5h963v-168h-963q-102 0 -175 72.5t-73 175.5z" />
<glyph unicode="d" horiz-adv-x="1366" d="M47 248v692q0 102 73 175t177 73h793v389h167v-1577h-960q-104 0 -177 72.5t-73 175.5zM217 248q0 -33 23.5 -56.5t56.5 -23.5h713q33 0 56.5 23.5t23.5 56.5v692q0 33 -24 56.5t-56 23.5h-713q-33 0 -56.5 -23.5t-23.5 -56.5v-692z" />
<glyph unicode="e" horiz-adv-x="1417" d="M104 248v692q0 102 73 175t175 73h713q104 0 177 -73t73 -175v-430h-1043v-262q0 -33 23.5 -56.5t56.5 -23.5h963v-168h-963q-102 0 -175 72.5t-73 175.5zM272 678h873v262q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -56.5 -23.5t-23.5 -56.5v-262z" />
<glyph unicode="f" horiz-adv-x="833" d="M109 0v1329q0 104 71.5 176t175.5 72h435v-168h-435q-33 0 -56.5 -23.5t-23.5 -56.5v-141h515v-168h-515v-1020h-167z" />
<glyph unicode="g" horiz-adv-x="1398" d="M84 248v692q0 102 72.5 175t175.5 73h712q104 0 176 -73t72 -175v-1159q0 -104 -71.5 -177t-176.5 -73h-741v170h741q33 0 56.5 23.5t23.5 56.5v219h-792q-102 0 -175 72.5t-73 175.5zM252 248q0 -33 23.5 -56.5t56.5 -23.5h712q33 0 56.5 23.5t23.5 56.5v692 q0 33 -23.5 56.5t-56.5 23.5h-712q-33 0 -56.5 -23.5t-23.5 -56.5v-692z" />
<glyph unicode="h" horiz-adv-x="1368" d="M111 0v1577h168v-389h794q102 0 175 -73t73 -175v-940h-168v940q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -57 -23.5t-24 -56.5v-940h-168z" />
<glyph unicode="i" horiz-adv-x="425" d="M106 0v1188h168v-1188h-168zM106 1409v168h168v-168h-168z" />
<glyph unicode="j" horiz-adv-x="489" d="M-383 -328h502q33 0 56.5 23.5t23.5 56.5v1436h170v-1436q0 -104 -73 -177t-177 -73h-502v170zM199 1409v168h170v-168h-170z" />
<glyph unicode="k" horiz-adv-x="1323" d="M111 0v1577h168v-899h327l467 510h221l-538 -594l536 -594h-219l-467 510h-327v-510h-168z" />
<glyph unicode="l" horiz-adv-x="618" d="M106 248v1329h168v-1329q0 -33 24 -56.5t56 -23.5h201v-168h-201q-102 0 -175 72.5t-73 175.5z" />
<glyph unicode="m" horiz-adv-x="2002" d="M111 0v1188h1568q104 0 176 -73t72 -175v-940h-166v940q0 33 -24.5 56.5t-57.5 23.5h-493q-33 0 -56.5 -23.5t-23.5 -56.5v-940h-170v940q0 33 -23.5 56.5t-56.5 23.5h-496q-33 0 -56 -23.5t-23 -56.5v-940h-170z" />
<glyph unicode="n" horiz-adv-x="1425" d="M111 0v1188h962q102 0 175 -73t73 -175v-940h-168v940q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -57 -23.5t-24 -56.5v-940h-168z" />
<glyph unicode="o" horiz-adv-x="1417" d="M104 248v692q0 102 73 175t175 73h713q104 0 177 -73t73 -175v-692q0 -102 -73 -175t-177 -73h-713q-102 0 -175 72.5t-73 175.5zM272 248q0 -33 23.5 -56.5t56.5 -23.5h713q33 0 56.5 23.5t23.5 56.5v692q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -56.5 -23.5 t-23.5 -56.5v-692z" />
<glyph unicode="p" horiz-adv-x="1359" d="M111 -471v1659h962q102 0 175 -73t73 -175v-692q0 -102 -72.5 -175t-175.5 -73h-794v-471h-168zM279 248q0 -33 24.5 -56.5t56.5 -23.5h713q33 0 56.5 23.5t23.5 56.5v692q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -57 -23.5t-24 -56.5v-692z" />
<glyph unicode="q" horiz-adv-x="1359" d="M41 248v692q0 102 72.5 175t177.5 73h960v-1659h-168v471h-792q-104 0 -177 72.5t-73 175.5zM211 248q0 -33 23.5 -56.5t56.5 -23.5h713q33 0 56 23.5t23 56.5v692q0 33 -23.5 56.5t-55.5 23.5h-713q-33 0 -56.5 -23.5t-23.5 -56.5v-692z" />
<glyph unicode="r" horiz-adv-x="1048" d="M106 0v940q0 102 73 175t175 73h668v-168h-668q-33 0 -56.5 -23.5t-23.5 -56.5v-940h-168z" />
<glyph unicode="s" horiz-adv-x="1404" d="M98 248v16h168v-16q0 -33 23.5 -56.5t56.5 -23.5h713q33 0 56.5 23.5t23.5 56.5v182q0 33 -23.5 56.5t-56.5 23.5h-713q-102 0 -175 72.5t-73 175.5v182q0 102 73 175t175 73h713q104 0 177 -73t73 -175v-16h-170v16q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -56.5 -23.5 t-23.5 -56.5v-182q0 -33 23.5 -56.5t56.5 -23.5h713q104 0 177 -73t73 -175v-182q0 -102 -73 -175t-177 -73h-713q-102 0 -175 72.5t-73 175.5z" />
<glyph unicode="t" horiz-adv-x="839" d="M109 248v1329h167v-389h515v-168h-515v-772q0 -33 24 -56.5t56 -23.5h435v-168h-435q-104 0 -175.5 72.5t-71.5 175.5z" />
<glyph unicode="u" horiz-adv-x="1423" d="M109 248v940h167v-940q0 -33 24 -56.5t56 -23.5h713q33 0 57.5 23.5t24.5 56.5v940h168v-940q0 -102 -72.5 -175t-177.5 -73h-713q-102 0 -174.5 72.5t-72.5 175.5z" />
<glyph unicode="v" horiz-adv-x="1617" d="M43 1188h197l557 -1024l557 1024h196l-657 -1188h-195z" />
<glyph unicode="w" horiz-adv-x="2193" d="M72 1188h180l360 -885l383 885h222l407 -883l336 883h182l-448 -1188h-146l-442 981l-420 -981h-147z" />
<glyph unicode="x" horiz-adv-x="1417" d="M94 0l496 604l-496 584h221l385 -451l387 451h220l-496 -584l498 -604h-222l-387 475l-385 -475h-221z" />
<glyph unicode="y" horiz-adv-x="1402" d="M86 248v936h168v-936q0 -33 23.5 -56.5t56.5 -23.5h713q33 0 56 23.5t23 56.5v936h168v-1405q0 -104 -71.5 -177t-175.5 -73h-742v170h742q33 0 56 23.5t23 56.5v221h-792q-102 0 -175 72.5t-73 175.5z" />
<glyph unicode="z" horiz-adv-x="1429" d="M111 0v229l1026 791h-1026v168h1210v-230l-1026 -790h1026v-168h-1210z" />
<glyph unicode="{" horiz-adv-x="591" d="M47 641v197l96 51v336q0 104 73 177t175 73h60v-170h-60q-33 0 -56.5 -24t-23.5 -56v-351l-172 -137l172 -141v-348q0 -33 23.5 -56.5t56.5 -23.5h60v-168h-60q-102 0 -175 72.5t-73 175.5v334q-12 8 -47 29.5t-49 29.5z" />
<glyph unicode="|" horiz-adv-x="438" d="M111 -236v1960h168v-1960h-168z" />
<glyph unicode="}" horiz-adv-x="591" d="M104 0v168h60q33 0 56.5 23.5t23.5 56.5v346l172 141l-172 135v355q0 33 -23.5 56.5t-56.5 23.5h-60v170h60q102 0 175 -73t73 -177v-336q16 -8 51 -29.5t43 -25.5v-195l-94 -59v-332q0 -102 -73 -175t-175 -73h-60z" />
<glyph unicode="~" horiz-adv-x="827" d="M49 631v76q55 18 127 18q82 0 219 -68.5t209 -76.5h4q66 0 135 32v-84q-72 -27 -135 -26q-72 0 -209 72.5t-223 72.5q-80 0 -127 -16z" />
<glyph unicode="&#xa1;" horiz-adv-x="430" d="M109 0v1059h167v-1059h-167zM109 1321v170h167v-170h-167z" />
<glyph unicode="&#xa2;" horiz-adv-x="1302" d="M68 248v713q0 104 71.5 176.5t175.5 72.5h273v277h168v-277h516v-170h-516v-872h516v-168h-516v-236h-168v236h-273q-104 0 -175.5 72.5t-71.5 175.5zM236 248q0 -33 23.5 -56.5t55.5 -23.5h273v872h-273q-33 0 -56 -23.5t-23 -55.5v-713z" />
<glyph unicode="&#xa3;" horiz-adv-x="1503" d="M80 0v168h215v494h-215v167h215v396q0 104 72.5 177t177.5 73h620q104 0 177 -73t73 -177v-31h-170v31q0 33 -23.5 56.5t-56.5 23.5h-620q-33 0 -56.5 -24t-23.5 -56v-396h721v-167h-721v-494h950v-168h-1335z" />
<glyph unicode="&#xa8;" horiz-adv-x="788" d="M111 1786v168h170v-168h-170zM479 1786v168h168v-168h-168z" />
<glyph unicode="&#xad;" horiz-adv-x="1058" d="M121 522v168h799v-168h-799z" />
<glyph unicode="&#xb0;" horiz-adv-x="899" d="M92 1069v172q0 104 73 177t177 73h193q104 0 176.5 -72.5t72.5 -177.5v-172q0 -102 -72.5 -175t-176.5 -73h-193q-104 0 -177 73t-73 175zM217 1026q0 -33 23.5 -56.5t56.5 -23.5h283q33 0 56 23.5t23 56.5v258q0 33 -23.5 56.5t-55.5 23.5h-283q-33 0 -56.5 -23.5 t-23.5 -56.5v-258z" />
<glyph unicode="&#xb4;" horiz-adv-x="436" d="M68 1786l71 285h162l-70 -285h-163z" />
<glyph unicode="&#xb6;" horiz-adv-x="1705" d="M115 803v436q0 104 71.5 177t175.5 73h1242v-1489h-168v555h-283v-555h-168v555h-623q-104 0 -175.5 72.5t-71.5 175.5zM283 803q0 -33 23.5 -56.5t55.5 -23.5h623v596h-623q-33 0 -56 -23.5t-23 -56.5v-436zM1153 723h283v596h-283v-596z" />
<glyph unicode="&#xb8;" horiz-adv-x="436" d="M68 -350l71 284h162l-70 -284h-163z" />
<glyph unicode="&#xbf;" horiz-adv-x="1382" d="M39 248v397q0 104 71.5 177t176.5 73h559q33 0 56.5 23.5t23.5 56.5v98h168v-98q0 -104 -72 -177t-176 -73h-559q-33 0 -56.5 -23.5t-23.5 -56.5v-397q0 -33 23.5 -56.5t56.5 -23.5h1040q0 -59 4 -105.5t8 -62.5l4 -16l-1056 16q-104 0 -176 72.5t-72 175.5zM926 1321 v170h168v-170h-168z" />
<glyph unicode="&#xc0;" horiz-adv-x="1712" d="M119 0v1229q0 102 72 174t174 72h983q102 0 173.5 -72t71.5 -174v-1229h-166v539h-1142v-539h-166zM285 705h1142v524q0 33 -23.5 56.5t-55.5 23.5h-983q-33 0 -56.5 -23.5t-23.5 -56.5v-524zM705 2056h165l70 -284h-164z" />
<glyph unicode="&#xc1;" horiz-adv-x="1712" d="M119 0v1229q0 102 72 174t174 72h983q102 0 173.5 -72t71.5 -174v-1229h-166v539h-1142v-539h-166zM285 705h1142v524q0 33 -23.5 56.5t-55.5 23.5h-983q-33 0 -56.5 -23.5t-23.5 -56.5v-524zM705 1769l71 285h162l-70 -285h-163z" />
<glyph unicode="&#xc2;" horiz-adv-x="1712" d="M119 0v1229q0 102 72 174t174 72h983q102 0 173.5 -72t71.5 -174v-1229h-166v539h-1142v-539h-166zM285 705h1142v524q0 33 -23.5 56.5t-55.5 23.5h-983q-33 0 -56.5 -23.5t-23.5 -56.5v-524zM606 1769l146 240h120l146 -240h-86l-119 175l-123 -175h-84z" />
<glyph unicode="&#xc3;" horiz-adv-x="1712" d="M119 0v1229q0 102 72 174t174 72h983q102 0 173.5 -72t71.5 -174v-1229h-166v539h-1142v-539h-166zM285 705h1142v524q0 33 -23.5 56.5t-55.5 23.5h-983q-33 0 -56.5 -23.5t-23.5 -56.5v-524zM496 1911v96q55 18 127 18q82 0 219 -68.5t209 -78.5h4q61 0 135 35v-105 q-78 -29 -135 -28q-72 0 -209 73.5t-223 73.5q-80 0 -127 -16z" />
<glyph unicode="&#xc4;" horiz-adv-x="1712" d="M119 0v1229q0 102 72 174t174 72h983q102 0 173.5 -72t71.5 -174v-1229h-166v539h-1142v-539h-166zM285 705h1142v524q0 33 -23.5 56.5t-55.5 23.5h-983q-33 0 -56.5 -23.5t-23.5 -56.5v-524zM571 1751v168h170v-168h-170zM940 1751v168h168v-168h-168z" />
<glyph unicode="&#xc5;" horiz-adv-x="1712" d="M119 0v1229q0 102 72 174t174 72h983q102 0 173.5 -72t71.5 -174v-1229h-166v539h-1142v-539h-166zM285 705h1142v524q0 33 -23.5 56.5t-55.5 23.5h-983q-33 0 -56.5 -23.5t-23.5 -56.5v-524zM688 1790v111q0 45 33 76.5t78 31.5h114q45 0 78 -31.5t33 -76.5v-111 q0 -45 -33 -77t-78 -32h-114q-45 0 -78 32t-33 77zM770 1784q0 -21 18 -21h136q18 0 18 21v123q0 20 -18 20h-136q-18 0 -18 -20v-123z" />
<glyph unicode="&#xc6;" horiz-adv-x="2816" d="M111 0v1229q0 102 71.5 174t173.5 72h2409v-166h-1180v-488h948v-168h-948v-487h1180v-166h-1346v539h-1143v-539h-165zM276 705h1143v524q0 33 -23.5 56.5t-56.5 23.5h-983q-33 0 -56.5 -23.5t-23.5 -56.5v-524z" />
<glyph unicode="&#xc7;" horiz-adv-x="1683" d="M115 246v983q0 102 71.5 174t173.5 72h1225v-166h-1225q-33 0 -56 -23.5t-23 -56.5v-983q0 -33 23.5 -56.5t55.5 -23.5h1225v-166h-661l-70 -285h-164l72 285h-402q-102 0 -173.5 71.5t-71.5 174.5z" />
<glyph unicode="&#xc8;" horiz-adv-x="1568" d="M119 0v1475h1345v-166h-1179v-488h948v-168h-948v-487h1179v-166h-1345zM633 2056h166l69 -284h-163z" />
<glyph unicode="&#xc9;" horiz-adv-x="1568" d="M119 0v1475h1345v-166h-1179v-488h948v-168h-948v-487h1179v-166h-1345zM633 1772l72 284h161l-69 -284h-164z" />
<glyph unicode="&#xca;" horiz-adv-x="1568" d="M119 0v1475h1345v-166h-1179v-488h948v-168h-948v-487h1179v-166h-1345zM535 1769l145 240h121l145 -240h-86l-119 175l-123 -175h-83z" />
<glyph unicode="&#xcb;" horiz-adv-x="1568" d="M119 0v1475h1345v-166h-1179v-488h948v-168h-948v-487h1179v-166h-1345zM500 1772v167h170v-167h-170zM868 1772v167h168v-167h-168z" />
<glyph unicode="&#xcc;" horiz-adv-x="450" d="M74 2056h166l69 -284h-164zM117 0v1475h166v-1475h-166z" />
<glyph unicode="&#xcd;" horiz-adv-x="450" d="M74 1772l71 284h162l-69 -284h-164zM117 0v1475h166v-1475h-166z" />
<glyph unicode="&#xce;" horiz-adv-x="450" d="M-25 1769l146 240h121l145 -240h-86l-119 175l-123 -175h-84zM117 0v1475h166v-1475h-166z" />
<glyph unicode="&#xcf;" horiz-adv-x="450" d="M-59 1772v167h170v-167h-170zM117 0v1475h166v-1475h-166zM309 1772v167h168v-167h-168z" />
<glyph unicode="&#xd1;" horiz-adv-x="1703" d="M115 0v1475h227l1081 -1287v1287h166v-1475h-227l-1081 1286v-1286h-166zM492 1911v96q55 18 126 18q82 0 219.5 -68.5t209.5 -78.5h4q61 0 135 35v-105q-78 -29 -135 -28q-72 0 -209 73.5t-224 73.5q-80 0 -126 -16z" />
<glyph unicode="&#xd2;" d="M111 246v983q0 102 71.5 174t173.5 72h983q102 0 174 -72t72 -174v-983q0 -102 -71.5 -174t-174.5 -72h-983q-102 0 -173.5 71.5t-71.5 174.5zM276 246q0 -33 23.5 -56.5t56.5 -23.5h983q33 0 56.5 23.5t23.5 56.5v983q0 33 -23.5 56.5t-56.5 23.5h-983 q-33 0 -56.5 -23.5t-23.5 -56.5v-983zM696 2056h166l70 -284h-164z" />
<glyph unicode="&#xd3;" d="M111 246v983q0 102 71.5 174t173.5 72h983q102 0 174 -72t72 -174v-983q0 -102 -71.5 -174t-174.5 -72h-983q-102 0 -173.5 71.5t-71.5 174.5zM276 246q0 -33 23.5 -56.5t56.5 -23.5h983q33 0 56.5 23.5t23.5 56.5v983q0 33 -23.5 56.5t-56.5 23.5h-983 q-33 0 -56.5 -23.5t-23.5 -56.5v-983zM696 1772l72 284h162l-70 -284h-164z" />
<glyph unicode="&#xd4;" d="M111 246v983q0 102 71.5 174t173.5 72h983q102 0 174 -72t72 -174v-983q0 -102 -71.5 -174t-174.5 -72h-983q-102 0 -173.5 71.5t-71.5 174.5zM276 246q0 -33 23.5 -56.5t56.5 -23.5h983q33 0 56.5 23.5t23.5 56.5v983q0 33 -23.5 56.5t-56.5 23.5h-983 q-33 0 -56.5 -23.5t-23.5 -56.5v-983zM598 1769l145 240h121l146 -240h-86l-119 175l-123 -175h-84z" />
<glyph unicode="&#xd5;" d="M111 246v983q0 102 71.5 174t173.5 72h983q102 0 174 -72t72 -174v-983q0 -102 -71.5 -174t-174.5 -72h-983q-102 0 -173.5 71.5t-71.5 174.5zM276 246q0 -33 23.5 -56.5t56.5 -23.5h983q33 0 56.5 23.5t23.5 56.5v983q0 33 -23.5 56.5t-56.5 23.5h-983 q-33 0 -56.5 -23.5t-23.5 -56.5v-983zM487 1911v96q55 18 127 18q82 0 219 -68.5t209 -78.5h5q61 0 135 35v-105q-78 -29 -135 -28q-72 0 -209.5 73.5t-223.5 73.5q-80 0 -127 -16z" />
<glyph unicode="&#xd6;" d="M111 246v983q0 102 71.5 174t173.5 72h983q102 0 174 -72t72 -174v-983q0 -102 -71.5 -174t-174.5 -72h-983q-102 0 -173.5 71.5t-71.5 174.5zM276 246q0 -33 23.5 -56.5t56.5 -23.5h983q33 0 56.5 23.5t23.5 56.5v983q0 33 -23.5 56.5t-56.5 23.5h-983 q-33 0 -56.5 -23.5t-23.5 -56.5v-983zM563 1772v167h170v-167h-170zM932 1772v167h168v-167h-168z" />
<glyph unicode="&#xd7;" horiz-adv-x="1118" d="M109 1036h221l215 -295l217 295h217l-324 -420l324 -421h-217l-217 294l-215 -294h-219l323 421z" />
<glyph unicode="&#xd9;" d="M111 246v1229h165v-1229q0 -33 24 -56.5t56 -23.5h983q33 0 56.5 23.5t23.5 56.5v1229h166v-1229q0 -102 -71.5 -174t-174.5 -72h-983q-102 0 -173.5 71.5t-71.5 174.5zM696 2056h166l70 -284h-164z" />
<glyph unicode="&#xda;" d="M111 246v1229h165v-1229q0 -33 24 -56.5t56 -23.5h983q33 0 56.5 23.5t23.5 56.5v1229h166v-1229q0 -102 -71.5 -174t-174.5 -72h-983q-102 0 -173.5 71.5t-71.5 174.5zM696 1772l72 284h162l-70 -284h-164z" />
<glyph unicode="&#xdb;" d="M111 246v1229h165v-1229q0 -33 24 -56.5t56 -23.5h983q33 0 56.5 23.5t23.5 56.5v1229h166v-1229q0 -102 -71.5 -174t-174.5 -72h-983q-102 0 -173.5 71.5t-71.5 174.5zM598 1769l145 240h121l146 -240h-86l-119 175l-123 -175h-84z" />
<glyph unicode="&#xdc;" d="M111 246v1229h165v-1229q0 -33 24 -56.5t56 -23.5h983q33 0 56.5 23.5t23.5 56.5v1229h166v-1229q0 -102 -71.5 -174t-174.5 -72h-983q-102 0 -173.5 71.5t-71.5 174.5zM563 1772v167h170v-167h-170zM932 1772v167h168v-167h-168z" />
<glyph unicode="&#xdd;" horiz-adv-x="1650" d="M35 1475h190l572 -721l565 721h194l-677 -920v-555h-166v555zM674 1772l71 284h162l-69 -284h-164z" />
<glyph unicode="&#xdf;" horiz-adv-x="1705" d="M117 0v1241q0 104 71.5 177t176.5 73h993q82 0 152.5 -62.5t95.5 -146.5v-350q0 -82 -62 -166q61 -80 62 -164v-354q0 -102 -73 -175t-175 -73h-776v168h776q33 0 56.5 23.5t23.5 56.5v354q0 33 -23.5 56.5t-56.5 23.5h-776v145h776q33 0 56.5 23.5t23.5 56.5v332 q0 33 -23.5 56.5t-56.5 23.5h-993q-33 0 -56.5 -23.5t-23.5 -56.5v-1239h-168z" />
<glyph unicode="&#xe0;" horiz-adv-x="1484" d="M106 248v430h1041v262q0 33 -23.5 56.5t-56.5 23.5h-961v168h961q104 0 177 -73t73 -175v-940h-963q-102 0 -175 72.5t-73 175.5zM274 248q0 -33 24 -56.5t56 -23.5h793v342h-873v-262zM590 1847h166l69 -284h-163z" />
<glyph unicode="&#xe1;" horiz-adv-x="1484" d="M106 248v430h1041v262q0 33 -23.5 56.5t-56.5 23.5h-961v168h961q104 0 177 -73t73 -175v-940h-963q-102 0 -175 72.5t-73 175.5zM274 248q0 -33 24 -56.5t56 -23.5h793v342h-873v-262zM590 1563l72 284h161l-69 -284h-164z" />
<glyph unicode="&#xe2;" horiz-adv-x="1484" d="M106 248v430h1041v262q0 33 -23.5 56.5t-56.5 23.5h-961v168h961q104 0 177 -73t73 -175v-940h-963q-102 0 -175 72.5t-73 175.5zM274 248q0 -33 24 -56.5t56 -23.5h793v342h-873v-262zM492 1563l145 239h121l145 -239h-86l-119 174l-123 -174h-83z" />
<glyph unicode="&#xe3;" horiz-adv-x="1484" d="M106 248v430h1041v262q0 33 -23.5 56.5t-56.5 23.5h-961v168h961q104 0 177 -73t73 -175v-940h-963q-102 0 -175 72.5t-73 175.5zM274 248q0 -33 24 -56.5t56 -23.5h793v342h-873v-262zM381 1700v96q55 18 127 19q82 0 219 -69t209 -79h4q61 0 135 35v-105 q-78 -29 -135 -28q-72 0 -209 73.5t-223 73.5q-80 0 -127 -16z" />
<glyph unicode="&#xe4;" horiz-adv-x="1484" d="M106 248v430h1041v262q0 33 -23.5 56.5t-56.5 23.5h-961v168h961q104 0 177 -73t73 -175v-940h-963q-102 0 -175 72.5t-73 175.5zM274 248q0 -33 24 -56.5t56 -23.5h793v342h-873v-262zM457 1563v168h170v-168h-170zM825 1563v168h168v-168h-168z" />
<glyph unicode="&#xe5;" horiz-adv-x="1484" d="M106 248v430h1041v262q0 33 -23.5 56.5t-56.5 23.5h-961v168h961q104 0 177 -73t73 -175v-940h-963q-102 0 -175 72.5t-73 175.5zM274 248q0 -33 24 -56.5t56 -23.5h793v342h-873v-262zM573 1579v111q0 45 33 76.5t78 31.5h115q45 0 77.5 -31.5t32.5 -76.5v-111 q0 -45 -32.5 -77t-77.5 -32h-115q-45 0 -78 32t-33 77zM655 1573q1 -21 19 -21h135q18 0 18 21v123q0 20 -18 20h-135q-18 0 -19 -20v-123z" />
<glyph unicode="&#xe6;" horiz-adv-x="2412" d="M109 248v430h1040v262q0 33 -23.5 56.5t-56.5 23.5h-960v168h2000q104 0 176 -73t72 -175v-430h-1040v-270q2 -31 25.5 -51.5t54.5 -20.5h960v-168h-2001q-104 0 -175.5 72.5t-71.5 175.5zM276 248q0 -33 24 -56.5t56 -23.5h793v342h-873v-262zM1317 678h872v262 q0 33 -23.5 56.5t-56.5 23.5h-712q-33 0 -56.5 -23.5t-23.5 -56.5v-262z" />
<glyph unicode="&#xe7;" horiz-adv-x="1419" d="M104 248v692q0 102 73 175t175 73h959v-168h-959q-33 0 -56.5 -23.5t-23.5 -56.5v-692q0 -33 23.5 -56.5t56.5 -23.5h963v-168h-524l-70 -285h-164l72 285h-277q-102 0 -175 72.5t-73 175.5z" />
<glyph unicode="&#xe8;" horiz-adv-x="1306" d="M104 248v692q0 102 73 175t175 73h713q104 0 177 -73t73 -175v-430h-1043v-262q0 -33 23.5 -56.5t56.5 -23.5h963v-168h-963q-102 0 -175 72.5t-73 175.5zM272 678h873v262q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -56.5 -23.5t-23.5 -56.5v-262zM502 1847h166l69 -284 h-164z" />
<glyph unicode="&#xe9;" horiz-adv-x="1306" d="M104 248v692q0 102 73 175t175 73h713q104 0 177 -73t73 -175v-430h-1043v-262q0 -33 23.5 -56.5t56.5 -23.5h963v-168h-963q-102 0 -175 72.5t-73 175.5zM272 678h873v262q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -56.5 -23.5t-23.5 -56.5v-262zM502 1565l71 284h162 l-69 -284h-164z" />
<glyph unicode="&#xea;" horiz-adv-x="1306" d="M104 248v692q0 102 73 175t175 73h713q104 0 177 -73t73 -175v-430h-1043v-262q0 -33 23.5 -56.5t56.5 -23.5h963v-168h-963q-102 0 -175 72.5t-73 175.5zM272 678h873v262q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -56.5 -23.5t-23.5 -56.5v-262zM403 1563l146 239h121 l145 -239h-86l-119 174l-123 -174h-84z" />
<glyph unicode="&#xeb;" horiz-adv-x="1306" d="M104 248v692q0 102 73 175t175 73h713q104 0 177 -73t73 -175v-430h-1043v-262q0 -33 23.5 -56.5t56.5 -23.5h963v-168h-963q-102 0 -175 72.5t-73 175.5zM272 678h873v262q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -56.5 -23.5t-23.5 -56.5v-262zM369 1563v168h170v-168 h-170zM737 1563v168h168v-168h-168z" />
<glyph unicode="&#xec;" horiz-adv-x="438" d="M33 1849h166l69 -284h-164zM115 0v1188h168v-1188h-168z" />
<glyph unicode="&#xed;" horiz-adv-x="438" d="M100 1563l72 284h162l-70 -284h-164zM104 0v1188h168v-1188h-168z" />
<glyph unicode="&#xee;" horiz-adv-x="438" d="M-31 1563l146 239h121l145 -239h-86l-119 174l-123 -174h-84zM104 0v1188h168v-1188h-168z" />
<glyph unicode="&#xef;" horiz-adv-x="438" d="M-66 1567v168h170v-168h-170zM113 0v1188h168v-1188h-168zM303 1567v168h168v-168h-168z" />
<glyph unicode="&#xf1;" horiz-adv-x="1449" d="M111 0v1188h962q102 0 175 -73t73 -175v-940h-168v940q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -57 -23.5t-24 -56.5v-940h-168zM365 1698v96q55 18 127 18q82 0 219 -68.5t209 -78.5h4q61 0 135 35v-105q-78 -29 -135 -28q-72 0 -209 73.5t-223 73.5q-80 0 -127 -16z " />
<glyph unicode="&#xf2;" horiz-adv-x="1417" d="M104 248v692q0 102 73 175t175 73h713q104 0 177 -73t73 -175v-692q0 -102 -73 -175t-177 -73h-713q-102 0 -175 72.5t-73 175.5zM272 248q0 -33 23.5 -56.5t56.5 -23.5h713q33 0 56.5 23.5t23.5 56.5v692q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -56.5 -23.5 t-23.5 -56.5v-692zM557 1849h166l70 -284h-164z" />
<glyph unicode="&#xf3;" horiz-adv-x="1417" d="M104 248v692q0 102 73 175t175 73h713q104 0 177 -73t73 -175v-692q0 -102 -73 -175t-177 -73h-713q-102 0 -175 72.5t-73 175.5zM272 248q0 -33 23.5 -56.5t56.5 -23.5h713q33 0 56.5 23.5t23.5 56.5v692q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -56.5 -23.5 t-23.5 -56.5v-692zM557 1565l72 284h162l-70 -284h-164z" />
<glyph unicode="&#xf4;" horiz-adv-x="1417" d="M104 248v692q0 102 73 175t175 73h713q104 0 177 -73t73 -175v-692q0 -102 -73 -175t-177 -73h-713q-102 0 -175 72.5t-73 175.5zM272 248q0 -33 23.5 -56.5t56.5 -23.5h713q33 0 56.5 23.5t23.5 56.5v692q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -56.5 -23.5 t-23.5 -56.5v-692zM459 1563l145 239h121l145 -239h-86l-118 174l-123 -174h-84z" />
<glyph unicode="&#xf5;" horiz-adv-x="1417" d="M104 248v692q0 102 73 175t175 73h713q104 0 177 -73t73 -175v-692q0 -102 -73 -175t-177 -73h-713q-102 0 -175 72.5t-73 175.5zM272 248q0 -33 23.5 -56.5t56.5 -23.5h713q33 0 56.5 23.5t23.5 56.5v692q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -56.5 -23.5 t-23.5 -56.5v-692zM348 1698v96q55 18 127 18q82 0 219 -68.5t209 -78.5h4q61 0 135 35v-105q-78 -29 -135 -28q-72 0 -209 73.5t-223 73.5q-80 0 -127 -16z" />
<glyph unicode="&#xf6;" horiz-adv-x="1417" d="M104 248v692q0 102 73 175t175 73h713q104 0 177 -73t73 -175v-692q0 -102 -73 -175t-177 -73h-713q-102 0 -175 72.5t-73 175.5zM272 248q0 -33 23.5 -56.5t56.5 -23.5h713q33 0 56.5 23.5t23.5 56.5v692q0 33 -23.5 56.5t-56.5 23.5h-713q-33 0 -56.5 -23.5 t-23.5 -56.5v-692zM424 1567v168h170v-168h-170zM793 1567v168h168v-168h-168z" />
<glyph unicode="&#xf7;" horiz-adv-x="1040" d="M37 522v168h971v-168h-971zM440 2v168h168v-168h-168zM440 1018v168h168v-168h-168z" />
<glyph unicode="&#xf9;" horiz-adv-x="1423" d="M109 248v940h167v-940q0 -33 24 -56.5t56 -23.5h713q33 0 57.5 23.5t24.5 56.5v940h168v-940q0 -102 -72.5 -175t-177.5 -73h-713q-102 0 -174.5 72.5t-72.5 175.5zM559 1849h166l70 -284h-164z" />
<glyph unicode="&#xfa;" horiz-adv-x="1423" d="M109 248v940h167v-940q0 -33 24 -56.5t56 -23.5h713q33 0 57.5 23.5t24.5 56.5v940h168v-940q0 -102 -72.5 -175t-177.5 -73h-713q-102 0 -174.5 72.5t-72.5 175.5zM559 1565l72 284h162l-70 -284h-164z" />
<glyph unicode="&#xfb;" horiz-adv-x="1423" d="M109 248v940h167v-940q0 -33 24 -56.5t56 -23.5h713q33 0 57.5 23.5t24.5 56.5v940h168v-940q0 -102 -72.5 -175t-177.5 -73h-713q-102 0 -174.5 72.5t-72.5 175.5zM461 1565l145 239h121l145 -239h-86l-118 174l-123 -174h-84z" />
<glyph unicode="&#xfc;" horiz-adv-x="1423" d="M109 248v940h167v-940q0 -33 24 -56.5t56 -23.5h713q33 0 57.5 23.5t24.5 56.5v940h168v-940q0 -102 -72.5 -175t-177.5 -73h-713q-102 0 -174.5 72.5t-72.5 175.5zM426 1563v168h170v-168h-170zM795 1563v168h168v-168h-168z" />
<glyph unicode="&#xfd;" horiz-adv-x="1409" d="M86 248v936h168v-936q0 -33 23.5 -56.5t56.5 -23.5h713q33 0 56 23.5t23 56.5v936h168v-1405q0 -104 -71.5 -177t-175.5 -73h-742v170h742q33 0 56 23.5t23 56.5v221h-792q-102 0 -175 72.5t-73 175.5zM553 1565l72 284h161l-69 -284h-164z" />
<glyph unicode="&#xff;" horiz-adv-x="1409" d="M86 248v936h168v-936q0 -33 23.5 -56.5t56.5 -23.5h713q33 0 56 23.5t23 56.5v936h168v-1405q0 -104 -71.5 -177t-175.5 -73h-742v170h742q33 0 56 23.5t23 56.5v221h-792q-102 0 -175 72.5t-73 175.5zM420 1567v168h170v-168h-170zM788 1567v168h168v-168h-168z" />
<glyph unicode="&#x152;" horiz-adv-x="2813" d="M109 246v983q0 102 71.5 174t173.5 72h2409v-166h-1180v-488h948v-168h-948v-487h1180v-166h-2409q-102 0 -173.5 71.5t-71.5 174.5zM274 246q0 -33 24 -56.5t56 -23.5h983q33 0 56.5 23.5t23.5 56.5v983q0 33 -23.5 56.5t-56.5 23.5h-983q-33 0 -56.5 -23.5t-23.5 -56.5 v-983z" />
<glyph unicode="&#x153;" horiz-adv-x="2410" d="M106 248v692q0 102 72 175t176 73h1753q104 0 176 -73t72 -175v-430h-1040v-262q0 -33 23.5 -56.5t56.5 -23.5h960v-168h-2001q-104 0 -176 72.5t-72 175.5zM274 248q0 -33 24 -56.5t56 -23.5h713q33 0 56.5 23.5t23.5 56.5v692q0 33 -23.5 56.5t-56.5 23.5h-713 q-33 0 -56.5 -23.5t-23.5 -56.5v-692zM1315 678h872v262q0 33 -23.5 56.5t-56.5 23.5h-712q-33 0 -56.5 -23.5t-23.5 -56.5v-262z" />
<glyph unicode="&#x178;" horiz-adv-x="1650" d="M35 1475h190l572 -721l565 721h194l-677 -920v-555h-166v555zM541 1772v167h170v-167h-170zM909 1772v167h168v-167h-168z" />
<glyph unicode="&#x2c6;" horiz-adv-x="614" d="M57 1784l146 239h121l145 -239h-86l-119 174l-123 -174h-84z" />
<glyph unicode="&#x2dc;" horiz-adv-x="825" d="M47 1925v96q55 18 127 19q82 0 219 -69t209 -79h4q61 0 135 35v-104q-78 -29 -135 -29q-72 0 -209 74t-223 74q-80 0 -127 -17z" />
<glyph unicode="&#x2000;" horiz-adv-x="1035" />
<glyph unicode="&#x2001;" horiz-adv-x="2071" />
<glyph unicode="&#x2002;" horiz-adv-x="1035" />
<glyph unicode="&#x2003;" horiz-adv-x="2071" />
<glyph unicode="&#x2004;" horiz-adv-x="690" />
<glyph unicode="&#x2005;" horiz-adv-x="517" />
<glyph unicode="&#x2006;" horiz-adv-x="345" />
<glyph unicode="&#x2007;" horiz-adv-x="345" />
<glyph unicode="&#x2008;" horiz-adv-x="258" />
<glyph unicode="&#x2009;" horiz-adv-x="414" />
<glyph unicode="&#x200a;" horiz-adv-x="115" />
<glyph unicode="&#x2010;" horiz-adv-x="1058" d="M121 522v168h799v-168h-799z" />
<glyph unicode="&#x2011;" horiz-adv-x="1058" d="M121 522v168h799v-168h-799z" />
<glyph unicode="&#x2012;" horiz-adv-x="1058" d="M121 522v168h799v-168h-799z" />
<glyph unicode="&#x2013;" horiz-adv-x="1449" d="M111 520v168h1230v-168h-1230z" />
<glyph unicode="&#x2014;" horiz-adv-x="1683" d="M111 520v168h1476v-168h-1476z" />
<glyph unicode="&#x2018;" horiz-adv-x="344" d="M68 1030v201q0 82 47 147.5t123 87.5v-436h-170z" />
<glyph unicode="&#x2019;" horiz-adv-x="339" d="M111 1040v437h168v-201q0 -82 -47.5 -147.5t-120.5 -88.5z" />
<glyph unicode="&#x201c;" horiz-adv-x="743" d="M96 1028v201q0 82 47 147.5t123 87.5v-436h-170zM467 1028v201q0 82 46 147.5t122 87.5v-436h-168z" />
<glyph unicode="&#x201d;" horiz-adv-x="743" d="M111 1040v437h170v-201q0 -82 -47.5 -147.5t-122.5 -88.5zM481 1040v437h168v-201q0 -82 -47 -147.5t-121 -88.5z" />
<glyph unicode="&#x2022;" horiz-adv-x="759" d="M295 723v43q0 59 57 59h51q59 0 60 -59v-43q0 -57 -60 -57h-51q-57 0 -57 57z" />
<glyph unicode="&#x2026;" horiz-adv-x="1175" d="M111 0v168h168v-168h-168zM498 0v168h168v-168h-168zM883 0v168h170v-168h-170z" />
<glyph unicode="&#x202f;" horiz-adv-x="414" />
<glyph unicode="&#x205f;" horiz-adv-x="517" />
<glyph unicode="&#x20ac;" horiz-adv-x="1636" d="M72 471v168h215v211h-215v170h215v207q0 104 72.5 177t177.5 73h1022v-170h-1022q-33 0 -56.5 -23.5t-23.5 -56.5v-207h868v-170h-868v-211h868v-168h-868v-223q0 -33 23.5 -56.5t56.5 -23.5h1022v-168h-1022q-104 0 -177 72.5t-73 175.5v223h-215z" />
<glyph unicode="&#x25fc;" horiz-adv-x="1187" d="M0 0v1188h1188v-1188h-1188z" />
<hkern u1="&#x3f;" u2="v" k="2" />
<hkern u1="A" u2="Y" k="27" />
<hkern u1="A" u2="W" k="63" />
<hkern u1="B" u2="Y" k="63" />
<hkern u1="B" u2="V" k="100" />
<hkern u1="D" u2="Z" k="55" />
<hkern u1="D" u2="V" k="59" />
<hkern u1="E" u2="O" k="63" />
<hkern u1="E" u2="M" k="59" />
<hkern u1="F" u2="y" k="41" />
<hkern u1="F" u2="T" k="-20" />
<hkern u1="F" u2="R" k="-10" />
<hkern u1="F" u2="J" k="492" />
<hkern u1="G" u2="W" k="55" />
<hkern u1="K" u2="H" k="59" />
<hkern u1="K" u2="A" k="61" />
<hkern u1="L" u2="Y" k="367" />
<hkern u1="L" u2="W" k="264" />
<hkern u1="L" u2="V" k="473" />
<hkern u1="M" u2="c" k="20" />
<hkern u1="O" u2="X" k="80" />
<hkern u1="O" u2="W" k="55" />
<hkern u1="O" u2="V" k="55" />
<hkern u1="P" u2="v" k="-2" />
<hkern u1="P" u2="d" k="-20" />
<hkern u1="P" u2="J" k="383" />
<hkern u1="P" u2="A" k="-20" />
<hkern u1="R" u2="W" k="39" />
<hkern u1="R" u2="V" k="39" />
<hkern u1="S" u2="Y" k="20" />
<hkern u1="S" u2="W" k="51" />
<hkern u1="S" u2="N" k="39" />
<hkern u1="T" u2="z" k="211" />
<hkern u1="T" u2="y" k="186" />
<hkern u1="T" u2="w" k="170" />
<hkern u1="T" u2="u" k="207" />
<hkern u1="T" u2="s" k="248" />
<hkern u1="T" u2="o" k="252" />
<hkern u1="V" u2="s" k="82" />
<hkern u1="V" u2="o" k="61" />
<hkern u1="V" u2="S" k="41" />
<hkern u1="V" u2="O" k="68" />
<hkern u1="V" u2="A" k="76" />
<hkern u1="W" u2="u" k="41" />
<hkern u1="W" u2="o" k="51" />
<hkern u1="W" u2="i" k="20" />
<hkern u1="W" u2="e" k="72" />
<hkern u1="W" u2="a" k="31" />
<hkern u1="W" u2="O" k="47" />
<hkern u1="W" u2="A" k="55" />
<hkern u1="X" u2="B" k="72" />
<hkern u1="Y" u2="u" k="199" />
<hkern u1="Y" u2="s" k="240" />
<hkern u1="Y" u2="p" k="203" />
<hkern u1="Y" u2="o" k="244" />
<hkern u1="Y" u2="i" k="39" />
<hkern u1="Y" u2="e" k="244" />
<hkern u1="Y" u2="a" k="199" />
<hkern u1="Y" u2="S" k="72" />
<hkern u1="Z" u2="Y" k="20" />
<hkern u1="a" u2="z" k="51" />
<hkern u1="a" u2="x" k="31" />
<hkern u1="a" u2="w" k="61" />
<hkern u1="a" u2="v" k="41" />
<hkern u1="a" u2="s" k="41" />
<hkern u1="a" u2="r" k="10" />
<hkern u1="a" u2="n" k="31" />
<hkern u1="a" u2="m" k="41" />
<hkern u1="a" u2="l" k="20" />
<hkern u1="a" u2="c" k="20" />
<hkern u1="a" u2="b" k="51" />
<hkern u1="b" u2="d" k="-61" />
<hkern u1="c" u2="z" k="41" />
<hkern u1="c" u2="u" k="41" />
<hkern u1="c" u2="t" k="51" />
<hkern u1="c" u2="k" k="41" />
<hkern u1="c" u2="h" k="31" />
<hkern u1="c" u2="e" k="51" />
<hkern u1="d" u2="u" k="47" />
<hkern u1="d" u2="o" k="45" />
<hkern u1="d" u2="e" k="41" />
<hkern u1="e" u2="x" k="35" />
<hkern u1="e" u2="w" k="61" />
<hkern u1="e" u2="v" k="41" />
<hkern u1="e" u2="r" k="10" />
<hkern u1="e" u2="l" k="41" />
<hkern u1="e" u2="e" k="31" />
<hkern u1="e" u2="c" k="41" />
<hkern u1="f" u2="u" k="-20" />
<hkern u1="f" u2="t" k="-10" />
<hkern u1="f" u2="&#x2c;" k="371" />
<hkern u1="g" u2="w" k="41" />
<hkern u1="g" u2="u" k="51" />
<hkern u1="g" u2="s" k="43" />
<hkern u1="g" u2="r" k="31" />
<hkern u1="g" u2="o" k="41" />
<hkern u1="g" u2="e" k="31" />
<hkern u1="g" u2="c" k="31" />
<hkern u1="g" u2="a" k="31" />
<hkern u1="h" u2="i" k="-10" />
<hkern u1="h" u2="f" k="-20" />
<hkern u1="h" u2="a" k="-10" />
<hkern u1="i" u2="x" k="84" />
<hkern u1="i" u2="v" k="10" />
<hkern u1="i" u2="q" k="31" />
<hkern u1="i" u2="p" k="51" />
<hkern u1="i" u2="n" k="31" />
<hkern u1="i" u2="f" k="96" />
<hkern u1="i" u2="c" k="31" />
<hkern u1="i" u2="a" k="72" />
<hkern u1="j" u2="e" k="41" />
<hkern u1="k" u2="e" k="10" />
<hkern u1="l" u2="&#x2019;" k="178" />
<hkern u1="l" u2="w" k="133" />
<hkern u1="l" u2="v" k="121" />
<hkern u1="l" u2="o" k="20" />
<hkern u1="l" u2="m" k="20" />
<hkern u1="l" u2="e" k="31" />
<hkern u1="l" u2="d" k="-10" />
<hkern u1="l" u2="a" k="20" />
<hkern u1="m" u2="w" k="51" />
<hkern u1="m" u2="m" k="27" />
<hkern u1="m" u2="k" k="27" />
<hkern u1="n" u2="x" k="51" />
<hkern u1="n" u2="p" k="20" />
<hkern u1="n" u2="o" k="31" />
<hkern u1="n" u2="c" k="41" />
<hkern u1="n" u2="b" k="41" />
<hkern u1="o" u2="x" k="72" />
<hkern u1="o" u2="w" k="72" />
<hkern u1="o" u2="v" k="27" />
<hkern u1="o" u2="u" k="47" />
<hkern u1="o" u2="t" k="47" />
<hkern u1="o" u2="s" k="41" />
<hkern u1="o" u2="r" k="20" />
<hkern u1="o" u2="o" k="41" />
<hkern u1="o" u2="n" k="31" />
<hkern u1="o" u2="l" k="41" />
<hkern u1="o" u2="a" k="20" />
<hkern u1="p" u2="s" k="-20" />
<hkern u1="p" u2="i" k="-31" />
<hkern u1="p" u2="d" k="-51" />
<hkern u1="q" u2="u" k="51" />
<hkern u1="r" u2="o" k="10" />
<hkern u1="r" u2="&#x2e;" k="41" />
<hkern u1="r" u2="&#x2c;" k="498" />
<hkern u1="s" u2="z" k="47" />
<hkern u1="s" u2="x" k="76" />
<hkern u1="s" u2="v" k="41" />
<hkern u1="s" u2="u" k="41" />
<hkern u1="s" u2="n" k="47" />
<hkern u1="s" u2="k" k="31" />
<hkern u1="s" u2="e" k="31" />
<hkern u1="s" u2="c" k="39" />
<hkern u1="t" u2="z" k="-10" />
<hkern u1="t" u2="i" k="-10" />
<hkern u1="t" u2="h" k="-10" />
<hkern u1="t" u2="d" k="-41" />
<hkern u1="t" u2="b" k="-10" />
<hkern u1="u" u2="z" k="31" />
<hkern u1="u" u2="x" k="31" />
<hkern u1="u" u2="t" k="31" />
<hkern u1="u" u2="s" k="31" />
<hkern u1="u" u2="p" k="31" />
<hkern u1="u" u2="n" k="-10" />
<hkern u1="u" u2="m" k="41" />
<hkern u1="u" u2="f" k="20" />
<hkern u1="u" u2="e" k="31" />
<hkern u1="u" u2="d" k="-20" />
<hkern u1="u" u2="c" k="41" />
<hkern u1="u" u2="b" k="31" />
<hkern u1="v" u2="s" k="51" />
<hkern u1="v" u2="o" k="59" />
<hkern u1="v" u2="e" k="61" />
<hkern u1="w" u2="s" k="31" />
<hkern u1="w" u2="r" k="41" />
<hkern u1="w" u2="o" k="41" />
<hkern u1="w" u2="e" k="41" />
<hkern u1="x" u2="e" k="100" />
<hkern u1="y" u2="o" k="47" />
<hkern u1="y" u2="n" k="31" />
<hkern u1="y" u2="l" k="-20" />
<hkern u1="y" u2="e" k="41" />
<hkern u1="y" u2="c" k="41" />
<hkern u1="y" u2="a" k="47" />
<hkern u1="z" u2="z" k="41" />
<hkern u1="z" u2="t" k="41" />
<hkern u1="z" u2="l" k="41" />
<hkern u1="z" u2="e" k="51" />
<hkern u1="z" u2="a" k="51" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 45 KiB

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M4 10v20c0 1.1 0.9 2 2 2h18c1.1 0 2-0.9 2-2v-20h-22zM10 28h-2v-14h2v14zM14 28h-2v-14h2v14zM18 28h-2v-14h2v14zM22 28h-2v-14h2v14z"></path>
<path d="M26.5 4h-6.5v-2.5c0-0.825-0.675-1.5-1.5-1.5h-7c-0.825 0-1.5 0.675-1.5 1.5v2.5h-6.5c-0.825 0-1.5 0.675-1.5 1.5v2.5h26v-2.5c0-0.825-0.675-1.5-1.5-1.5zM18 4h-6v-1.975h6v1.975z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 657 B

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16 16-7.163 16-16-7.163-16-16-16zM16 29c-7.18 0-13-5.82-13-13s5.82-13 13-13 13 5.82 13 13-5.82 13-13 13z"></path>
<path d="M21 8l-5 5-5-5-3 3 5 5-5 5 3 3 5-5 5 5 3-3-5-5 5-5z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 554 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M27 4l-15 15-7-7-5 5 12 12 20-20z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 371 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M12.42 28.678l-12.433-12.238 6.168-6.071 6.265 6.167 13.426-13.214 6.168 6.071-19.594 19.285zM3.372 16.441l9.048 8.905 16.208-15.953-2.782-2.739-13.426 13.214-6.265-6.167-2.782 2.739z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 521 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M11.366 22.564l1.291-1.807-1.414-1.414-1.807 1.291c-0.335-0.187-0.694-0.337-1.071-0.444l-0.365-2.19h-2l-0.365 2.19c-0.377 0.107-0.736 0.256-1.071 0.444l-1.807-1.291-1.414 1.414 1.291 1.807c-0.187 0.335-0.337 0.694-0.443 1.071l-2.19 0.365v2l2.19 0.365c0.107 0.377 0.256 0.736 0.444 1.071l-1.291 1.807 1.414 1.414 1.807-1.291c0.335 0.187 0.694 0.337 1.071 0.444l0.365 2.19h2l0.365-2.19c0.377-0.107 0.736-0.256 1.071-0.444l1.807 1.291 1.414-1.414-1.291-1.807c0.187-0.335 0.337-0.694 0.444-1.071l2.19-0.365v-2l-2.19-0.365c-0.107-0.377-0.256-0.736-0.444-1.071zM7 27c-1.105 0-2-0.895-2-2s0.895-2 2-2 2 0.895 2 2-0.895 2-2 2zM32 12v-2l-2.106-0.383c-0.039-0.251-0.088-0.499-0.148-0.743l1.799-1.159-0.765-1.848-2.092 0.452c-0.132-0.216-0.273-0.426-0.422-0.629l1.219-1.761-1.414-1.414-1.761 1.219c-0.203-0.149-0.413-0.29-0.629-0.422l0.452-2.092-1.848-0.765-1.159 1.799c-0.244-0.059-0.492-0.109-0.743-0.148l-0.383-2.106h-2l-0.383 2.106c-0.251 0.039-0.499 0.088-0.743 0.148l-1.159-1.799-1.848 0.765 0.452 2.092c-0.216 0.132-0.426 0.273-0.629 0.422l-1.761-1.219-1.414 1.414 1.219 1.761c-0.149 0.203-0.29 0.413-0.422 0.629l-2.092-0.452-0.765 1.848 1.799 1.159c-0.059 0.244-0.109 0.492-0.148 0.743l-2.106 0.383v2l2.106 0.383c0.039 0.251 0.088 0.499 0.148 0.743l-1.799 1.159 0.765 1.848 2.092-0.452c0.132 0.216 0.273 0.426 0.422 0.629l-1.219 1.761 1.414 1.414 1.761-1.219c0.203 0.149 0.413 0.29 0.629 0.422l-0.452 2.092 1.848 0.765 1.159-1.799c0.244 0.059 0.492 0.109 0.743 0.148l0.383 2.106h2l0.383-2.106c0.251-0.039 0.499-0.088 0.743-0.148l1.159 1.799 1.848-0.765-0.452-2.092c0.216-0.132 0.426-0.273 0.629-0.422l1.761 1.219 1.414-1.414-1.219-1.761c0.149-0.203 0.29-0.413 0.422-0.629l2.092 0.452 0.765-1.848-1.799-1.159c0.059-0.244 0.109-0.492 0.148-0.743l2.106-0.383zM21 15.35c-2.402 0-4.35-1.948-4.35-4.35s1.948-4.35 4.35-4.35 4.35 1.948 4.35 4.35c0 2.402-1.948 4.35-4.35 4.35z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1,8 +0,0 @@
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(1,1)">
<path stroke="#ff3b00" transform="rotate(45 15 15)" d="m4,4 l 11,-4 l 11,4 l 4,11 l -4,11 l -11,4 l -11,-4 l -4,-11 l 4,-11 l 22,0 l 0,22 l -22,0 z" stroke-width="1" fill="#000000"/>
<rect height="3" width="10" y="13.5" x="10" stroke-width="1" stroke="#ff3b00" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 404 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M16 18l8-8h-6v-8h-4v8h-6zM23.273 14.727l-2.242 2.242 8.128 3.031-13.158 4.907-13.158-4.907 8.127-3.031-2.242-2.242-8.727 3.273v8l16 6 16-6v-8z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 480 B

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M18 23l3 3 10-10-10-10-3 3 7 7z"></path>
<path d="M14 9l-3-3-10 10 10 10 3-3-7-7z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 419 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M28 0h-28v32h32v-28l-4-4zM16 4h4v8h-4v-8zM28 28h-24v-24h2v10h18v-10h2.343l1.657 1.657v22.343z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 431 B

View File

@@ -1,3 +0,0 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<path d="M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16 16-7.163 16-16-7.163-16-16-16zM9.464 26.067c0.347-0.957 0.536-1.99 0.536-3.067 0-3.886-2.463-7.197-5.913-8.456 0.319-2.654 1.508-5.109 3.427-7.029 2.267-2.266 5.28-3.515 8.485-3.515s6.219 1.248 8.485 3.515c1.92 1.92 3.108 4.375 3.428 7.029-3.45 1.26-5.913 4.57-5.913 8.456 0 1.077 0.189 2.11 0.536 3.067-1.928 1.258-4.18 1.933-6.536 1.933s-4.608-0.675-6.536-1.933zM17.242 20.031c0.434 0.109 0.758 0.503 0.758 0.969v2c0 0.55-0.45 1-1 1h-2c-0.55 0-1-0.45-1-1v-2c0-0.466 0.324-0.86 0.758-0.969l0.742-14.031h1l0.742 14.031z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 688 B

View File

@@ -1,3 +0,0 @@
<svg height="1024" width="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 0C229.252 0 0 229.25199999999995 0 512c0 226.251 146.688 418.126 350.155 485.813 25.593 4.686 34.937-11.125 34.937-24.626 0-12.188-0.469-52.562-0.718-95.314-128.708 23.46-161.707-31.541-172.469-60.373-5.525-14.809-30.407-60.249-52.398-72.263-17.988-9.828-43.26-33.237-0.917-33.735 40.434-0.476 69.348 37.308 78.471 52.75 45.938 77.749 119.876 55.627 148.999 42.5 4.654-32.999 17.902-55.627 32.501-68.373-113.657-12.939-233.22-56.875-233.22-253.063 0-55.94 19.968-101.561 52.658-137.404-5.22-12.999-22.844-65.095 5.063-135.563 0 0 42.937-13.749 140.811 52.501 40.811-11.406 84.594-17.031 128.124-17.22 43.499 0.188 87.314 5.874 128.188 17.28 97.689-66.311 140.686-52.501 140.686-52.501 28 70.532 10.375 122.564 5.124 135.499 32.811 35.844 52.626 81.468 52.626 137.404 0 196.686-119.751 240-233.813 252.686 18.439 15.876 34.748 47.001 34.748 94.748 0 68.437-0.686 123.627-0.686 140.501 0 13.625 9.312 29.561 35.25 24.562C877.436 929.998 1024 738.126 1024 512 1024 229.25199999999995 794.748 0 512 0z" />
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M31.562 25.905l-9.423-9.423c-0.583-0.583-1.538-0.583-2.121 0l-0.707 0.707-5.75-5.75 9.439-9.439h-10l-4.439 4.439-0.439-0.439h-2.121v2.121l0.439 0.439-6.439 6.439 5 5 6.439-6.439 5.75 5.75-0.707 0.707c-0.583 0.583-0.583 1.538 0 2.121l9.423 9.423c0.583 0.583 1.538 0.583 2.121 0l3.535-3.535c0.583-0.583 0.583-1.538 0-2.121z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 659 B

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M24.5 23.5c-2.003 0-3.887-0.78-5.303-2.197l-3.197-3.196-3.196 3.196c-1.417 1.417-3.3 2.197-5.303 2.197s-3.887-0.78-5.304-2.197c-1.417-1.417-2.197-3.3-2.197-5.303s0.78-3.887 2.197-5.304c1.417-1.417 3.3-2.197 5.304-2.197s3.887 0.78 5.303 2.197l3.196 3.196 3.196-3.196c1.417-1.417 3.3-2.197 5.303-2.197s3.887 0.78 5.303 2.197c1.417 1.417 2.197 3.3 2.197 5.304s-0.78 3.887-2.197 5.303c-1.416 1.417-3.3 2.197-5.303 2.197zM21.304 19.197c0.854 0.853 1.989 1.324 3.196 1.323s2.342-0.47 3.196-1.324c0.854-0.854 1.324-1.989 1.324-3.196s-0.47-2.342-1.324-3.196c-0.854-0.854-1.989-1.324-3.196-1.324s-2.342 0.47-3.196 1.324l-3.196 3.196 3.196 3.197zM7.5 11.48c-1.207 0-2.342 0.47-3.196 1.324s-1.324 1.989-1.324 3.196c0 1.207 0.47 2.342 1.324 3.196s1.989 1.324 3.196 1.324c1.207 0 2.342-0.47 3.196-1.324l3.196-3.196-3.196-3.196c-0.854-0.854-1.989-1.324-3.196-1.324v0z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M14 9.5c0-0.825 0.675-1.5 1.5-1.5h1c0.825 0 1.5 0.675 1.5 1.5v1c0 0.825-0.675 1.5-1.5 1.5h-1c-0.825 0-1.5-0.675-1.5-1.5v-1z"></path>
<path d="M20 24h-8v-2h2v-6h-2v-2h6v8h2z"></path>
<path d="M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16 16-7.163 16-16-7.163-16-16-16zM16 29c-7.18 0-13-5.82-13-13s5.82-13 13-13 13 5.82 13 13-5.82 13-13 13z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 675 B

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M13.757 19.868c-0.416 0-0.832-0.159-1.149-0.476-2.973-2.973-2.973-7.81 0-10.783l6-6c1.44-1.44 3.355-2.233 5.392-2.233s3.951 0.793 5.392 2.233c2.973 2.973 2.973 7.81 0 10.783l-2.743 2.743c-0.635 0.635-1.663 0.635-2.298 0s-0.635-1.663 0-2.298l2.743-2.743c1.706-1.706 1.706-4.481 0-6.187-0.826-0.826-1.925-1.281-3.094-1.281s-2.267 0.455-3.094 1.281l-6 6c-1.706 1.706-1.706 4.481 0 6.187 0.635 0.635 0.635 1.663 0 2.298-0.317 0.317-0.733 0.476-1.149 0.476z"></path>
<path d="M8 31.625c-2.037 0-3.952-0.793-5.392-2.233-2.973-2.973-2.973-7.81 0-10.783l2.743-2.743c0.635-0.635 1.664-0.635 2.298 0s0.635 1.663 0 2.298l-2.743 2.743c-1.706 1.706-1.706 4.481 0 6.187 0.826 0.826 1.925 1.281 3.094 1.281s2.267-0.455 3.094-1.281l6-6c1.706-1.706 1.706-4.481 0-6.187-0.635-0.635-0.635-1.663 0-2.298s1.663-0.635 2.298 0c2.973 2.973 2.973 7.81 0 10.783l-6 6c-1.44 1.44-3.355 2.233-5.392 2.233z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,7 +0,0 @@
<svg width="201" height="201" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<circle fill-opacity="0" r="70" cy="100" cx="100" stroke-width="5" />
<line y2="60" x2="101" y1="0" x1="101" stroke-width="5" />
<line y2="101" x2="200" y1="101" x1="140" stroke-width="5" />
<line y2="101" x2="60" y1="101" x1="0" stroke-width="5" />
<line y2="200" x2="101" y1="140" x1="101" stroke-width="5" />
</svg>

Before

Width:  |  Height:  |  Size: 417 B

View File

@@ -1,4 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<ellipse ry="25" rx="95" cy="100" cx="100" fill-opacity="0" stroke-width="5" />
<ellipse ry="95" rx="25" cy="100" cx="100" fill-opacity="0" stroke-width="5" />
</svg>

Before

Width:  |  Height:  |  Size: 258 B

View File

@@ -1,5 +0,0 @@
<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<line y2="170" x2="162" y1="170" x1="8" stroke-width="6" />
<path d="m13,138l144,0l0,-50l-27,-40l-90,0l-27,40l0,50z" id="svg_12" fill-opacity="0" stroke-width="6" />
<line y2="91" x2="200" y1="91" x1="159" stroke-width="6" />
</svg>

Before

Width:  |  Height:  |  Size: 326 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M16 3c-3.472 0-6.737 1.352-9.192 3.808s-3.808 5.72-3.808 9.192c0 3.472 1.352 6.737 3.808 9.192s5.72 3.808 9.192 3.808c3.472 0 6.737-1.352 9.192-3.808s3.808-5.72 3.808-9.192c0-3.472-1.352-6.737-3.808-9.192s-5.72-3.808-9.192-3.808zM16 0v0c8.837 0 16 7.163 16 16s-7.163 16-16 16c-8.837 0-16-7.163-16-16s7.163-16 16-16zM14 22h4v4h-4zM14 6h4v12h-4z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 681 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M14 22h4v4h-4zM22 8c1.105 0 2 0.895 2 2v6l-6 4h-4v-2l6-4v-2h-10v-4h12zM16 3c-3.472 0-6.737 1.352-9.192 3.808s-3.808 5.72-3.808 9.192c0 3.472 1.352 6.737 3.808 9.192s5.72 3.808 9.192 3.808c3.472 0 6.737-1.352 9.192-3.808s3.808-5.72 3.808-9.192c0-3.472-1.352-6.737-3.808-9.192s-5.72-3.808-9.192-3.808zM16 0v0c8.837 0 16 7.163 16 16s-7.163 16-16 16c-8.837 0-16-7.163-16-16s7.163-16 16-16z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 723 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M22 2l-10 10h-6l-6 8c0 0 6.357-1.77 10.065-0.94l-10.065 12.94 13.184-10.255c1.839 4.208-1.184 10.255-1.184 10.255l8-6v-6l10-10 2-10-10 2z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 475 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M32 12h-12l4.485-4.485c-2.267-2.266-5.28-3.515-8.485-3.515s-6.219 1.248-8.485 3.515c-2.266 2.267-3.515 5.28-3.515 8.485s1.248 6.219 3.515 8.485c2.267 2.266 5.28 3.515 8.485 3.515s6.219-1.248 8.485-3.515c0.189-0.189 0.371-0.384 0.546-0.583l3.010 2.634c-2.933 3.349-7.239 5.464-12.041 5.464-8.837 0-16-7.163-16-16s7.163-16 16-16c4.418 0 8.418 1.791 11.313 4.687l4.687-4.687v12z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 713 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M0 26h32v4h-32zM4 18h4v6h-4zM10 10h4v14h-4zM16 16h4v8h-4zM22 4h4v20h-4z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 409 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M20 4.581v4.249c1.131 0.494 2.172 1.2 3.071 2.099 1.889 1.889 2.929 4.4 2.929 7.071s-1.040 5.182-2.929 7.071c-1.889 1.889-4.4 2.929-7.071 2.929s-5.182-1.040-7.071-2.929c-1.889-1.889-2.929-4.4-2.929-7.071s1.040-5.182 2.929-7.071c0.899-0.899 1.94-1.606 3.071-2.099v-4.249c-5.783 1.721-10 7.077-10 13.419 0 7.732 6.268 14 14 14s14-6.268 14-14c0-6.342-4.217-11.698-10-13.419zM14 0h4v16h-4z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 723 B

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M14 18h4v-8h6l-8-8-8 8h6zM20 13.5v3.085l9.158 3.415-13.158 4.907-13.158-4.907 9.158-3.415v-3.085l-12 4.5v8l16 6 16-6v-8z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 458 B

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generated by IcoMoon.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<path d="M16 2.899l13.409 26.726h-26.819l13.409-26.726zM16 0c-0.69 0-1.379 0.465-1.903 1.395l-13.659 27.222c-1.046 1.86-0.156 3.383 1.978 3.383h27.166c2.134 0 3.025-1.522 1.978-3.383h0l-13.659-27.222c-0.523-0.93-1.213-1.395-1.903-1.395v0z"></path>
<path d="M18 26c0 1.105-0.895 2-2 2s-2-0.895-2-2c0-1.105 0.895-2 2-2s2 0.895 2 2z"></path>
<path d="M16 22c-1.105 0-2-0.895-2-2v-6c0-1.105 0.895-2 2-2s2 0.895 2 2v6c0 1.105-0.895 2-2 2z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 762 B

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square70x70logo src="images/logo/mstile-70x70.png"/>
<square150x150logo src="images/logo/mstile-150x150.png"/>
<square310x310logo src="images/logo/mstile-310x310.png"/>
<wide310x150logo src="images/logo/mstile-310x150.png"/>
<TileColor>#000000</TileColor>
</tile>
</msapplication>
</browserconfig>

View File

@@ -1,87 +0,0 @@
<!DOCTYPE html>
<html ng-app="app" ng-strict-di="true" manifest="/coriolis.appcache">
<head>
<title ng-bind="title">Coriolis</title>
<link rel="stylesheet" href="/app.css">
<!-- Standard headers -->
<meta name="mobile-web-app-capable" content="yes">
<meta name="viewport" content="width = device-width, initial-scale = 1.0">
<link rel="manifest" href="/images/logo/manifest.json">
<link rel="icon" sizes="152x152 192x192" type="image/png" href="/images/logo/192x192.png">
<link rel="shortcut icon" href="/images/logo/favicon.ico">
<!-- Apple/iOS headers -->
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-title" content="Coriolis">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="180x180" href="/images/logo/apple-touch-icon-precomposed.png">
<link rel="apple-touch-icon" href="/images/logo/apple-touch-icon.png">
<link rel="apple-touch-icon" sizes="180x180" href="/images/logo/apple-touch-icon-180x180.png">
<!-- iPhone, iPod Touch, portrait -->
<link href="/images/splash/320x460.png" media="(device-width: 320px) and (device-height: 480px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 1)" rel="apple-touch-startup-image">
<!-- iPhone, iPod Touch, landscape -->
<link href="/images/splash/480x320.png" media="(device-width: 320px) and (device-height: 480px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 1)" rel="apple-touch-startup-image">
<!-- iPhone 4, 4S, portrait -->
<link href="/images/splash/640x920.png" media="(device-width: 320px) and (device-height: 480px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPhone 4, 4S, landscape -->
<link href="/images/splash/960x640.png" media="(device-width: 320px) and (device-height: 480px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPhone 5, 5S, 5C, portrait -->
<link href="/images/splash/640x1096.png" media="(device-width: 320px) and (device-height: 568px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPhone 5, 5S, 5C, landscape -->
<link href="/images/splash/1136x640.png" media="(device-width: 320px) and (device-height: 568px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPhone 6, portrait -->
<link href="/images/splash/750x1294.png" media="(device-width: 375px) and (device-height: 667px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPhone 6, landscape -->
<link href="/images/splash/1334x750.png" media="(device-width: 375px) and (device-height: 667px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPhone 6+, portrait -->
<link href="/images/splash/1242x2148.png" media="(device-width: 414px) and (device-height: 736px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 3)" rel="apple-touch-startup-image">
<!-- iPhone 6+, landscape -->
<link href="/images/splash/2208x1242.png" media="(device-width: 414px) and (device-height: 736px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 3)" rel="apple-touch-startup-image">
<!-- iPad 1, 2, Mini, portrait -->
<link href="/images/splash/768x1004.png" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 1)" rel="apple-touch-startup-image">
<!-- iPad 1, 2, Mini, landscape -->
<link href="/images/splash/1024x748.png" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 1)" rel="apple-touch-startup-image">
<!-- iPad 3, 4, Air, Air 2, Mini 2, Mini 3, portrait -->
<link href="/images/splash/1536x2008.png" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- iPad 3, 4, Air, Air 2, Mini 2, Mini 3, landscape -->
<link href="/images/splash/2048x1496.png" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image">
<!-- Microsoft Windows Phone/Tablet headers -->
<meta name="msapplication-TileColor" content="#000000">
<meta name="msapplication-TileImage" content="/images/logo/mstile-144x144.png">
<meta name="msapplication-config" content="/images/logo/browserconfig.xml">
<meta name="theme-color" content="#000000">
</head>
<body style="background-color:#000;">
<div style="height: 0; width: 0; overflow:hidden"><%= svgContent %></div>
<shipyard-header></shipyard-header>
<div id="main" ui-view ng-click="bgClicked($event)"></div>
<div ui-view="modal" ng-click="bgClicked($event)"></div>
<footer>
<div class="right">
<a href="https://github.com/cmmcleod/coriolis" target="_blank" title="Coriolis Github Project">Version <%= version %> - <%= date %></a>
</div>
<div style="max-width:50%" class="l">
Coriolis Shipyard was created for non-commercial purposes. It is not endorsed by nor reflects the views or opinions of Frontier Developments.
</div>
</footer>
<script src="/lib.js" type="text/javascript"></script>
<script src="/app.js" type="text/javascript"></script>
<% if (uaTracking) { %>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', '<%= uaTracking %> ', 'auto');
var GAPI_KEY = '<%= gapiKey %>';
</script>
<% } %>
</body>
</html>

View File

@@ -1,61 +0,0 @@
angular.module('app', ['ui.router', 'ct.ui.router.extras.sticky', 'ui.sortable', 'shipyard', 'ngLodash', 'app.templates'])
.run(['$rootScope', '$location', '$window', '$document','$state','commonArray','shipPurpose','shipSize','hardPointClass','internalGroupMap','hardpointsGroupMap', function ($rootScope, $location, $window, $doc, $state, CArr, shipPurpose, sz, hpc, igMap, hgMap) {
// Redirect any state transition errors to the error controller/state
$rootScope.$on('$stateChangeError', function(e, toState, toParams, fromState, fromParams, error){
e.preventDefault();
$state.go('error', error, {location:false, reload:true}); // Go to error state, reload the controller, keep the current URL
});
// Track on Google analytics if available
$rootScope.$on('$stateChangeSuccess', function(e, to, toParams, from, fromParams) {
$rootScope.prevState = { name: from.name, params: fromParams };
if(to.url && $window.ga) { // Only track states that have a URL
ga('send', 'pageview', {page: $location.path()});
}
});
// Global Reference variables
$rootScope.CArr = CArr;
$rootScope.SP = shipPurpose;
$rootScope.SZ = sz;
$rootScope.HPC = hpc;
$rootScope.igMap = igMap;
$rootScope.hgMap = hgMap;
$rootScope.title = 'Coriolis';
// Formatters
$rootScope.fCrd = d3.format(',.0f');
$rootScope.fPwr = d3.format(',.2f');
$rootScope.fRound = function(d) { return d3.round(d, 2); };
$rootScope.fRound4 = function(d) { return d3.round(d, 4); };
$rootScope.fPct = d3.format('.2%');
$rootScope.fRPct = d3.format('%');
$rootScope.fTime = function(d) { return Math.floor(d/60) + ":" + ("00" + Math.floor(d%60)).substr(-2,2); };
// Global Event Listeners
$doc.bind('keyup', function (e) {
if(e.keyCode == 27) { // Escape Key
$rootScope.$broadcast('close', e);
$rootScope.$apply();
} else {
$rootScope.$broadcast('keyup', e);
}
});
$rootScope.bgClicked = function (e) {
$rootScope.$broadcast('close', e);
};
if ($window.applicationCache) {
// Listen for appcache updated event, present refresh to update view
$window.applicationCache.addEventListener('updateready', function() {
if ($window.applicationCache.status == $window.applicationCache.UPDATEREADY) {
// Browser downloaded a new app cache.
$rootScope.appCacheUpdate = true;
$rootScope.$apply();
}
}, false);
}
}]);

View File

@@ -1,80 +0,0 @@
/**
* Sets up the routes and handlers before the Angular app is kicked off.
*/
angular.module('app').config(['$provide','$stateProvider', '$urlRouterProvider', '$locationProvider', 'ShipsDB', function ($provide, $stateProvider, $urlRouterProvider, $locationProvider, ships) {
// Use HTML5 push and replace state if possible
$locationProvider.html5Mode({enabled: true, requireBase: false});
/**
* Set up all states and their routes.
*/
$stateProvider
.state('outfit', {
url: '/outfit/:shipId/:code?bn',
params: {
shipId: { value: 'sidewinder', squash: false}, // Allow 'shipId' parameter to default to sidewinder
code: { value: null, squash: true } // Allow 'code' parameter to be empty/optional
},
templateUrl: 'views/page-outfit.html',
controller: 'OutfitController',
resolve: {
shipId: ['$stateParams',function ($p) { // Ensure ship exists before loading controller
if (!ships[$p.shipId]) {
throw { type: 'no-ship', message: $p.shipId };
}
}]
},
sticky: true
})
.state('compare', {
url: '/compare/:name',
params: {
name: {value: null, squash: true }
},
templateUrl: 'views/page-comparison.html',
controller: 'ComparisonController',
sticky: true
})
.state('comparison', {
url: '/comparison/:code',
templateUrl: 'views/page-comparison.html',
controller: 'ComparisonController',
sticky: true
})
.state('shipyard', { url: '/', templateUrl: 'views/page-shipyard.html', controller: 'ShipyardController', sticky: true })
.state('error', { params: {type:null, message:null, details: null }, templateUrl: 'views/page-error.html', controller: 'ErrorController', sticky: true })
// Modal States and views
.state('modal', { abstract: true, views:{ "modal": { templateUrl: "views/_modal.html", controller: 'ModalController' } } })
.state('modal.about', { views: { "modal-content": { templateUrl: "views/modal-about.html" } } })
.state('modal.export', { params: {title:null, data: null, promise: null}, views: { "modal-content": { templateUrl: "views/modal-export.html", controller: 'ExportController' } } })
.state('modal.import', { params: {obj:null}, views: { "modal-content": { templateUrl: "views/modal-import.html", controller: 'ImportController' } } })
.state('modal.link', { params: {url:null}, views: { "modal-content": { templateUrl: "views/modal-link.html", controller: 'LinkController' } } })
.state('modal.delete', { views: { "modal-content": { templateUrl: "views/modal-delete.html", controller: 'DeleteController' } } });
// Redirects
$urlRouterProvider.when('/outfit','/outfit/sidewinder');
/**
* 404 Handler - Keep current URL/ do not redirect, change to error state.
*/
$urlRouterProvider.otherwise(function ($injector, $location) {
// Go to error state, reload the controller, keep the current URL
$injector.get('$state').go('error', { type: 404, message: null, details: null }, {location:false, reload:true});
return $location.path;
});
/**
* Global Error Handler. Decorates the existing error handler such that it
* redirects uncaught errors to the error page.
*
*/
$provide.decorator('$exceptionHandler', ['$delegate', '$injector', function ($delegate, $injector) {
return function(err, cause) {
// Go to error state, reload the controller, keep the current URL
$injector.get('$state').go('error', {type:null, message: err.message, details: err.stack }, {location:false, reload:true});
$delegate(err, cause);
};
}]);
}]);

View File

@@ -1,234 +0,0 @@
angular.module('app').controller('ComparisonController', ['lodash', '$rootScope', '$filter', '$scope', '$state', '$stateParams', 'Utils', 'ShipFacets', 'ShipsDB', 'Ship', 'Persist', 'Serializer', function (_, $rootScope, $filter, $scope, $state, $stateParams, Utils, ShipFacets, Ships, Ship, Persist, Serializer) {
$rootScope.title = 'Coriolis - Compare';
$scope.predicate = 'name'; // Sort by ship name as default
$scope.desc = false;
$scope.facetSortOpts = { containment: '#facet-container', orderChanged: function () { $scope.saved = false; } };
$scope.builds = [];
$scope.unusedBuilds = [];
$scope.name = $stateParams.name;
$scope.compareMode = !$stateParams.code;
$scope.importObj = {}; // Used for importing comparison builds (from permalinked comparison)
var defaultFacets = [9,6,4,1,3,2]; // Reverse order of Armour, Shields, Speed, Jump Range, Cargo Capacity, Cost
var facets = $scope.facets = angular.copy(ShipFacets);
/**
* Add an existing build to the comparison. The build must be saved locally.
* @param {string} shipId The unique ship key/id
* @param {string} buildName The build name
*/
$scope.addBuild = function (shipId, buildName, code) {
var data = Ships[shipId]; // Get ship properties
code = code? code : Persist.builds[shipId][buildName]; // Retrieve build code if not passed
var b = new Ship(shipId, data.properties, data.slots); // Create a new Ship instance
Serializer.toShip(b, code); // Populate components from code
// Extend ship instance and add properties below
b.buildName = buildName;
b.code = code;
b.pctRetracted = b.powerRetracted / b.powerAvailable;
b.pctDeployed = b.powerDeployed / b.powerAvailable;
$scope.builds.push(b); // Add ship build to comparison
$scope.builds = $filter('orderBy')($scope.builds, $scope.predicate, $scope.desc); // Resort
_.remove($scope.unusedBuilds, function (b) { // Remove from unused builds
return b.id == shipId && b.buildName == buildName;
});
$scope.saved = false;
};
/**
* Removes a build from the comparison
* @param {string} shipId The unique ship key/id
* @param {string} buildName The build name
*/
$scope.removeBuild = function (shipId, buildName) {
_.remove($scope.builds, function (b) {
if (b.id == shipId && b.buildName == buildName) {
$scope.unusedBuilds.push({id: shipId, buildName: buildName, name: b.name}); // Add build back to unused builds
return true;
}
return false;
});
$scope.saved = false;
};
/**
* Toggles the selected the set of facets used in the comparison
* @param {number} i The index of the facet in facets
*/
$scope.toggleFacet = function (i) {
facets[i].active = !facets[i].active;
$scope.tblUpdate = !$scope.tblUpdate; // Simple switch to trigger the table to update
$scope.saved = false;
};
/**
* Click handler for sorting by facets in the table
* @param {object} e Event object
*/
$scope.handleClick = function (e) {
var elem = angular.element(e.target);
if(elem.attr('prop')) { // Get component ID
$scope.sort(elem.attr('prop'));
}
else if (elem.attr('del')) { // Delete index
$scope.removeBuild(elem.attr('del'));
}
};
/**
* Sort the comparison array based on the selected facet / ship property
* @param {string} key Ship property
*/
$scope.sort = function (key) {
$scope.desc = ($scope.predicate == key)? !$scope.desc : $scope.desc;
$scope.predicate = key;
$scope.builds = $filter('orderBy')($scope.builds, $scope.predicate, $scope.desc);
};
/**
* Saves the current comparison's selected facets and builds
*/
$scope.save = function() {
$scope.name = $scope.name.trim();
if ($scope.name == 'all') {
return;
}
var selectedFacets = [];
facets.forEach(function(f) {
if(f.active) {
selectedFacets.unshift(f.index);
}
});
Persist.saveComparison($scope.name, $scope.builds, selectedFacets);
$state.go('compare', {name: $scope.name}, {location:'replace', notify:false});
$scope.saved = true;
};
/**
* Permantently delete the current comparison
*/
$scope.delete = function() {
Persist.deleteComparison($scope.name);
$state.go('compare', {name: null}, {location:'replace', reload:true});
};
/**
* Set saved to false when the name of the comparison is changed.
*/
$scope.nameChange = function() {
$scope.saved = false;
};
/**
* Hide/Show the select builds menu
* @param {boolean} s Show true/false
* @param {Event} e Event Object
*/
$scope.selectBuilds = function(s, e) {
e.stopPropagation();
$scope.showBuilds = s;
};
/**
* Show the permalink modal
* @param {Event} e Event object
*/
$scope.permalink = function(e) {
e.stopPropagation();
$state.go('modal.link', {url: genPermalink()});
};
/**
* Generate the forum embed code for the comparison
* and show the export modal.
*
* @param {Event} e Event object
*/
$scope.embed = function(e) {
e.stopPropagation();
// Make a request to goo.gl to shorten the URL, returns a promise
var promise = Utils.shortenUrl( genPermalink()).then(
function (shortUrl) {
return Utils.comparisonBBCode(facets, $scope.builds, shortUrl);
},
function (e) {
return 'Error - ' + e.statusText;
}
);
$state.go('modal.export', {promise: promise, title:'Forum BBCode'});
};
/**
* Generates the long permalink URL
* @return {string} The long permalink URL
*/
function genPermalink() {
var selectedFacets = [];
facets.forEach(function(f) {
if(f.active) {
selectedFacets.unshift(f.index);
}
});
var code = Serializer.fromComparison(
$scope.name,
$scope.builds,
selectedFacets,
$scope.predicate,
$scope.desc
);
return $state.href('comparison', {code: code}, {absolute:true});
}
/* Event listeners */
$scope.$on('close', function() {
$scope.showBuilds = false;
});
/* Initialization */
var shipId, buildName, comparisonData;
if ($scope.compareMode) {
if ($scope.name == 'all') {
for (shipId in Persist.builds) {
for (buildName in Persist.builds[shipId]) {
$scope.addBuild(shipId, buildName);
}
}
} else {
for (shipId in Persist.builds) {
for (buildName in Persist.builds[shipId]) {
$scope.unusedBuilds.push({id: shipId, buildName: buildName, name: Ships[shipId].properties.name});
}
}
comparisonData = Persist.getComparison($scope.name);
if (comparisonData) {
defaultFacets = comparisonData.facets;
comparisonData.builds.forEach(function (b) {
$scope.addBuild(b.shipId, b.buildName);
});
$scope.saved = true;
}
}
} else {
try {
comparisonData = Serializer.toComparison($stateParams.code);
defaultFacets = comparisonData.f;
$scope.name = comparisonData.n;
$scope.predicate = comparisonData.p;
$scope.desc = comparisonData.d;
comparisonData.b.forEach(function (build) {
$scope.addBuild(build.s, build.n, build.c);
if(!$scope.importObj[build.s]) {
$scope.importObj[build.s] = {};
}
$scope.importObj[build.s][build.n] = build.c;
});
} catch (e) {
throw { type: 'bad-comparison', message: e.message, details: e };
}
}
// Replace fmt with actual format function as defined in rootScope and retain original index
facets.forEach(function(f,i) { f.fmt = $rootScope[f.fmt]; f.index = i; });
// Remove default facets, mark as active, and add them back in selected order
_.pullAt(facets, defaultFacets).forEach(function (f) { f.active = true; facets.unshift(f); });
$scope.builds = $filter('orderBy')($scope.builds, $scope.predicate, $scope.desc);
}]);

View File

@@ -1,7 +0,0 @@
angular.module('app').controller('DeleteController', ['$scope', 'Persist', function ($scope, Persist) {
$scope.deleteAll = function () {
Persist.deleteAll();
$scope.$parent.dismiss();
};
}]);

View File

@@ -1,29 +0,0 @@
angular.module('app')
.controller('ErrorController', ['$window','$rootScope','$scope','$stateParams', '$location', function ($window, $rootScope, $scope, $p, $location) {
$rootScope.title = 'Error';
$scope.path = $location.path();
$scope.type = $p.type || 'unknown';
$scope.browser = $window.navigator.userAgent;
switch ($scope.type) {
case 404:
$scope.msgPre = 'Page';
$scope.msgHighlight = $scope.path;
$scope.msgPost = 'Not Found';
break;
case 'no-ship':
$scope.msgPre = 'Ship';
$scope.msgHighlight = $p.message;
$scope.msgPost = 'does not exist';
break;
case 'build-fail':
$scope.msgPre = 'Build Failure!';
$scope.details = $p.details;
break;
default:
$scope.msgPre = "Uh, Jameson, we have a problem..";
$scope.errorMessage = $p.message;
$scope.details = $p.details;
}
}]);

View File

@@ -1,18 +0,0 @@
angular.module('app').controller('ExportController', ['$scope', '$stateParams', function ($scope, $stateParams) {
$scope.title = $stateParams.title || 'Export';
if ($stateParams.promise) {
$scope.export = 'Generating...';
$stateParams.promise.then(function(data){
$scope.export = data;
});
} else {
$scope.export = angular.toJson($stateParams.data, true);
}
$scope.onTextClick = function ($event) {
$event.target.select();
};
}]);

View File

@@ -1,101 +0,0 @@
angular.module('app').controller('ImportController', ['$scope', '$stateParams', 'ShipsDB', 'Ship', 'Persist', 'Serializer', function ($scope, $stateParams, Ships, Ship, Persist, Serializer) {
$scope.jsonValid = false;
$scope.importData = null;
$scope.errorMsg = null;
$scope.canEdit = true;
$scope.builds = $stateParams.obj || null;
$scope.ships = Ships;
$scope.validateJson = function() {
var importObj = null;
$scope.jsonValid = false;
$scope.errorMsg = null;
$scope.builds = null;
if (!$scope.importData) { return; }
try {
importObj = angular.fromJson($scope.importData);
} catch (e) {
$scope.errorMsg = 'Cannot Parse JSON!';
return;
}
if(typeof importObj != 'object') {
$scope.errorMsg = 'Must be an object!';
return;
}
if ((!importObj.builds || !Object.keys(importObj.builds).length)) {
$scope.errorMsg = 'No builds in data';
return;
}
for (var shipId in importObj.builds) {
var shipData = Ships[shipId];
if (shipData) {
for (var buildName in importObj.builds[shipId]) {
if (typeof importObj.builds[shipId][buildName] != 'string') {
$scope.errorMsg = shipData.properties.name + ' build "' + buildName + '" must be a string!';
return;
}
try {
// Actually build the ship with the code to ensure it's valid
Serializer.toShip(new Ship(shipId, shipData.properties, shipData.slots), importObj.builds[shipId][buildName]);
} catch (e) {
$scope.errorMsg = shipData.properties.name + ' build "' + buildName + '" is not valid!';
return;
}
}
} else {
$scope.errorMsg = '"' + shipId + '" is not a valid Ship Id!';
return;
}
$scope.builds = importObj.builds;
}
$scope.jsonValid = true;
};
$scope.hasBuild = function (shipId, name) {
return Persist.getBuild(shipId, name) !== null;
};
$scope.process = function() {
var builds = $scope.builds;
for (var shipId in builds) {
for (var buildName in builds[shipId]) {
var code = builds[shipId][buildName];
// Update builds object such that orginal name retained, but can be renamed
builds[shipId][buildName] = {
code: code,
useName: buildName
};
}
}
$scope.processed = true;
};
$scope.import = function() {
var builds = $scope.builds;
for (var shipId in builds) {
for (var buildName in builds[shipId]) {
var build = builds[shipId][buildName];
var name = build.useName.trim();
if (name) {
Persist.saveBuild(shipId, name, build.code);
}
}
}
$scope.$parent.dismiss();
};
/* Initialization */
if ($scope.builds) { // If import is passed an build object
$scope.canEdit = false;
$scope.process();
}
}]);

View File

@@ -1,16 +0,0 @@
angular.module('app').controller('LinkController', ['$scope', 'Utils', '$stateParams', function ($scope, Utils, $stateParams) {
$scope.url = $stateParams.url;
$scope.shortenedUrl = 'Shortening...';
$scope.onTextClick = function ($event) {
$event.target.select();
};
Utils.shortenUrl($scope.url)
.then(function(url) {
$scope.shortenedUrl = url;
},function(e) {
$scope.shortenedUrl = 'Error - ' + e.statusText;
});
}]);

View File

@@ -1,14 +0,0 @@
angular.module('app').controller('ModalController', ['$rootScope','$scope', '$state', function ($rootScope, $scope, $state) {
$scope.dismiss = function() {
if ($rootScope.prevState) {
var state = $rootScope.prevState;
$state.go(state.name, state.params, {location: 'replace', reload: false});
} else {
$state.go('shipyard');
}
};
$scope.$on('close', $scope.dismiss);
}]);

View File

@@ -1,188 +0,0 @@
angular.module('app').controller('OutfitController', ['$window','$rootScope','$scope', '$state', '$stateParams', 'ShipsDB', 'Ship', 'Components', 'Serializer', 'Persist', function ($window, $rootScope, $scope, $state, $p, Ships, Ship, Components, Serializer, Persist) {
var data = Ships[$p.shipId]; // Retrieve the basic ship properties, slots and defaults
var ship = new Ship($p.shipId, data.properties, data.slots); // Create a new Ship instance
// Update the ship instance with the code (if provided) or the 'factory' defaults.
if ($p.code) {
Serializer.toShip(ship, $p.code); // Populate components from 'code' URL param
$scope.code = $p.code;
} else {
ship.buildWith(data.defaults); // Populate with default components
}
$scope.buildName = $p.bn;
$rootScope.title = ship.name + ($scope.buildName? ' - ' + $scope.buildName : '');
$scope.ship = ship;
$scope.pp = ship.common[0]; // Power Plant
$scope.th = ship.common[1]; // Thruster
$scope.fsd = ship.common[2]; // Frame Shrift Drive
$scope.ls = ship.common[3]; // Life Support
$scope.pd = ship.common[4]; // Power Distributor
$scope.ss = ship.common[5]; // Sensors
$scope.ft = ship.common[6]; // Fuel Tank
$scope.hps = ship.hardpoints;
$scope.internal = ship.internal;
$scope.availCS = Components.forShip(ship.id);
$scope.selectedSlot = null;
$scope.savedCode = Persist.getBuild(ship.id, $scope.buildName);
$scope.canSave = Persist.isEnabled();
$scope.fuel = 0;
$scope.jrSeries = {
xMin: 0,
xMax: ship.cargoCapacity,
// Slightly higher than actual based bacuse components are excluded
yMax: ship.jumpRangeWithMass(ship.unladenMass),
yMin: 0,
func: function(cargo) { // X Axis is Cargo
return ship.jumpRangeWithMass(ship.unladenMass + $scope.fuel + cargo, $scope.fuel);
}
};
$scope.jrChart = {
labels: {
xAxis: {
title:'Cargo',
unit: 'T'
},
yAxis: {
title:'Jump Range',
unit: 'LY'
}
},
watch: $scope.fsd
};
/**
* 'Opens' a select for component selection.
*
* @param {[type]} e The event object
* @param {[type]} slot The slot that is being 'opened' for selection
*/
$scope.selectSlot = function(e, slot) {
e.stopPropagation();
if ($scope.selectedSlot == slot) {
$scope.selectedSlot = null;
} else {
$scope.selectedSlot = slot;
}
};
/**
* Updates the ships build with the selected component for the
* specified slot. Prevents the click event from propagation.
*
* @param {string} type Shorthand key/string for identifying the slot & component type
* @param {[type]} slot The slot object belonging to the ship instance
* @param {[type]} e The event object
*/
$scope.select = function(type, slot, e) {
e.stopPropagation();
var id = angular.element(e.target).attr('cpid'); // Get component ID
if (id) {
if (id == 'empty') {
ship.use(slot, null, null);
} else if(type == 'h') {
ship.use(slot, id, Components.hardpoints(id));
} else if (type == 'c') {
ship.use(slot, id, Components.common(ship.common.indexOf(slot), id));
} else if (type == 'i') {
ship.use(slot, id, Components.internal(id));
} else if (type == 'b') {
ship.useBulkhead(id);
}
$scope.selectedSlot = null;
$scope.code = Serializer.fromShip(ship);
updateState();
}
};
/**
* Reload the build from the last save.
*/
$scope.reloadBuild = function() {
if ($scope.buildName && $scope.savedCode) {
Serializer.toShip(ship, $scope.savedCode); // Repopulate with components from last save
$scope.code = $scope.savedCode;
updateState();
}
};
/**
* Save the current build. Will replace the saved build if there is one
* for this ship & with the exact name.
*/
$scope.saveBuild = function() {
if (!$scope.buildName) {
return;
}
// No change hav been made, i.e. save ship default build under a name
if (!$scope.code) {
$scope.code = Serializer.fromShip(ship);
}
// Only save if there a build name and a change has been made or the build has never been saved
if ($scope.code != $scope.savedCode) {
Persist.saveBuild(ship.id, $scope.buildName, $scope.code);
$scope.savedCode = $scope.code;
updateState();
}
};
/**
* Permanently delete the current build and redirect/reload this controller
* with the 'factory' build of the current ship.
*/
$scope.deleteBuild = function() {
Persist.deleteBuild(ship.id, $scope.buildName);
$state.go('outfit', {shipId: ship.id, code: null, bn: null}, {location:'replace', reload:true});
};
/**
* On build name change, retrieve the existing saved code if there is one
*/
$scope.bnChange = function(){
$scope.savedCode = Persist.getBuild(ship.id, $scope.buildName);
};
/**
* Toggle cost of the selected component
* @param {object} item The component being toggled
*/
$scope.toggleCost = function(item) {
item.incCost = !item.incCost;
ship.updateTotals();
};
/**
* Toggle the power on/off for the selected component
* @param {object} item The component being toggled
*/
$scope.togglePwr = function(item) {
item.enabled = !item.enabled;
ship.updateTotals();
};
$scope.fuelChange = function (fuel) {
$scope.fuel = fuel;
angular.element($window).triggerHandler('render');
};
// Utilify functions
function updateState() {
$state.go('outfit', {shipId: ship.id, code: $scope.code, bn: $scope.buildName}, {location:'replace', notify:false});
$scope.jrSeries.xMax = ship.cargoCapacity;
$scope.jrSeries.yMax = ship.jumpRangeWithMass(ship.unladenMass);
$scope.jrSeries.mass = ship.unladenMass;
}
// Hide any open menu/slot/etc if escape key is pressed
$scope.$on('escape', function () {
$scope.selectedSlot = null;
$scope.$apply();
});
// Hide any open menu/slot/etc if the background is clicked
$scope.$on('close', function () {
$scope.selectedSlot = null;
});
}]);

View File

@@ -1,4 +0,0 @@
angular.module('app').controller('ShipyardController', ['$rootScope', 'ShipsDB', function ($rootScope, ships) {
$rootScope.title = 'Coriolis';
$rootScope.ships = ships;
}]);

View File

@@ -1,131 +0,0 @@
angular.module('app').directive('areaChart', ['$window', function ($window) {
return {
restrict: 'A',
scope:{
config: '=',
series: '='
},
link: function(scope, element) {
var series = scope.series,
config = scope.config,
labels = config.labels,
margin = {top: 15, right: 15, bottom: 35, left: 50},
fmt = d3.format('.3r'),
fmtLong = d3.format('.2f'),
// Define Axes
xAxis = d3.svg.axis().outerTickSize(0).orient("bottom").tickFormat(d3.format('.2r')),
yAxis = d3.svg.axis().outerTickSize(0).orient("left").tickFormat(fmt),
x = d3.scale.linear(),
y = d3.scale.linear();
// Create chart
var svg = d3.select(element[0]).append("svg");
var vis = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");
// Define Area
var area = d3.svg.area();
var gradient = vis.append("defs")
.append("linearGradient")
.attr("id", "gradient")
.attr("x1", "0%").attr("y1", "0%")
.attr("x2", "100%").attr("y2", "100%")
.attr("spreadMethod", "pad");
gradient.append("stop")
.attr("offset", "0%")
.attr("stop-color", "#ff8c0d")
.attr("stop-opacity", 1);
gradient.append("stop")
.attr("offset", "100%")
.attr("stop-color", "#ff3b00")
.attr("stop-opacity", 1);
// Create Y Axis SVG Elements
var yTxt = vis.append("g").attr("class", "y axis")
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", -40)
.attr("dy", ".1em")
.style("text-anchor", "middle")
.text(labels.yAxis.title + ' (' + labels.yAxis.unit + ')');
// Create X Axis SVG Elements
var xLbl = vis.append("g").attr("class", "x axis");
var xTxt = xLbl.append("text")
.attr("y", 30)
.attr("dy", ".1em")
.style("text-anchor", "middle")
.text(labels.xAxis.title + ' (' + labels.xAxis.unit + ')');
// Create and Add tooltip
var tip = vis.append("g").style("display", "none");
tip.append("rect").attr("width","4em").attr("height", "2em").attr("x", "0.5em").attr("y","-1em").attr("class","tip");
tip.append("circle")
.attr("class", "marker")
.attr("r", 4);
tip.append("text").attr("class", 'label x').attr("y", "-0.1em");
tip.append("text").attr("class", 'label y').attr("y", '0.7em');
/**
* Watch for changes in the series data (mass changes, etc)
*/
scope.$watchCollection('series', render);
angular.element($window).bind('orientationchange resize render', render);
function render() {
var width = element[0].parentElement.offsetWidth,
height = width * 0.6,
w = width - margin.left - margin.right,
h = height - margin.top - margin.bottom,
data = [],
func = series.func;
if (series.xMax == series.xMin) {
var yVal = func(series.xMin);
data.push([ series.xMin, yVal ]);
data.push([ series.xMin, yVal ]);
area.x(function(d,i) { return i * w; }).y0(h).y1(function(d) { return y(d[1]); });
} else {
for (var d = series.xMin; d <= series.xMax; d += 1) {
data.push([ d, func(d) ]);
}
area.x(function(d) { return x(d[0]); }).y0(h).y1(function(d) { return y(d[1]); });
}
// Update Chart Size
svg.attr("width", width).attr("height", height);
// Update domain and scale for axes;
x.range([0, w]).domain([series.xMin, series.xMax]);
xAxis.scale(x);
xLbl.attr("transform", "translate(0," + h + ")");
xTxt.attr("x", w/2);
y.range([h, 0]).domain([series.yMin, series.yMax]);
yAxis.scale(y);
yTxt.attr("x", -h/2);
vis.selectAll(".y.axis").call(yAxis);
vis.selectAll(".x.axis").call(xAxis);
// Remove existing elements
vis.selectAll('path.area').remove();
vis.insert("path",':first-child') // Area/Path to appear behind everything else
.datum(data)
.attr("class", "area")
.attr('fill', 'url(#gradient)')
.attr("d", area)
.on("mouseover", function() { tip.style("display", null); })
.on("mouseout", function() { tip.style("display", "none"); })
.on('mousemove', function() {
var xPos = d3.mouse(this)[0], x0 = x.invert(xPos), y0 = func(x0), flip = (xPos > w * 0.75);
tip.attr("transform", "translate(" + xPos + "," + y(y0) + ")");
tip.selectAll('rect').attr("x", flip? '-4.5em' : "0.5em").style("text-anchor", flip? 'end' : 'start');
tip.selectAll('text.label').attr("x", flip? "-1em" : "1em").style("text-anchor", flip? 'end' : 'start');
tip.select('text.label.x').text(fmtLong(x0) + ' ' + labels.xAxis.unit);
tip.select('text.label.y').text(fmtLong(y0) + ' ' + labels.yAxis.unit);
});
}
}
};
}]);

View File

@@ -1,121 +0,0 @@
angular.module('app').directive('barChart', function () {
function bName (build) {
return build.buildName + '\n' + build.name;
}
var insertLinebreaks = function (d) {
var el = d3.select(this);
var words = d.split('\n');
el.text('').attr('y', -5);
for (var i = 0; i < words.length; i++) {
var tspan = el.append('tspan').text(words[i]);
if (i > 0) {
tspan.attr('x', -9).attr('dy', 10);
}
}
};
return {
restrict: 'A',
scope:{
data: '=',
facet: '=',
height: '=',
width: '='
},
link: function(scope, element) {
var color = d3.scale.ordinal().range([ '#7b6888', '#6b486b', '#3182bd', '#a05d56', '#d0743c']),
width = scope.width,
labels = scope.facet.lbls,
fmt = scope.facet.fmt,
properties = scope.facet.props,
unit = scope.facet.unit,
margin = {top: 10, right: 20, bottom: 35, left: 150},
w = width - margin.left - margin.right;
// Create chart
var svg = d3.select(element[0]).append('svg').attr('width', width);
var vis = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
// Create and Add tooltip
var tip = d3.tip()
.attr('class', 'd3-tip')
.html(function(property, propertyIndex) {
return (labels? (labels[propertyIndex] + ': ') : '') + fmt(property.value) + ' ' + unit;
});
vis.call(tip);
// Create Y Axis SVG Elements
vis.append('g').attr('class', 'y axis');
vis.selectAll('g.y.axis g text').each(insertLinebreaks);
// Create X Axis SVG Elements
vis.append('g')
.attr('class', 'x axis')
.append('text')
.attr('y', 30)
.attr('x', w/2)
.attr('dy', '.1em')
.style('text-anchor', 'middle')
.text(scope.facet.title + (unit? (' (' + unit + ')') : ''));
/**
* Watch for changes in the comparison array (ships added/removed, sorting)
*/
scope.$watchCollection('data', function() {
var data = scope.data,
height = 45 + (25 * data.length),
h = height - margin.top - margin.bottom,
maxVal = d3.max(data, function(d) { return d3.max(properties, function(p) {return d[p]; }); }),
y0 = d3.scale.ordinal().domain(data.map(bName)).rangeRoundBands([0, h],0.3),
y1 = d3.scale.ordinal().domain(properties).rangeRoundBands([0, y0.rangeBand()]),
x = d3.scale.linear().range([0, w]).domain([0, maxVal]),
yAxis = d3.svg.axis().scale(y0).outerTickSize(0).orient('left'),
xAxis = d3.svg.axis().scale(x).outerTickSize(0).orient('bottom').tickFormat(d3.format('.2s'));
// Update chart size
svg.attr('height', height);
// Remove existing elements
vis.selectAll('.ship').remove();
vis.selectAll('rect').remove();
// Update X & Y Axis
vis.selectAll('.y.axis').call(yAxis);
vis.selectAll('.x.axis').attr('transform', 'translate(0,' + h + ')').call(xAxis);
// Update Y-Axis labels
vis.selectAll('g.y.axis g text').each(insertLinebreaks);
var group = vis.selectAll('.ship')
.data(scope.data, bName)
.enter().append('g')
.attr('class', 'g')
.attr('transform', function(build) { return 'translate(0,' + y0(bName(build)) + ')'; });
group.selectAll('rect')
.data(function(build) {
var o = [];
for (var i = 0; i < properties.length; i++) {
o.push({name: properties[i], value:build[properties[i]]});
}
return o;
})
.enter().append('rect')
.attr('height', y1.rangeBand())
.attr('x',0)
.attr('y', function(d) {return y1(d.name); })
.attr('width', function(d) { return x(d.value); })
.on('mouseover', tip.show)
.on('mouseout', tip.hide)
.style('fill', function(d) { return color(d.name); });
});
scope.$on('$destroy', function() {
tip.destroy(); // Remove the tooltip from the DOM
});
}
};
});

View File

@@ -1,80 +0,0 @@
angular.module('app').directive('comparisonTable', ['$state', function ($state) {
function tblHeader(facets) {
var r1 = ['<tr class="main"><th rowspan="2" class="prop" prop="name">Ship</th><th rowspan="2" class="prop" prop="buildName">Build</th>'];
var r2 = [];
for (var i = 0, l = facets.length; i < l; i++) {
if (facets[i].active) {
var f = facets[i];
var p = f.props;
var pl = p.length;
r1.push('<th rowspan="', f.props.length == 1 ? 2 : 1,'" colspan="',pl,'"');
if (pl == 1) {
r1.push(' prop="',p[0],'" class="prop"');
} else {
for (var j = 0; j < pl; j++) {
r2.push('<th prop="', p[j], '" class="prop ', j === 0? 'lft' : '', ' ">' , f.lbls[j], '</th>');
}
}
r1.push('>', f.title ,'</th>');
}
}
r1.push('</tr><tr>');
r1.push(r2.join(''));
r1.push('</tr>');
return r1.join('');
}
function tblBody(facets, builds) {
var body = [];
if(builds.length === 0) {
return '<td colspan="100" class="cen">No builds added to comparison!</td';
}
for (var i = 0, l = builds.length; i < l; i++) {
var b = builds[i];
body.push('<tr class="tr">');
var href = $state.href('outfit',{shipId: b.id, code: b.code, bn: b.buildName});
body.push('<td class="tl"><a href="', href,'">', b.name,'</a></td>');
body.push('<td class="tl"><a href="', href,'">', b.buildName,'</a></td>');
for (var j = 0, fl = facets.length; j < fl; j++) {
if (facets[j].active) {
var f = facets[j];
var p = f.props;
for (var k = 0, pl = p.length; k < pl; k++) {
body.push('<td>', f.fmt(b[p[k]]), '<u> ', f.unit, '</u></td>');
}
}
}
body.push('</tr>');
}
return body.join('');
}
return {
restrict: 'A',
link: function (scope, element) {
var header = angular.element('<thead></thead>');
var body = angular.element('<tbody></tbody>');
element.append(header);
element.append(body);
var updateAll = function (){
header.html(tblHeader(scope.facets));
body.html(tblBody(scope.facets, scope.builds));
};
scope.$watchCollection('facets', updateAll);
scope.$watch('tblUpdate', updateAll);
scope.$watchCollection('builds', function() {
body.html(tblBody(scope.facets, scope.builds));
});
}
};
}]);

View File

@@ -1,85 +0,0 @@
angular.module('app').directive('componentSelect', function () {
// Generting the HTML in this manner is MUCH faster than using an angular template.
function appendGroup(list, opts, cid, mass) {
var prevClass = null, prevRating = null;
for (var i = 0; i < opts.length; i++) {
var o = opts[i];
var id = o.id || (o.class + o.rating); // Common components' ID is their class and rating
if(i > 0 && opts.length > 3 && o.class != prevClass && (!o.grp || o.rating != prevRating || o.mode)) {
list.push('<br/>');
}
list.push('<li class="', o.name? 'lc' : 'c');
if (cid == id) {
list.push(' active');
}
list.push((o.maxmass && mass > o.maxmass)? ' disabled"' : '" cpid="', id, '">');
if(o.mode) {
list.push('<svg cpid="', id, '" class="icon lg"><use xlink:href="#mount-', o.mode , '"></use></svg> ');
}
list.push(o.class, o.rating);
if(o.missile) {
list.push('/' + o.missile);
}
if(o.name) {
list.push(' ' + o.name);
}
list.push('</li>');
prevClass = o.class;
prevRating= o.rating;
}
}
return {
restrict: 'A',
scope:{
opts: '=', // Component Options object
groups: '=', // Groups of Component Options
mass: '=', // Current ship unladen mass
s: '=' // Current Slot
},
link: function(scope, element) {
var list = [];
var cid = scope.s.id; // Slot's current component id
var component = scope.s.c; // Slot's Current Component (may be null/undefined)
var opts = scope.opts;
var groups = scope.groups;
var mass = scope.mass || 0;
if(groups) {
// At present time slots with grouped options (Hardpoints and Internal) can be empty
list.push('<div class="empty-c" cpid="empty">EMPTY</div>');
for (var g in groups) {
var grp = groups[g];
var grpCode = grp[Object.keys(grp)[0]].grp; // Nasty operation to get the grp property of the first/any single component
list.push('<div id="', grpCode ,'" class="select-group">', g, '</div><ul>');
appendGroup(list, grp, cid, mass);
list.push('</ul>');
}
} else {
list.push('<ul>');
appendGroup(list, opts, cid, mass);
list.push('</ul>');
}
element.html(list.join(''));
// If groups are present and a component is already selectd
if (groups && component && component.grp) {
var groupElement = angular.element(document.getElementById(component.grp));
var parentElem = element[0].parentElement;
parentElem.scrollTop = groupElement[0].offsetTop; // Scroll to currently selected group
}
}
};
});

View File

@@ -1,75 +0,0 @@
angular.module('app').directive('shipyardHeader', ['lodash', '$rootScope', 'Persist', 'ShipsDB', function (_, $rootScope, Persist, ships) {
return {
restrict: 'E',
templateUrl: 'views/_header.html',
scope: true,
link: function (scope) {
scope.openedMenu = null;
scope.ships = ships;
scope.allBuilds = Persist.builds;
scope.buildsList = Object.keys(scope.allBuilds).sort();
scope.allComparisons = Persist.comparisons;
scope.bs = Persist.state;
// Insurance options and management here for now.
$rootScope.insurance = {
opts: [
{ name:'Standard', pct: 0.05 },
{ name:'Alpha', pct: 0.025 },
{ name:'Beta', pct: 0.035 }
]
};
var insIndex = _.findIndex($rootScope.insurance.opts, 'name', Persist.getInsurance());
$rootScope.insurance.current = $rootScope.insurance.opts[insIndex != -1? insIndex : 0];
// Close menus if a navigation change event occurs
$rootScope.$on('$stateChangeStart',function(){
scope.openedMenu = null;
});
// Listen to close event to close opened menus or modals
$rootScope.$on('close', function () {
scope.openedMenu = null;
$rootScope.showAbout = false;
});
/**
* Save selected insurance option
*/
scope.updateInsurance = function(){
Persist.setInsurance($rootScope.insurance.current.name);
};
scope.openMenu = function (e, menu) {
e.stopPropagation();
if(menu == scope.openedMenu) {
scope.openedMenu = null;
return;
}
if ((menu == 'comp' || menu == 'b') && !scope.bs.hasBuilds) {
scope.openedMenu = null;
return;
}
scope.openedMenu = menu;
};
scope.about = function(e) {
e.preventDefault();
e.stopPropagation();
scope.openedMenu = null;
$rootScope.showAbout = true;
};
$rootScope.hideAbout = function (){
$rootScope.showAbout = false;
};
scope.$watchCollection('allBuilds', function() {
scope.buildsList = Object.keys(scope.allBuilds).sort();
});
}
};
}]);

View File

@@ -1,74 +0,0 @@
angular.module('app').directive('slider', ['$window', function ($window) {
return {
restrict: 'A',
scope:{
max: '=',
unit: '=',
change: '&onChange'
},
link: function(scope, element) {
var margin = {top: -10, right: 130, bottom: 0, left: 50},
height = 40, // Height is fixed
h = height - margin.top - margin.bottom,
fmt = d3.format('.2f'),
pct = d3.format('.1%'),
unit = scope.unit,
val = scope.max,
svg = d3.select(element[0]).append("svg"),
vis = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")"),
xAxis = vis.append("g").attr("class", "x slider-axis").attr("transform", "translate(0," + h / 2 + ")"),
x = d3.scale.linear(),
slider = vis.append("g").attr("class", "slider"),
filled = slider.append('path').attr('class', 'filled').attr("transform", "translate(0," + h/2 + ")"),
brush = d3.svg.brush().x(x).extent([scope.max, scope.max]).on("brush", brushed),
handle = slider.append("circle").attr("class", "handle").attr("r", '0.75em'),
lbl = slider.append("g").append("text").attr("y", h/2);
slider.call(brush);
slider.select(".background").attr("height", h);
handle.attr("transform", "translate(0," + h / 2 + ")");
/**
* Watch for changes in the max, window size
*/
scope.$watch('max', function(newMax, oldMax) {
val = newMax * (val / oldMax); // Retain percentage filled
render();
});
angular.element($window).bind('orientationchange resize', render);
function render() {
var width = element[0].offsetWidth, w = width - margin.left - margin.right;
svg.attr("width", width).attr("height", height);
x.domain([0, scope.max]).range([0, w]).clamp(true);
handle.attr("cx", x(val));
xAxis
.call(d3.svg.axis()
.scale(x)
.orient("bottom")
.tickFormat(function(d) { return d + unit; })
.tickSize(0)
.tickPadding(12))
.select(".domain");
lbl.attr('x', w + 20).text(fmt(val) + ' ' + unit + ' (' + pct(val / scope.max) + ')');
slider.call(brush.extent([val, val])).call(brush.event);
slider.selectAll(".extent,.resize").remove();
}
function brushed() {
val = brush.extent()[0];
if (d3.event.sourceEvent) { // not a programmatic event
val = x.invert(d3.mouse(this)[0]);
brush.extent([val, val]);
}
lbl.text(fmt(val) + ' ' + unit + ' (' + pct(val / scope.max) + ')');
scope.change({val: val});
handle.attr("cx", x(val));
filled.attr("d", "M0,0V0H" + x(val) + "V0");
}
}
};
}]);

View File

@@ -1,14 +0,0 @@
angular.module('app').directive('slotHardpoint', ['$rootScope', function ($r) {
return {
restrict: 'A',
scope:{
hp: '=',
size: '=',
lbl: '=',
},
templateUrl: 'views/_slot-hardpoint.html',
link: function (scope) {
scope.$r = $r;
}
};
}]);

View File

@@ -1,15 +0,0 @@
angular.module('app').directive('slotInternal', ['$rootScope', function ($r) {
return {
restrict: 'A',
scope:{
c: '=slot',
lbl: '=',
ft: '=',
},
templateUrl: 'views/_slot-internal.html',
link: function(scope) {
scope.$r = $r;
}
};
}]);

View File

@@ -1,65 +0,0 @@
/**
* BBCode Generator functions for embedding in the Elite Dangerous Forums
*/
angular.module('app').factory('Utils', ['$window','$state','$http', '$q', function ($window, $state, $http, $q) {
var shortenAPI = 'https://www.googleapis.com/urlshortener/v1/url?key=';
function shortenUrl(url) {
if ($window.navigator.onLine) {
return $http.post(shortenAPI + GAPI_KEY, {longUrl:url}).then(function(response) {
return response.data.id;
});
} else {
return $q.reject({statusText: 'Not Online'});
}
}
function comparisonBBCode(facets, builds, link) {
var colCount = 2, b, i, j, k, f, fl, p, pl, l = [];
for (i = 0; i < facets.length; i++) {
if (facets[i].active) {
f = facets[i];
p = f.props;
if (p.length == 1) {
l.push('[th][B][COLOR=#FF8C0D]', f.title, '[/COLOR][/B][/th]');
colCount++;
} else {
for (j = 0; j < p.length; j++) {
l.push('[th][B][COLOR=#FF8C0D]', f.title, '\n', f.lbls[j], '[/COLOR][/B][/th]');
colCount++;
}
}
}
}
l.push('[/tr]\n');
for (i = 0; i < builds.length; i++) {
b = builds[i];
//var href = $state.href('outfit',{shipId: b.id, code: b.code, bn: b.buildName}, {absolute: true});
l.push('[tr][td]', b.name,'[/td][td]', b.buildName ,'[/td]');
for (j = 0, fl = facets.length; j < fl; j++) {
if (facets[j].active) {
f = facets[j];
p = f.props;
for (k = 0, pl = p.length; k < pl; k++) {
l.push('[td="align: right"]', f.fmt(b[p[k]]), ' [size=-2]', f.unit, '[/size][/td]');
}
}
}
l.push('[/tr]\n');
}
l.push('[tr][td="align: center, colspan:',colCount,'"][size=-3]\n[url=', link,']Interactive Comparison at Coriolis.io[/url][/td][/tr]\n[/size][/table]');
l.unshift('[table="width:', colCount * 90,',align: center"]\n[tr][th][B][COLOR=#FF8C0D]Ship[/COLOR][/B][/th][th][B][COLOR="#FF8C0D"]Build[/COLOR][/B][/th]');
return l.join('');
}
return {
comparisonBBCode: comparisonBBCode,
shortenUrl: shortenUrl
};
}]);

View File

@@ -1,182 +0,0 @@
/**
* [description]
*/
angular.module('app').service('Persist', ['$window','lodash', function ($window, _) {
var LS_KEY_BUILDS = 'builds';
var LS_KEY_COMPARISONS = 'comparisons';
var localStorage = $window.localStorage;
var buildJson = null;
var comparisonJson = null;
// Safe check to determine if localStorage is enabled
try {
localStorage.setItem('s', 1);
localStorage.removeItem('s');
buildJson = localStorage.getItem(LS_KEY_BUILDS);
comparisonJson = localStorage.getItem(LS_KEY_COMPARISONS);
this.lsEnabled = true;
} catch(e) {
this.lsEnabled = false;
}
this.builds = buildJson? angular.fromJson(buildJson) : {};
this.comparisons = comparisonJson? angular.fromJson(comparisonJson) : {};
var buildCount = Object.keys(this.builds).length;
this.state = {
buildCount: buildCount,
hasBuilds: buildCount > 0,
hasComparisons: Object.keys(this.comparisons).length > 0
};
/**
* Persist a ship build in local storage.
*
* @param {string} shipId The unique id for a model of ship
* @param {string} name The name of the build
* @param {string} code The serialized code
*/
this.saveBuild = function (shipId, name, code) {
if (!this.lsEnabled) {
return;
}
if (!this.builds[shipId]) {
this.builds[shipId] = {};
}
if(!this.builds[shipId][name]) {
this.state.buildCount++;
this.state.hasBuilds = true;
}
this.builds[shipId][name] = code;
// Persist updated build collection to localStorage
localStorage.setItem(LS_KEY_BUILDS, angular.toJson(this.builds));
};
/**
* Get the serialized code/string for a build. Returns null if a
* build is not found.
*
* @param {string} shipId The unique id for a model of ship
* @param {string} name The name of the build
* @return {string} The serialized build string.
*/
this.getBuild = function (shipId, name) {
if (this.builds[shipId] && this.builds[shipId][name]) {
return this.builds[shipId][name];
}
return null;
};
/**
* Delete a build from local storage. It will also delete the ship build collection if
* it becomes empty
*
* @param {string} shipId The unique id for a model of ship
* @param {string} name The name of the build
*/
this.deleteBuild = function (shipId, name) {
if(this.lsEnabled && this.builds[shipId][name]) {
delete this.builds[shipId][name];
if (Object.keys(this.builds[shipId]).length === 0) {
delete this.builds[shipId];
this.state.buildCount--;
this.state.hasBuilds = this.state.buildCount > 0;
}
// Persist updated build collection to localStorage
localStorage.setItem(LS_KEY_BUILDS, angular.toJson(this.builds));
// Check if the build was used in existing comparisons
var comps = this.comparisons;
for (var c in comps) {
for (var i = 0; i < comps[c].builds.length; i++) { // For all builds in the current comparison
if(comps[c].builds[i].shipId == shipId && comps[c].builds[i].buildName == name) {
comps[c].builds.splice(i,1);
break; // A build is unique ber comparison
}
}
}
localStorage.setItem(LS_KEY_COMPARISONS, angular.toJson(this.comparisons));
}
};
/**
* Persist a comparison in localstorage.
*
* @param {string} name The name of the comparison
* @param {array} builds Array of builds
* @param {array} facets Array of facet indices
*/
this.saveComparison = function (name, builds, facets){
if (!this.lsEnabled) {
return;
}
if (!this.comparisons[name]) {
this.comparisons[name] = {};
}
this.comparisons[name] = {
facets: facets,
builds: _.map(builds, function (b) { return {shipId: b.id, buildName: b.buildName }; })
};
localStorage.setItem(LS_KEY_COMPARISONS, angular.toJson(this.comparisons));
this.state.hasComparisons = true;
};
/**
* [getComparison description]
* @param {string} name [description]
* @return {object} Object containing array of facets and ship id + build names
*/
this.getComparison = function (name) {
if (this.comparisons[name]) {
return this.comparisons[name];
}
return null;
};
/**
* Removes the comparison from localstorage.
* @param {string} name Comparison name
*/
this.deleteComparison = function (name) {
if (this.lsEnabled && this.comparisons[name]) {
delete this.comparisons[name];
localStorage.setItem(LS_KEY_COMPARISONS, angular.toJson(this.comparisons));
this.state.hasComparisons = Object.keys(this.comparisons).length > 0;
}
};
/**
* Delete all builds and comparisons from localStorage
*/
this.deleteAll = function() {
angular.copy({}, this.builds); // Empty object but keep original instance
angular.copy({}, this.comparisons);
this.state.hasBuilds = false;
this.state.buildCount = 0;
if (this.lsEnabled) {
localStorage.removeItem(LS_KEY_BUILDS);
localStorage.removeItem(LS_KEY_COMPARISONS);
}
};
this.getInsurance = function () {
if (this.lsEnabled) {
return localStorage.getItem('insurance');
}
return null;
};
this.setInsurance = function (name) {
if (this.lsEnabled) {
return localStorage.setItem('insurance', name);
}
};
this.isEnabled = function() {
return this.lsEnabled;
};
}]);

View File

@@ -1,89 +0,0 @@
/**
* Service managing seralization and deserialization of models for use in URLs and persistene.
*/
angular.module('app').service('Serializer', ['lodash', function (_) {
/**
* Serializes the ships selected components for all slots to a URL friendly string.
* @param {Ship} ship The ship to be serialized.
* @return {string} Encoded string of components
*/
this.fromShip = function(ship) {
var data = [
ship.bulkheads.id,
_.map(ship.common, idToStr),
_.map(ship.hardpoints, idToStr),
_.map(ship.internal, idToStr),
];
return _.flatten(data).join('');
};
/**
* Updates an existing ship instance's slots with components determined by the
* code.
*
* @param {Ship} ship The ship instance to be updated
* @param {string} code The string to deserialize
*/
this.toShip = function (ship, code) {
var commonCount = ship.common.length;
var hpCount = commonCount + ship.hardpoints.length;
var comps = {
bulkheads: code.charAt(0) * 1,
common: new Array(ship.common.length),
hardpoints: new Array(ship.hardpoints.length),
internal: new Array(ship.internal.length)
};
// TODO: improve...
for (var i = 1, c = 0, l = code.length; i < l; i++) {
var empty = code.charAt(i) == '-';
if (c < commonCount) {
comps.common[c] = empty? 0 : code.substring(i, i + 2);
} else if (c < hpCount) {
comps.hardpoints[c - commonCount] = empty? 0 : code.substring(i, i + 2);
} else {
comps.internal[c - hpCount] = empty? 0 : code.substring(i, i + 2);
}
if (!empty) {
i++;
}
c++;
}
ship.buildWith(comps);
};
this.fromComparison = function (name, builds, facets, predicate, desc) {
var shipBuilds = [];
builds.forEach(function (b) {
shipBuilds.push({s: b.id, n: b.buildName, c: this.fromShip(b)});
}.bind(this));
return LZString.compressToBase64(angular.toJson({
n: name,
b: shipBuilds,
f: facets,
p: predicate,
d: desc? 1 : 0
})).replace(/\//g,'-');
};
this.toComparison = function (code) {
return angular.fromJson(LZString.decompressFromBase64(code.replace(/-/g,'/')));
};
/**
* Utility function to retrieve a safe string for selected component for a slot.
* Used for serialization to code only.
*
* @private
* @param {object} slot The slot object.
* @return {string} The id of the selected component or '-' if none selected
*/
function idToStr(slot) {
return (slot.id === null)? '-' : slot.id;
}
}]);

View File

@@ -1,68 +0,0 @@
angular.module('shipyard').factory('ComponentSet', ['lodash', function (_) {
function ComponentSet(components, mass, maxCommonArr, maxInternal, maxHardPoint) {
this.mass = mass;
this.common = {};
this.internal = {};
this.hardpoints = {};
this.hpClass = {};
this.intClass = {};
for (var i = 0; i < components.common.length; i ++) {
var max = maxCommonArr[i];
switch (i) {
// Slots where component class must be equal to slot class
case 3: // Life Support
case 5: // Sensors
this.common[i] = filter(components.common[i], max, max, this.mass);
break;
// Other slots can have a component of class lower than the slot class
default:
this.common[i] = filter(components.common[i], max, 0, this.mass);
}
}
for(var h in components.hardpoints) {
this.hardpoints[h] = filter(components.hardpoints[h], maxHardPoint, 0, this.mass);
}
for(var g in components.internal) {
this.internal[g] = filter(components.internal[g], maxInternal, 0, this.mass);
}
}
ComponentSet.prototype.getHps = function(c) {
if(!this.hpClass[c]) {
var o = this.hpClass[c] = {};
for(var key in this.hardpoints) {
var data = filter(this.hardpoints[key], c, c? 1 : 0, this.mass);
if(data.length) { // If group is not empty
o[key] = data;
}
}
}
return this.hpClass[c];
};
ComponentSet.prototype.getInts = function(c) {
if(!this.intClass[c]) {
var o = this.intClass[c] = {};
for(var key in this.internal) {
var data = filter(this.internal[key], c, 0, this.mass);
if(data.length) { // If group is not empty
o[key] = data;
}
}
}
return this.intClass[c];
};
function filter (data, maxClass, minClass, mass) {
return _.filter(data, function (c) {
return c.class <= maxClass && c.class >= minClass && (c.maxmass === undefined || mass <= c.maxmass);
});
}
return ComponentSet;
}]);

View File

@@ -1,193 +0,0 @@
angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', 'calcJumpRange', 'lodash', function (Components, calcShieldStrength, calcJumpRange, _) {
/**
* Ship model used to track all ship components and properties.
*
* @param {string} id Unique ship Id / Key
* @param {object} properties Basic ship properties such as name, manufacturer, mass, etc
* @param {object} slots Collection of slot groups (standard/common, internal, hardpoints) with their max class size.
*/
function Ship(id, properties, slots) {
this.id = id;
this.incCost = true;
this.cargoScoop = { enabled: true, c: Components.cargoScoop() };
this.bulkheads = { incCost: true, maxClass: 8 };
for (var p in properties) { this[p] = properties[p]; } // Copy all base properties from shipData
for (var slotType in slots) { // Initialize all slots
var slotGroup = slots[slotType];
var group = this[slotType] = []; // Initialize Slot group (Common, Hardpoints, Internal)
for(var i = 0; i < slotGroup.length; i++){
group.push({id: null, c: null, enabled: true, incCost: true, maxClass: slotGroup[i]});
}
}
}
/**
* Builds/Updates the ship instance with the components[comps] passed in.
* @param {object} comps Collection of components used to build the ship
*/
Ship.prototype.buildWith = function(comps) {
var internal = this.internal;
var common = this.common;
var hps = this.hardpoints;
var i,l;
this.bulkheads.id = comps.bulkheads || 0;
this.bulkheads.c = Components.bulkheads(this.id, this.bulkheads.id);
for(i = 0, l = comps.common.length; i < l; i++) {
common[i].id = comps.common[i];
common[i].c = Components.common(i, comps.common[i]);
}
for(i = 0, l = comps.hardpoints.length; i < l; i++) {
if (comps.hardpoints[i] !== 0) {
hps[i].id = comps.hardpoints[i];
hps[i].c = Components.hardpoints(comps.hardpoints[i]);
} else {
hps[i].c = hps[i].id = null;
}
}
for(i = 0, l = comps.internal.length; i < l; i++) {
if (comps.internal[i] !== 0) {
internal[i].id = comps.internal[i];
internal[i].c = Components.internal(comps.internal[i]);
} else {
internal[i].id = internal[i].c = null;
}
}
this.updateTotals();
};
/**
* Updates the ship totals based on the components for every slot.
*/
Ship.prototype.updateTotals = function() {
var c = _.reduce(this.common, optsSum, {cost: 0, power: 0, mass: 0});
var i = _.reduce(this.internal, optsSum, {cost: 0, power: 0, mass: 0, capacity: 0, armouradd: 0});
var h = _.reduce(this.hardpoints, hpSum, {cost: 0, active: 0, passive: 0, mass: 0, shieldmul: 1});
var fsd = this.common[2].c; // Frame Shift Drive;
var sgSI = this.findInternalByGroup('sg'); // Find Shield Generator slot Index if any
this.totalCost = c.cost + i.cost + h.cost + (this.incCost? this.cost : 0) + (this.bulkheads.incCost? this.bulkheads.c.cost : 0);
this.unladenMass = c.mass + i.mass + h.mass + this.mass + this.bulkheads.c.mass;
this.powerAvailable = this.common[0].c.pGen; // Power Plant
this.fuelCapacity = this.common[6].c.capacity;
this.maxMass = this.common[1].c.maxmass; // Thrusters Max Mass
this.cargoCapacity = i.capacity;
this.ladenMass = this.unladenMass + this.cargoCapacity + this.fuelCapacity;
this.powerRetracted = c.power + i.power + h.passive + (this.cargoScoop.enabled? this.cargoScoop.c.power : 0);
this.powerDeployed = this.powerRetracted + h.active;
this.armourAdded = i.armouradd;
this.shieldMultiplier = h.shieldmul;
this.unladenJumpRange = calcJumpRange(this.unladenMass + fsd.maxfuel, fsd); // Include fuel weight for jump
this.ladenJumpRange = calcJumpRange(this.ladenMass, fsd);
this.shieldStrength = sgSI != -1? calcShieldStrength(this.mass, this.shields, this.internal[sgSI].c, this.shieldMultiplier) : 0;
this.armourTotal = this.armourAdded + this.armour;
// TODO: shield recharge rate based pips, shield generator, power distributor
// TODO: armor bonus / damage reduction for bulkheads
// TODO: Damage / DPS total (for all weapons)
};
/**
* Utilify function for summing the components properties
*
* @private
* @param {object} sum Sum of cost, power, mass, capacity
* @param {object} slot Slot object
* @return {object} The mutated sum object
*/
function optsSum(sum, slot) {
var c = slot.c;
if (c) { // The slot has a component installed
sum.cost += (slot.incCost && c.cost)? c.cost : 0;
sum.power += (slot.enabled && c.power)? c.power : 0;
sum.mass += c.mass || 0;
sum.capacity += c.capacity || 0;
sum.armouradd += c.armouradd || 0;
}
return sum;
}
/**
* Utilify function for summing the hardpoint properties
*
* @private
* @param {object} sum Sum of cost, power, etc
* @param {object} slot Slot object
* @return {object} The mutated sum object
*/
function hpSum(sum, slot) {
var c = slot.c;
if (c) { // The slot has a component installed
sum.cost += (slot.incCost && c.cost)? c.cost : 0;
sum[c.passive? 'passive': 'active'] += slot.enabled? c.power : 0;
sum.mass += c.mass || 0;
sum.shieldmul += c.shieldmul || 0;
}
return sum;
}
Ship.prototype.useBulkhead = function(index) {
this.bulkheads.id = index;
this.bulkheads.c = Components.bulkheads(this.id, index);
this.updateTotals(); // Update mass, range, shield strength, armor
};
/**
* Update a slot with a the component if the id is different from the current id for this slot.
* Has logic handling components that you may only have 1 of (Shield Generator or Refinery).
*
* @param {object} slot The component slot
* @param {string} id Unique ID for the selected component
* @param {object} component Properties for the selected component
*/
Ship.prototype.use = function(slot, id, component) {
if (slot.id != id) { // Selecting a different component
var slotIndex = this.internal.indexOf(slot);
// Slot is an internal slot, is not being emptied, and the selected component group/type must be of unique
if(slotIndex != -1 && component && _.includes(['sg','rf','fs'],component.grp)) {
// Find another internal slot that already has this type/group installed
var similarSlotIndex = this.findInternalByGroup(component.grp);
// If another slot has an installed component with of the same type
if (similarSlotIndex != -1 && similarSlotIndex != slotIndex) {
// Empty the slot
this.internal[similarSlotIndex].id = null;
this.internal[similarSlotIndex].c = null;
}
}
// Update slot with selected component (or empty)
slot.id = id;
slot.c = component;
this.updateTotals();
}
};
/**
* Calculate jump range using the installed FSD and the
* specified mass which can be more or less than ships actual mass
* @param {number} mass Mass in tons
* @param {number} fuel Fuel available in tons
* @return {number} Jump range in Light Years
*/
Ship.prototype.jumpRangeWithMass = function (mass, fuel) {
return calcJumpRange(mass, this.common[2].c, fuel);
};
/**
* Find an internal slot that has an installed component of the specific group.
*
* @param {string} group Component group/type
* @return {number} The index of the slot in ship.internal
*/
Ship.prototype.findInternalByGroup = function(group) {
return _.findIndex(this.internal, function (slot) {
return slot.c && slot.c.grp == group;
});
};
return Ship;
}]);

View File

@@ -1,182 +0,0 @@
/**
* This module contains all of the logic and models corresponding to
* information or behavoir in Elite Dangerous.
*
* This file contains values and functions that can be reused across the app.
*
* @requires ngLodash
*/
angular.module('shipyard', ['ngLodash'])
// Create 'angularized' references to DB.This will aid testing
.constant('ShipsDB', DB.ships)
.constant('ComponentsDB', DB.components)
.value('commonArray', [
'Power Plant',
'Thrusters',
'Frame Shift Drive',
'Life Support',
'Power Distributor',
'Sensors',
'Fuel Tank'
])
.value('internalGroupMap', {
fs:'Fuel Scoop',
sc:'Scanners',
am:'Auto Field-Maintenance Unit',
cr:'Cargo Racks',
fi:'FSD Interdictor',
hb:'Hatch Breaker Limpet Ctrl',
hr:'Hull Reinforcement Package',
rf:'Refinery',
sb:'Shield Cell Bank',
sg:'Shield Generator',
dc:'Docking Computer'
})
.value('hardpointsGroupMap', {
'bl': "Beam Laser",
'ul': "Burst Laser",
'c': "Cannon",
'cs': "Cargo Scanner",
'cm': "Countermeasure",
'fc': "Fragment Cannon",
'fs': "Frame Shift Wake Scanner",
'kw': "Kill Warrant Scanner",
'nl': "Mine Launcher",
'ml': "Mining Laser",
'mr': "Missile Rack",
'pa': "Plasma Accelerator",
'mc': "Multi-cannon",
'pl': "Pulse Laser",
'rg': "Rail Gun",
'sb': "Shield Booster",
'tp': "Torpedo Pylon"
})
.value('shipPurpose', {
mp: 'Multi Purpose',
fr: 'Freighter',
ex: 'Explorer',
co: 'Combat',
pa: 'Passenger Transport'
})
.value('shipSize', [
'N/A',
'Small',
'Medium',
'Large',
'Capital',
])
.value('hardPointClass', [
'Utility',
'Small',
'Medium',
'Large',
'Huge'
])
/**
* Array of all Ship properties (facets) organized into groups
* used for ship comparisons.
*
* @type {Array}
*/
.value('ShipFacets', [
{ // 0
title: 'Agility',
props: ['agility'],
unit: '',
fmt: 'fCrd'
},
{ // 1
title: 'Speed',
props: ['speed', 'boost'],
lbls: ['Thrusters', 'Boost'],
unit: 'M/s',
fmt: 'fRound'
},
{ // 2
title: 'Armour',
props: ['armourTotal'],
unit: '',
fmt: 'fCrd'
},
{ // 3
title: 'Shields',
props: ['shieldStrength'],
unit: 'Mj',
fmt: 'fRound'
},
{ // 4
title: 'Jump Range',
props: ['unladenJumpRange', 'ladenJumpRange'],
lbls: ['Unladen', 'Laden'],
unit: 'LY',
fmt: 'fRound'
},
{ // 5
title: 'Mass',
props: ['unladenMass', 'ladenMass'],
lbls: ['Unladen', 'Laden'],
unit: 'T',
fmt: 'fRound'
},
{ // 6
title: 'Cargo',
props: ['cargoCapacity'],
unit: 'T',
fmt: 'fRound'
},
{ // 7
title: 'Fuel',
props: ['fuelCapacity'],
unit: 'T',
fmt: 'fRound'
},
{ // 8
title: 'Power',
props: ['powerRetracted','powerDeployed','powerAvailable'],
lbls: ['Retracted', 'Deployed', 'Available'],
unit: 'MW',
fmt: 'fPwr'
},
{ // 9
title: 'Cost',
props: ['totalCost'],
unit: 'CR',
fmt: 'fCrd'
}
])
/**
* Calculate the maximum single jump range based on mass and a specific FSD
*
* @param {number} mass Mass of a ship: laden, unlanden, partially laden, etc
* @param {object} fsd The FDS object/component with maxfuel, fuelmul, fuelpower, optmass
* @param {number} fuel Optional - The fuel consumed during the jump (must be less than the drives max fuel per jump)
* @return {number} Distance in Light Years
*/
.value('calcJumpRange', function(mass, fsd, fuel) {
return Math.pow(Math.min(fuel === undefined? fsd.maxfuel : fuel, fsd.maxfuel) / fsd.fuelmul, 1 / fsd.fuelpower ) * fsd.optmass / mass;
})
/**
* Calculate the a ships shield strength based on mass, shield generator and shield boosters used.
*
* @private
* @param {number} mass Current mass of the ship
* @param {number} shields Base Shield strength MJ for ship
* @param {object} sg The shield generator used
* @param {number} multiplier Shield multiplier for ship (1 + shield boosters if any)
* @return {number} Approximate shield strengh in MJ
*/
.value('calcShieldStrength', function (mass, shields, sg, multiplier) {
if (!sg) {
return 0;
}
if (mass <= sg.minmass) {
return shields * multiplier * sg.minmul;
}
if (mass < sg.optmass) {
return shields * multiplier * (sg.minmul + (mass - sg.minmass) / (sg.optmass - sg.minmass) * (sg.optmul - sg.minmul));
}
if (mass < sg.maxmass) {
return shields * multiplier * (sg.optmul + (mass - sg.optmass) / (sg.maxmass - sg.optmass) * (sg.maxmul - sg.optmul));
}
return shields * multiplier * sg.maxmul;
});

View File

@@ -1,44 +0,0 @@
angular.module('shipyard').service('Components', ['lodash', 'ComponentsDB', 'ShipsDB', 'ComponentSet', function (_, C, Ships, ComponentSet) {
this.cargoScoop = function() {
return { name: 'Cargo Hatch', class: 1, rating: 'H', power: 0.6};
};
this.common = function (typeIndex, componentId) {
return C.common[typeIndex][componentId];
};
this.hardpoints = function(id) {
for (var n in C.hardpoints) {
var group = C.hardpoints[n];
for (var i = 0; i < group.length; i++) {
if (group[i].id == id) {
return group[i];
}
}
}
return null;
};
this.internal = function(id) {
for (var n in C.internal) {
var group = C.internal[n];
for (var i = 0; i < group.length; i++) {
if (group[i].id == id) {
return group[i];
}
}
}
return null;
};
this.bulkheads = function(shipId, bulkheadsId) {
return C.bulkheads[shipId][bulkheadsId];
};
this.forShip = function (shipId) {
var ship = Ships[shipId];
return new ComponentSet(C, ship.properties.mass, ship.slots.common, ship.slots.internal[0], ship.slots.hardpoints[0]);
};
}]);

View File

@@ -1,8 +0,0 @@
.deep-space {
background-image: url(images/deep-space-1920x1080.jpg);
}
.docking-bay {
background-image: url(images/bay-1920x1080.jpg);
}

View File

@@ -1,63 +0,0 @@
.d3-tip {
font-size: 0.8em;
padding: 0.25em 0.5em;
background: @primary-disabled;
color: @primary-bg;
pointer-events: none;
}
/* Creates a small triangle extender for the tooltip */
.d3-tip:after {
box-sizing: border-box;
display: inline;
font-size: 10px;
width: 100%;
line-height: 1;
color: @primary-disabled;
position: absolute;
pointer-events: none;
}
/* Northward tooltips */
.d3-tip.n {
margin-top: -7px;
&:after {
content: "\25BC";
margin: -1px 0 0 0;
top: 100%;
left: 0;
text-align: center;
}
}
/* Eastward tooltips */
.d3-tip.e {
margin-left: 8px;
&:after {
content: "\25C0";
margin: -4px 0 0 0;
top: 50%;
left: -8px;
}
}
/* Southward tooltips */
.d3-tip.s {
margin-top: 8px;
&:after {
content: "\25B2";
margin: 0 0 1px 0;
top: -7px;
left: 0;
text-align: center;
}
}
/* Westward tooltips */
.d3-tip.w:after {
content: "\25B6";
margin: -4px 0 0 -1px;
top: 50%;
left: 100%;
}

View File

@@ -1,26 +0,0 @@
@font-face {
font-family: 'Orbitron-Regular';
src: url('fonts/orbitron-regular-webfont.eot');
src: url('fonts/orbitron-regular-webfont.eot?#iefix') format('embedded-opentype'),
url('fonts/orbitron-regular-webfont.woff2') format('woff2'),
url('fonts/orbitron-regular-webfont.woff') format('woff'),
url('fonts/orbitron-regular-webfont.ttf') format('truetype'),
url('fonts/orbitron-regular-webfont.svg#orbitronregular') format('svg');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'eurocaps';
src: url('fonts/eurocaps-webfont.eot');
src: url('fonts/eurocaps-webfont.eot?#iefix') format('embedded-opentype'),
url('fonts/eurocaps-webfont.woff2') format('woff2'),
url('fonts/eurocaps-webfont.woff') format('woff'),
url('fonts/eurocaps-webfont.ttf') format('truetype'),
url('fonts/eurocaps-webfont.svg#euro_capsregular') format('svg');
font-weight: normal;
font-style: normal;
}
@fStandard: 'eurocaps', Helvetica, sans-serif;
@fTitle: 'Orbitron-Regular', Arial, sans-serif;

View File

@@ -1,27 +0,0 @@
.icon {
display: inline-block;
vertical-align: middle;
width: 1.1em;
height: 1em;
&.sm {
width: 0.8em;
height: 0.75em;
}
&.tn {
width: 0.6em;
height: 0.5em;
}
&.lg {
width: 1.6em;
height: 1.5em;
}
&.xl {
width: 2.1em;
height: 2em;
}
}

View File

@@ -1,65 +0,0 @@
.list {
margin: 1em 0;
cursor: default;
font-size: 0.8em;
min-width: 25%;
text-align: left;
.user-select-none();
box-sizing: border-box;
.header {
width: 100%;
margin-bottom: 0.4em;
font-family: @fStandard;
color: @bgBlack;
background-color: @primary-disabled;
text-transform: uppercase;
text-align: center;
}
table {
width: 100%;
text-align: right;
td {
padding-right: 0.5em;
}
}
.items {
margin-bottom: 10px;
clear: both;
overflow: hidden;
.item {
clear: both;
margin: 1px 0 0;
overflow: hidden;
.val {
float:right;
text-align: right;
}
.lbl {
float: left;
}
color: @disabled;
cursor: pointer;
&.enabled {
color: @fg;
}
&.consumer {
.val:before {
content: "-";
}
}
&.untoggleable {
cursor: default;
}
}
}
}

View File

@@ -1,68 +0,0 @@
#outfit {
font-size: 1.1em;
max-width: 1200px;
margin: 0 auto;
.user-select-none();
.tablet({
width: 100%;
min-width: 750px;
font-size: 0.8em;
});
}
#overview {
h1 {
margin: 0;
float: left;
}
overflow: hidden;
}
#summary {
.user-select-none();
width: 100%;
margin: 1em 0;
font-size: 0.8em;
border-collapse: collapse;
tbody td {
padding: 0 0.5em;
}
}
#build {
float: right;
line-height: 2em;
font-size: 0.8em;
input {
background: none;
line-height: 1.5em;
font-size: 0.8em;
box-sizing: border-box;
display: inline-block;
padding: 0.5em;
&:focus {
border: 1px solid @primary;
color: @primary;
}
}
}
#hardpoints, #utility, #standard {
padding-right: 0.3em;
.slot {
clear: left;
}
}
#internal {
.slot {
clear: left;
}
}

View File

@@ -1,101 +0,0 @@
.select {
color: @primary-disabled;
position: absolute;
left: -1px;
padding: 0.5em 0;
width: 100%;
margin: 0;
max-height: 300px;
overflow-y: auto;
overflow-x: hidden;
z-index: 0;
-webkit-overflow-scrolling: touch;
background-color: @bg;
border: 1px solid @primary;
white-space: nowrap;
text-align: center;
.select-group {
text-align: left;
margin: 0.5em 0;
padding-left: 5px;
border-top: 1px solid @primary-disabled;
border-bottom: 1px solid @primary-disabled;
}
.empty-c, .c, .lc {
cursor: pointer;
color: @primary-disabled;
stroke-width: 1em;
stroke: @primary-disabled;
&:hover {
color: @warning;
stroke: @warning;
}
&.disabled {
cursor: not-allowed;
color: @disabled;
stroke: @disabled;
}
&.active {
color: @secondary;
stroke: @secondary;
}
}
@optionSpacing: 1.8em;
.lc {
line-height:@optionSpacing;
text-align: left;
}
.empty-c {
line-height:@optionSpacing;
text-align: center;
}
.c {
border:1px solid @primary-disabled;
display: inline-block;
padding: 0.1em;
margin: 0.3em;
width: 2em;
line-height: @optionSpacing;
text-align: center;
&:hover {
border:1px solid @warning;
}
&.disabled {
border:1px solid @disabled;
}
&.active {
border:1px solid @secondary;
}
}
ul {
display: inline-block;
text-align: left;
min-width: 15em;
margin: 0 auto;
padding: 0;
list-style: none;
}
&.hardpoint {
.c {
width: 4em;
padding: 0.1em 0.5em;
}
ul {
width: 17em;
}
}
}

View File

@@ -1,42 +0,0 @@
.slider-axis {
line, path {
fill: none;
stroke: @primary-disabled;
}
text {
font-size: 0.8em;
fill: @primary-disabled;
}
.domain {
fill: none;
stroke: @primary;
stroke-opacity: .3;
stroke-width: 0.7em;
stroke-linecap: round;
}
}
.slider {
text {
dominant-baseline: central;
fill: @primary;
}
.filled {
stroke-width: 0.3em;
stroke-linecap: round;
stroke: @primary-disabled;
}
.handle {
fill: @primary;
stroke-opacity: .5;
cursor: crosshair;
}
}

View File

@@ -1,85 +0,0 @@
.slot-group {
width: 25%;
margin: 0;
box-sizing: border-box;
.user-select-none();
cursor: default;
h1 {
font-family: @fStandard;
color: @bgBlack;
background-color: @primary-disabled;
text-transform: uppercase;
margin: 0.1em 0;
font-size: 0.8em;
padding-left: 0.5em;
font-weight: normal;
}
}
.slot {
float: left;
text-align: left;
width: 100%;
font-size: 0.75em;
margin-top: 0.5em;
position: relative;
z-index: 0;
padding-right: 0.4em;
padding-left: 1.65em;
box-sizing: border-box;
background-color: @primary-bg;
border: 1px solid @primary-disabled;
color: @fg;
fill: @disabled;
.details {
min-height: 2.5em;
overflow: hidden;
height: 100%;
cursor: pointer;
text-transform: none;
}
.cb {
overflow: hidden;
}
.l {
margin-right: 0.8em;
}
.sz {
text-align: center;
position: absolute;
top: 0;
height: 100%;
left: 0;
font-size: 1.2em;
width: 1.2em;
color: @primary-disabled;
border-right: 1px solid @primary-disabled;
box-sizing: border-box;
}
.empty {
font-size: 1.5em;
color: lighten(@primary-bg, 12%);
text-align: center;
letter-spacing: 0.1em;
line-height: 1.7em;
}
&.selected {
color: @primary-bg;
background-color: @primary;
border: 1px solid @primary;
z-index: 1;
.sz {
color: @primary;
background-color: @primary-bg;
border-right: 1px solid @primary;
}
}
}

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