First working version

master
marcel 2 years ago
parent 8f022ebfe3
commit 664f2d4b3a
  1. 36
      README.md
  2. 5
      aprs_utils/aprs_log/2021-12-27_telemetry_PE1RXF-7.dat
  3. 5
      aprs_utils/aprs_log/2021-12-28_messages_from_PE1RXF-7_extracted_datafields.dat
  4. 18
      aprs_utils/aprs_log/2021-12-28_telemetry_PE1RXF-7.dat
  5. 228
      aprs_utils/aprs_log/aprs_received_messages.log
  6. 36
      aprs_utils/aprs_log/aprs_send_messages.log
  7. 36
      aprs_utils/aprs_log/aprs_stations_heard_digipeated.log
  8. 8
      aprs_utils/aprs_log/aprs_stations_heard_direct.log
  9. 1
      aprs_utils/aprs_log/latest_telemetry_PE1RXF-7.dat
  10. 1
      aprs_utils/aprs_log/messages_from_PE1RXF-7_latest_telemetry_data.dat
  11. 2
      aprs_utils/aprs_log/telemetry_PE1RXF-7_max_values.dat
  12. 2
      aprs_utils/aprs_log/telemetry_PE1RXF-7_min_values.dat
  13. 1
      aprs_utils/beacon_ax0.txt
  14. 1
      aprs_utils/beacon_ax1.txt
  15. 44
      aprs_utils/config.shlib
  16. 41
      aprs_utils/crontab.pe1rxf
  17. 276
      aprs_utils/generate_diagrams_from_aprs_data_PE1RXF-7.sh
  18. 132
      aprs_utils/get_max_min_values.sh
  19. 73
      aprs_utils/pe1rxf-aprs-server.cfg
  20. 71
      aprs_utils/pe1rxf-aprs-server.cfg.defaults
  21. 62
      aprs_utils/pe1rxf-aprs-server.sh
  22. 217
      aprs_utils/process_aprs_messages.sh
  23. 182
      aprs_utils/process_traffic.sh
  24. 52
      aprs_utils/send_beacon_external_radio.sh
  25. 36
      aprs_utils/send_beacon_internal_radio.sh
  26. 131
      aprs_utils/send_message.sh
  27. 236
      aprs_utils/set_beacon.sh
  28. BIN
      documentation/APRS101.PDF
  29. BIN
      documentation/APRS_protocol_nodes_PE1RXF.pdf
  30. BIN
      documentation/Raspberry-Pi-APRS.pdf
  31. BIN
      documentation/aprx-manual.pdf
  32. 246
      installation_pe1rxf-aprs-server.txt
  33. BIN
      screenshots/screenshot_main_page.png
  34. BIN
      screenshots/screenshot_send_message.png
  35. BIN
      screenshots/screenshot_telemetry.png
  36. 73
      start_aprs_server.sh
  37. 4
      web-interface/css/font-awesome.min.css
  38. 87
      web-interface/css/popup.css
  39. 148
      web-interface/css/styles.css
  40. BIN
      web-interface/fonts/FontAwesome.otf
  41. BIN
      web-interface/fonts/fontawesome-webfont.eot
  42. 2671
      web-interface/fonts/fontawesome-webfont.svg
  43. BIN
      web-interface/fonts/fontawesome-webfont.ttf
  44. BIN
      web-interface/fonts/fontawesome-webfont.woff
  45. BIN
      web-interface/fonts/fontawesome-webfont.woff2
  46. 17
      web-interface/images/home.svg
  47. 125
      web-interface/images/mail-in.svg
  48. 132
      web-interface/images/mail-out.svg
  49. BIN
      web-interface/images/preload.gif
  50. 185
      web-interface/images/received.svg
  51. 38
      web-interface/images/settings.svg
  52. 155
      web-interface/images/telemetry.svg
  53. 468
      web-interface/index.php
  54. 34
      web-interface/less/animated.less
  55. 25
      web-interface/less/bordered-pulled.less
  56. 12
      web-interface/less/core.less
  57. 6
      web-interface/less/fixed-width.less
  58. 18
      web-interface/less/font-awesome.less
  59. 789
      web-interface/less/icons.less
  60. 13
      web-interface/less/larger.less
  61. 19
      web-interface/less/list.less
  62. 60
      web-interface/less/mixins.less
  63. 15
      web-interface/less/path.less
  64. 20
      web-interface/less/rotated-flipped.less
  65. 5
      web-interface/less/screen-reader.less
  66. 20
      web-interface/less/stacked.less
  67. 800
      web-interface/less/variables.less
  68. 34
      web-interface/scss/_animated.scss
  69. 25
      web-interface/scss/_bordered-pulled.scss
  70. 12
      web-interface/scss/_core.scss
  71. 6
      web-interface/scss/_fixed-width.scss
  72. 789
      web-interface/scss/_icons.scss
  73. 13
      web-interface/scss/_larger.scss
  74. 19
      web-interface/scss/_list.scss
  75. 60
      web-interface/scss/_mixins.scss
  76. 15
      web-interface/scss/_path.scss
  77. 20
      web-interface/scss/_rotated-flipped.scss
  78. 5
      web-interface/scss/_screen-reader.scss
  79. 20
      web-interface/scss/_stacked.scss
  80. 800
      web-interface/scss/_variables.scss
  81. 18
      web-interface/scss/font-awesome.scss
  82. 897
      web-interface/send_message.php
  83. 72
      web-interface/telemetry.php
  84. BIN
      web-interface/telemetry/humidity_graph.png
  85. BIN
      web-interface/telemetry/minmax_humidity_large_greenhouse.png
  86. BIN
      web-interface/telemetry/minmax_humidity_outside.png
  87. BIN
      web-interface/telemetry/minmax_humidity_small_greenhouse.png
  88. BIN
      web-interface/telemetry/minmax_temperature_large_greenhouse.png
  89. BIN
      web-interface/telemetry/minmax_temperature_outside.png
  90. BIN
      web-interface/telemetry/minmax_temperature_small_greenhouse.png
  91. BIN
      web-interface/telemetry/soilmoisture_graph.png
  92. BIN
      web-interface/telemetry/temperature_graph.png

@ -1,3 +1,37 @@
# pe1rxf-aprs-server
A dual band aprs digipeater with enhanced telemetry capabilities.
## A dual band APRS digipeater with enhanced telemetry capabilities.
This is the custom software for a self build two band APRS digipeater.
It runs on a Raspberry Pi Zero with Raspberry Pi OS Bullseye.
## In short
It can:
* Function as a normal digipeater (mono, dual or cross band)
* Work as an IGate (RX only or RX/TX)
* Send and receive APRS messages
* Display some basic statistics like heard stations.
* Process and display data from the custom telemetry devices from PE1RXF
In has (hardware):
* Two build in 1200bps AFSK modems
* Build in transceiver
* Connector for external (second) transceiver
* Two USB ports for a network adapter and a third modem
* Real Time Clock
* Raspberry Pi Zero
It has (software):
* APRX digipeater software for the basic functions
* Apache2 web server for the user interface
* Custom software (from this repository) for extra functionality
Want to know more? The complete guide (and more) is available on https://www.meezenest.nl/mees
![Main page](image screenshots/screenshot_main_page.png "Main page")
![Send message](image screenshots/screenshot_send_message.png "Send message")
![Telemetry](image screenshots/screenshot_telemetry.png "Telemetry")

@ -0,0 +1,5 @@
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:39,16.6,59.8,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0

@ -0,0 +1,5 @@
2021-12-28 11:48,16.2,57.8,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 11:58,16.1,57.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:08,16.0,57.4,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:18,16.1,59.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:19,16.1,59.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0

@ -0,0 +1,18 @@
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:29,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:39,16.6,59.8,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:49,16.9,59.4,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 12:59,17.1,59.6,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 13:24,16.3,58.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 13:24,16.3,58.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 13:24,16.3,58.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 13:34,16.1,59.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 13:44,16.1,59.1,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 13:54,16.1,59.1,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 14:04,16.1,59.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 14:05,16.1,59.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 14:15,16.2,59.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 14:25,16.2,59.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28 14:35,16.3,59.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0

@ -0,0 +1,228 @@
2021-12-26 10:18:05,ax0,PE1RXF-1,APRX29,Test message
2021-12-26 10:18:38,ax0,PE1RXF-1,APRX29,Test message
2021-12-26 10:18:56,ax1,PE1RXF-1,APRX29,Test message
2021-12-26 10:19:29,ax1,PA1RXF-1,APRX29,Test message
2021-12-26 10:28:22,ax1,PA1RXF-1,APRX29,Test message{001
2021-12-26 10:29:30,ax1,PE1RXF-1,APRX29,Test message{001
2021-12-26 10:30:20,ax1,PE1RXF-1,APRX29,Test message{001
2021-12-26 10:33:16,ax0,PE1RXF-1,APRX29,Test message{001
2021-12-26 14:42:29,ax0,PE1RXF-1,APRX29,Test message 3
2021-12-26 14:57:09,ax0,KM6LYW-9,APZ100,Your sister swims out to meet troop ships.{2
2021-12-26 14:57:18,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 14:58:19,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 14:59:01,ax0,KM6LYW-9,APZ100,You will be recognized and honored as a community leader.{3
2021-12-26 14:59:09,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 19:39:59,ax0,KM6LYW-9,APZ100,"A tall, dark stranger will have more fun than you.{4"
2021-12-26 19:40:06,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 19:40:13,ax0,KM6LYW-9,APZ100,A tall, dark stranger will have more fun than you.{4
2021-12-26 19:40:20,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 19:40:34,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 19:40:54,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 19:41:01,ax0,KM6LYW-9,APZ100,ack0
2021-12-26 19:46:20,ax0,KM6LYW-9,APZ100,"A tall, dark stranger will have more fun than you."
2021-12-26 19:51:03,ax0,KM6LYW-9,APZ100,"Your lucky number has been disconnected.{5"
2021-12-26 19:51:14,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:51:25,ax0,KM6LYW-9,APZ100,"Your lucky number has been disconnected.{5"
2021-12-26 19:51:36,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:51:47,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:51:58,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:53:02,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:53:13,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:58:23,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:58:34,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 19:59:17,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 20:02:30,ax0,PE1RXF-1,APRX29,"Test message"
2021-12-26 20:02:50,ax0,PE1RXF-1,APRX29,"Test message"
2021-12-26 20:03:54,ax0,KM6LYW-9,APZ100,"Do not overtax your powers.{7"
2021-12-26 20:04:15,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 20:04:36,ax0,KM6LYW-9,APZ100,"Do not overtax your powers.{7"
2021-12-26 20:04:58,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 20:08:37,ax0,KM6LYW-9,APZ100,"Condense soup, not books!{8"
2021-12-26 20:11:58,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 20:12:18,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 20:16:26,ax0,KM6LYW-9,APZ100,"Condense soup, not books!{8"
2021-12-26 20:16:47,ax0,KM6LYW-9,APZ100,"Condense soup, not books!{8"
2021-12-26 20:17:08,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 20:17:49,ax0,KM6LYW-9,APZ100,"Do not overtax your powers.{7"
2021-12-26 20:18:10,ax0,KM6LYW-9,APZ100,"Do not overtax your powers.{7"
2021-12-26 20:18:51,ax0,KM6LYW-9,APZ100,"Condense soup, not books!{8"
2021-12-26 20:19:12,ax0,KM6LYW-9,APZ100,"Condense soup, not books!{8"
2021-12-26 21:21:22,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 21:21:42,ax0,KM6LYW-9,APZ100,"You will gain money by a speculation or lottery.{9"
2021-12-26 21:21:43,ax0,KM6LYW-9,APZ100,"You will gain money by a speculation or lottery.{9"
2021-12-26 21:21:45,ax0,KM6LYW-9,APZ100,"You will gain money by a speculation or lottery.{9"
2021-12-26 21:21:56,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-26 21:21:58,ax0,KM6LYW-9,APZ100,"ack0"
2021-12-28 08:58:07,ax0,PE1RXF-1,APRX29,"Test message"
2021-12-28 08:58:08,ax0,PE1RXF-1,APRX29,"Test message"
2021-12-28 09:07:02,ax0,PE1RXF-1,APRX29,"Test message"
2021-12-28 09:08:53,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:11:50,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:14:11,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:15:02,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:17:10,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:49:49,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:53:28,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:54:35,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:59:04,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 09:59:05,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:59:06,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 09:59:43,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01<0x1b><0xa9>"
2021-12-28 10:00:11,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01<0x0d>F"
2021-12-28 10:00:51,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:01:07,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:01:15,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:01:29,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:01:55,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01<0xfb>"
2021-12-28 10:01:59,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01<0xf2><0x9d>"
2021-12-28 10:02:01,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:02:06,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:02:24,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:02:33,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:02:50,ax0,PE1RXF-2,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:02:57,ax1,PE1RXF-1,APRX29,"PE1RXF-7 :?01"
2021-12-28 10:03:18,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:03:21,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:03:22,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:03:39,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:03:40,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:03:41,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:03:49,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:03:50,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:03:51,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:04:12,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:04:17,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:04:28,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:04:53,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:05:09,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:05:25,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:05:34,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:05:44,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:06:21,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:06:22,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:06:23,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:06:27,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:06:36,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:06:53,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:06:54,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:07:43,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:07:44,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:07:45,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:09:35,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:09:36,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:09:37,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:09:52,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:09:58,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:07,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:11:12,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:22,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:25,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:11:38,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:40,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:45,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:11:47,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:50,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:53,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:11:54,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:11:55,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:28,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:12:29,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:30,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:39,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:12:40,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:41,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:48,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:12:53,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:12:54,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:55,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:12:58,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:12:59,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:13:00,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:15:17,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:15:27,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:15:27,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:15:28,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:16:43,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:16:44,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:16:52,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:16:52,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:17:07,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:17:08,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:33:23,ax1,PE1RXF-1,APRX29,"?01"
2021-12-28 10:33:29,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:33:32,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:33:39,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:33:40,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:33:41,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:33:44,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:33:45,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:33:46,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:33:51,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:33:52,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:33:53,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:34:08,ax0,PE1RXF-2,APRX29,"?01"
2021-12-28 10:34:09,ax0,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:34:10,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:35:48,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:36:16,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:36:44,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 10:37:43,ax1,PE1RXF-7,APZMDM," 15.2,58.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0"
2021-12-28 10:38:21,ax1,PE1RXF-7,APZMDM,"ack10"
2021-12-28 10:39:17,ax1,PE1RXF-7,APZMDM,"rej51"
2021-12-28 10:41:04,ax1,PE1RXF-7,APZMDM,"ack21"
2021-12-28 10:41:05,ax1,PE1RXF-7,APZMDM," 15.3,59.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 10:41:10,ax1,PE1RXF-7,APZMDM," 15.3,59.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 10:41:15,ax1,PE1RXF-7,APZMDM," 15.3,59.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 10:41:20,ax1,PE1RXF-7,APZMDM," 15.3,59.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 10:41:50,ax1,PE1RXF-7,APZMDM,"ack21"
2021-12-28 10:44:08,ax0,PE1RXF-2,APRX29,"?21{21"
2021-12-28 10:44:09,ax0,PE1RXF-7,APZMDM,"ack21"
2021-12-28 10:44:10,ax1,PE1RXF-7,APZMDM,"ack21"
2021-12-28 10:44:11,ax1,PE1RXF-1,APRX29,"ack21"
2021-12-28 10:51:25,ax0,PE1RXF-7,APZMDM," 15.4,58.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 10:51:26,ax1,PE1RXF-7,APZMDM," 15.4,58.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 10:51:27,ax1,PE1RXF-1,APRX29,"ack002"
2021-12-28 10:51:28,ax1,PE1RXF-1,APRX29,"ack002"
2021-12-28 10:51:30,ax0,PE1RXF-7,APZMDM," 15.4,58.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 10:51:31,ax1,PE1RXF-7,APZMDM," 15.4,58.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 10:51:32,ax1,PE1RXF-1,APRX29,"ack002"
2021-12-28 10:51:33,ax1,PE1RXF-1,APRX29,"ack002"
2021-12-28 10:57:55,ax1,PE1RXF-7,APZMDM,"ack21"
2021-12-28 11:07:37,ax1,PE1RXF-7,APZMDM," 15.5,58.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:07:42,ax1,PE1RXF-7,APZMDM," 15.5,58.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:07:47,ax1,PE1RXF-7,APZMDM," 15.5,58.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:15:53,ax1,PE1RXF-7,APZMDM," 15.5,58.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:16:24,ax1,PE1RXF-7,APZMDM," 15.5,58.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:16:53,ax1,PE1RXF-7,APZMDM," 15.5,58.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:27:59,ax1,PE1RXF-7,APZMDM," 15.9,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:28:09,ax1,PE1RXF-7,APZMDM," 15.9,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:28:14,ax1,PE1RXF-7,APZMDM," 15.9,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:31:56,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 11:32:14,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 11:36:14,ax1,PE1RXF-7,APZMDM," 16.1,58.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:37:14,ax1,PE1RXF-7,APZMDM," 16.1,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 11:38:14,ax1,PE1RXF-7,APZMDM," 16.1,59.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{003"
2021-12-28 11:43:20,ax1,PE1RXF-7,APZMDM,"APRS node V1"
2021-12-28 11:48:46,ax1,PE1RXF-7,APZMDM," 16.2,57.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 11:58:46,ax1,PE1RXF-7,APZMDM," 16.1,57.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 12:08:45,ax1,PE1RXF-7,APZMDM," 16.0,57.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{003"
2021-12-28 12:18:45,ax1,PE1RXF-7,APZMDM," 16.1,59.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{004"
2021-12-28 12:19:00,ax1,PE1RXF-7,APZMDM," 16.1,59.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{004"
2021-12-28 12:29:01,ax1,PE1RXF-7,APZMDM," 16.3,60.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{005"
2021-12-28 12:29:15,ax1,PE1RXF-7,APZMDM," 16.3,60.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{005"
2021-12-28 12:29:30,ax1,PE1RXF-7,APZMDM," 16.3,60.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{005"
2021-12-28 12:29:45,ax1,PE1RXF-7,APZMDM," 16.3,60.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{005"
2021-12-28 12:39:45,ax1,PE1RXF-7,APZMDM," 16.6,59.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{006"
2021-12-28 12:49:45,ax1,PE1RXF-7,APZMDM," 16.9,59.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{007"
2021-12-28 12:59:44,ax1,PE1RXF-7,APZMDM," 17.1,59.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{008"
2021-12-28 13:24:02,ax1,PE1RXF-7,APZMDM," 16.3,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 13:24:17,ax1,PE1RXF-7,APZMDM," 16.3,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 13:24:32,ax1,PE1RXF-7,APZMDM," 16.3,58.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{001"
2021-12-28 13:34:32,ax1,PE1RXF-7,APZMDM," 16.1,59.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{002"
2021-12-28 13:44:47,ax1,PE1RXF-7,APZMDM," 16.1,59.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{003"
2021-12-28 13:54:47,ax1,PE1RXF-7,APZMDM," 16.1,59.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{004"
2021-12-28 14:04:47,ax1,PE1RXF-7,APZMDM," 16.1,59.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{005"
2021-12-28 14:05:02,ax1,PE1RXF-7,APZMDM," 16.1,59.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{005"
2021-12-28 14:15:01,ax1,PE1RXF-7,APZMDM," 16.2,59.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{006"
2021-12-28 14:25:01,ax1,PE1RXF-7,APZMDM," 16.2,59.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{007"
2021-12-28 14:35:01,ax1,PE1RXF-7,APZMDM," 16.3,59.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0{008"

@ -0,0 +1,36 @@
2021-12-26 19:06:37,ax1,PE1RXF-7,APRX29,test berichtje
2021-12-26 19:06:39,ax0,PE1RXF-7,APRX29,test berichtje
2021-12-26 19:57:59,ax0,PE1RXF-7,APRX29,Test message
2021-12-26 20:01:09,ax0,PE1RXF-7,APRX29,Test message
2021-12-26 20:02:20,ax0,PE1RXF-7,APRX29,Test message
2021-12-26 20:02:52,ax0,KM6LYW-9,APRX29,fortune
2021-12-26 21:20:39,ax0,KM6LYW-9,APRX29,fortune
2021-12-28 08:57:37,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 08:58:03,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 08:58:19,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 08:58:32,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 08:58:46,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 08:58:56,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 09:06:59,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 09:07:44,ax0,PE1RXF-7,APRX29,Test message
2021-12-28 09:08:22,ax0,PE1RXF-7,APRX29,01
2021-12-28 09:08:50,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:09:37,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:11:07,ax0,PE1RXF,APRX29,?01
2021-12-28 09:11:36,ax0,PE1RXF,APRX29,?01
2021-12-28 09:11:47,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:14:08,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:14:59,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:17:06,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:49:47,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:53:25,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:54:31,ax0,PE1RXF-7,APRX29,?01
2021-12-28 09:59:02,ax0,PE1RXF-7,APRX29,?01
2021-12-28 10:03:15,ax0,PE1RXF-7,APRX29,?01
2021-12-28 10:04:50,ax0,PE1RXF-7,APRX29,?01
2021-12-28 10:07:41,ax0,PE1RXF-7,APRX29,?01
2021-12-28 11:30:48,ax1,PE1RXF-7,APRX29,?01
2021-12-28 11:31:03,ax1,PE1RXF-7,APRX29,?01
2021-12-28 11:31:13,ax1,PE1RXF-7,APRX29,?01
2021-12-28 11:31:53,ax1,PE1RXF-7,APRX29,?01
2021-12-28 11:32:12,ax1,PE1RXF-7,APRX29,?01

@ -0,0 +1,36 @@
2021-12-28 14:28:57,ax0,DO1IBS-4,APNU19-3
2021-12-28 14:42:54,ax0,DL0PBS-5,APMI03
2021-12-28 14:42:54,ax0,DO1EJK,APU25N
2021-12-28 10:27:43,ax0,DB0PDF-10,AP4R10
2021-12-28 14:40:48,ax0,SM5WXF-9,APOTC1
2021-12-28 13:50:33,ax0,DG4BRT-1,WIDE1-1
2021-12-28 14:40:18,ax0,DB0ET,APTT4
2021-12-27 20:38:17,ax0,DB0LER,APRX29
2021-12-28 14:40:31,ax0,DB0PBG-5,APMI03
2021-12-27 16:18:09,ax0,DL9OBG-9,UR5RY4
2021-12-28 14:33:57,ax0,DB0WHV,APRX29
2021-12-28 13:38:01,ax0,DH9AG-7,UR0TW1-2
2021-12-28 14:08:40,ax0,DO6DN-10,APRX28
2021-12-28 11:00:42,ax0,DL2KV-9,APPIC3
2021-12-28 11:28:49,ax0,DB0OL-10,AP4R10
2021-12-28 12:49:42,ax0,DB0SAH,APMI06
2021-12-28 14:27:43,ax0,DB0OHB,APDW16
2021-12-28 14:42:28,ax0,DO2DAN-6,APRS
2021-12-28 12:51:21,ax0,DL2MT-6,APRS
2021-12-28 12:54:26,ax0,DL1BJN-1,USRQX8
2021-12-28 09:05:06,ax0,DB1NTO-2,APRS
2021-12-28 14:30:36,ax0,DG4BRT-6,WIDE1-1
2021-12-28 11:14:11,ax0,DD1GO,5S0YX8
2021-12-28 13:47:01,ax0,DG9OBI-9,US2TT6
2021-12-27 15:29:20,ax0,DG9BFE-9,US2TR0
2021-12-28 04:53:47,ax0,DO6HT-9,US2VT3
2021-12-28 11:32:52,ax0,DL5UHR-9,US2TR2
2021-12-27 14:54:30,ax0,PA0EMS-9,US2PQ4
2021-12-28 13:54:19,ax0,PD1ATA,5S2RQ5
2021-12-28 14:38:38,ax0,DB0LER-13,APRX29
2021-12-28 08:44:58,ax0,OE5DRP-9,UQ3UT0
2021-12-28 09:07:03,ax0,PE1RXF-1,APRX29
2021-12-28 09:07:15,ax0,DB6PBG-5,APMI03
2021-12-28 11:52:50,ax0,DO9BG-9,APOTC1
2021-12-28 12:47:06,ax0,PA0KNW-2,APRS
2021-12-28 13:20:45,ax0,DG7ACF-9,5R1WQ2

@ -0,0 +1,8 @@
2021-12-28 14:41:24,ax0,DB0PBG-5,APMI03
2021-12-28 14:38:02,ax0,DB0LER,APRX29
2021-12-28 05:10:44,ax0,DL0PBS-5,APMI33
2021-12-28 14:39:31,ax0,PA0EMS,USRPR0
2021-12-28 10:51:30,ax0,PE1RXF-7,APZMDM
2021-12-28 10:51:33,ax1,PE1RXF-1,APRX29
2021-12-28 14:35:02,ax1,PE1RXF-7,APZMDM
2021-12-28 10:44:09,ax0,PE1RXF-2,APRX29

@ -0,0 +1 @@
16.3,59.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0

@ -0,0 +1,2 @@
2021-12-28,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0

@ -0,0 +1,2 @@
2021-12-28,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
2021-12-28,16.3,60.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0

@ -0,0 +1 @@
PE1RXF-1>APRX29,WIDE2-1:!5302.78N/00707.91E-https://meezenest.nl/pe1rxf

@ -0,0 +1 @@
/usr/sbin/beacon -d "APRX29" -s ax1 '!5302.78N/00707.91E-https://meezenest.nl/pe1rxf'

@ -0,0 +1,44 @@
##################################################################################
# Bash library for reading configuration file #
# #
# Example use: #
# #
# #!/usr/bin/env bash #
# source config.shlib; # load the config library functions #
# echo "$(config_get myvar)"; # will be found in user-cfg #
# printf -- "%s\n" "$(config_get myvar $config_file_name)"; # safer way of #
# # echoing! #
# myvar="$(config_get myvar)"; # how to just read a value without echoing #
# echo "$(config_get othervar)"; # will fall back to defaults #
# echo "$(config_get bleh)"; # "__UNDEFINED__" since it isn't set anywhere #
# #
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
# #
# This file is part of PE1RXF-APRS-server. #
# #
# PE1RXF-APRS-server is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# PE1RXF-APRS-server is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with PE1RXF-APRS-server If not, see <https://www.gnu.org/licenses/>. #
# #
##################################################################################
config_read_file() {
(grep -E "^${2}=" -m 1 "${1}" 2>/dev/null || echo "VAR=__UNDEFINED__") | head -n 1 | cut -d '=' -f 2-;
}
config_get() {
val="$(config_read_file "${2}" "${1}")";
if [ "${val}" = "__UNDEFINED__" ]; then
val="$(config_read_file pe1rxf-aprs-server.cfg.defaults "${1}")";
fi
printf -- "%s" "${val}";
}

@ -0,0 +1,41 @@
# This is a template crontab for the pe1rxf-aprs-server software. Make sure crontab changes are listed in this file!
# Otherwise, changing the beacon from the website will delete your changes made with crontab -e
#
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
# Start APRS server at boot time (delay of 1 minute is needed. Otherwise direwolf will not start for some reason)
@reboot sleep 60 && /home/marcel/ham/start_aprs_server.sh
# Calculate minimum and maximum values from last day (run at one minute past midnight)
1 0 * * * /home/marcel/ham/aprs_utils/get_max_min_values.sh
# Generate new graphs from telemetry data every thirty minutes
*/30 * * * * /home/marcel/ham/aprs_utils/generate_diagrams_from_aprs_data_PE1RXF-7.sh
# Send beacon on AX0 (internal radio)
#* * * * * /home/marcel/ham/aprs_utils/send_beacon_internal_radio.sh
#Send beacon on AX1 (external radio)
#* * * * * /home/marcel/ham/aprs_utils/send_beacon_external_radio.sh

@ -0,0 +1,276 @@
#!/bin/bash
##################################################################################
# #
# Generates graphs and images of telemetry data for website #
# Run at the same frequency as telemetry data comes in #
# For example in the crontab #
#
# Data format: #
# [date],1,2,3,4,5,6,7,8,9,10 #
# #
# 1 = temperature outside #
# 2 = humidity outside #
# 3 = temperature small greenhouse #
# 4 = humidity small greenhouse #
# 5 = soil moisture small greenhouse #
# 6 = soil moisture small greenhouse #
# 7 = temperature large greenhouse #
# 8 = humidity large greenhouse #
# 9 = soil moisture large greenhouse #
# 10 = soil moisture large greenhouse #
# #
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
# #
# This file is part of PE1RXF-APRS-server. #
# #
# PE1RXF-APRS-server is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# PE1RXF-APRS-server is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with PE1RXF-APRS-server. If not, see <https://www.gnu.org/licenses/>. #
# #
##################################################################################
APRS_RECEIVED_MESSAGES_DIR=/home/marcel/ham/aprs_utils/aprs_log/
APRS_TELEMETRY_FILE_SUFFIX=_telemetry_PE1RXF-7.dat
APRS_LATEST_TELEMETRY_FILE=latest_telemetry_PE1RXF-7.dat
APRS_MAX_DATA=telemetry_PE1RXF-7_max_values.dat
APRS_MIN_DATA=telemetry_PE1RXF-7_min_values.dat
PUBLISH_DIR=/home/marcel/ham/web-interface/telemetry
# Get current date YYYY-MM-DD
CURRENT_DATE=$(date +"%Y-%m-%d")
YESTERDAY_DATE=$(date --date="yesterday" +"%Y-%m-%d")
MONTH_AGO_DATE=$(date --date="1 month ago" +"%Y-%m-%d")
APRS_TELEMETRY_FILE_TODAY="$CURRENT_DATE$APRS_TELEMETRY_FILE_SUFFIX"
APRS_TELEMETRY_FILE_YESTERDAY="$YESTERDAY_DATE$APRS_TELEMETRY_FILE_SUFFIX"
APRS_TELEMETRY_FILE="TEMP$APRS_TELEMETRY_FILE_SUFFIX"
cat "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE_YESTERDAY" > "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE"
cat "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE_TODAY" >> "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE"
#Temperatuur buiten en in beide kassen
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Temperatuur" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d %H:%M"
set format x "%H:%M"
set xdata time
set xrange ["$YESTERDAY_DATE 00:00":"$CURRENT_DATE 23:59"]
set yrange [-20:45]
set xlabel "tijd"
set ylabel "graden Celcius"
set ytics 10
set mytics 2
set mxtics 2
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/temperature_graph.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:2 with lines linewidth 2 title "buiten", "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:8 with lines linewidth 2 title "kleine kas", "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:4 with lines linewidth 2 title "grote kas"
EOFMarker
#Luchtvochtigheid buiten en in beide kassen
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Luchtvochtigheid" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d %H:%M"
set format x "%H:%M"
set xdata time
set xrange ["$YESTERDAY_DATE 00:00":"$CURRENT_DATE 23:59"]
set yrange [0:100]
set xlabel "tijd"
set ylabel "%"
set ytics 10
set mytics 2
set mxtics 2
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/humidity_graph.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:3 with lines linewidth 2 title "buiten", "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:9 with lines linewidth 2 title "kleine kas", "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:5 with lines linewidth 2 title "grote kas"
EOFMarker
#Bodemvochtigheid in beide kassen
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Bodemvochtigheid" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d %H:%M"
set format x "%H:%M"
set xdata time
set xrange ["$YESTERDAY_DATE 00:00":"$CURRENT_DATE 23:59"]
set yrange [0:1000]
set xlabel "tijd"
set ylabel "absoluut"
set ytics 100
set mytics 2
set mxtics 2
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/soilmoisture_graph.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:10 with lines linewidth 2 title "kleine kas", "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE" using 1:6 with lines linewidth 2 title "grote kas"
EOFMarker
#Min-max temperatuur buiten afgelopen maand
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Minimale en maximale buitentemperatuur afgelopen maand" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d"
set format x "%d %B"
set xdata time
set xrange ["$MONTH_AGO_DATE":"$YESTERDAY_DATE"]
set yrange [-20:45]
set xlabel "tijd"
set ylabel "graden Celcius"
set ytics 10
set mytics 2
set mxtics 7
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/minmax_temperature_outside.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_MAX_DATA" using 1:2 with lines linewidth 2 title "maxima", "$APRS_RECEIVED_MESSAGES_DIR$APRS_MIN_DATA" using 1:2 with lines linewidth 2 title "minima"
EOFMarker
#Min-max temperatuur kleine kas afgelopen maand
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Minimale en maximale temperatuur kleine kas afgelopen maand" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d"
set format x "%d %B"
set xdata time
set xrange ["$MONTH_AGO_DATE":"$YESTERDAY_DATE"]
set yrange [-20:45]
set xlabel "tijd"
set ylabel "graden Celcius"
set ytics 10
set mytics 2
set mxtics 7
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/minmax_temperature_small_greenhouse.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_MAX_DATA" using 1:8 with lines linewidth 2 title "maxima", "$APRS_RECEIVED_MESSAGES_DIR$APRS_MIN_DATA" using 1:8 with lines linewidth 2 title "minima"
EOFMarker
#Min-max temperatuur grote kas afgelopen maand
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Minimale en maximale temperatuur grote kas afgelopen maand" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d"
set format x "%d %B"
set xdata time
set xrange ["$MONTH_AGO_DATE":"$YESTERDAY_DATE"]
set yrange [-20:45]
set xlabel "tijd"
set ylabel "graden Celcius"
set ytics 10
set mytics 2
set mxtics 7
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/minmax_temperature_large_greenhouse.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_MAX_DATA" using 1:4 with lines linewidth 2 title "maxima", "$APRS_RECEIVED_MESSAGES_DIR$APRS_MIN_DATA" using 1:4 with lines linewidth 2 title "minima"
EOFMarker
#Min-max luchtvochtigheid buiten afgelopen maand
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Minimale en maximale luchtvochtigheid buiten afgelopen maand" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d"
set format x "%d %B"
set xdata time
set xrange ["$MONTH_AGO_DATE":"$YESTERDAY_DATE"]
set yrange [0:100]
set xlabel "tijd"
set ylabel "%"
set ytics 10
set mytics 2
set mxtics 7
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/minmax_humidity_outside.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_MAX_DATA" using 1:3 with lines linewidth 2 title "maxima", "$APRS_RECEIVED_MESSAGES_DIR$APRS_MIN_DATA" using 1:3 with lines linewidth 2 title "minima"
EOFMarker
#Min-max luchtvochtigheid kleine kas afgelopen maand
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Minimale en maximale luchtvochtigheid kleine kas afgelopen maand" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d"
set format x "%d %B"
set xdata time
set xrange ["$MONTH_AGO_DATE":"$YESTERDAY_DATE"]
set yrange [0:100]
set xlabel "tijd"
set ylabel "%"
set ytics 10
set mytics 2
set mxtics 7
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/minmax_humidity_small_greenhouse.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_MAX_DATA" using 1:9 with lines linewidth 2 title "maxima", "$APRS_RECEIVED_MESSAGES_DIR$APRS_MIN_DATA" using 1:9 with lines linewidth 2 title "minima"
EOFMarker
#Min-max luchtvochtigheid grote kas afgelopen maand
/usr/bin/gnuplot -persist <<-EOFMarker
set title "Minimale en maximale luchtvochtigheid grote kas afgelopen maand" font ",14" textcolor rgbcolor "royalblue"
set datafile separator ","
set timefmt "%Y-%m-%d"
set format x "%d %B"
set xdata time
set xrange ["$MONTH_AGO_DATE":"$YESTERDAY_DATE"]
set yrange [0:100]
set xlabel "tijd"
set ylabel "%"
set ytics 10
set mytics 2
set mxtics 7
set grid ytics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mytics
set grid xtics lt 0 lw 1 lc rgb "#bbbbbb"
set grid mxtics
set pointsize 1
set terminal png size 1024,768
set output "$PUBLISH_DIR/minmax_humidity_large_greenhouse.png"
plot "$APRS_RECEIVED_MESSAGES_DIR$APRS_MAX_DATA" using 1:5 with lines linewidth 2 title "maxima", "$APRS_RECEIVED_MESSAGES_DIR$APRS_MIN_DATA" using 1:5 with lines linewidth 2 title "minima"
EOFMarker
# rest of script, after gnuplot exits
# Remove temporary file
rm "$APRS_RECEIVED_MESSAGES_DIR$APRS_TELEMETRY_FILE"

@ -0,0 +1,132 @@
#!/bin/bash
##################################################################################
# Reads telemetry data file from yesterday and output minimum and maximum #
# values of every data field. #
# This script should be run once every day at midnight #
# #
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
# #
# This file is part of PE1RXF-APRS-server. #
# #
# PE1RXF-APRS-server is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# PE1RXF-APRS-server is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with PE1RXF-APRS-server. If not, see <https://www.gnu.org/licenses/>. #
# #
##################################################################################
APRS_RECEIVED_MESSAGES_DIR=/home/marcel/ham/aprs_utils/aprs_log/
APRS_TELEMETRY_FILE_SUFFIX=_telemetry_PE1RXF-7.dat
MIN_TELEMETRY_FILE=telemetry_PE1RXF-7_min_values.dat
MAX_TELEMETRY_FILE=telemetry_PE1RXF-7_max_values.dat
PUBLISH_DIR=/home/marcel/ham/aprs_utils/publish
# Get current and yesterdays date YYYY-MM-DD
CURRENT_DATE=$(date +"%Y-%m-%d")
YESTERDAY_DATE=$(date --date="yesterday" +"%Y-%m-%d")
APRS_TELEMETRY_FILE="$APRS_RECEIVED_MESSAGES_DIR$YESTERDAY_DATE$APRS_TELEMETRY_FILE_SUFFIX"
SINGLE_SHOT=0
declare -a max
declare -a min
#####################################################################
# Evaluate a floating point number conditional expression.
# Bash itself cannot work with floating point, so we use bc
function float_cond()
{
local cond=0
if [[ $# -gt 0 ]]; then
cond=$(echo "$*" | bc -q 2>/dev/null)
if [[ -z "$cond" ]]; then cond=0; fi
if [[ "$cond" != 0 && "$cond" != 1 ]]; then cond=0; fi
fi
local stat=$((cond == 0))
return $stat
}
#Read file line by line
while read LINE
do
#echo "$LINE"
#Datafiled should have comma as field seperator, so asume this and put values in array for later testing if data is valid
IFS=',' read -r -a array <<< "$LINE"
cnt=0
for index in "${!array[@]}"
do
#First time in the loop: we fill the min and max values with the first values in the array
if [[ $SINGLE_SHOT -eq 0 ]]; then
#echo "First: ${array[index]}"
max[cnt]=${array[index]}
min[cnt]=${array[index]}
else
#bash cannot work with floats, so we use this function instead
if float_cond "${array[index]} > ${max[cnt]}"; then
#if [[ ${array[index]} > ${max[cnt]} ]]; then
#echo "Max: $cnt ${max[cnt]} $index ${array[index]}"
max[cnt]=${array[index]}
fi
#bash cannot work with floats, so we use this function instead
if float_cond "${array[index]} < ${min[cnt]}"; then
#if [[ ${array[index]} < ${min[cnt]} ]]; then
min[cnt]=${array[index]}
# echo "Min: $cnt $index ${array[index]}"
fi
fi
#echo "$cnt"
cnt=$((cnt+1))
done
#First time through loop is different from all the rest
SINGLE_SHOT=1
#done < /dev/stdin
done < "$APRS_TELEMETRY_FILE"
#Store minimum values in file (append file)
for index in "${!min[@]}"
do
#first data field: remove time from date/time field and no leading comma
if [[ index -eq 0 ]] ; then
min[index]="$(echo "${min[index]}" | cut -b 1-10)"
echo -n "${min[index]}" >> "$APRS_RECEIVED_MESSAGES_DIR$MIN_TELEMETRY_FILE"
else
echo -n ",${min[index]}" >> "$APRS_RECEIVED_MESSAGES_DIR$MIN_TELEMETRY_FILE"
fi
done
#New line
echo "" >> "$APRS_RECEIVED_MESSAGES_DIR$MIN_TELEMETRY_FILE"
#Store maximum values in file (append file)
for index in "${!max[@]}"
do
#first data field: remove time from date/time field and no leading comma
if [[ index -eq 0 ]] ; then
max[index]="$(echo "${max[index]}" | cut -b 1-10)"
echo -n "${max[index]}" >> "$APRS_RECEIVED_MESSAGES_DIR$MAX_TELEMETRY_FILE"
else
echo -n ",${max[index]}" >> "$APRS_RECEIVED_MESSAGES_DIR$MAX_TELEMETRY_FILE"
fi
done
#New line
echo "" >> "$APRS_RECEIVED_MESSAGES_DIR$MAX_TELEMETRY_FILE"

@ -0,0 +1,73 @@
# Configuration file for PE1RXF-APRS-server
#
# Must be readable AND writable by www-data!
#
# This file is read periodically, so just changing this file will automatically
# update take effect.
# Internal radio settings
ax0_name=Digipeater 2 meter
ax0_frequency=144.800 MHz
# Beacon time internal radio (ax0) in minutes. 0-60, where 0 disables beaconing.
ax0_beacon_time=0
ax0_beacon_destination=APRX29
ax0_beacon_path=WIDE2-1
ax0_beacon_position=!5302.78N/00707.91E-
ax0_beacon_comment=https://meezenest.nl/pe1rxf
ax0_beacon_file=/home/marcel/ham/aprs_utils/beacon_ax0.txt
ax0_transmit_directory=/home/marcel/ham/aprs_utils/aprs_files_to_transmit/
# Predefined messages
ax0_message1_id=Test naar PE1RXF
ax0_message1_text=Test message
ax0_message1_destination=PE1RXF-7
ax0_message1_path=WIDE2-2
ax0_message2_id=Fortune bot
ax0_message2_text=fortune
ax0_message2_destination=KM6LYW-9
ax0_message2_path=WIDE2-2
ax0_message3_id=Message 3
ax0_message3_text=Thirth message
ax0_message3_destination=PE1RXF-7
ax0_message3_path=WIDE2-2
ax0_message4_id=Message 4
ax0_message4_text=Fourth message
ax0_message4_destination=PE1RXF-7
ax0_message4_path=WIDE2-2
# External radio settings
ax1_name=Digipeater 70 cm
ax1_frequency=432.500 MHz
# Beacon time external radio (ax1) in minutes. 0-60, where 0 disables beaconing.
ax1_beacon_time=0
ax1_beacon_destination=APRX29
ax1_beacon_path=none
ax1_beacon_position=!5302.78N/00707.91E-
ax1_beacon_comment=https://meezenest.nl/pe1rxf
ax1_beacon_file=/home/marcel/ham/aprs_utils/beacon_ax1.txt
# Predefined messages
ax1_message1_id=Message 1
ax1_message1_text=First message
ax1_message1_destination=PE1RXF-7
ax1_message1_path=WIDE2-2
ax1_message2_id=Message 2
ax1_message2_text=Second message
ax1_message2_destination=PE1RXF-7
ax1_message2_path=WIDE2-2
ax1_message3_id=Message 3
ax1_message3_text=Thirth message
ax1_message3_destination=PE1RXF-7
ax1_message3_path=WIDE2-2
ax1_message4_id=Message 4
ax1_message4_text=Fourth message
ax1_message4_destination=PE1RXF-7
ax1_message4_path=WIDE2-2

@ -0,0 +1,71 @@
# Default configuration file for PE1RXF-APRS-server
#
# The values in this file are read only if the correspondinf values in the main configuration file are missing.
# Internal radio settings
ax0_name=Digipeater 2 meter
ax0_frequency=144.800 MHz
# Beacon time internal radio (ax0) in minutes. 0-60, where 0 disables beaconing.
ax0_beacon_time=0
ax0_beacon_destination=APRX29
ax0_beacon_path=WIDE2-1
ax0_beacon_position=!5302.78N/00707.91E-
ax0_beacon_comment=https://meezenest.nl/pe1rxf
ax0_beacon_file=/home/marcel/ham/aprs_utils/beacon_ax0.txt
ax0_transmit_directory=/home/marcel/ham/aprs_utils/aprs_files_to_transmit/
# Predefined messages
ax0_message1_id=Message 1
ax0_message1_text=First message
ax0_message1_destination=PE1RXF-7
ax0_message1_path=none
ax0_message2_id=Message 2
ax0_message2_text=Second message
ax0_message2_destination=PE1RXF-7
ax0_message2_path=WIDE2-1
ax0_message3_id=Message 3
ax0_message3_text=Thirth message
ax0_message3_destination=PE1RXF-7
ax0_message3_path=WIDE2-2
ax0_message4_id=Message 4
ax0_message4_text=Fourth message
ax0_message4_destination=PE1RXF-7
ax0_message4_path=WIDE3-3
# External radio settings
ax1_name=Digipeater 70 cm
ax1_frequency=432.500 MHz
# Beacon time external radio (ax1) in minutes. 0-60, where 0 disables beaconing.
ax1_beacon_time=0
ax1_beacon_destination=APRX29
ax1_beacon_path=none
ax1_beacon_position=!5302.78N/00707.91E-
ax1_beacon_comment=https://meezenest.nl/pe1rxf
ax1_beacon_file=/home/marcel/ham/aprs_utils/beacon_ax1.txt
# Predefined messages
ax1_message1_id=Message 1
ax1_message1_text=First message
ax1_message1_destination=PE1RXF-7
ax1_message1_path=WIDE2-2
ax1_message2_id=Message 2
ax1_message2_text=Second message
ax1_message2_destination=PE1RXF-7
ax1_message2_path=WIDE2-2
ax1_message3_id=Message 3
ax1_message3_text=Thirth message
ax1_message3_destination=PE1RXF-7
ax1_message3_path=WIDE2-2
ax1_message4_id=Message 4
ax1_message4_text=Fourth message
ax1_message4_destination=PE1RXF-7
ax1_message4_path=WIDE2-2

@ -0,0 +1,62 @@
#!/bin/bash
##################################################################################
# Main loop of PE1RXF-APRS-server. #
# Here it all starts. From here all functions are called. #
# #
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
# #
# This file is part of PE1RXF-APRS-server. #
# #
# PE1RXF-APRS-server is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# PE1RXF-APRS-server is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with PE1RXF-APRS-server If not, see <https://www.gnu.org/licenses/>. #
# #
##################################################################################
source /home/marcel/ham/aprs_utils/config.shlib; # load the config library functions
ConfigFile="/home/marcel/ham/aprs_utils/pe1rxf-aprs-server.cfg"
web_interface_config_file="/home/marcel/ham/web-interface/config/pe1rxf-aprs-server.cfg"
ConfigFileMD5_previous=0
while :
do
# First check if configuration file has changed. If so, update the processes with the new changes.
# Ontherwise, do nothing.
ConfigFileMD5=$(md5sum $ConfigFile | cut -d ' ' -f1)
if [ $ConfigFileMD5 != $ConfigFileMD5_previous ]; then
echo "Configuration file has changed."
# Update beacon files and corresponding crontab entries
/home/marcel/ham/aprs_utils/set_beacon.sh -c $ConfigFile
ConfigFileMD5_previous=$ConfigFileMD5
fi
# If configuration file on web interface exists, we copy it to the program directory
# and remove it from the web interface
if [ -f "$web_interface_config_file" ]; then
cp $web_interface_config_file $ConfigFile
rm -f $web_interface_config_file
# change beacon settings
/home/marcel/ham/aprs_utils/set_beacon.sh -c $ConfigFile
fi
echo
echo "Loop repeats every 1 seconds. Press [CTRL+C] to stop.."
sleep 1
done

@ -0,0 +1,217 @@
#!/bin/bash
##################################################################################
# Background process started by the initializing script start_aprs_server.sh #
# #
# It processes all incomming messages for PE1RXF and sends acknowledges when #
# if asked for (via kissutil for ax0 and beacon for ax1. It also prosesses the #
# special telemetry messages from PE1RXF devices. #
# #
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
# #
# This file is part of PE1RXF-APRS-server. #
# #
# PE1RXF-APRS-server is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# PE1RXF-APRS-server is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with PE1RXF-APRS-server If not, see <https://www.gnu.org/licenses/>. #
# #
##################################################################################
# Filters out all APRS messages to PE1RXF-1 and saves these to file.
# Generate and send acknowledge message when incomming message ask for it.
# Also, reads APRS message and when it is telemetry converts it to a format readeble by gnuplot
#
# The script aprs_utils.sh starts a filters means of tail | grep on the log file of aprx.
# The output of this command goes to this script via stdin. This script reads this line by line
# and sends an acknowledgement to the stations asking for one. This is done via kissutil, which
# is also started the script aprs_utils.sh
# Direectory where kissutils expect files to send
APRS_SEND_MESSAGE_DIRECTORY=/home/marcel/ham/aprs_utils/aprs_files_to_transmit/
# Directory where APRS messages are stored
APRS_RECEIVED_MESSAGES_DIR=/home/marcel/ham/aprs_utils/aprs_log/
MESSAGE_FILE=aprs_received_messages.log
# Get current date YYYY-MM-DD
#CURRENT_DATE=$(date +"%Y-%m-%d")
#Read file line by line and send acknowledge if needed
while read LINE
do
#################
# Section: filter out APRS messages and generate acknowledge if needed
#################
# Get current date YYYY-MM-DD (do this every time, because a day may already have passed)
CURRENT_DATE=$(date +"%Y-%m-%d")
CURRENT_DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")
# figure out who sent the message
# Check channel 1 (internal radio)
CALL="$(grep -o -P "(?<=PE1RXF-1 d \*).+?\>"<<<$LINE)"
PORT="ax0"
# If call is empty, frame not from channel 1, maybe from channel 2?
if [ -z $CALL ]; then
CALL="$(grep -o -P "(?<=PE1RXF-2 d \*).+?\>"<<<$LINE)"
PORT="ax1"
fi
# Lets do something with the message from channel 1 or 2
if [[ $CALL ]]; then
# Remove last character from string
CALL=${CALL::-1}
ACKNOWLEDGE_NUMBER="$(grep -o -P '(?<={).*'<<<$LINE)"
#Write messages to file with name "YYYY-MM-DD_messages_from_NOCALL.log (append)
#echo "$LINE" >> "$APRS_RECEIVED_MESSAGES_DIR""$CURRENT_DATE""_messages_from_""$CALL"".log"
# Get full path of message
if [ $PORT == "ax0" ]; then
FULL_PATH="$(grep -o -P '(?<=PE1RXF-1 d \*).+?:'<<<$LINE)"
else
FULL_PATH="$(grep -o -P '(?<=PE1RXF-2 d \*).+?:'<<<$LINE)"
fi
FULL_PATH="$(grep -o -P '(?<=\>).*'<<<$FULL_PATH)"
# Remove last character from string
FULL_PATH=${FULL_PATH::-1}
# Messages direct from sender do not contain a '*' in the path
DIRECT="$(grep '*' <<<$FULL_PATH)"
if [ -z $DIRECT ]; then
DIRECT="true"
else
unset DIRECT
fi
# First call in path is destination
DESTINATION="$(awk -F "," '{ print $1} ' <<<$FULL_PATH)"
# get the message
MESSAGE="$(grep -o -P '(?<=::).*'<<<$LINE)"
MESSAGE="$(grep -o -P '(?<=:).*'<<<$MESSAGE)"
# Write message to file
echo "$CURRENT_DATE_TIME"",""$PORT"",""$CALL"",""$DESTINATION",\"$MESSAGE\" >> "$APRS_RECEIVED_MESSAGES_DIR""$MESSAGE_FILE"
#Send incomming message as email
#echo "$LINE" | /home/marcel/ham/aprs_utils/send_aprs_message_to_email.sh
#Generate acknowledge frame and put in in de directory where kissutil can find (ax0) it or (for channel ax1) send it via beacon
if [[ $ACKNOWLEDGE_NUMBER ]]; then
# if call is less than 9 characters, add spaces at the end (according to the APRS protocol)
printf -v FORMATTED_CALL %-9.9s "$CALL"
OWN_CALL="$(grep "PE1RXF"<<<$CALL)"
# Message on port ax0
if [ $PORT == "ax0" ]; then
# Local (own) stations do not need to be digipeated
if [ $OWN_CALL ]; then
APRS_FRAME="PE1RXF-1>APRX29::$FORMATTED_CALL:ack$ACKNOWLEDGE_NUMBER"
# Everyone else is digipeated
else
APRS_FRAME="PE1RXF-1>APRX29,WIDE2-2::$FORMATTED_CALL:ack$ACKNOWLEDGE_NUMBER"
fi
# Send acknowledge frame
APRS_TRANSMIT_FILE="acknowledge_""$FORMATTED_CALL""_message_""$ACKNOWLEDGE_NUMBER"
echo "$APRS_FRAME" > "$APRS_SEND_MESSAGE_DIRECTORY$APRS_TRANSMIT_FILE"
# Message on port ax1
else
# Local (own) stations do not need to be digipeated
if [ $OWN_CALL ]; then
APRS_HEADER="APRX29"
APRS_FRAME="::$FORMATTED_CALL:ack$ACKNOWLEDGE_NUMBER"
args[0]=-d
args[1]="APRX29"
args[2]=-s
args[3]=ax1
args[4]=":$FORMATTED_CALL:ack$ACKNOWLEDGE_NUMBER"
# Everyone else is digipeated
else
APRS_HEADER="APRX29 WIDE2-2"
APRS_FRAME="::$FORMATTED_CALL:ack$ACKNOWLEDGE_NUMBER"
args[0]=-d
args[1]="APRX29 WIDE2-2"
args[2]=-s
args[3]=ax1
args[4]=":$FORMATTED_CALL:ack$ACKNOWLEDGE_NUMBER"
fi
# use beacon to send acknowledge frame
#echo "/usr/sbin/beacon -d '$APRS_HEADER' -s ax1 '$APRS_FRAME'"
#/usr/sbin/beacon -d "$APRS_HEADER" -s ax1 "$APRS_FRAME"
/usr/sbin/beacon "${args[@]}"
fi
fi
#################
# Section: process APRS telemetry to format readable by gnuplot
#################
# get date field
DATE="$(echo $LINE | cut -b 1-10)"
# get time field
TIME="$(echo $LINE | cut -b 12-16)"
# get telemetry fields and remove empty spaces and optional acknowledge message if it is present
TELEMETRY="$(echo $LINE | cut -b 65- | sed 's/{.*//' | tr -d "[:blank:]")"
#Datafiled should have comma as field seperator, so asume this and put values in array for later testing if data is valid
IFS=',' read -r -a array <<< "$TELEMETRY"
# Test if message contains valid numbers. It could be an acknowledge or beacon etc.
TELEMETRY_ERROR=0
for index in "${!array[@]}"
do
if ! [[ ${array[index]} =~ ^-?[0-9]+([.][0-9]+)?$ ]] ; then
TELEMETRY_ERROR=1
fi
done
# If telemetry message is valid, store it (change APRS date/time (UTM) with local time)
if [ $TELEMETRY_ERROR -eq 0 ] ; then
# Get current date and time YYYY-MM-DD %H:%M for local time stamp (do this every time, because a day may already have passed)
LOCAL_DATE_TIME=$(date +"%Y-%m-%d %H:%M")
#Format line by combining all needed fields
DATA_STRING="$(echo "$LOCAL_DATE_TIME","$TELEMETRY")"
#| tr -d "[:blank:]")"
#Write messages to file with name "YYYY-MM-DD_telemetry_NOCALL.log (append)
echo "$DATA_STRING" >> "$APRS_RECEIVED_MESSAGES_DIR""$CURRENT_DATE""_telemetry_""$CALL"".dat"
#Write last telemetry message to file (overwrite) for current values
echo "$TELEMETRY" > "$APRS_RECEIVED_MESSAGES_DIR""latest_telemetry_""$CALL"".dat"
fi
fi
# end channel 1
done < /dev/stdin

@ -0,0 +1,182 @@
#!/bin/bash
##################################################################################
# Background process started by the initializing script start_aprs_server.sh #
# #
# It processes all incomming traffic and filters out heard stations. #
# #
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
# #
# This file is part of PE1RXF-APRS-server. #
# #
# PE1RXF-APRS-server is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# PE1RXF-APRS-server is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with PE1RXF-APRS-server If not, see <https://www.gnu.org/licenses/>. #
# #
##################################################################################
# The script aprs_utils.sh starts a filters means of tail | grep on the log file of aprx.
# The output of this command goes to this script via stdin. This script reads this line by line.
# Directory where APRS data files are stored
APRS_DATA_DIR=/home/marcel/ham/aprs_utils/aprs_log/
APRS_STATIONS_HEARD_DIRECT=aprs_stations_heard_direct.log
APRS_STATIONS_HEARD_DIGIPEATED=aprs_stations_heard_digipeated.log
# If files do not exist, create them
if [ ! -f "$APRS_DATA_DIR$APRS_STATIONS_HEARD_DIRECT" ]; then
touch $APRS_DATA_DIR$APRS_STATIONS_HEARD_DIRECT
fi
if [ ! -f "$APRS_DATA_DIR$APRS_STATIONS_HEARD_DIGIPEATED" ]; then
touch $APRS_DATA_DIR$APRS_STATIONS_HEARD_DIGIPEATED
fi
# Maybe there is an old temporary file still pressent: remove it
for ACTIVE_FILE in $APRS_STATIONS_HEARD_DIRECT $APRS_STATIONS_HEARD_DIGIPEATED
do
rm $APRS_DATA_DIR$ACTIVE_FILE".tmp"
done
# Get current date YYYY-MM-DD
#CURRENT_DATE=$(date +"%Y-%m-%d")
CURRENT_DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")
LAST_EPOCH_DATE="$(date -d"$CURRENT_DATE_TIME" +%s)"
#Read file line by line and send acknowledge if needed
while read LINE
do
# Start filter for received messages to PE1RXF (all sufixes)
# Messages addressed to PE1RXF are stored in file /home/marcel/ham/aprs_utils/aprs_received_messages.log
MESSAGE_FOR_PE1RXF="$(grep "::PE1RXF"<<<$LINE)"
if [[ $MESSAGE_FOR_PE1RXF ]]; then
#echo "Message from PE1RXF"
/home/marcel/ham/aprs_utils/process_aprs_messages.sh <<<$MESSAGE_FOR_PE1RXF
fi
# Get current date YYYY-MM-DD (do this every time, because a day may already have passed)
CURRENT_DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")
CURRENT_DATE=$(date +"%Y-%m-%d")
# figure out who sent the message
# Check channel 1 (internal radio)
CALL="$(grep -o -P "(?<=PE1RXF-1 d \*).+?\>"<<<$LINE)"
PORT="ax0"
# If call is empty, frame not from channel 1, maybe from channel 2?
if [ -z $CALL ]; then
CALL="$(grep -o -P "(?<=PE1RXF-2 d \*).+?\>"<<<$LINE)"
PORT="ax1"
fi
# Lets do something with the frame from channel 1 or 2
if [[ $CALL ]]; then
# Remove last character from string
CALL=${CALL::-1}
# Get full path of message
if [ $PORT == "ax0" ]; then
FULL_PATH="$(grep -o -P '(?<=PE1RXF-1 d \*).+?:'<<<$LINE)"
else
FULL_PATH="$(grep -o -P '(?<=PE1RXF-2 d \*).+?:'<<<$LINE)"
fi
FULL_PATH="$(grep -o -P '(?<=\>).*'<<<$FULL_PATH)"
# Remove last character from string
FULL_PATH=${FULL_PATH::-1}
# Messages direct from sender do not contain a '*' in the path
DIRECT="$(grep '*' <<<$FULL_PATH)"
if [ -z $DIRECT ]; then
DIRECT="true"
else
unset DIRECT
fi
# First call in path is destination
DESTINATION="$(awk -F "," '{ print $1} ' <<<$FULL_PATH)"
#echo "Port: " $PORT
#echo "Call:" $CALL
#echo "Path:" $FULL_PATH
#echo "Destination: "$DESTINATION
# Select correct log file to use: direct or digipeated
if [ $DIRECT ]; then
ACTIVE_FILE=$APRS_STATIONS_HEARD_DIRECT
else
ACTIVE_FILE=$APRS_STATIONS_HEARD_DIGIPEATED
fi
# get line number where call occurs (will return NULL if call is never heard)
LINE_NUMBER="$(grep -n $PORT","$CALL "$APRS_DATA_DIR$ACTIVE_FILE" | cut -d : -f 1)"
#LINE_NUMBER=2
# If call already heard: replace line
if [[ $LINE_NUMBER ]]; then
# replace found line with new date and time
#SED_CMD="'$LINE_NUMBER c\\""$CURRENT_DATE_TIME"",""$CALL"","$DESTINATION"' ""$APRS_DATA_DIR""$ACTIVE_FILE"
#echo $SED_CMD
RESULT="$(sed -i "$LINE_NUMBER c\\$CURRENT_DATE_TIME,$PORT,$CALL,$DESTINATION" $APRS_DATA_DIR$ACTIVE_FILE )"
# If call not heard before: add to file
else
echo "$CURRENT_DATE_TIME"",""$PORT"",""$CALL"",""$DESTINATION" >> "$APRS_DATA_DIR""$ACTIVE_FILE"
fi
fi
# Do maintenance on all log files (every 10 minutes)
# Remove all heard calls older than 24 hours
EPOCH_DATE="$(date -d"$CURRENT_DATE_TIME" +%s)"
EPOCH_COUNTER=$((EPOCH_DATE-LAST_EPOCH_DATE))
if [ "$EPOCH_COUNTER" -gt "600" ]; then
LAST_EPOCH_DATE="$EPOCH_DATE"
for ACTIVE_FILE in $APRS_STATIONS_HEARD_DIRECT $APRS_STATIONS_HEARD_DIGIPEATED
do
touch $APRS_DATA_DIR$ACTIVE_FILE".tmp"
LINE_NR=1
while read FILE_LINE; do
# reading each line
# echo "Line No. $LINE_NR : $FILE_LINE"
LINE_DATE="$(awk -F "," '{ print $1} ' <<<$FILE_LINE)"
EPOCH_LINE_DATE="$(date -d"$LINE_DATE" +%s)"
# echo $EPOCH_LINE_DATE
ELAPSED_TIME=$((EPOCH_DATE-EPOCH_LINE_DATE))
# echo $ELAPSED_TIME
# Entry older than 24 hours? Remove entry
if [ "$ELAPSED_TIME" -lt "86400" ]; then
#RESULT="$(sed -e "$LINE_NR d" $APRS_DATA_DIR$ACTIVE_FILE >> $APRS_DATA_DIR$ACTIVE_FILE".tmp")"
echo $FILE_LINE >> $APRS_DATA_DIR$ACTIVE_FILE".tmp"
# echo "OUD"
fi
LINE_NR=$((LINE_NR+1))
done < $APRS_DATA_DIR$ACTIVE_FILE
cp $APRS_DATA_DIR$ACTIVE_FILE".tmp" $APRS_DATA_DIR$ACTIVE_FILE
rm $APRS_DATA_DIR$ACTIVE_FILE".tmp"
done
fi
# END: remove all heard calls older than 24 hours
done < /dev/stdin

@ -0,0 +1,52 @@
#!/bin/bash
##################################################################################
# Send beacon via APRS channel 2 (ax1) #
# #
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
# #
# This file is part of PE1RXF-APRS-server. #
# #
# PE1RXF-APRS-server is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# PE1RXF-APRS-server is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with PE1RXF-APRS-server. If not, see <https://www.gnu.org/licenses/>. #
# #
##################################################################################
source /home/marcel/ham/aprs_utils/config.shlib; # load the config library functions
ConfigFile="/home/marcel/ham/aprs_utils/pe1rxf-aprs-server.cfg"
BEACON_FILE="$(config_get ax1_beacon_file $ConfigFile)"
if [ -f "$BEACON_FILE" ]; then
BEACON_TEXT=$(cat "$BEACON_FILE")
# The BEACON_FILE holds the command for sending a beacon. So make this file part of the script.
# I shouldn't really do this, as it is a potential security risk. But the BEACON_FILE is as safe as this script itself.
# The BEACON_FILE can not be altered via the web interface, but only by the main program. So it should be ok.
# But this makes the code potential self altering, which is bad! Realy realy bad!
# But than again, is it really not the same as calling an external program from the script, as this program can also be alterred.
# Anyway, enough of my rambling, let's continue with the script.
# To be safe, lets do some minimal safety checks before executing the external file:
# BEACON_FILE should only have one line:
NR_OF_LINES=$(awk 'END { print NR }' $BEACON_FILE)
# And this line should contain the beacon command:
RESULT=$(grep "/usr/sbin/beacon" $BEACON_FILE)
if [ -n "$RESULT" ] && [ $NR_OF_LINES -eq 1 ]; then
# Send the beacon
. $BEACON_FILE
fi
fi

@ -0,0 +1,36 @@
#!/bin/bash
##################################################################################
# Send beacon via APRS channel 1 (ax0) #
# #
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
# #
# This file is part of PE1RXF-APRS-server. #
# #
# PE1RXF-APRS-server is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# PE1RXF-APRS-server is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with PE1RXF-APRS-server. If not, see <https://www.gnu.org/licenses/>. #
# #
##################################################################################
source /home/marcel/ham/aprs_utils/config.shlib; # load the config library functions
ConfigFile="/home/marcel/ham/aprs_utils/pe1rxf-aprs-server.cfg"
BEACON_FILE="$(config_get ax0_beacon_file $ConfigFile)"
TRANSMIT_LOCATION="$(config_get ax0_transmit_directory $ConfigFile)"
if [ -f "$BEACON_FILE" ]; then
/bin/cp "$BEACON_FILE" "$TRANSMIT_LOCATION"
fi

@ -0,0 +1,131 @@
#!/bin/bash
##################################################################################
# Send an APRS message consrructed from the given parameters. #
# #
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
# #
# This file is part of PE1RXF-APRS-server. #
# #
# NOTE: the ax25 utility 'beacon' has a bug: the first few times it is called #
# the send string ends with some random characters. After these first few #
# times it all comes good and the utility works fine. #
# #
# PE1RXF-APRS-server is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# PE1RXF-APRS-server is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with PE1RXF-APRS-server If not, see <https://www.gnu.org/licenses/>. #
# #
##################################################################################
source /home/marcel/ham/aprs_utils/config.shlib; # load the config library functions
ConfigFile=/home/marcel/ham/aprs_utils/pe1rxf-aprs-server.cfg
# Directory where APRS messages are stored
APRS_RECEIVED_MESSAGES_DIR=/home/marcel/ham/aprs_utils/aprs_log/
MESSAGE_FILE=aprs_send_messages.log
############################################################
# Help #
############################################################
Help()
{
# Display Help
echo "Send APRS message."
echo
echo "Syntax: set_beacon.sh [-i <interface>|-c <call>|-p <path>|-m <message>]"
echo "Options:"
echo "-i AX.25 interface (ax0 or ax1)"
echo "-c Destination call"
echo "-p Path: 0=none, WIDE2-1, WIDE2-2, WIDE3-3 or call of digipeater"
echo "-m Message to send."
echo
}
############################################################
############################################################
# Main program #
############################################################
############################################################
# Set variables
Interface="0"
Call="0"
Path="0"
Message=""
############################################################
# Process the input options. #
############################################################
# Get the options
while getopts i:c:p:m: flag; do
case "${flag}" in
i) # Interface
Interface=${OPTARG};;
c) # Destination Call
Call=${OPTARG};;
p) # Path
Path=${OPTARG};;
m) # Message
Message=${OPTARG};;
\?) # Invalid option
echo "Syntax error!"
Help
exit;;
esac
done
CURRENT_DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")
if [ "$Interface" == "ax0" ]; then
# Log message
echo "$CURRENT_DATE_TIME,ax0,$Call,APRX29,$Message" >> $APRS_RECEIVED_MESSAGES_DIR$MESSAGE_FILE
# if call is less than 9 characters, add spaces at the end (according to the APRS protocol)
printf -v Call %-9.9s "$Call"
if [ "$Path" == "0" ]; then
APRS_FRAME="PE1RXF-1>APRX29::$Call:$Message"
else
APRS_FRAME="PE1RXF-1>APRX29,$Path::$Call:$Message"
fi
AX0_APRS_TRANSMIT_DIR="$(config_get ax0_transmit_directory $ConfigFile)"
echo "$APRS_FRAME" > "$AX0_APRS_TRANSMIT_DIR"message.msg
#echo "$APRS_FRAME $AX0_APRS_TRANSMIT_DIR"
else
# Log message
echo "$CURRENT_DATE_TIME,ax1,$Call,APRX29,$Message" >> $APRS_RECEIVED_MESSAGES_DIR$MESSAGE_FILE
# if call is less than 9 characters, add spaces at the end (according to the APRS protocol)
printf -v Call %-9.9s "$Call"
if [ "$Path" == "0" ]; then
APRS_FRAME="PE1RXF-2>APRX29::$Call:$Message"
args[0]=-d
args[1]="APRX29"
args[2]=-s
args[3]=ax1
args[4]=":$Call:$Message"
else
APRS_FRAME="PE1RXF-2>APRX29,$Path::$Call:$Message"
args[0]=-d
args[1]="APRX29 $Path"
args[2]=-s
args[3]=ax1
args[4]=":$Call:$Message"
fi
#echo "$APRS_FRAME"
#"$APRS_CMD" > tmp.tmp
/usr/sbin/beacon "${args[@]}"
fi

@ -0,0 +1,236 @@
#!/bin/bash
##################################################################################
# Formats crontab string for periodic APRS beacon and #
# replaces the original crontab entry string with this #
# new string thus changing the crontab. #
# #
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
# #
# This file is part of PE1RXF-APRS-server. #
# #
# PE1RXF-APRS-server is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# PE1RXF-APRS-server is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with PE1RXF-APRS-server If not, see <https://www.gnu.org/licenses/>. #
# #
##################################################################################
source /home/marcel/ham/aprs_utils/config.shlib; # load the config library functions
############################################################
# Help #
############################################################
Help()
{
# Display Help
echo "Set interval of APRS beacons in crontab."
echo
echo "Syntax: set_beacon.sh [-i <interface>|-t <time>|-c <config-file>]"
echo "Options:"
echo "-i AX.25 interface (ax0 or ax1)"
echo "-t Time interval in minutes (0-60), 0 disables beacon"
echo "-c Read from config file instead of command line arguments"
echo
}
############################################################
# This function update the crontab of user marcel #
############################################################
UpdateCrontab()
{
# All those escaped characters were a nightmare, but in the end the resulting string was perfect. But executing the string directly from this script proved to be another nightmare:
# It appears that bash inserts additional escape characters, resulting in the command not working. The solution below is not very elegant, but hey...it works!
# Let's make a bash script, execute is and remove it again.
echo "#!/bin/bash" > $sed_tmp_command_file
echo "$sed_string" >> $sed_tmp_command_file
chmod u+x $sed_tmp_command_file
$sed_tmp_command_file
rm $sed_tmp_command_file
# Update crontab
/usr/bin/crontab -u marcel $crontab_intermediate_file
}
###############################################################
# Generates beacon files which are send via a crontab process #
###############################################################
ConstructBeaconFile()
{
if [ "${1}" == "ax0" ]; then
ConstructBeaconFile_Destination="$(config_get ax0_beacon_destination $ConfigFile)"
ConstructBeaconFile_Path="$(config_get ax0_beacon_path $ConfigFile)"
ConstructBeaconFile_Position="$(config_get ax0_beacon_position $ConfigFile)"
ConstructBeaconFile_Comment="$(config_get ax0_beacon_comment $ConfigFile)"
ConstructBeaconFile_File="$(config_get ax0_beacon_file $ConfigFile)"
if [ "$ConstructBeaconFile_Path" == "none" ]; then
ConstructBeaconFile_Beacon="PE1RXF-1>$ConstructBeaconFile_Destination:$ConstructBeaconFile_Position$ConstructBeaconFile_Comment"
else
ConstructBeaconFile_Beacon="PE1RXF-1>$ConstructBeaconFile_Destination,$ConstructBeaconFile_Path:$ConstructBeaconFile_Position$ConstructBeaconFile_Comment"
fi
echo "Beacon for ax0:"
echo $ConstructBeaconFile_Beacon
echo $ConstructBeaconFile_Beacon > $ConstructBeaconFile_File
else
ConstructBeaconFile_Destination="$(config_get ax1_beacon_destination $ConfigFile)"
ConstructBeaconFile_Path="$(config_get ax1_beacon_path $ConfigFile)"
ConstructBeaconFile_Position="$(config_get ax1_beacon_position $ConfigFile)"
ConstructBeaconFile_Comment="$(config_get ax1_beacon_comment $ConfigFile)"
ConstructBeaconFile_File="$(config_get ax1_beacon_file $ConfigFile)"
if [ "$ConstructBeaconFile_Path" == "none" ]; then
ConstructBeaconFile_Beacon="PE1RXF-2>$ConstructBeaconFile_Destination:$ConstructBeaconFile_Position$ConstructBeaconFile_Comment"
else
ConstructBeaconFile_Beacon="PE1RXF-2>$ConstructBeaconFile_Destination,$ConstructBeaconFile_Path:$ConstructBeaconFile_Position$ConstructBeaconFile_Comment"
fi
echo "Beacon for ax1:"
echo $ConstructBeaconFile_Beacon
if [ "$ConstructBeaconFile_Path" == "none" ]; then
ConstructBeaconFile_Beacon="/usr/sbin/beacon -d \"$ConstructBeaconFile_Destination\" -s ax1 '$ConstructBeaconFile_Position$ConstructBeaconFile_Comment'"
else
ConstructBeaconFile_Beacon="/usr/sbin/beacon -d \"$ConstructBeaconFile_Destination $ConstructBeaconFile_Path\" -s ax1 '$ConstructBeaconFile_Position$ConstructBeaconFile_Comment'"
fi
echo $ConstructBeaconFile_Beacon > $ConstructBeaconFile_File
fi
}
############################################################
############################################################
# Main program #
############################################################
############################################################
# Set variables
Interface="0"
TimeInterval="-1"
crontab_time_string="* * * * *"
crontab_command_string_ax0="/home/marcel/ham/aprs_utils/send_beacon_internal_radio.sh"
crontab_command_string_ax1="/home/marcel/ham/aprs_utils/send_beacon_external_radio.sh"
crontab_full_string="#* * * * * /home/marcel/ham/aprs_utils/send_beacon_internal_radio.sh"
crontab_intermediate_file="/home/marcel/ham/aprs_utils/crontab.pe1rxf"
sed_tmp_command_file="/home/marcel/ham/aprs_utils/sed.cmd"
work_with_config_file="0"
############################################################
# Process the input options. #
############################################################
# Get the options
while getopts i:t:c: flag; do
case "${flag}" in
i) # interface
Interface=${OPTARG};;
t) # time interval beacon
TimeInterval=${OPTARG};;
c) # work with config_file
work_with_config_file="1"
ConfigFile=${OPTARG};;
\?) # Invalid option
echo "Syntax error!"
Help
exit;;
esac
done
##############################################################
# Get Beacon Timer Interval and translate to crontab syntax #
##############################################################
# Read values from config-file
if [ "$work_with_config_file" -eq "1" ]; then
for ax_port in ax0 ax1
do
Interface="$ax_port"
if [ "$Interface" == "ax0" ]; then
TimeInterval="$(config_get ax0_beacon_time $ConfigFile)"
else
TimeInterval="$(config_get ax1_beacon_time $ConfigFile)"
fi
# Let's generate new beacon files according to values in configuration file
ConstructBeaconFile $Interface
# Every 1 to 59 minutes
if [ "$TimeInterval" -gt 0 ] && [ "$TimeInterval" -lt 60 ]; then
crontab_time_string="*/$TimeInterval * * * *"
# Never
elif [ "$TimeInterval" -eq 0 ]; then
crontab_time_string="#* * * * *"
# Every hour
elif [ "$TimeInterval" -eq 60 ]; then
crontab_time_string="0 * * * *"
else
echo "No valid value. Using default."
crontab_time_string="#* * * * *"
fi
# Select ax.25 port
if [ "$Interface" == "ax0" ]; then
crontab_full_string="$crontab_time_string $crontab_command_string_ax0"
sed_string="sed -i \"/send_beacon_internal_radio/c\\$crontab_full_string\" $crontab_intermediate_file"
elif [ "$Interface" == "ax1" ]; then
crontab_full_string="$crontab_time_string $crontab_command_string_ax1"
sed_string="sed -i \"/send_beacon_external_radio/c\\$crontab_full_string\" $crontab_intermediate_file"
else
echo "No valid value. Using default."
crontab_full_string="$crontab_time_string $crontab_command_string_ax0"
sed_string="sed -i \"/send_beacon_internal_radio/c\\$crontab_full_string\" $crontab_intermediate_file"
fi
UpdateCrontab
done
printf -- "Values read from file: %s$ConfigFile\n";
printf -- "ax0 beacon time: %s\n" "$(config_get ax0_beacon_time $ConfigFile)";
printf -- "ax1 beacon time: %s\n" "$(config_get ax1_beacon_time $ConfigFile)";
# Read values from command line arguments
else
# Every 1 to 59 minutes
if [ "$TimeInterval" -gt 0 ] && [ "$TimeInterval" -lt 60 ]; then
crontab_time_string="*/$TimeInterval * * * *"
# Never
elif [ "$TimeInterval" -eq 0 ]; then
crontab_time_string="#* * * * *"
# Every hour
elif [ "$TimeInterval" -eq 60 ]; then
crontab_time_string="0 * * * *"
else
echo "Syntax error!"
Help
exit
fi
# Select ax.25 port
if [ "$Interface" == "ax0" ]; then
crontab_full_string="$crontab_time_string $crontab_command_string_ax0"
sed_string="sed -i \"/send_beacon_internal_radio/c\\$crontab_full_string\" $crontab_intermediate_file"
elif [ "$Interface" == "ax1" ]; then
crontab_full_string="$crontab_time_string $crontab_command_string_ax1"
sed_string="sed -i \"/send_beacon_external_radio/c\\$crontab_full_string\" $crontab_intermediate_file"
else
echo "Syntax error!"
Help
exit
fi
UpdateCrontab
fi

Binary file not shown.

Binary file not shown.

@ -0,0 +1,246 @@
Raspberry Pi 1e installation
--------
Before 1e boot:
Add "ssh" file In The Boot Partition
"ssh" is empty
--------
Find ip-adres in router and log in via ssh (user: pi, password: raspberry)
Add user and make sure it has the same UID as your other machines (for convenience):
in "/etc/passwd" you cab find the UID of users
Add user:
adduser user_name
Change UID with command:
usermod -u 1001 user_name
Add new user to all the groups 'pi' is also in:
File "/etc/group"
Change all entries. For example: adm:x:4:pi becomes adm_x:username,pi")
Add new user to sudo:
usermod -aG sudo user_name
REBOOT SYSTEEM!
Login as new user and test (don't forget to test sudo!
Remove pi-user:
sudo deluser -remove-home pi
sudo rm -vf /etc/sudoers.d/010_pi-nopasswd
----
SSH loggin without password:
On local-machine (if not already done, check with "ls ~/.ssh/id_*"):
ssh-keygen -t rsa -b 4096
Copy the keu:
ssh-copy-id remote_username@server_ip_address
Log in on remote, now without passworrd
Disable login with password on remote: (optional; don't loose the key!)
open file "/etc/ssh/sshd_config"
Change:
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
Restart ssh deamon:
sudo /etc/init.d/ssh reload
----
Change login schreen by editing the text file "/etc/motd".
Change the "sshd_config" to (if you now get two motd's, change it back to no)
PrintMotd yes
----
Change hostname:
sudo nano /etc/hostname
sudo nano /etc/hosts
---
LOCALE settings
sudo raspi-config
Than Localisation options / change locale (en_US.UTF-8 UTF-8)
and also time-zone
-----
Update system:
sudo apt-get update
sudo apt-get upgrade
---
Apache webserver and php
sudo apt-get install apache2 php
sudo chown www-data:www-data /var/www/html/
sudo usermod -aG www-data marcel
sudo chmod g+w /var/www/html/
install index.html in /var/www/html
---
Add firewall:
sudo apt install ufw
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
sudo ufw status
------
Enable I2C RTC
sudo rapi-config
enable i2c
sudo reboot
sudo apt-get install i2c-tools
sudo i2cdetect -y 1
#68 is RTC
sudo nano /boot/config.txt
dtoverlay=i2c-rtc,ds1307
sudo reboot
sudo i2cdetect -y 1
You should see a wall of text appear, if UU appears instead of 68 then we have successfully loaded in the Kernel driver for our RTC circuit.
Disable fake hardware clock:
sudo apt-get -y remove fake-hwclock
sudo update-rc.d -f fake-hwclock remove
sudo systemctl disable fake-hwclock
sudo nano /lib/udev/hwclock-set
Find
if [ -e /run/systemd/system ] ; then
exit 0
fi
Replace With
#if [ -e /run/systemd/system ] ; then
# exit 0
#fi
Also comment out the two lines
/sbin/hwclock --rtc=$dev --systz --badyear
and
/sbin/hwclock --rtc=$dev --systz
Read RTC:
sudo hwclock -r
Set RTC from system time:
sudo hwclock -w
----
Direwolf:
sudo apt-get install git
sudo apt-get install cmake
sudo apt-get install libasound2-dev
sudo apt-get install libudev-dev
cd ~
cd direwolf
mkdir build && cd build
cmake -DUNITTEST=1 ..
make -j4
make test
sudo make install
make install-conf
edit direwolf.conf:
ADEVICE plughw:1,0
CHANNEL 0
MYCALL MYCALL-0
MODEM 1200
PTT GPIO 18
DCD GPIO 17
TXDELAY 40
TXTAIL 5
AGWPORT 8000
KISSPORT 8001
<REST: leave at default>
Add user to gpio-group:
sudo usermod -aG gpio marcel
----
AX25 support
sudo apt-get install libax25 ax25-apps ax25-tools
sudo nano /etc/ax25/axports
add:
ax0 PE1RXF-0 1200 255 2 144.800 MHz (1200 bps)
ax1 PE1RXF-1 9600 255 2 External radio
---
APRX software
sudo apt-get install aprx
sudo systemctl enable aprx
----
gnuplot:
sudo apt install gnuplot
-----
kissattach and kissutil can only be executed as root. But we don't want to enter a password when starting the pe1rxf-scripts as the aprs-server has to work autonomous. We also don't want to run all the scripts as root, because that's a safety risk. The solution is to add the following lines to the sudoers-file:
sudo visudo
marcel ALL = (root) NOPASSWD: /usr/sbin/kissattach
marcel ALL = (root) NOPASSWD: /usr/sbin/kissparms
---
Install software from PE1RXF (meezenest.nl/mees):
Start ax.25 interfaces (direwolf and kiss) in crontab of user marcel.
Delay of 60 sec, otherwise direwolf will not start. Probably no sound card module loaded at time crontab is executed:
crontab -l
Add:
# Start APRS server at boot time
@reboot sleep 60 && /home/marcel/ham/start_aprs_server.sh
A default crontab is included in the ham/aprs_utils directory. Two more processes are in there for the custom telemetry.
The web-interface uses php to do some tasks. Make sure that at least the following files and directories can be accessed by user www-data:
ham/aprs_utils/aprs_files_to_transmit/ (rwx)
ham/aprs_utils/aprs_log/ (rwx)
ham/aprs_utils/send_message.sh (rx)
Make a symbolic link from ham/web-interface/ to /var/log/www/html/ and place all web-files in this folder.
MAKE IMAGE OF SD_KAART!
Use the script 'pishrink.sh' to compress the image.
At 1st boot, the image is automatically expanded (or not if you have choosen to to it manually. Than do that with sudo raspi-config.

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

@ -0,0 +1,73 @@
#!/bin/bash
##################################################################################
# Initializing drivers and background processes for PE1RXF-APRS-server #
# #
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
# #
# This file is part of PE1RXF-APRS-server. #
# #
# PE1RXF-APRS-server is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# PE1RXF-APRS-server is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with PE1RXF-APRS-server If not, see <https://www.gnu.org/licenses/>. #
# #
##################################################################################
###########################
# initializing soundmodem #
###########################
echo "Starting direwolf"
/usr/local/bin/direwolf -t 0 -c /home/marcel/direwolf.conf -p -q hd > /dev/null 2>&1 &
#Check if Direwolf is running
/usr/bin/sleep 5
if [ -z "`ps ax | grep -v grep | grep direwolf`" ]; then
echo -e "\nERROR: Direwolf did not start properly and is not running, please review direwolf.conf"
exit 1
fi
echo "Installing one KISS connection on PTY port /tmp/direwolf/kisstnc_aprx"
mkdir -p /tmp/direwolf
cp -a /tmp/kisstnc /tmp/direwolf/kisstnc_aprx
/usr/sbin/mkiss -s 19200 -x 1 /tmp/direwolf/kisstnc_aprx > /tmp/unix98
#This creates a PTS interface like "/dev/pts/3"
export PTS0=`more /tmp/unix98 | grep -w /dev | cut -b -11`
echo "PTS0 device: $PTS0"
sudo /usr/sbin/kissattach $PTS0 ax0 > /tmp/ax25-config.tmp
awk '/device/ { print $7 }' /tmp/ax25-config.tmp > /tmp/ax25-config1-tmp
read Device < /tmp/ax25-config1-tmp
# Start kissutil to send messages in files written to /home/marcel/ham/aprs_utils/aprs_files_to_transmit
/usr/local/bin/kissutil -f /home/marcel/ham/aprs_utils/aprs_files_to_transmit > /dev/null 2>&1 &
# Start filter for received messages to PE1RXF-0
# Messages addressed to PE1RXF are stored in file /home/marcel/ham/aprs_utils/aprs_received_messages.log
# tail /var/log/aprx/aprx-rf.log -F | grep --line-buffered "::PE1RXF-10" >> /home/marcel/ham/aprs_utils/aprs_received_messages/received_aprs_messages.log &
#tail /var/log/aprx/aprx-rf.log -F --lines=1 | grep --line-buffered "::PE1RXF-1" | /home/marcel/ham/aprs_utils/process_aprs_messages.sh &
###########################
#initialize arduino modem #
###########################
echo "Starting external interface"
sudo /usr/sbin/kissattach /dev/ttyUSB0 ax1
sudo /usr/sbin/kissparms -p ax1 -t 500 -s 200 -r 32 -l 100 -f n
# Start kissutil to send messages in files written to /home/marcel/ham/aprs_utils/aprs_files_to_transmit_channel_B
# kissutil -f /home/marcel/ham/aprs_utils/aprs_files_to_transmit_channel_B > /dev/null 2>&1 &
# Start filter for received messages to PE1RXF (all sufixes)
# Messages addressed to PE1RXF are stored in file /home/marcel/ham/aprs_utils/aprs_received_messages.log
#tail /var/log/aprx/aprx-rf.log -F --lines=1 | grep --line-buffered "::PE1RXF" | /home/marcel/ham/aprs_utils/process_aprs_messages.sh &
# Test log heard stations
tail /var/log/aprx/aprx-rf.log -F --lines=1 | /home/marcel/ham/aprs_utils/process_traffic.sh &
# Start mainloop maintenance routine
/home/marcel/ham/aprs_utils/pe1rxf-aprs-server.sh

File diff suppressed because one or more lines are too long

@ -0,0 +1,87 @@
* {
box-sizing: border-box;
}
.openBtn {
display: flex;
justify-content: left;
}
.openButton {
border: none;
border-radius: 5px;
background-color: #1c87c9;
color: white;
padding: 14px 20px;
cursor: pointer;
position: fixed;
}
.loginPopup {
position: relative;
text-align: center;
width: 100%;
}
.formPopup {
display: none;
position: fixed;
left: 25%;
top: 5%;
transform: translate(-30%, -5%);
border: 3px solid #999999;
z-index: 9;
}
.formContainer {
max-width: 300px;
padding: 20px;
background-color: #fff;
}
.formContainer input[type=text],
.formContainer input[type=number],
.formContainer select,
.formContainer radio,
.formContainer input[type=password] {
width: 100%;
padding: 15px;
margin: 5px 0 20px 0;
border: none;
background: #eee;
}
.formContainer input[type=text]:focus,
.formContainer input[type=number]:focus,
.formContainer select:focus,
.formContainer input[type=password]:focus {
background-color: #ddd;
outline: none;
}
.formContainer .btn {
padding: 12px 20px;
border: none;
background-color: #8ebf42;
color: #fff;
cursor: pointer;
width: 100%;
margin-bottom: 15px;
opacity: 0.8;
}
.formContainer .cancel {
background-color: #cc0000;
}
.formContainer .wait {
background-color: #ffffff;
}
.formContainer .radio {
vertical-align: middle;
padding: 12px 20px;
height: 30px;
width: 30px;
background-color: #eee;
border-radius: 25%;
}
.formContainer .btn:hover,
.openButton:hover {
opacity: 1;
}
.radioLeft {
display: block;
text-align: left;
margin-left: 25%;
margin-bottom: 20px;
}

@ -0,0 +1,148 @@
* {
box-sizing: border-box;
}
img {
display: block;
margin-left: auto;
margin-right: auto;
width: 50%;
}
.medium {
display: block;
margin-left: auto;
margin-right: auto;
width: 50%;
height: auto;
}
.large {
width: 100%;
height: auto;
}
.row:after {
content: "";
clear: both;
display: table;
}
[class*="col-"] {
float: left;
padding: 15px;
width: 100%;
}
@media only screen and (min-width: 600px) {
.col-s-1 {width: 8.33%;}
.col-s-2 {width: 16.66%;}
.col-s-3 {width: 25%;}
.col-s-4 {width: 33.33%;}
.col-s-5 {width: 41.66%;}
.col-s-6 {width: 50%;}
.col-s-7 {width: 58.33%;}
.col-s-8 {width: 66.66%;}
.col-s-9 {width: 75%;}
.col-s-10 {width: 83.33%;}
.col-s-11 {width: 91.66%;}
.col-s-12 {width: 100%;}
}
@media only screen and (min-width: 768px) {
.col-1 {width: 8.33%;}
.col-2 {width: 16.66%;}
.col-3 {width: 25%;}
.col-4 {width: 33.33%;}
.col-5 {width: 41.66%;}
.col-6 {width: 50%;}
.col-7 {width: 58.33%;}
.col-8 {width: 66.66%;}
.col-9 {width: 75%;}
.col-10 {width: 83.33%;}
.col-11 {width: 91.66%;}
.col-12 {width: 100%;}
}
html {
font-family: "Lucida Sans", sans-serif;
}
.header {
background-color: #33b5e5;
color: #ffffff;
padding: 15px;
}
.menu ul {
list-style-type: none;
margin: 0;
padding: 0;
}
.menu li {
padding: 8px;
margin-bottom: 7px;
background-color :#33b5e5;
color: #ffffff;
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
}
.menu li:hover {
background-color: #0099cc;
}
.aside {
background-color: #33b5e5;
padding: 15px;
color: #ffffff;
text-align: center;
font-size: 14px;
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
}
.footer {
background-color: #0099cc;
color: #ffffff;
text-align: center;
font-size: 12px;
padding: 15px;
}
h1 {
text-align: center;
}
a:link {
color: white;
text-decoration: none;
}
/* visited link */
a:visited {
color: white;
text-decoration: none;
}
.input-blue {
background-color: #33b5e5;
color: #ffffff;
font-weight: bold;
border: none;
border-bottom: 2px solid #33b5e5;
text-decoration: none;
cursor: pointer;
}
.input-blue-submit {
background-color: #33b5e5;
color: #ffffff;
font-weight: bold;
border: none;
border-bottom: 2px solid #33b5e5;
text-decoration: none;
font-size: medium;
font-weight: normal;
cursor: pointer;
font-family: "Lucida Sans", sans-serif;
}

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="home" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="212px" height="206.25px" viewBox="394.5 418.584 212 206.25" enable-background="new 394.5 418.584 212 206.25"
xml:space="preserve">
<path d="M600.116,503.301l-88.955-77.062c-0.298-0.254-0.656-0.472-1.059-0.639c-5.693-4.32-13.557-4.119-19.049,0.639
l-88.956,77.053c-6.376,5.519-7.181,15.313-1.784,21.839c3.411,4.128,9.069,4.075,13.408,3.2v82.834
c0,6.253,5.02,11.344,11.195,11.344h53.586c2.414,0,4.374-1.96,4.374-4.373v-72.242h36.471v72.242c0,2.413,1.959,4.373,4.372,4.373
h53.587c6.175,0,11.195-5.091,11.195-11.344v-82.834c4.355,0.857,9.996,0.919,13.407-3.2
C607.297,518.606,606.492,508.802,600.116,503.301z M595.166,519.551c-0.9,1.058-5.563,0.48-9.288-1.146
c-1.355-0.595-2.93-0.454-4.146,0.351c-1.233,0.805-1.985,2.187-1.985,3.655v88.746c0,1.435-1.103,2.598-2.449,2.598h-49.214
v-72.242c0-2.414-1.959-4.373-4.373-4.373h-45.217c-2.414,0-4.373,1.959-4.373,4.373v72.242h-49.214
c-1.347,0-2.449-1.163-2.449-2.598V522.41c0-1.478-0.744-2.859-1.985-3.664c-1.233-0.796-2.799-0.919-4.155-0.342
c-3.306,1.461-8.334,2.283-9.279,1.138c-2.388-2.887-2.046-7.207,0.77-9.647l88.956-77.061c2.432-2.099,5.956-2.099,8.388,0
c0.314,0.28,0.674,0.507,1.05,0.674l88.186,76.405C597.213,512.344,597.553,516.664,595.166,519.551L595.166,519.551z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1,125 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/svg"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:ns1="http://sozi.baierouge.fr"
xmlns:cc="http://web.resource.org/cc/"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
id="svg1"
sodipodi:docname="kmailcvt.svg"
viewBox="0 0 60 60"
sodipodi:version="0.32"
_SVGFile__filename="oldscale/apps/kmailcvt.svg"
version="1.0"
y="0"
x="0"
inkscape:version="0.40"
sodipodi:docbase="/home/danny/work/flat/SVG/mono/scalable/apps"
>
<sodipodi:namedview
id="base"
bordercolor="#666666"
inkscape:pageshadow="2"
inkscape:window-y="0"
pagecolor="#ffffff"
inkscape:window-height="699"
inkscape:zoom="7.0969147"
inkscape:window-x="0"
borderopacity="1.0"
inkscape:current-layer="svg1"
inkscape:cx="46.339523"
inkscape:cy="19.954819"
inkscape:window-width="1024"
inkscape:pageopacity="0.0000000"
/>
<g
id="g1844"
transform="translate(.048743 -.32114)"
>
<path
id="path1721"
style="stroke-linejoin:round;stroke:#ffffff;stroke-linecap:round;stroke-width:10;fill:none"
d="m5.5743 26.027h48.27v28.397h-48.27l0.0003-28.397z"
/>
<g
id="g1717"
transform="matrix(.93211 0 0 .93004 1.3656 11.79)"
>
<path
id="path1210"
style="stroke-linejoin:round;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-width:30.806;fill:#ffffff"
d="m69.819 119.6h303.75v171.31h-303.75l-0.001-171.31z"
transform="matrix(.17049 0 0 .17824 -7.3882 -6.0097)"
/>
<path
id="path1211"
style="stroke-linejoin:round;stroke:#000000;stroke-linecap:round;stroke-width:19.254;fill:none"
transform="matrix(.17049 0 0 .17824 -7.3882 -6.0097)"
d="m69.819 119.6l150.12 90.41 153.63-90.41"
/>
</g
>
<path
id="path1212"
style="fill-rule:evenodd;fill:#ffffff"
d="m49.914 1.2369c-12.507 0.3409-19.769 4.7586-23.391 9.9321-1.932 2.759-2.742 5.559-3.125 7.828h-3.899c-1.628-0.001-3.097 0.979-3.72 2.483s-0.279 3.235 0.873 4.386l10.211 10.21c1.47 1.469 3.817 1.576 5.415 0.248l12.128-10.118c1.308-1.086 1.791-2.877 1.208-4.473-0.583-1.597-2.107-2.655-3.807-2.643h-2.784c0.072-0.133 0.036-0.168 0.123-0.31 1.508-2.43 5.691-6.393 17.235-9.5293 1.889-0.5241 3.125-2.3339 2.926-4.2844s-1.775-3.4736-3.731-3.6056c-2.006-0.1272-3.875-0.1724-5.662-0.1238zm-19.245 23.639c0.257 0.527 0.627 0.992 1.083 1.361l-1.826 1.547-1.114-1.114c0.799-0.378 1.452-1.008 1.857-1.794z"
/>
<path
id="path968"
style="stroke-linejoin:round;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-width:3.125;fill:#000000"
d="m55.336 5.3673c-24.264 6.5927-21.043 17.58-21.043 17.747h7.529l-12.13 10.122-10.205-10.206h7.612s-2.153-19.59 28.237-17.663z"
/>
</g
>
<metadata
>
<rdf:RDF
>
<cc:Work
>
<dc:format
>image/svg+xml</dc:format
>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
/>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
/>
<dc:publisher
>
<cc:Agent
rdf:about="http://openclipart.org/"
>
<dc:title
>Openclipart</dc:title
>
</cc:Agent
>
</dc:publisher
>
</cc:Work
>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/"
>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
/>
</cc:License
>
</rdf:RDF
>
</metadata
>
</svg
>

After

Width:  |  Height:  |  Size: 4.2 KiB

@ -0,0 +1,132 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:ns1="http://sozi.baierouge.fr"
xmlns:cc="http://web.resource.org/cc/"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:dc="http://purl.org/dc/elements/1.1/"
id="svg1"
sodipodi:docname="mail_send.svg"
viewBox="0 0 60 60"
sodipodi:version="0.32"
_SVGFile__filename="oldscale/apps/kmailcvt.svg"
version="1.0"
y="0"
x="0"
inkscape:version="0.40"
sodipodi:docbase="/home/danny/work/flat/SVG/mono/scalable/actions"
>
<sodipodi:namedview
id="base"
bordercolor="#666666"
inkscape:pageshadow="2"
inkscape:window-y="0"
pagecolor="#ffffff"
inkscape:window-height="699"
inkscape:zoom="7.0969147"
inkscape:window-x="0"
borderopacity="1.0"
inkscape:current-layer="svg1"
inkscape:cx="46.339523"
inkscape:cy="19.954819"
inkscape:window-width="1024"
inkscape:pageopacity="0.0000000"
/>
<g
id="g1117"
transform="matrix(1 0 0 .99981 -.046244 .33191)"
>
<path
id="path1721"
style="stroke-linejoin:round;stroke:#ffffff;stroke-linecap:round;stroke-width:9.903;fill:none"
transform="matrix(1.0099 0 0 1.0099 .042993 -.90884)"
d="m5.5743 26.027h48.27v28.397h-48.27l0.0003-28.397z"
/>
<g
id="g1717"
transform="matrix(.94133 0 0 .93924 1.4221 10.998)"
>
<path
id="path1210"
style="stroke-linejoin:round;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-width:30.507;fill:#ffffff"
d="m69.819 119.6h303.75v171.31h-303.75l-0.001-171.31z"
transform="matrix(.17049 0 0 .17824 -7.3882 -6.0097)"
/>
<path
id="path1211"
style="stroke-linejoin:round;stroke:#000000;stroke-linecap:round;stroke-width:19.067;fill:none"
transform="matrix(.17049 0 0 .17824 -7.3882 -6.0097)"
d="m69.819 119.6l150.12 90.41 153.63-90.41"
/>
</g
>
</g
>
<g
id="g1213"
>
<path
id="path1789"
style="stroke-linejoin:round;stroke:#ffffff;stroke-linecap:round;stroke-width:9.6801;fill:none"
transform="matrix(.83936 0 0 .83936 6.7873 2.8514)"
d="m23.155 31.013c2.661-23.499 23.065-21.921 24.378-21.798v-7.0275l10.279 10.174-10.279 10.154v-6.944c-1.543-0.181-15.958-1.628-24.378 15.441z"
/>
<path
id="path993"
style="stroke-linejoin:round;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-width:3.125;fill:#000000"
d="m26.223 28.882c2.233-19.724 19.36-18.399 20.461-18.296v-5.8985l8.628 8.5405-8.628 8.523v-5.829c-1.295-0.152-13.394-1.366-20.461 12.96z"
/>
</g
>
<metadata
>
<rdf:RDF
>
<cc:Work
>
<dc:format
>image/svg+xml</dc:format
>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
/>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
/>
<dc:publisher
>
<cc:Agent
rdf:about="http://openclipart.org/"
>
<dc:title
>Openclipart</dc:title
>
</cc:Agent
>
</dc:publisher
>
</cc:Work
>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/"
>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
/>
</cc:License
>
</rdf:RDF
>
</metadata
>
</svg
>

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

@ -0,0 +1,185 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/svg"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:ns1="http://sozi.baierouge.fr"
xmlns:xlink="http://www.w3.org/1999/xlink"
id="svg7088"
sodipodi:docname="Nouveau document 49"
viewBox="0 0 103.21 97.938"
version="1.1"
inkscape:version="0.48.3.1 r9886"
>
<sodipodi:namedview
id="base"
bordercolor="#666666"
inkscape:pageshadow="2"
inkscape:window-y="24"
fit-margin-left="0"
pagecolor="#ffffff"
fit-margin-top="0"
inkscape:window-maximized="0"
inkscape:zoom="0.35"
inkscape:window-x="49"
inkscape:window-height="415"
showgrid="false"
borderopacity="1.0"
inkscape:current-layer="layer1"
inkscape:cx="-90.534384"
inkscape:cy="59.981567"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="486"
inkscape:pageopacity="0.0"
inkscape:document-units="px"
/>
<g
id="layer1"
inkscape:label="Calque 1"
inkscape:groupmode="layer"
transform="translate(-465.53 -494.41)"
>
<path
id="path516"
d="m540.89 551.92c1.7138-7.2558 0.01-14.897-4.6192-20.742-4.6289-5.8496-11.675-9.2578-19.131-9.2578-7.4561 0-14.502 3.4082-19.131 9.2578-4.6289 5.8447-6.3281 13.486-4.6191 20.742"
style="stroke-linejoin:round;stroke:#ba0000;stroke-miterlimit:10;stroke-width:5;fill:none"
inkscape:connector-curvature="0"
/>
<path
id="path518"
d="m565.89 551.92c1.6895-13.95-2.6807-27.954-12.002-38.467s-22.695-16.533-36.748-16.533c-14.048 0-27.427 6.0205-36.748 16.533-9.3164 10.513-13.687 24.517-12.002 38.467"
style="stroke-linejoin:round;stroke:#ba0000;stroke-miterlimit:10;stroke-width:5;fill:none"
inkscape:connector-curvature="0"
/>
<path
id="path520"
d="m503.39 591.92 13.75-46.25 16.25 46.25"
style="stroke:#000000;stroke-miterlimit:10;stroke-width:2.5;fill:none"
inkscape:connector-curvature="0"
/>
<path
id="path522"
d="m523.39 545.67c0 8.335-12.5 8.335-12.5 0s12.5-8.335 12.5 0"
style="fill-rule:evenodd;stroke:#ba0000;stroke-miterlimit:10;stroke-width:2.5;fill:#ba0000"
inkscape:connector-curvature="0"
/>
<path
id="path524"
d="m513.39 561.92 10 2.5-12.5 7.5 15 5-20 10h25"
style="stroke:#000000;stroke-miterlimit:10;stroke-width:1.25;fill:none"
inkscape:connector-curvature="0"
/>
</g
>
<metadata
>
<rdf:RDF
>
<cc:Work
>
<dc:format
>image/svg+xml</dc:format
>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
/>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
/>
<dc:publisher
>
<cc:Agent
rdf:about="http://openclipart.org/"
>
<dc:title
>Openclipart</dc:title
>
</cc:Agent
>
</dc:publisher
>
<dc:title
>Wireless</dc:title
>
<dc:date
>2012-08-02T14:25:28</dc:date
>
<dc:description
/>
<dc:source
>https://openclipart.org/detail/171418/wireless-by-cyberscooty-171418</dc:source
>
<dc:creator
>
<cc:Agent
>
<dc:title
>cyberscooty</dc:title
>
</cc:Agent
>
</dc:creator
>
<dc:subject
>
<rdf:Bag
>
<rdf:li
>computer</rdf:li
>
<rdf:li
>informatique</rdf:li
>
<rdf:li
>it</rdf:li
>
<rdf:li
>network</rdf:li
>
<rdf:li
>ordinateur</rdf:li
>
<rdf:li
>réseau</rdf:li
>
<rdf:li
>server</rdf:li
>
<rdf:li
>serveur</rdf:li
>
<rdf:li
>wireless</rdf:li
>
</rdf:Bag
>
</dc:subject
>
</cc:Work
>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/"
>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
/>
</cc:License
>
</rdf:RDF
>
</metadata
>
</svg
>

After

Width:  |  Height:  |  Size: 5.1 KiB

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="windows-1252"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="479.79px" height="479.79px" viewBox="0 0 479.79 479.79" style="enable-background:new 0 0 479.79 479.79;" xml:space="preserve">
<g>
<path d="M478.409,116.617c-0.368-4.271-3.181-7.94-7.2-9.403c-4.029-1.472-8.539-0.47-11.57,2.556l-62.015,62.011l-68.749-21.768 l-21.768-68.748l62.016-62.016c3.035-3.032,4.025-7.543,2.563-11.565c-1.477-4.03-5.137-6.837-9.417-7.207 c-37.663-3.245-74.566,10.202-101.247,36.887c-36.542,36.545-46.219,89.911-29.083,135.399c-1.873,1.578-3.721,3.25-5.544,5.053 L19.386,373.152c-0.073,0.071-0.145,0.149-0.224,0.219c-24.345,24.346-24.345,63.959,0,88.309 c24.349,24.344,63.672,24.048,88.013-0.298c0.105-0.098,0.201-0.196,0.297-0.305l193.632-208.621 c1.765-1.773,3.404-3.628,4.949-5.532c45.5,17.167,98.9,7.513,135.474-29.056C468.202,191.181,481.658,154.275,478.409,116.617z M75.98,435.38c-8.971,8.969-23.5,8.963-32.47,0c-8.967-8.961-8.967-23.502,0-32.466c8.97-8.963,23.499-8.963,32.47,0 C84.947,411.878,84.947,426.419,75.98,435.38z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,155 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg2"
viewBox="0 0 474.76 474.76"
version="1.1">
<title
id="title3006">Progress</title>
<defs
id="defs4">
<filter
id="filter3799"
width="1.2044"
y="-.14526"
x="-.10222"
height="1.2905"
color-interpolation-filters="sRGB">
<feGaussianBlur
id="feGaussianBlur3801"
stdDeviation="11.5" />
</filter>
<filter
id="filter3944"
color-interpolation-filters="sRGB">
<feGaussianBlur
id="feGaussianBlur3946"
stdDeviation="7.76" />
</filter>
</defs>
<path
id="path3769"
opacity="0.5"
stroke-linejoin="round"
d="m 67.08,324.5 50,-40 80,60 140,-190"
filter="url(#filter3799)"
stroke="#000000"
stroke-linecap="round"
stroke-width="25"
fill="none" />
<g
id="g3870"
stroke="#000000"
transform="translate(-140.92,-255.86)">
<g
id="g3862">
<path
id="path3755"
stroke-width="8"
fill="none"
d="m 170,312.36 v 345" />
<path
id="path3761"
stroke-width="2"
d="m 170,287.36 -10,30 h 20 z" />
</g>
<g
id="g3866">
<path
id="path3757"
stroke-width="8"
fill="none"
d="M 533,655.36 H 166" />
<path
id="path3763"
stroke-width="2"
d="m 558,655.36 -30,-10 v 20 z" />
</g>
</g>
<path
id="path3767"
stroke-linejoin="round"
d="m 59.08,306.5 50,-40 80,60 140,-190"
stroke="#fa0000"
stroke-linecap="round"
stroke-width="25"
fill="none" />
<g
id="g3878"
opacity="0.5"
filter="url(#filter3944)"
stroke="#000000"
transform="translate(-134.556,-244.546)">
<g
id="g3880">
<path
id="path3882"
stroke-width="8"
fill="none"
d="m 170,312.36 v 345" />
<path
id="path3884"
stroke-width="2"
d="m 170,287.36 -10,30 h 20 z" />
</g>
<g
id="g3886">
<path
id="path3888"
stroke-width="8"
fill="none"
d="M 533,655.36 H 166" />
<path
id="path3890"
stroke-width="2"
d="m 558,655.36 -30,-10 v 20 z" />
</g>
</g>
<metadata
id="metadata26">
<rdf:RDF>
<cc:Work>
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:publisher>
<cc:Agent
rdf:about="http://openclipart.org/">
<dc:title>Openclipart</dc:title>
</cc:Agent>
</dc:publisher>
<dc:title>Progress</dc:title>
<dc:date>2013-05-17T18:08:54</dc:date>
<dc:description>A graph of progress</dc:description>
<dc:source>https://openclipart.org/detail/178279/progress-by-kamil_stepinski-178279</dc:source>
<dc:creator>
<cc:Agent>
<dc:title>kamil_stepinski</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>chart</rdf:li>
<rdf:li>graph</rdf:li>
<rdf:li>progress</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

@ -0,0 +1,468 @@
<!DOCTYPE html>
<html>
<head>
<title>PE1RXF APRS server</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/styles.css">
<link rel="stylesheet" href="css/popup.css">
<link rel="stylesheet" href="css/font-awesome.min.css">
</head>
<body>
<?php
// Prevents a repost when the user refreshes the page.
// Also it handles the post itself.
session_start();
if(count($_POST) > 0) {
// figure out which form was entered
if ($_POST['comment_ax0']) {
$_SESSION['comment_ax0'] = $_POST['comment_ax0'];
$_SESSION['period_ax0'] = $_POST['period_ax0'];
$_SESSION['path_ax0'] = $_POST['path_ax0'];
}
if ($_POST['comment_ax1']) {
$_SESSION['comment_ax1'] = $_POST['comment_ax1'];
$_SESSION['period_ax1'] = $_POST['period_ax1'];
$_SESSION['path_ax1'] = $_POST['path_ax1'];
}
header("HTTP/1.1 303 See Other");
header("Location: http://$_SERVER[HTTP_HOST]/index.php");
die();
}
else {
if (isset($_SESSION['comment_ax0'])){
$comment_ax0 = $_SESSION['comment_ax0'];
$period_ax0 = $_SESSION['period_ax0'];
$path_ax0 = $_SESSION['path_ax0'];
//echo "Set ax0: $comment_ax0, $period_ax0, $path_ax0";
save_settings("ax0", $period_ax0, 0, $path_ax0, 0, $comment_ax0);
# Wait for the changes to take effect
sleep(1);
}
else if (isset($_SESSION['comment_ax1'])){
$comment_ax1 = $_SESSION['comment_ax1'];
$period_ax1 = $_SESSION['period_ax1'];
$path_ax1 = $_SESSION['path_ax1'];
//echo "Set ax1: $comment_ax1, $period_ax1, $path_ax1";
save_settings("ax1", $period_ax1, 0, $path_ax1, 0, $comment_ax1);
# Wait for the changes to take effect
sleep(1);
}
session_unset();
session_destroy();
}
// END: Prevents a repost when the user refreshes the page.
# Reads configuration file from pe1rxf-aprs-server directory, makes changes if necesary
# and writes the newly constructed file to a temporary config-file. It does not overwrite
# the original file, because user www-data can only read the program directory, not write to it.
# It's a safety thing...
# The main loop of pe1rxf-aprs-server than copies it to the program directory and removes the temporary file.
function change_parameter_value($parameter, $value)
{
$config_file = '/var/www/html/config/test.cfg';
$tmp_config_file = '/var/www/html/config/test.cfg.tmp';
$reading = fopen($config_file, 'r');
$writing = fopen($tmp_config_file, 'w');
$replaced = false;
while (!feof($reading)) {
$line = fgets($reading);
if (stristr($line,$parameter)) {
$line = "$parameter=$value\n";
//echo "New value: ", "$line";
$replaced = true;
}
fputs($writing, $line);
}
fclose($reading); fclose($writing);
// might as well not overwrite the file if we didn't replace anything
if ($replaced)
{
shell_exec("mv $tmp_config_file $config_file");
} else {
shell_exec("rm $tmp_config_file");
}
}
# Saves setting for given form: ax0 or ax1
# $a = beacon_time
# $b = beacon_destination
# $c = beacon_path
# $d = beacon_position
# $e = beacon_comment
# $f = beacon_file
# $g = transmit_directory
function save_settings($form, $a, $b=0, $c=0, $d=0, $e=0, $f=0, $g=0)
{
# Copy original config file to temporary place on web server.
# From here we can change the values
$original_config_file = '/home/marcel/ham/aprs_utils/pe1rxf-aprs-server.cfg';
$destination_config_file = '/var/www/html/config/test.cfg';
$newly_made_config_file = '/var/www/html/config/pe1rxf-aprs-server.cfg';
$fileCopied = copy("$original_config_file", "$destination_config_file");
if($fileCopied) {
//echo "# $a, $b, $c, $d, $e, $f, $g";
if ($form == "ax0" ) {
change_parameter_value("ax0_beacon_time", $a);
if ($c) change_parameter_value("ax0_beacon_path", $c);
if ($e) change_parameter_value("ax0_beacon_comment", $e);
}
else if ($form == "ax1" ) {
change_parameter_value("ax1_beacon_time", $a);
if ($c) change_parameter_value("ax1_beacon_path", $c);
if ($e) change_parameter_value("ax1_beacon_comment", $e);
}
# now make new file with new configuration for the main loop to find.
shell_exec("cp $destination_config_file $newly_made_config_file");
# and remove working file:
shell_exec("rm $destination_config_file");
} else{
#echo "Error";
}
}
# Reads configuration file from pe1rxf-aprs-server directory.
# Search this file for given paramter and returns its value.
function search_parameter_in_config_file($parameter)
{
$config_file = '/home/marcel/ham/aprs_utils/pe1rxf-aprs-server.cfg';
$reading = fopen($config_file, 'r');
while (!feof($reading)) {
$line = fgets($reading);
if ( strstr($line,$parameter) ) {
$line = substr( $line, strlen($parameter)+1 );
# Found match. Stop further search.
fclose($reading);
return rtrim($line);
}
}
}
$ax0_name = search_parameter_in_config_file("ax0_name");
$ax0_frequency = search_parameter_in_config_file("ax0_frequency");
$ax0_beacon_comment = search_parameter_in_config_file("ax0_beacon_comment");
$ax0_beacon_time = search_parameter_in_config_file("ax0_beacon_time");
$ax0_beacon_path = search_parameter_in_config_file("ax0_beacon_path");
$ax1_name = search_parameter_in_config_file("ax1_name");
$ax1_frequency = search_parameter_in_config_file("ax1_frequency");
$ax1_beacon_comment = search_parameter_in_config_file("ax1_beacon_comment");
$ax1_beacon_time = search_parameter_in_config_file("ax1_beacon_time");
$ax1_beacon_path = search_parameter_in_config_file("ax1_beacon_path");
?>
<div class="header">
<a href="index.php" >
<h1><i class="fa fa-home" aria-hidden="true"></i>&nbsp; PE1RXF APRS server</h1>
</a>
</div>
<div class="row">
<div class="col-3 col-s-3 menu">
<ul>
<li><h3><?php echo $ax0_name ?> (<?php echo $ax0_frequency ?>)</h3></li>
<li onclick="openForm_ax0()">Beacon: <b><?php echo $ax0_beacon_comment; ?></b></li>
<li onclick="openForm_ax0()">Beacon interval: <b><?php if ($ax0_beacon_time == 0) echo "OFF";else echo $ax0_beacon_time; ?></b></li>
<li onclick="openForm_ax0()">Path: <b><?php echo $ax0_beacon_path; ?></b></li>
</ul>
</div>
<div class="col-6 col-s-9" id="main_page">
<div class="col-6 col-s-12">
<a href="send_message.php"><img src="images/mail-out.svg" /></a>
<h1>Send a message</h1>
<img src="images/mail-in.svg" style="cursor:pointer;" onclick="show_received_messages()" />
<h1>Received messages</h1>
</div>
<div class="col-6 col-s-12">
<a href="telemetry.php"><img src="images/telemetry.svg" /></a>
<h1>Telemetry</h1>
<img src="images/received.svg" style="cursor:pointer;" onclick="show_heard_stations()" />
<h1>Heard stations</h1>
</div>
</div>
<div class="col-6 col-s-9" id="heard_stations" style="display:none">
<h1>Heard last 24 hours</h1>
<div class="col-6 col-s-12">
<h1><?php echo $ax0_frequency ?></h1>
<h3 align="center">
<b style="color:Blue">DIRECT</b><br><br>
<?php
$csv = array_map('str_getcsv', file("/home/marcel/ham/aprs_utils/aprs_log/aprs_stations_heard_direct.log"));
for ($i = 0; $i < count($csv); $i++) {
if ($csv[$i][1] == "ax0") {
echo $csv[$i][2];
echo "<br>";
}
}
echo "<br><b style=\"color:Blue\">DIGIPEATED</b><br><br>";
$csv = array_map('str_getcsv', file("/home/marcel/ham/aprs_utils/aprs_log/aprs_stations_heard_digipeated.log"));
for ($i = 0; $i < count($csv); $i++) {
if ($csv[$i][1] == "ax0") {
echo $csv[$i][2];
echo "<br>";
}
}
?>
</h3>
</div>
<div class="col-6 col-s-12">
<h1><?php echo $ax1_frequency ?></h1>
<h3 align="center">
<b style="color:Blue">DIRECT</b><br><br>
<?php
$csv = array_map('str_getcsv', file("/home/marcel/ham/aprs_utils/aprs_log/aprs_stations_heard_direct.log"));
for ($i = 0; $i < count($csv); $i++) {
if ($csv[$i][1] == "ax1") {
echo $csv[$i][2];
echo "<br>";
}
}
echo "<br><b style=\"color:Blue\">DIGIPEATED</b><br><br>";
$csv = array_map('str_getcsv', file("/home/marcel/ham/aprs_utils/aprs_log/aprs_stations_heard_digipeated.log"));
for ($i = 0; $i < count($csv); $i++) {
if ($csv[$i][1] == "ax1") {
echo $csv[$i][2];
echo "<br>";
}
}
?>
</h3>
</div>
<a href=""><h1 style="color:Black;" onclick="show_main_page()"><i class="fa fa-arrow-left" aria-hidden="true"></i>&nbsp; Back</h1></a>
</div>
<div class="col-6 col-s-9" id="received_messages" style="display:none">
<h1>Received messages</h1>
<h2 align="left"><?php echo $ax0_name ?> (<?php echo $ax0_frequency ?>)</h2>
<h3 align="left">
<?php
$csv = array_map('str_getcsv', file("/home/marcel/ham/aprs_utils/aprs_log/aprs_received_messages.log"));
for ($i = 0; $i < count($csv); $i++) {
if ($csv[$i][1] == "ax0") {
echo $csv[$i][2];
echo ": ";
echo $csv[$i][4];
echo "<br>";
}
}
?>
</h3>
<h2 align="left"><?php echo $ax1_name ?> (<?php echo $ax1_frequency ?>)</h2>
<h3 align="left">
<?php
$csv = array_map('str_getcsv', file("/home/marcel/ham/aprs_utils/aprs_log/aprs_received_messages.log"));
for ($i = 0; $i < count($csv); $i++) {
if ($csv[$i][1] == "ax1") {
echo $csv[$i][2];
echo ": ";
echo $csv[$i][4];
echo "<br>";
}
}
?>
</h3>
<a href=""><h1 style="color:Black;" onclick="show_main_page()"><i class="fa fa-arrow-left" aria-hidden="true"></i>&nbsp; Back</h1></a>
</div>
<div class="col-3 col-s-12 menu">
<ul>
<li><h3><?php echo $ax1_name ?> (<?php echo $ax1_frequency ?>)</h3></li>
<li onclick="openForm_ax1()">Beacon: <b><?php echo $ax1_beacon_comment; ?></b></li>
<li onclick="openForm_ax1()">Beacon interval: <b><?php if ($ax1_beacon_time == 0) echo "OFF";else echo $ax1_beacon_time; ?></b></li>
<li onclick="openForm_ax1()">Path: <b><?php echo $ax1_beacon_path; ?></b></li>
</ul>
</div>
</div>
<div class="loginPopup">
<div class="formPopup" id="popupForm_ax0_beacon">
<form action="" class="formContainer" method="post">
<h2>Beacon <?php echo $ax0_frequency ?></h2>
<label for="email">
<strong>Comment</strong>
</label>
<input type="text" id="email" placeholder="Comment" name="comment_ax0" value="<?php echo $ax0_beacon_comment; ?>" required>
<label for="psw">
<strong>Period (minutes)</strong>
</label>
<input type="number" id="psw" placeholder="Minutes" name="period_ax0" min="0" max="60" step="10" value="<?php echo $ax0_beacon_time; ?>" required>
<label for="path">
<strong>Path<br></strong>
</label>
<div class="radioLeft">
<input type="radio" class="formContainer radio" id="path_none" name="path_ax0" value="none"<?php if ($ax0_beacon_path == "none") echo "checked"; ?>>
<label for="path_none">none</label><br>
<input type="radio" class="formContainer radio" id="path_wide21" name="path_ax0" value="WIDE2-1" <?php if ($ax0_beacon_path == "WIDE2-1") echo "checked"; ?> >
<label for="path_wide21">WIDE2-1</label><br>
<input type="radio" class="formContainer radio" id="path_wide22" name="path_ax0" value="WIDE2-2" <?php if ($ax0_beacon_path == "WIDE2-2") echo "checked"; ?> >
<label for="path_wide22">WIDE2-2</label><br>
<input type="radio" class="formContainer radio" id="path_wide33" name="path_ax0" value="WIDE3-3" <?php if ($ax0_beacon_path == "WIDE3-3") echo "checked"; ?> >
<label for="path_wide33">WIDE3-3</label><br>
</div>
<div id="submit_ax0"><button type="submit" class="btn" onclick="SubmitClicked_ax0()">Submit</button></div>
<div id="submit_done_ax0" style="display:none;"><button type="button" class="btn wait"><img src="images/preload.gif">Please wait...</button></div>
<div id="cancel_ax0"><button type="button" class="btn cancel" onclick="closeForm_ax0()">Cancel</button>
</form>
</div>
</div>
</div>
<div class="loginPopup">
<div class="formPopup" id="popup_ax1_beacon">
<form action="" class="formContainer" method="post">
<h2>Beacon <?php echo $ax1_frequency ?></h2>
<label for="email">
<strong>Comment</strong>
</label>
<input type="text" id="email" placeholder="comment" name="comment_ax1" value="<?php echo $ax1_beacon_comment; ?>" required>
<label for="psw">
<strong>Period</strong>
</label>
<input type="number" id="psw" placeholder="Period" name="period_ax1" min="0" max="60" step="10" value="<?php echo $ax1_beacon_time; ?>" required>
<label for="path">
<strong>Path<br></strong>
</label>
<div class="radioLeft">
<input type="radio" class="formContainer radio" id="path_none" name="path_ax1" value="none"<?php if ($ax1_beacon_path == "none") echo "checked"; ?>>
<label for="path_none">none</label><br>
<input type="radio" class="formContainer radio" id="path_wide21" name="path_ax1" value="WIDE2-1" <?php if ($ax1_beacon_path == "WIDE2-1") echo "checked"; ?> >
<label for="path_wide21">WIDE2-1</label><br>
<input type="radio" class="formContainer radio" id="path_wide22" name="path_ax1" value="WIDE2-2" <?php if ($ax1_beacon_path == "WIDE2-2") echo "checked"; ?> >
<label for="path_wide22">WIDE2-2</label><br>
<input type="radio" class="formContainer radio" id="path_wide33" name="path_ax1" value="WIDE3-3" <?php if ($ax1_beacon_path == "WIDE3-3") echo "checked"; ?> >
<label for="path_wide33">WIDE3-3</label><br>
</div>
<div id="submit_ax1"><button type="submit" class="btn" onclick="SubmitClicked_ax1()">Submit</button></div>
<div id="submit_done_ax1" style="display:none;"><button type="button" class="btn wait"><img src="images/preload.gif">Please wait...</button></div>
<div id="cancel_ax1"><button type="button" class="btn cancel" onclick="closeForm_ax1()">Cancel</button>
</form>
</div>
</div>
</div>
<div class="footer">
<p>Open source hardware and software. Visit https://www.meezenest.nl/mees for more information.</p>
</div>
<script>
function openForm_ax0() {
document.getElementById("popupForm_ax0_beacon").style.display = "block";
}
function closeForm_ax0() {
document.getElementById("popupForm_ax0_beacon").style.display = "none";
}
function openForm_ax1() {
document.getElementById("popup_ax1_beacon").style.display = "block";
}
function closeForm_ax1() {
document.getElementById("popup_ax1_beacon").style.display = "none";
}
function show_heard_stations() {
document.getElementById("main_page").style.display = "none";
document.getElementById("heard_stations").style.display = "block";
document.getElementById("received_messages").style.display = "none";
}
function show_received_messages() {
document.getElementById("main_page").style.display = "none";
document.getElementById("heard_stations").style.display = "none";
document.getElementById("received_messages").style.display = "block";
}
function show_main_page() {
document.getElementById("main_page").style.display = "block";
document.getElementById("heard_stations").style.display = "none";
document.getElementById("received_messages").style.display = "none";
}
/*
Replacing Submit Button with 'Loading' Image
Version 2.0
December 18, 2012
Will Bontrager Software, LLC
https://www.willmaster.com/
Copyright 2012 Will Bontrager Software, LLC
This software is provided "AS IS," without
any warranty of any kind, without even any
implied warranty such as merchantability
or fitness for a particular purpose.
Will Bontrager Software, LLC grants
you a royalty free license to use or
modify this software provided this
notice appears on all copies.
*/
function SubmitClicked_ax1()
{
document.getElementById("submit_ax1").style.display = "none"; // to undisplay
document.getElementById("submit_done_ax1").style.display = "block"; // to display
document.getElementById("cancel_ax1").style.display = "none"; // to display
return true;
}
function SubmitClicked_ax0()
{
document.getElementById("submit_ax0").style.display = "none"; // to undisplay
document.getElementById("submit_done_ax0").style.display = "block"; // to display
document.getElementById("cancel_ax0").style.display = "none"; // to display
return true;
}
</script>
</body>
</html>

@ -0,0 +1,34 @@
// Animated Icons
// --------------------------
.@{fa-css-prefix}-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
}
.@{fa-css-prefix}-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8);
}
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}

@ -0,0 +1,25 @@
// Bordered & Pulled
// -------------------------
.@{fa-css-prefix}-border {
padding: .2em .25em .15em;
border: solid .08em @fa-border-color;
border-radius: .1em;
}
.@{fa-css-prefix}-pull-left { float: left; }
.@{fa-css-prefix}-pull-right { float: right; }
.@{fa-css-prefix} {
&.@{fa-css-prefix}-pull-left { margin-right: .3em; }
&.@{fa-css-prefix}-pull-right { margin-left: .3em; }
}
/* Deprecated as of 4.4.0 */
.pull-right { float: right; }
.pull-left { float: left; }
.@{fa-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
}

@ -0,0 +1,12 @@
// Base Class Definition
// -------------------------
.@{fa-css-prefix} {
display: inline-block;
font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}

@ -0,0 +1,6 @@
// Fixed Width Icons
// -------------------------
.@{fa-css-prefix}-fw {
width: (18em / 14);
text-align: center;
}

@ -0,0 +1,18 @@
/*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/
@import "variables.less";
@import "mixins.less";
@import "path.less";
@import "core.less";
@import "larger.less";
@import "fixed-width.less";
@import "list.less";
@import "bordered-pulled.less";
@import "animated.less";
@import "rotated-flipped.less";
@import "stacked.less";
@import "icons.less";
@import "screen-reader.less";

@ -0,0 +1,789 @@
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }
.@{fa-css-prefix}-music:before { content: @fa-var-music; }
.@{fa-css-prefix}-search:before { content: @fa-var-search; }
.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }
.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }
.@{fa-css-prefix}-star:before { content: @fa-var-star; }
.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }
.@{fa-css-prefix}-user:before { content: @fa-var-user; }
.@{fa-css-prefix}-film:before { content: @fa-var-film; }
.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }
.@{fa-css-prefix}-th:before { content: @fa-var-th; }
.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }
.@{fa-css-prefix}-check:before { content: @fa-var-check; }
.@{fa-css-prefix}-remove:before,
.@{fa-css-prefix}-close:before,
.@{fa-css-prefix}-times:before { content: @fa-var-times; }
.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }
.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }
.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }
.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }
.@{fa-css-prefix}-gear:before,
.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }
.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }
.@{fa-css-prefix}-home:before { content: @fa-var-home; }
.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }
.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }
.@{fa-css-prefix}-road:before { content: @fa-var-road; }
.@{fa-css-prefix}-download:before { content: @fa-var-download; }
.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }
.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }
.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }
.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }
.@{fa-css-prefix}-rotate-right:before,
.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }
.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }
.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }
.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }
.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }
.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }
.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }
.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }
.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }
.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }
.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }
.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }
.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }
.@{fa-css-prefix}-book:before { content: @fa-var-book; }
.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }
.@{fa-css-prefix}-print:before { content: @fa-var-print; }
.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }
.@{fa-css-prefix}-font:before { content: @fa-var-font; }
.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }
.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }
.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }
.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }
.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }
.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }
.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }
.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }
.@{fa-css-prefix}-list:before { content: @fa-var-list; }
.@{fa-css-prefix}-dedent:before,
.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }
.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }
.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }
.@{fa-css-prefix}-photo:before,
.@{fa-css-prefix}-image:before,
.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }
.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }
.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }
.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }
.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }
.@{fa-css-prefix}-edit:before,
.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }
.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }
.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }
.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }
.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }
.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }
.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }
.@{fa-css-prefix}-play:before { content: @fa-var-play; }
.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }
.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }
.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }
.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }
.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }
.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }
.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }
.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }
.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }
.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }
.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }
.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }
.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }
.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }
.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }
.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }
.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }
.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }
.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }
.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }
.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }
.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }
.@{fa-css-prefix}-mail-forward:before,
.@{fa-css-prefix}-share:before { content: @fa-var-share; }
.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }
.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }
.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }
.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }
.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }
.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }
.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }
.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }
.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }
.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }
.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }
.@{fa-css-prefix}-warning:before,
.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }
.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }
.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }
.@{fa-css-prefix}-random:before { content: @fa-var-random; }
.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }
.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }
.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }
.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }
.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }
.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }
.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }
.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }
.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }
.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }
.@{fa-css-prefix}-bar-chart-o:before,
.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }
.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }
.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }
.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }
.@{fa-css-prefix}-key:before { content: @fa-var-key; }
.@{fa-css-prefix}-gears:before,
.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }
.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }
.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }
.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }
.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }
.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }
.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }
.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }
.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }
.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }
.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }
.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }
.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }
.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }
.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }
.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }
.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }
.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }
.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }
.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }
.@{fa-css-prefix}-facebook-f:before,
.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }
.@{fa-css-prefix}-github:before { content: @fa-var-github; }
.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }
.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }
.@{fa-css-prefix}-feed:before,
.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }
.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }
.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }
.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }
.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }
.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }
.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }
.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }
.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }
.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }
.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }
.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }
.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }
.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }
.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }
.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }
.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }
.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }
.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }
.@{fa-css-prefix}-group:before,
.@{fa-css-prefix}-users:before { content: @fa-var-users; }
.@{fa-css-prefix}-chain:before,
.@{fa-css-prefix}-link:before { content: @fa-var-link; }
.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }
.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }
.@{fa-css-prefix}-cut:before,
.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }
.@{fa-css-prefix}-copy:before,
.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }
.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }
.@{fa-css-prefix}-save:before,
.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }
.@{fa-css-prefix}-square:before { content: @fa-var-square; }
.@{fa-css-prefix}-navicon:before,
.@{fa-css-prefix}-reorder:before,
.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }
.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }
.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }
.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }
.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }
.@{fa-css-prefix}-table:before { content: @fa-var-table; }
.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }
.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }
.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }
.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }
.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }
.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }
.@{fa-css-prefix}-money:before { content: @fa-var-money; }
.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }
.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }
.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }
.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }
.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }
.@{fa-css-prefix}-unsorted:before,
.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }
.@{fa-css-prefix}-sort-down:before,
.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }
.@{fa-css-prefix}-sort-up:before,
.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }
.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }
.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }
.@{fa-css-prefix}-rotate-left:before,
.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }
.@{fa-css-prefix}-legal:before,
.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }
.@{fa-css-prefix}-dashboard:before,
.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }
.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }
.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }
.@{fa-css-prefix}-flash:before,
.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }
.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }
.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }
.@{fa-css-prefix}-paste:before,
.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }
.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }
.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }
.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }
.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }
.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }
.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }
.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }
.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }
.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }
.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }
.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }
.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }
.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }
.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }
.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }
.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }
.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }
.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }
.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }
.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }
.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }
.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }
.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }
.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }
.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }
.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }
.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }
.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }
.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }
.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }
.@{fa-css-prefix}-mobile-phone:before,
.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }
.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }
.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }
.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }
.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }
.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }
.@{fa-css-prefix}-mail-reply:before,
.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }
.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }
.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }
.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }
.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }
.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }
.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }
.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }
.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }
.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }
.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }
.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }
.@{fa-css-prefix}-code:before { content: @fa-var-code; }
.@{fa-css-prefix}-mail-reply-all:before,
.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }
.@{fa-css-prefix}-star-half-empty:before,
.@{fa-css-prefix}-star-half-full:before,
.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }
.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }
.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }
.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }
.@{fa-css-prefix}-unlink:before,
.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }
.@{fa-css-prefix}-question:before { content: @fa-var-question; }
.@{fa-css-prefix}-info:before { content: @fa-var-info; }
.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }
.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }
.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }
.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }
.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }
.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }
.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }
.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }
.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }
.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }
.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }
.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }
.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }
.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }
.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }
.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }
.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }
.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }
.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }
.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }
.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }
.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }
.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }
.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }
.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }
.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }
.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }
.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }
.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }
.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }
.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }
.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }
.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }
.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }
.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }
.@{fa-css-prefix}-toggle-down:before,
.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }
.@{fa-css-prefix}-toggle-up:before,
.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }
.@{fa-css-prefix}-toggle-right:before,
.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }
.@{fa-css-prefix}-euro:before,
.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }
.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }
.@{fa-css-prefix}-dollar:before,
.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }
.@{fa-css-prefix}-rupee:before,
.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }
.@{fa-css-prefix}-cny:before,
.@{fa-css-prefix}-rmb:before,
.@{fa-css-prefix}-yen:before,
.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }
.@{fa-css-prefix}-ruble:before,
.@{fa-css-prefix}-rouble:before,
.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }
.@{fa-css-prefix}-won:before,
.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }
.@{fa-css-prefix}-bitcoin:before,
.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }
.@{fa-css-prefix}-file:before { content: @fa-var-file; }
.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }
.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }
.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }
.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }
.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }
.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }
.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }
.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }
.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }
.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }
.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }
.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }
.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }
.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }
.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }
.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }
.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }
.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }
.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }
.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }
.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }
.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }
.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }
.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }
.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }
.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }
.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }
.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }
.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }
.@{fa-css-prefix}-android:before { content: @fa-var-android; }
.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }
.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }
.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }
.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }
.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }
.@{fa-css-prefix}-female:before { content: @fa-var-female; }
.@{fa-css-prefix}-male:before { content: @fa-var-male; }
.@{fa-css-prefix}-gittip:before,
.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; }
.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }
.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }
.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }
.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }
.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }
.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }
.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }
.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }
.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }
.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }
.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }
.@{fa-css-prefix}-toggle-left:before,
.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }
.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }
.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }
.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }
.@{fa-css-prefix}-turkish-lira:before,
.@{fa-css-prefix}-try:before { content: @fa-var-try; }
.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }
.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }
.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }
.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }
.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }
.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }
.@{fa-css-prefix}-institution:before,
.@{fa-css-prefix}-bank:before,
.@{fa-css-prefix}-university:before { content: @fa-var-university; }
.@{fa-css-prefix}-mortar-board:before,
.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }
.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }
.@{fa-css-prefix}-google:before { content: @fa-var-google; }
.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }
.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }
.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }
.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }
.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }
.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }
.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; }
.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }
.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }
.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }
.@{fa-css-prefix}-language:before { content: @fa-var-language; }
.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }
.@{fa-css-prefix}-building:before { content: @fa-var-building; }
.@{fa-css-prefix}-child:before { content: @fa-var-child; }
.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }
.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }
.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }
.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }
.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }
.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }
.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }
.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }
.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }
.@{fa-css-prefix}-automobile:before,
.@{fa-css-prefix}-car:before { content: @fa-var-car; }
.@{fa-css-prefix}-cab:before,
.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }
.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }
.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }
.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }
.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }
.@{fa-css-prefix}-database:before { content: @fa-var-database; }
.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }
.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }
.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }
.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }
.@{fa-css-prefix}-file-photo-o:before,
.@{fa-css-prefix}-file-picture-o:before,
.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }
.@{fa-css-prefix}-file-zip-o:before,
.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }
.@{fa-css-prefix}-file-sound-o:before,
.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }
.@{fa-css-prefix}-file-movie-o:before,
.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }
.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }
.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }
.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }
.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }
.@{fa-css-prefix}-life-bouy:before,
.@{fa-css-prefix}-life-buoy:before,
.@{fa-css-prefix}-life-saver:before,
.@{fa-css-prefix}-support:before,
.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }
.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }
.@{fa-css-prefix}-ra:before,
.@{fa-css-prefix}-resistance:before,
.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }
.@{fa-css-prefix}-ge:before,
.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }
.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }
.@{fa-css-prefix}-git:before { content: @fa-var-git; }
.@{fa-css-prefix}-y-combinator-square:before,
.@{fa-css-prefix}-yc-square:before,
.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }
.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }
.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }
.@{fa-css-prefix}-wechat:before,
.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }
.@{fa-css-prefix}-send:before,
.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }
.@{fa-css-prefix}-send-o:before,
.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }
.@{fa-css-prefix}-history:before { content: @fa-var-history; }
.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }
.@{fa-css-prefix}-header:before { content: @fa-var-header; }
.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }
.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }
.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }
.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }
.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }
.@{fa-css-prefix}-soccer-ball-o:before,
.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }
.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }
.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }
.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }
.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }
.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }
.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }
.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }
.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }
.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }
.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }
.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }
.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }
.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }
.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }
.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }
.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }
.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }
.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }
.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }
.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }
.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }
.@{fa-css-prefix}-at:before { content: @fa-var-at; }
.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }
.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }
.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }
.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }
.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }
.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }
.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }
.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }
.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }
.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }
.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }
.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }
.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }
.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }
.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }
.@{fa-css-prefix}-shekel:before,
.@{fa-css-prefix}-sheqel:before,
.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }
.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }
.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; }
.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; }
.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; }
.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; }
.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; }
.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; }
.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; }
.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; }
.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; }
.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; }
.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; }
.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; }
.@{fa-css-prefix}-ship:before { content: @fa-var-ship; }
.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; }
.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; }
.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; }
.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; }
.@{fa-css-prefix}-venus:before { content: @fa-var-venus; }
.@{fa-css-prefix}-mars:before { content: @fa-var-mars; }
.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; }
.@{fa-css-prefix}-intersex:before,
.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; }
.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; }
.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; }
.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; }
.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; }
.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; }
.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; }
.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; }
.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; }
.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; }
.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; }
.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; }
.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; }
.@{fa-css-prefix}-server:before { content: @fa-var-server; }
.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; }
.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; }
.@{fa-css-prefix}-hotel:before,
.@{fa-css-prefix}-bed:before { content: @fa-var-bed; }
.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; }
.@{fa-css-prefix}-train:before { content: @fa-var-train; }
.@{fa-css-prefix}-subway:before { content: @fa-var-subway; }
.@{fa-css-prefix}-medium:before { content: @fa-var-medium; }
.@{fa-css-prefix}-yc:before,
.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; }
.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; }
.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; }
.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; }
.@{fa-css-prefix}-battery-4:before,
.@{fa-css-prefix}-battery:before,
.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; }
.@{fa-css-prefix}-battery-3:before,
.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; }
.@{fa-css-prefix}-battery-2:before,
.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; }
.@{fa-css-prefix}-battery-1:before,
.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; }
.@{fa-css-prefix}-battery-0:before,
.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; }
.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; }
.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; }
.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; }
.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; }
.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; }
.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; }
.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; }
.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; }
.@{fa-css-prefix}-clone:before { content: @fa-var-clone; }
.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; }
.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; }
.@{fa-css-prefix}-hourglass-1:before,
.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; }
.@{fa-css-prefix}-hourglass-2:before,
.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; }
.@{fa-css-prefix}-hourglass-3:before,
.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; }
.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; }
.@{fa-css-prefix}-hand-grab-o:before,
.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; }
.@{fa-css-prefix}-hand-stop-o:before,
.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; }
.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; }
.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; }
.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; }
.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; }
.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; }
.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; }
.@{fa-css-prefix}-registered:before { content: @fa-var-registered; }
.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; }
.@{fa-css-prefix}-gg:before { content: @fa-var-gg; }
.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; }
.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; }
.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; }
.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; }
.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; }
.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; }
.@{fa-css-prefix}-safari:before { content: @fa-var-safari; }
.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; }
.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; }
.@{fa-css-prefix}-opera:before { content: @fa-var-opera; }
.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; }
.@{fa-css-prefix}-tv:before,
.@{fa-css-prefix}-television:before { content: @fa-var-television; }
.@{fa-css-prefix}-contao:before { content: @fa-var-contao; }
.@{fa-css-prefix}-500px:before { content: @fa-var-500px; }
.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; }
.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; }
.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; }
.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; }
.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; }
.@{fa-css-prefix}-industry:before { content: @fa-var-industry; }
.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; }
.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; }
.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; }
.@{fa-css-prefix}-map:before { content: @fa-var-map; }
.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; }
.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; }
.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; }
.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; }
.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; }
.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; }
.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; }
.@{fa-css-prefix}-edge:before { content: @fa-var-edge; }
.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; }
.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; }
.@{fa-css-prefix}-modx:before { content: @fa-var-modx; }
.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; }
.@{fa-css-prefix}-usb:before { content: @fa-var-usb; }
.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; }
.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; }
.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; }
.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; }
.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; }
.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; }
.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; }
.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; }
.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; }
.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; }
.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; }
.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; }
.@{fa-css-prefix}-percent:before { content: @fa-var-percent; }
.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; }
.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; }
.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; }
.@{fa-css-prefix}-envira:before { content: @fa-var-envira; }
.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; }
.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; }
.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; }
.@{fa-css-prefix}-blind:before { content: @fa-var-blind; }
.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; }
.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; }
.@{fa-css-prefix}-braille:before { content: @fa-var-braille; }
.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; }
.@{fa-css-prefix}-asl-interpreting:before,
.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; }
.@{fa-css-prefix}-deafness:before,
.@{fa-css-prefix}-hard-of-hearing:before,
.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; }
.@{fa-css-prefix}-glide:before { content: @fa-var-glide; }
.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; }
.@{fa-css-prefix}-signing:before,
.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; }
.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; }
.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; }
.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; }
.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; }
.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; }
.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; }
.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }
.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; }
.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; }
.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; }
.@{fa-css-prefix}-google-plus-circle:before,
.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; }
.@{fa-css-prefix}-fa:before,
.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; }
.@{fa-css-prefix}-handshake-o:before { content: @fa-var-handshake-o; }
.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; }
.@{fa-css-prefix}-envelope-open-o:before { content: @fa-var-envelope-open-o; }
.@{fa-css-prefix}-linode:before { content: @fa-var-linode; }
.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; }
.@{fa-css-prefix}-address-book-o:before { content: @fa-var-address-book-o; }
.@{fa-css-prefix}-vcard:before,
.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; }
.@{fa-css-prefix}-vcard-o:before,
.@{fa-css-prefix}-address-card-o:before { content: @fa-var-address-card-o; }
.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; }
.@{fa-css-prefix}-user-circle-o:before { content: @fa-var-user-circle-o; }
.@{fa-css-prefix}-user-o:before { content: @fa-var-user-o; }
.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; }
.@{fa-css-prefix}-drivers-license:before,
.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; }
.@{fa-css-prefix}-drivers-license-o:before,
.@{fa-css-prefix}-id-card-o:before { content: @fa-var-id-card-o; }
.@{fa-css-prefix}-quora:before { content: @fa-var-quora; }
.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; }
.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; }
.@{fa-css-prefix}-thermometer-4:before,
.@{fa-css-prefix}-thermometer:before,
.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; }
.@{fa-css-prefix}-thermometer-3:before,
.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; }
.@{fa-css-prefix}-thermometer-2:before,
.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; }
.@{fa-css-prefix}-thermometer-1:before,
.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; }
.@{fa-css-prefix}-thermometer-0:before,
.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; }
.@{fa-css-prefix}-shower:before { content: @fa-var-shower; }
.@{fa-css-prefix}-bathtub:before,
.@{fa-css-prefix}-s15:before,
.@{fa-css-prefix}-bath:before { content: @fa-var-bath; }
.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; }
.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; }
.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; }
.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; }
.@{fa-css-prefix}-times-rectangle:before,
.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; }
.@{fa-css-prefix}-times-rectangle-o:before,
.@{fa-css-prefix}-window-close-o:before { content: @fa-var-window-close-o; }
.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; }
.@{fa-css-prefix}-grav:before { content: @fa-var-grav; }
.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; }
.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; }
.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; }
.@{fa-css-prefix}-eercast:before { content: @fa-var-eercast; }
.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; }
.@{fa-css-prefix}-snowflake-o:before { content: @fa-var-snowflake-o; }
.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; }
.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; }
.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; }

@ -0,0 +1,13 @@
// Icon Sizes
// -------------------------
/* makes the font 33% larger relative to the icon container */
.@{fa-css-prefix}-lg {
font-size: (4em / 3);
line-height: (3em / 4);
vertical-align: -15%;
}
.@{fa-css-prefix}-2x { font-size: 2em; }
.@{fa-css-prefix}-3x { font-size: 3em; }
.@{fa-css-prefix}-4x { font-size: 4em; }
.@{fa-css-prefix}-5x { font-size: 5em; }

@ -0,0 +1,19 @@
// List Icons
// -------------------------
.@{fa-css-prefix}-ul {
padding-left: 0;
margin-left: @fa-li-width;
list-style-type: none;
> li { position: relative; }
}
.@{fa-css-prefix}-li {
position: absolute;
left: -@fa-li-width;
width: @fa-li-width;
top: (2em / 14);
text-align: center;
&.@{fa-css-prefix}-lg {
left: (-@fa-li-width + (4em / 14));
}
}

@ -0,0 +1,60 @@
// Mixins
// --------------------------
.fa-icon() {
display: inline-block;
font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.fa-icon-rotate(@degrees, @rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})";
-webkit-transform: rotate(@degrees);
-ms-transform: rotate(@degrees);
transform: rotate(@degrees);
}
.fa-icon-flip(@horiz, @vert, @rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)";
-webkit-transform: scale(@horiz, @vert);
-ms-transform: scale(@horiz, @vert);
transform: scale(@horiz, @vert);
}
// Only display content to screen readers. A la Bootstrap 4.
//
// See: http://a11yproject.com/posts/how-to-hide-content/
.sr-only() {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
border: 0;
}
// Use in conjunction with .sr-only to only display content when it's focused.
//
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
//
// Credit: HTML5 Boilerplate
.sr-only-focusable() {
&:active,
&:focus {
position: static;
width: auto;
height: auto;
margin: 0;
overflow: visible;
clip: auto;
}
}

@ -0,0 +1,15 @@
/* FONT PATH
* -------------------------- */
@font-face {
font-family: 'FontAwesome';
src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),
url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
font-weight: normal;
font-style: normal;
}

@ -0,0 +1,20 @@
// Rotated & Flipped Icons
// -------------------------
.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
// Hook for IE8-9
// -------------------------
:root .@{fa-css-prefix}-rotate-90,
:root .@{fa-css-prefix}-rotate-180,
:root .@{fa-css-prefix}-rotate-270,
:root .@{fa-css-prefix}-flip-horizontal,
:root .@{fa-css-prefix}-flip-vertical {
filter: none;
}

@ -0,0 +1,5 @@
// Screen Readers
// -------------------------
.sr-only { .sr-only(); }
.sr-only-focusable { .sr-only-focusable(); }

@ -0,0 +1,20 @@
// Stacked Icons
// -------------------------
.@{fa-css-prefix}-stack {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.@{fa-css-prefix}-stack-1x { line-height: inherit; }
.@{fa-css-prefix}-stack-2x { font-size: 2em; }
.@{fa-css-prefix}-inverse { color: @fa-inverse; }

@ -0,0 +1,800 @@
// Variables
// --------------------------
@fa-font-path: "../fonts";
@fa-font-size-base: 14px;
@fa-line-height-base: 1;
//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly
@fa-css-prefix: fa;
@fa-version: "4.7.0";
@fa-border-color: #eee;
@fa-inverse: #fff;
@fa-li-width: (30em / 14);
@fa-var-500px: "\f26e";
@fa-var-address-book: "\f2b9";
@fa-var-address-book-o: "\f2ba";
@fa-var-address-card: "\f2bb";
@fa-var-address-card-o: "\f2bc";
@fa-var-adjust: "\f042";
@fa-var-adn: "\f170";
@fa-var-align-center: "\f037";
@fa-var-align-justify: "\f039";
@fa-var-align-left: "\f036";
@fa-var-align-right: "\f038";
@fa-var-amazon: "\f270";
@fa-var-ambulance: "\f0f9";
@fa-var-american-sign-language-interpreting: "\f2a3";
@fa-var-anchor: "\f13d";
@fa-var-android: "\f17b";
@fa-var-angellist: "\f209";
@fa-var-angle-double-down: "\f103";
@fa-var-angle-double-left: "\f100";
@fa-var-angle-double-right: "\f101";
@fa-var-angle-double-up: "\f102";
@fa-var-angle-down: "\f107";
@fa-var-angle-left: "\f104";
@fa-var-angle-right: "\f105";
@fa-var-angle-up: "\f106";
@fa-var-apple: "\f179";
@fa-var-archive: "\f187";
@fa-var-area-chart: "\f1fe";
@fa-var-arrow-circle-down: "\f0ab";
@fa-var-arrow-circle-left: "\f0a8";
@fa-var-arrow-circle-o-down: "\f01a";
@fa-var-arrow-circle-o-left: "\f190";
@fa-var-arrow-circle-o-right: "\f18e";
@fa-var-arrow-circle-o-up: "\f01b";
@fa-var-arrow-circle-right: "\f0a9";
@fa-var-arrow-circle-up: "\f0aa";
@fa-var-arrow-down: "\f063";
@fa-var-arrow-left: "\f060";
@fa-var-arrow-right: "\f061";
@fa-var-arrow-up: "\f062";
@fa-var-arrows: "\f047";
@fa-var-arrows-alt: "\f0b2";
@fa-var-arrows-h: "\f07e";
@fa-var-arrows-v: "\f07d";
@fa-var-asl-interpreting: "\f2a3";
@fa-var-assistive-listening-systems: "\f2a2";
@fa-var-asterisk: "\f069";
@fa-var-at: "\f1fa";
@fa-var-audio-description: "\f29e";
@fa-var-automobile: "\f1b9";
@fa-var-backward: "\f04a";
@fa-var-balance-scale: "\f24e";
@fa-var-ban: "\f05e";
@fa-var-bandcamp: "\f2d5";
@fa-var-bank: "\f19c";
@fa-var-bar-chart: "\f080";
@fa-var-bar-chart-o: "\f080";
@fa-var-barcode: "\f02a";
@fa-var-bars: "\f0c9";
@fa-var-bath: "\f2cd";
@fa-var-bathtub: "\f2cd";
@fa-var-battery: "\f240";
@fa-var-battery-0: "\f244";
@fa-var-battery-1: "\f243";
@fa-var-battery-2: "\f242";
@fa-var-battery-3: "\f241";
@fa-var-battery-4: "\f240";
@fa-var-battery-empty: "\f244";
@fa-var-battery-full: "\f240";
@fa-var-battery-half: "\f242";
@fa-var-battery-quarter: "\f243";
@fa-var-battery-three-quarters: "\f241";
@fa-var-bed: "\f236";
@fa-var-beer: "\f0fc";
@fa-var-behance: "\f1b4";
@fa-var-behance-square: "\f1b5";
@fa-var-bell: "\f0f3";
@fa-var-bell-o: "\f0a2";
@fa-var-bell-slash: "\f1f6";
@fa-var-bell-slash-o: "\f1f7";
@fa-var-bicycle: "\f206";
@fa-var-binoculars: "\f1e5";
@fa-var-birthday-cake: "\f1fd";
@fa-var-bitbucket: "\f171";
@fa-var-bitbucket-square: "\f172";
@fa-var-bitcoin: "\f15a";
@fa-var-black-tie: "\f27e";
@fa-var-blind: "\f29d";
@fa-var-bluetooth: "\f293";
@fa-var-bluetooth-b: "\f294";
@fa-var-bold: "\f032";
@fa-var-bolt: "\f0e7";
@fa-var-bomb: "\f1e2";
@fa-var-book: "\f02d";
@fa-var-bookmark: "\f02e";
@fa-var-bookmark-o: "\f097";
@fa-var-braille: "\f2a1";
@fa-var-briefcase: "\f0b1";
@fa-var-btc: "\f15a";
@fa-var-bug: "\f188";
@fa-var-building: "\f1ad";
@fa-var-building-o: "\f0f7";
@fa-var-bullhorn: "\f0a1";
@fa-var-bullseye: "\f140";
@fa-var-bus: "\f207";
@fa-var-buysellads: "\f20d";
@fa-var-cab: "\f1ba";
@fa-var-calculator: "\f1ec";
@fa-var-calendar: "\f073";
@fa-var-calendar-check-o: "\f274";
@fa-var-calendar-minus-o: "\f272";
@fa-var-calendar-o: "\f133";
@fa-var-calendar-plus-o: "\f271";
@fa-var-calendar-times-o: "\f273";
@fa-var-camera: "\f030";
@fa-var-camera-retro: "\f083";
@fa-var-car: "\f1b9";
@fa-var-caret-down: "\f0d7";
@fa-var-caret-left: "\f0d9";
@fa-var-caret-right: "\f0da";
@fa-var-caret-square-o-down: "\f150";
@fa-var-caret-square-o-left: "\f191";
@fa-var-caret-square-o-right: "\f152";
@fa-var-caret-square-o-up: "\f151";
@fa-var-caret-up: "\f0d8";
@fa-var-cart-arrow-down: "\f218";
@fa-var-cart-plus: "\f217";
@fa-var-cc: "\f20a";
@fa-var-cc-amex: "\f1f3";
@fa-var-cc-diners-club: "\f24c";
@fa-var-cc-discover: "\f1f2";
@fa-var-cc-jcb: "\f24b";
@fa-var-cc-mastercard: "\f1f1";
@fa-var-cc-paypal: "\f1f4";
@fa-var-cc-stripe: "\f1f5";
@fa-var-cc-visa: "\f1f0";
@fa-var-certificate: "\f0a3";
@fa-var-chain: "\f0c1";
@fa-var-chain-broken: "\f127";
@fa-var-check: "\f00c";
@fa-var-check-circle: "\f058";
@fa-var-check-circle-o: "\f05d";
@fa-var-check-square: "\f14a";
@fa-var-check-square-o: "\f046";
@fa-var-chevron-circle-down: "\f13a";
@fa-var-chevron-circle-left: "\f137";
@fa-var-chevron-circle-right: "\f138";
@fa-var-chevron-circle-up: "\f139";
@fa-var-chevron-down: "\f078";
@fa-var-chevron-left: "\f053";
@fa-var-chevron-right: "\f054";
@fa-var-chevron-up: "\f077";
@fa-var-child: "\f1ae";
@fa-var-chrome: "\f268";
@fa-var-circle: "\f111";
@fa-var-circle-o: "\f10c";
@fa-var-circle-o-notch: "\f1ce";
@fa-var-circle-thin: "\f1db";
@fa-var-clipboard: "\f0ea";
@fa-var-clock-o: "\f017";
@fa-var-clone: "\f24d";
@fa-var-close: "\f00d";
@fa-var-cloud: "\f0c2";
@fa-var-cloud-download: "\f0ed";
@fa-var-cloud-upload: "\f0ee";
@fa-var-cny: "\f157";
@fa-var-code: "\f121";
@fa-var-code-fork: "\f126";
@fa-var-codepen: "\f1cb";
@fa-var-codiepie: "\f284";
@fa-var-coffee: "\f0f4";
@fa-var-cog: "\f013";
@fa-var-cogs: "\f085";
@fa-var-columns: "\f0db";
@fa-var-comment: "\f075";
@fa-var-comment-o: "\f0e5";
@fa-var-commenting: "\f27a";
@fa-var-commenting-o: "\f27b";
@fa-var-comments: "\f086";
@fa-var-comments-o: "\f0e6";
@fa-var-compass: "\f14e";
@fa-var-compress: "\f066";
@fa-var-connectdevelop: "\f20e";
@fa-var-contao: "\f26d";
@fa-var-copy: "\f0c5";
@fa-var-copyright: "\f1f9";
@fa-var-creative-commons: "\f25e";
@fa-var-credit-card: "\f09d";
@fa-var-credit-card-alt: "\f283";
@fa-var-crop: "\f125";
@fa-var-crosshairs: "\f05b";
@fa-var-css3: "\f13c";
@fa-var-cube: "\f1b2";
@fa-var-cubes: "\f1b3";
@fa-var-cut: "\f0c4";
@fa-var-cutlery: "\f0f5";
@fa-var-dashboard: "\f0e4";
@fa-var-dashcube: "\f210";
@fa-var-database: "\f1c0";
@fa-var-deaf: "\f2a4";
@fa-var-deafness: "\f2a4";
@fa-var-dedent: "\f03b";
@fa-var-delicious: "\f1a5";
@fa-var-desktop: "\f108";
@fa-var-deviantart: "\f1bd";
@fa-var-diamond: "\f219";
@fa-var-digg: "\f1a6";
@fa-var-dollar: "\f155";
@fa-var-dot-circle-o: "\f192";
@fa-var-download: "\f019";
@fa-var-dribbble: "\f17d";
@fa-var-drivers-license: "\f2c2";
@fa-var-drivers-license-o: "\f2c3";
@fa-var-dropbox: "\f16b";
@fa-var-drupal: "\f1a9";
@fa-var-edge: "\f282";
@fa-var-edit: "\f044";
@fa-var-eercast: "\f2da";
@fa-var-eject: "\f052";
@fa-var-ellipsis-h: "\f141";
@fa-var-ellipsis-v: "\f142";
@fa-var-empire: "\f1d1";
@fa-var-envelope: "\f0e0";
@fa-var-envelope-o: "\f003";
@fa-var-envelope-open: "\f2b6";
@fa-var-envelope-open-o: "\f2b7";
@fa-var-envelope-square: "\f199";
@fa-var-envira: "\f299";
@fa-var-eraser: "\f12d";
@fa-var-etsy: "\f2d7";
@fa-var-eur: "\f153";
@fa-var-euro: "\f153";
@fa-var-exchange: "\f0ec";
@fa-var-exclamation: "\f12a";
@fa-var-exclamation-circle: "\f06a";
@fa-var-exclamation-triangle: "\f071";
@fa-var-expand: "\f065";
@fa-var-expeditedssl: "\f23e";
@fa-var-external-link: "\f08e";
@fa-var-external-link-square: "\f14c";
@fa-var-eye: "\f06e";
@fa-var-eye-slash: "\f070";
@fa-var-eyedropper: "\f1fb";
@fa-var-fa: "\f2b4";
@fa-var-facebook: "\f09a";
@fa-var-facebook-f: "\f09a";
@fa-var-facebook-official: "\f230";
@fa-var-facebook-square: "\f082";
@fa-var-fast-backward: "\f049";
@fa-var-fast-forward: "\f050";
@fa-var-fax: "\f1ac";
@fa-var-feed: "\f09e";
@fa-var-female: "\f182";
@fa-var-fighter-jet: "\f0fb";
@fa-var-file: "\f15b";
@fa-var-file-archive-o: "\f1c6";
@fa-var-file-audio-o: "\f1c7";
@fa-var-file-code-o: "\f1c9";
@fa-var-file-excel-o: "\f1c3";
@fa-var-file-image-o: "\f1c5";
@fa-var-file-movie-o: "\f1c8";
@fa-var-file-o: "\f016";
@fa-var-file-pdf-o: "\f1c1";
@fa-var-file-photo-o: "\f1c5";
@fa-var-file-picture-o: "\f1c5";
@fa-var-file-powerpoint-o: "\f1c4";
@fa-var-file-sound-o: "\f1c7";
@fa-var-file-text: "\f15c";
@fa-var-file-text-o: "\f0f6";
@fa-var-file-video-o: "\f1c8";
@fa-var-file-word-o: "\f1c2";
@fa-var-file-zip-o: "\f1c6";
@fa-var-files-o: "\f0c5";
@fa-var-film: "\f008";
@fa-var-filter: "\f0b0";
@fa-var-fire: "\f06d";
@fa-var-fire-extinguisher: "\f134";
@fa-var-firefox: "\f269";
@fa-var-first-order: "\f2b0";
@fa-var-flag: "\f024";
@fa-var-flag-checkered: "\f11e";
@fa-var-flag-o: "\f11d";
@fa-var-flash: "\f0e7";
@fa-var-flask: "\f0c3";
@fa-var-flickr: "\f16e";
@fa-var-floppy-o: "\f0c7";
@fa-var-folder: "\f07b";
@fa-var-folder-o: "\f114";
@fa-var-folder-open: "\f07c";
@fa-var-folder-open-o: "\f115";
@fa-var-font: "\f031";
@fa-var-font-awesome: "\f2b4";
@fa-var-fonticons: "\f280";
@fa-var-fort-awesome: "\f286";
@fa-var-forumbee: "\f211";
@fa-var-forward: "\f04e";
@fa-var-foursquare: "\f180";
@fa-var-free-code-camp: "\f2c5";
@fa-var-frown-o: "\f119";
@fa-var-futbol-o: "\f1e3";
@fa-var-gamepad: "\f11b";
@fa-var-gavel: "\f0e3";
@fa-var-gbp: "\f154";
@fa-var-ge: "\f1d1";
@fa-var-gear: "\f013";
@fa-var-gears: "\f085";
@fa-var-genderless: "\f22d";
@fa-var-get-pocket: "\f265";
@fa-var-gg: "\f260";
@fa-var-gg-circle: "\f261";
@fa-var-gift: "\f06b";
@fa-var-git: "\f1d3";
@fa-var-git-square: "\f1d2";
@fa-var-github: "\f09b";
@fa-var-github-alt: "\f113";
@fa-var-github-square: "\f092";
@fa-var-gitlab: "\f296";
@fa-var-gittip: "\f184";
@fa-var-glass: "\f000";
@fa-var-glide: "\f2a5";
@fa-var-glide-g: "\f2a6";
@fa-var-globe: "\f0ac";
@fa-var-google: "\f1a0";
@fa-var-google-plus: "\f0d5";
@fa-var-google-plus-circle: "\f2b3";
@fa-var-google-plus-official: "\f2b3";
@fa-var-google-plus-square: "\f0d4";
@fa-var-google-wallet: "\f1ee";
@fa-var-graduation-cap: "\f19d";
@fa-var-gratipay: "\f184";
@fa-var-grav: "\f2d6";
@fa-var-group: "\f0c0";
@fa-var-h-square: "\f0fd";
@fa-var-hacker-news: "\f1d4";
@fa-var-hand-grab-o: "\f255";
@fa-var-hand-lizard-o: "\f258";
@fa-var-hand-o-down: "\f0a7";
@fa-var-hand-o-left: "\f0a5";
@fa-var-hand-o-right: "\f0a4";
@fa-var-hand-o-up: "\f0a6";
@fa-var-hand-paper-o: "\f256";
@fa-var-hand-peace-o: "\f25b";
@fa-var-hand-pointer-o: "\f25a";
@fa-var-hand-rock-o: "\f255";
@fa-var-hand-scissors-o: "\f257";
@fa-var-hand-spock-o: "\f259";
@fa-var-hand-stop-o: "\f256";
@fa-var-handshake-o: "\f2b5";
@fa-var-hard-of-hearing: "\f2a4";
@fa-var-hashtag: "\f292";
@fa-var-hdd-o: "\f0a0";
@fa-var-header: "\f1dc";
@fa-var-headphones: "\f025";
@fa-var-heart: "\f004";
@fa-var-heart-o: "\f08a";
@fa-var-heartbeat: "\f21e";
@fa-var-history: "\f1da";
@fa-var-home: "\f015";
@fa-var-hospital-o: "\f0f8";
@fa-var-hotel: "\f236";
@fa-var-hourglass: "\f254";
@fa-var-hourglass-1: "\f251";
@fa-var-hourglass-2: "\f252";
@fa-var-hourglass-3: "\f253";
@fa-var-hourglass-end: "\f253";
@fa-var-hourglass-half: "\f252";
@fa-var-hourglass-o: "\f250";
@fa-var-hourglass-start: "\f251";
@fa-var-houzz: "\f27c";
@fa-var-html5: "\f13b";
@fa-var-i-cursor: "\f246";
@fa-var-id-badge: "\f2c1";
@fa-var-id-card: "\f2c2";
@fa-var-id-card-o: "\f2c3";
@fa-var-ils: "\f20b";
@fa-var-image: "\f03e";
@fa-var-imdb: "\f2d8";
@fa-var-inbox: "\f01c";
@fa-var-indent: "\f03c";
@fa-var-industry: "\f275";
@fa-var-info: "\f129";
@fa-var-info-circle: "\f05a";
@fa-var-inr: "\f156";
@fa-var-instagram: "\f16d";
@fa-var-institution: "\f19c";
@fa-var-internet-explorer: "\f26b";
@fa-var-intersex: "\f224";
@fa-var-ioxhost: "\f208";
@fa-var-italic: "\f033";
@fa-var-joomla: "\f1aa";
@fa-var-jpy: "\f157";
@fa-var-jsfiddle: "\f1cc";
@fa-var-key: "\f084";
@fa-var-keyboard-o: "\f11c";
@fa-var-krw: "\f159";
@fa-var-language: "\f1ab";
@fa-var-laptop: "\f109";
@fa-var-lastfm: "\f202";
@fa-var-lastfm-square: "\f203";
@fa-var-leaf: "\f06c";
@fa-var-leanpub: "\f212";
@fa-var-legal: "\f0e3";
@fa-var-lemon-o: "\f094";
@fa-var-level-down: "\f149";
@fa-var-level-up: "\f148";
@fa-var-life-bouy: "\f1cd";
@fa-var-life-buoy: "\f1cd";
@fa-var-life-ring: "\f1cd";
@fa-var-life-saver: "\f1cd";
@fa-var-lightbulb-o: "\f0eb";
@fa-var-line-chart: "\f201";
@fa-var-link: "\f0c1";
@fa-var-linkedin: "\f0e1";
@fa-var-linkedin-square: "\f08c";
@fa-var-linode: "\f2b8";
@fa-var-linux: "\f17c";
@fa-var-list: "\f03a";
@fa-var-list-alt: "\f022";
@fa-var-list-ol: "\f0cb";
@fa-var-list-ul: "\f0ca";
@fa-var-location-arrow: "\f124";
@fa-var-lock: "\f023";
@fa-var-long-arrow-down: "\f175";
@fa-var-long-arrow-left: "\f177";
@fa-var-long-arrow-right: "\f178";
@fa-var-long-arrow-up: "\f176";
@fa-var-low-vision: "\f2a8";
@fa-var-magic: "\f0d0";
@fa-var-magnet: "\f076";
@fa-var-mail-forward: "\f064";
@fa-var-mail-reply: "\f112";
@fa-var-mail-reply-all: "\f122";
@fa-var-male: "\f183";
@fa-var-map: "\f279";
@fa-var-map-marker: "\f041";
@fa-var-map-o: "\f278";
@fa-var-map-pin: "\f276";
@fa-var-map-signs: "\f277";
@fa-var-mars: "\f222";
@fa-var-mars-double: "\f227";
@fa-var-mars-stroke: "\f229";
@fa-var-mars-stroke-h: "\f22b";
@fa-var-mars-stroke-v: "\f22a";
@fa-var-maxcdn: "\f136";
@fa-var-meanpath: "\f20c";
@fa-var-medium: "\f23a";
@fa-var-medkit: "\f0fa";
@fa-var-meetup: "\f2e0";
@fa-var-meh-o: "\f11a";
@fa-var-mercury: "\f223";
@fa-var-microchip: "\f2db";
@fa-var-microphone: "\f130";
@fa-var-microphone-slash: "\f131";
@fa-var-minus: "\f068";
@fa-var-minus-circle: "\f056";
@fa-var-minus-square: "\f146";
@fa-var-minus-square-o: "\f147";
@fa-var-mixcloud: "\f289";
@fa-var-mobile: "\f10b";
@fa-var-mobile-phone: "\f10b";
@fa-var-modx: "\f285";
@fa-var-money: "\f0d6";
@fa-var-moon-o: "\f186";
@fa-var-mortar-board: "\f19d";
@fa-var-motorcycle: "\f21c";
@fa-var-mouse-pointer: "\f245";
@fa-var-music: "\f001";
@fa-var-navicon: "\f0c9";
@fa-var-neuter: "\f22c";
@fa-var-newspaper-o: "\f1ea";
@fa-var-object-group: "\f247";
@fa-var-object-ungroup: "\f248";
@fa-var-odnoklassniki: "\f263";
@fa-var-odnoklassniki-square: "\f264";
@fa-var-opencart: "\f23d";
@fa-var-openid: "\f19b";
@fa-var-opera: "\f26a";
@fa-var-optin-monster: "\f23c";
@fa-var-outdent: "\f03b";
@fa-var-pagelines: "\f18c";
@fa-var-paint-brush: "\f1fc";
@fa-var-paper-plane: "\f1d8";
@fa-var-paper-plane-o: "\f1d9";
@fa-var-paperclip: "\f0c6";
@fa-var-paragraph: "\f1dd";
@fa-var-paste: "\f0ea";
@fa-var-pause: "\f04c";
@fa-var-pause-circle: "\f28b";
@fa-var-pause-circle-o: "\f28c";
@fa-var-paw: "\f1b0";
@fa-var-paypal: "\f1ed";
@fa-var-pencil: "\f040";
@fa-var-pencil-square: "\f14b";
@fa-var-pencil-square-o: "\f044";
@fa-var-percent: "\f295";
@fa-var-phone: "\f095";
@fa-var-phone-square: "\f098";
@fa-var-photo: "\f03e";
@fa-var-picture-o: "\f03e";
@fa-var-pie-chart: "\f200";
@fa-var-pied-piper: "\f2ae";
@fa-var-pied-piper-alt: "\f1a8";
@fa-var-pied-piper-pp: "\f1a7";
@fa-var-pinterest: "\f0d2";
@fa-var-pinterest-p: "\f231";
@fa-var-pinterest-square: "\f0d3";
@fa-var-plane: "\f072";
@fa-var-play: "\f04b";
@fa-var-play-circle: "\f144";
@fa-var-play-circle-o: "\f01d";
@fa-var-plug: "\f1e6";
@fa-var-plus: "\f067";
@fa-var-plus-circle: "\f055";
@fa-var-plus-square: "\f0fe";
@fa-var-plus-square-o: "\f196";
@fa-var-podcast: "\f2ce";
@fa-var-power-off: "\f011";
@fa-var-print: "\f02f";
@fa-var-product-hunt: "\f288";
@fa-var-puzzle-piece: "\f12e";
@fa-var-qq: "\f1d6";
@fa-var-qrcode: "\f029";
@fa-var-question: "\f128";
@fa-var-question-circle: "\f059";
@fa-var-question-circle-o: "\f29c";
@fa-var-quora: "\f2c4";
@fa-var-quote-left: "\f10d";
@fa-var-quote-right: "\f10e";
@fa-var-ra: "\f1d0";
@fa-var-random: "\f074";
@fa-var-ravelry: "\f2d9";
@fa-var-rebel: "\f1d0";
@fa-var-recycle: "\f1b8";
@fa-var-reddit: "\f1a1";
@fa-var-reddit-alien: "\f281";
@fa-var-reddit-square: "\f1a2";
@fa-var-refresh: "\f021";
@fa-var-registered: "\f25d";
@fa-var-remove: "\f00d";
@fa-var-renren: "\f18b";
@fa-var-reorder: "\f0c9";
@fa-var-repeat: "\f01e";
@fa-var-reply: "\f112";
@fa-var-reply-all: "\f122";
@fa-var-resistance: "\f1d0";
@fa-var-retweet: "\f079";
@fa-var-rmb: "\f157";
@fa-var-road: "\f018";
@fa-var-rocket: "\f135";
@fa-var-rotate-left: "\f0e2";
@fa-var-rotate-right: "\f01e";
@fa-var-rouble: "\f158";
@fa-var-rss: "\f09e";
@fa-var-rss-square: "\f143";
@fa-var-rub: "\f158";
@fa-var-ruble: "\f158";
@fa-var-rupee: "\f156";
@fa-var-s15: "\f2cd";
@fa-var-safari: "\f267";
@fa-var-save: "\f0c7";
@fa-var-scissors: "\f0c4";
@fa-var-scribd: "\f28a";
@fa-var-search: "\f002";
@fa-var-search-minus: "\f010";
@fa-var-search-plus: "\f00e";
@fa-var-sellsy: "\f213";
@fa-var-send: "\f1d8";
@fa-var-send-o: "\f1d9";
@fa-var-server: "\f233";
@fa-var-share: "\f064";
@fa-var-share-alt: "\f1e0";
@fa-var-share-alt-square: "\f1e1";
@fa-var-share-square: "\f14d";
@fa-var-share-square-o: "\f045";
@fa-var-shekel: "\f20b";
@fa-var-sheqel: "\f20b";
@fa-var-shield: "\f132";
@fa-var-ship: "\f21a";
@fa-var-shirtsinbulk: "\f214";
@fa-var-shopping-bag: "\f290";
@fa-var-shopping-basket: "\f291";
@fa-var-shopping-cart: "\f07a";
@fa-var-shower: "\f2cc";
@fa-var-sign-in: "\f090";
@fa-var-sign-language: "\f2a7";
@fa-var-sign-out: "\f08b";
@fa-var-signal: "\f012";
@fa-var-signing: "\f2a7";
@fa-var-simplybuilt: "\f215";
@fa-var-sitemap: "\f0e8";
@fa-var-skyatlas: "\f216";
@fa-var-skype: "\f17e";
@fa-var-slack: "\f198";
@fa-var-sliders: "\f1de";
@fa-var-slideshare: "\f1e7";
@fa-var-smile-o: "\f118";
@fa-var-snapchat: "\f2ab";
@fa-var-snapchat-ghost: "\f2ac";
@fa-var-snapchat-square: "\f2ad";
@fa-var-snowflake-o: "\f2dc";
@fa-var-soccer-ball-o: "\f1e3";
@fa-var-sort: "\f0dc";
@fa-var-sort-alpha-asc: "\f15d";
@fa-var-sort-alpha-desc: "\f15e";
@fa-var-sort-amount-asc: "\f160";
@fa-var-sort-amount-desc: "\f161";
@fa-var-sort-asc: "\f0de";
@fa-var-sort-desc: "\f0dd";
@fa-var-sort-down: "\f0dd";
@fa-var-sort-numeric-asc: "\f162";
@fa-var-sort-numeric-desc: "\f163";
@fa-var-sort-up: "\f0de";
@fa-var-soundcloud: "\f1be";
@fa-var-space-shuttle: "\f197";
@fa-var-spinner: "\f110";
@fa-var-spoon: "\f1b1";
@fa-var-spotify: "\f1bc";
@fa-var-square: "\f0c8";
@fa-var-square-o: "\f096";
@fa-var-stack-exchange: "\f18d";
@fa-var-stack-overflow: "\f16c";
@fa-var-star: "\f005";
@fa-var-star-half: "\f089";
@fa-var-star-half-empty: "\f123";
@fa-var-star-half-full: "\f123";
@fa-var-star-half-o: "\f123";
@fa-var-star-o: "\f006";
@fa-var-steam: "\f1b6";
@fa-var-steam-square: "\f1b7";
@fa-var-step-backward: "\f048";
@fa-var-step-forward: "\f051";
@fa-var-stethoscope: "\f0f1";
@fa-var-sticky-note: "\f249";
@fa-var-sticky-note-o: "\f24a";
@fa-var-stop: "\f04d";
@fa-var-stop-circle: "\f28d";
@fa-var-stop-circle-o: "\f28e";
@fa-var-street-view: "\f21d";
@fa-var-strikethrough: "\f0cc";
@fa-var-stumbleupon: "\f1a4";
@fa-var-stumbleupon-circle: "\f1a3";
@fa-var-subscript: "\f12c";
@fa-var-subway: "\f239";
@fa-var-suitcase: "\f0f2";
@fa-var-sun-o: "\f185";
@fa-var-superpowers: "\f2dd";
@fa-var-superscript: "\f12b";
@fa-var-support: "\f1cd";
@fa-var-table: "\f0ce";
@fa-var-tablet: "\f10a";
@fa-var-tachometer: "\f0e4";
@fa-var-tag: "\f02b";
@fa-var-tags: "\f02c";
@fa-var-tasks: "\f0ae";
@fa-var-taxi: "\f1ba";
@fa-var-telegram: "\f2c6";
@fa-var-television: "\f26c";
@fa-var-tencent-weibo: "\f1d5";
@fa-var-terminal: "\f120";
@fa-var-text-height: "\f034";
@fa-var-text-width: "\f035";
@fa-var-th: "\f00a";
@fa-var-th-large: "\f009";
@fa-var-th-list: "\f00b";
@fa-var-themeisle: "\f2b2";
@fa-var-thermometer: "\f2c7";
@fa-var-thermometer-0: "\f2cb";
@fa-var-thermometer-1: "\f2ca";
@fa-var-thermometer-2: "\f2c9";
@fa-var-thermometer-3: "\f2c8";
@fa-var-thermometer-4: "\f2c7";
@fa-var-thermometer-empty: "\f2cb";
@fa-var-thermometer-full: "\f2c7";
@fa-var-thermometer-half: "\f2c9";
@fa-var-thermometer-quarter: "\f2ca";
@fa-var-thermometer-three-quarters: "\f2c8";
@fa-var-thumb-tack: "\f08d";
@fa-var-thumbs-down: "\f165";
@fa-var-thumbs-o-down: "\f088";
@fa-var-thumbs-o-up: "\f087";
@fa-var-thumbs-up: "\f164";
@fa-var-ticket: "\f145";
@fa-var-times: "\f00d";
@fa-var-times-circle: "\f057";
@fa-var-times-circle-o: "\f05c";
@fa-var-times-rectangle: "\f2d3";
@fa-var-times-rectangle-o: "\f2d4";
@fa-var-tint: "\f043";
@fa-var-toggle-down: "\f150";
@fa-var-toggle-left: "\f191";
@fa-var-toggle-off: "\f204";
@fa-var-toggle-on: "\f205";
@fa-var-toggle-right: "\f152";
@fa-var-toggle-up: "\f151";
@fa-var-trademark: "\f25c";
@fa-var-train: "\f238";
@fa-var-transgender: "\f224";
@fa-var-transgender-alt: "\f225";
@fa-var-trash: "\f1f8";
@fa-var-trash-o: "\f014";
@fa-var-tree: "\f1bb";
@fa-var-trello: "\f181";
@fa-var-tripadvisor: "\f262";
@fa-var-trophy: "\f091";
@fa-var-truck: "\f0d1";
@fa-var-try: "\f195";
@fa-var-tty: "\f1e4";
@fa-var-tumblr: "\f173";
@fa-var-tumblr-square: "\f174";
@fa-var-turkish-lira: "\f195";
@fa-var-tv: "\f26c";
@fa-var-twitch: "\f1e8";
@fa-var-twitter: "\f099";
@fa-var-twitter-square: "\f081";
@fa-var-umbrella: "\f0e9";
@fa-var-underline: "\f0cd";
@fa-var-undo: "\f0e2";
@fa-var-universal-access: "\f29a";
@fa-var-university: "\f19c";
@fa-var-unlink: "\f127";
@fa-var-unlock: "\f09c";
@fa-var-unlock-alt: "\f13e";
@fa-var-unsorted: "\f0dc";
@fa-var-upload: "\f093";
@fa-var-usb: "\f287";
@fa-var-usd: "\f155";
@fa-var-user: "\f007";
@fa-var-user-circle: "\f2bd";
@fa-var-user-circle-o: "\f2be";
@fa-var-user-md: "\f0f0";
@fa-var-user-o: "\f2c0";
@fa-var-user-plus: "\f234";
@fa-var-user-secret: "\f21b";
@fa-var-user-times: "\f235";
@fa-var-users: "\f0c0";
@fa-var-vcard: "\f2bb";
@fa-var-vcard-o: "\f2bc";
@fa-var-venus: "\f221";
@fa-var-venus-double: "\f226";
@fa-var-venus-mars: "\f228";
@fa-var-viacoin: "\f237";
@fa-var-viadeo: "\f2a9";
@fa-var-viadeo-square: "\f2aa";
@fa-var-video-camera: "\f03d";
@fa-var-vimeo: "\f27d";
@fa-var-vimeo-square: "\f194";
@fa-var-vine: "\f1ca";
@fa-var-vk: "\f189";
@fa-var-volume-control-phone: "\f2a0";
@fa-var-volume-down: "\f027";
@fa-var-volume-off: "\f026";
@fa-var-volume-up: "\f028";
@fa-var-warning: "\f071";
@fa-var-wechat: "\f1d7";
@fa-var-weibo: "\f18a";
@fa-var-weixin: "\f1d7";
@fa-var-whatsapp: "\f232";
@fa-var-wheelchair: "\f193";
@fa-var-wheelchair-alt: "\f29b";
@fa-var-wifi: "\f1eb";
@fa-var-wikipedia-w: "\f266";
@fa-var-window-close: "\f2d3";
@fa-var-window-close-o: "\f2d4";
@fa-var-window-maximize: "\f2d0";
@fa-var-window-minimize: "\f2d1";
@fa-var-window-restore: "\f2d2";
@fa-var-windows: "\f17a";
@fa-var-won: "\f159";
@fa-var-wordpress: "\f19a";
@fa-var-wpbeginner: "\f297";
@fa-var-wpexplorer: "\f2de";
@fa-var-wpforms: "\f298";
@fa-var-wrench: "\f0ad";
@fa-var-xing: "\f168";
@fa-var-xing-square: "\f169";
@fa-var-y-combinator: "\f23b";
@fa-var-y-combinator-square: "\f1d4";
@fa-var-yahoo: "\f19e";
@fa-var-yc: "\f23b";
@fa-var-yc-square: "\f1d4";
@fa-var-yelp: "\f1e9";
@fa-var-yen: "\f157";
@fa-var-yoast: "\f2b1";
@fa-var-youtube: "\f167";
@fa-var-youtube-play: "\f16a";
@fa-var-youtube-square: "\f166";

@ -0,0 +1,34 @@
// Spinning Icons
// --------------------------
.#{$fa-css-prefix}-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
}
.#{$fa-css-prefix}-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8);
}
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}

@ -0,0 +1,25 @@
// Bordered & Pulled
// -------------------------
.#{$fa-css-prefix}-border {
padding: .2em .25em .15em;
border: solid .08em $fa-border-color;
border-radius: .1em;
}
.#{$fa-css-prefix}-pull-left { float: left; }
.#{$fa-css-prefix}-pull-right { float: right; }
.#{$fa-css-prefix} {
&.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
&.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
}
/* Deprecated as of 4.4.0 */
.pull-right { float: right; }
.pull-left { float: left; }
.#{$fa-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
}

@ -0,0 +1,12 @@
// Base Class Definition
// -------------------------
.#{$fa-css-prefix} {
display: inline-block;
font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}

@ -0,0 +1,6 @@
// Fixed Width Icons
// -------------------------
.#{$fa-css-prefix}-fw {
width: (18em / 14);
text-align: center;
}

@ -0,0 +1,789 @@
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }
.#{$fa-css-prefix}-music:before { content: $fa-var-music; }
.#{$fa-css-prefix}-search:before { content: $fa-var-search; }
.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }
.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }
.#{$fa-css-prefix}-star:before { content: $fa-var-star; }
.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }
.#{$fa-css-prefix}-user:before { content: $fa-var-user; }
.#{$fa-css-prefix}-film:before { content: $fa-var-film; }
.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }
.#{$fa-css-prefix}-th:before { content: $fa-var-th; }
.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }
.#{$fa-css-prefix}-check:before { content: $fa-var-check; }
.#{$fa-css-prefix}-remove:before,
.#{$fa-css-prefix}-close:before,
.#{$fa-css-prefix}-times:before { content: $fa-var-times; }
.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }
.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }
.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }
.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }
.#{$fa-css-prefix}-gear:before,
.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }
.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }
.#{$fa-css-prefix}-home:before { content: $fa-var-home; }
.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }
.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }
.#{$fa-css-prefix}-road:before { content: $fa-var-road; }
.#{$fa-css-prefix}-download:before { content: $fa-var-download; }
.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }
.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }
.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }
.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }
.#{$fa-css-prefix}-rotate-right:before,
.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }
.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }
.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }
.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }
.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }
.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }
.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }
.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }
.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }
.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }
.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }
.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }
.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }
.#{$fa-css-prefix}-book:before { content: $fa-var-book; }
.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }
.#{$fa-css-prefix}-print:before { content: $fa-var-print; }
.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }
.#{$fa-css-prefix}-font:before { content: $fa-var-font; }
.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }
.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }
.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }
.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }
.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }
.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }
.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }
.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }
.#{$fa-css-prefix}-list:before { content: $fa-var-list; }
.#{$fa-css-prefix}-dedent:before,
.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }
.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }
.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }
.#{$fa-css-prefix}-photo:before,
.#{$fa-css-prefix}-image:before,
.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }
.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }
.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }
.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }
.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }
.#{$fa-css-prefix}-edit:before,
.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }
.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }
.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }
.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }
.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }
.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }
.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }
.#{$fa-css-prefix}-play:before { content: $fa-var-play; }
.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }
.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }
.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }
.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }
.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }
.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }
.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }
.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }
.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }
.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }
.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }
.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }
.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }
.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }
.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }
.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }
.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }
.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }
.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }
.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }
.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }
.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }
.#{$fa-css-prefix}-mail-forward:before,
.#{$fa-css-prefix}-share:before { content: $fa-var-share; }
.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }
.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }
.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }
.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }
.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }
.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }
.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }
.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }
.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }
.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }
.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }
.#{$fa-css-prefix}-warning:before,
.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }
.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }
.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }
.#{$fa-css-prefix}-random:before { content: $fa-var-random; }
.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }
.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }
.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }
.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }
.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }
.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }
.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }
.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }
.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }
.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }
.#{$fa-css-prefix}-bar-chart-o:before,
.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }
.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }
.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }
.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }
.#{$fa-css-prefix}-key:before { content: $fa-var-key; }
.#{$fa-css-prefix}-gears:before,
.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }
.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }
.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }
.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }
.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }
.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }
.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }
.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }
.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }
.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }
.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }
.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }
.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }
.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }
.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }
.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }
.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }
.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }
.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }
.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }
.#{$fa-css-prefix}-facebook-f:before,
.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }
.#{$fa-css-prefix}-github:before { content: $fa-var-github; }
.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }
.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }
.#{$fa-css-prefix}-feed:before,
.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }
.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }
.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }
.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }
.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }
.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }
.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }
.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }
.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }
.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }
.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }
.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }
.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }
.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }
.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }
.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }
.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }
.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }
.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }
.#{$fa-css-prefix}-group:before,
.#{$fa-css-prefix}-users:before { content: $fa-var-users; }
.#{$fa-css-prefix}-chain:before,
.#{$fa-css-prefix}-link:before { content: $fa-var-link; }
.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }
.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }
.#{$fa-css-prefix}-cut:before,
.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }
.#{$fa-css-prefix}-copy:before,
.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }
.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }
.#{$fa-css-prefix}-save:before,
.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }
.#{$fa-css-prefix}-square:before { content: $fa-var-square; }
.#{$fa-css-prefix}-navicon:before,
.#{$fa-css-prefix}-reorder:before,
.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }
.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }
.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }
.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }
.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }
.#{$fa-css-prefix}-table:before { content: $fa-var-table; }
.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }
.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }
.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }
.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }
.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }
.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }
.#{$fa-css-prefix}-money:before { content: $fa-var-money; }
.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }
.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }
.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }
.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }
.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }
.#{$fa-css-prefix}-unsorted:before,
.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }
.#{$fa-css-prefix}-sort-down:before,
.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }
.#{$fa-css-prefix}-sort-up:before,
.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }
.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }
.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }
.#{$fa-css-prefix}-rotate-left:before,
.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }
.#{$fa-css-prefix}-legal:before,
.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }
.#{$fa-css-prefix}-dashboard:before,
.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }
.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }
.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }
.#{$fa-css-prefix}-flash:before,
.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }
.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }
.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }
.#{$fa-css-prefix}-paste:before,
.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }
.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }
.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }
.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }
.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }
.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }
.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }
.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }
.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }
.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }
.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }
.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }
.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }
.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }
.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }
.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }
.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }
.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }
.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }
.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }
.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }
.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }
.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }
.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }
.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }
.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }
.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }
.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }
.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }
.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }
.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }
.#{$fa-css-prefix}-mobile-phone:before,
.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }
.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }
.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }
.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }
.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }
.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }
.#{$fa-css-prefix}-mail-reply:before,
.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }
.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }
.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }
.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }
.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }
.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }
.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }
.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }
.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }
.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }
.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }
.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }
.#{$fa-css-prefix}-code:before { content: $fa-var-code; }
.#{$fa-css-prefix}-mail-reply-all:before,
.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }
.#{$fa-css-prefix}-star-half-empty:before,
.#{$fa-css-prefix}-star-half-full:before,
.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }
.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }
.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }
.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }
.#{$fa-css-prefix}-unlink:before,
.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }
.#{$fa-css-prefix}-question:before { content: $fa-var-question; }
.#{$fa-css-prefix}-info:before { content: $fa-var-info; }
.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }
.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }
.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }
.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }
.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }
.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }
.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }
.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }
.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }
.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }
.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }
.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }
.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }
.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }
.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }
.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }
.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }
.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }
.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }
.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }
.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }
.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }
.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }
.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }
.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }
.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }
.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }
.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }
.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }
.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }
.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }
.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }
.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }
.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }
.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }
.#{$fa-css-prefix}-toggle-down:before,
.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }
.#{$fa-css-prefix}-toggle-up:before,
.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }
.#{$fa-css-prefix}-toggle-right:before,
.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }
.#{$fa-css-prefix}-euro:before,
.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }
.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }
.#{$fa-css-prefix}-dollar:before,
.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }
.#{$fa-css-prefix}-rupee:before,
.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }
.#{$fa-css-prefix}-cny:before,
.#{$fa-css-prefix}-rmb:before,
.#{$fa-css-prefix}-yen:before,
.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }
.#{$fa-css-prefix}-ruble:before,
.#{$fa-css-prefix}-rouble:before,
.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }
.#{$fa-css-prefix}-won:before,
.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }
.#{$fa-css-prefix}-bitcoin:before,
.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }
.#{$fa-css-prefix}-file:before { content: $fa-var-file; }
.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }
.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }
.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }
.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }
.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }
.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }
.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }
.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }
.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }
.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }
.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }
.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }
.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }
.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }
.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }
.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }
.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }
.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }
.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }
.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }
.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }
.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }
.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }
.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }
.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }
.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }
.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }
.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }
.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }
.#{$fa-css-prefix}-android:before { content: $fa-var-android; }
.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }
.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }
.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }
.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }
.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }
.#{$fa-css-prefix}-female:before { content: $fa-var-female; }
.#{$fa-css-prefix}-male:before { content: $fa-var-male; }
.#{$fa-css-prefix}-gittip:before,
.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; }
.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }
.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }
.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }
.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }
.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }
.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }
.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }
.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }
.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }
.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }
.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }
.#{$fa-css-prefix}-toggle-left:before,
.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }
.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }
.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }
.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }
.#{$fa-css-prefix}-turkish-lira:before,
.#{$fa-css-prefix}-try:before { content: $fa-var-try; }
.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }
.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }
.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }
.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }
.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }
.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }
.#{$fa-css-prefix}-institution:before,
.#{$fa-css-prefix}-bank:before,
.#{$fa-css-prefix}-university:before { content: $fa-var-university; }
.#{$fa-css-prefix}-mortar-board:before,
.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }
.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }
.#{$fa-css-prefix}-google:before { content: $fa-var-google; }
.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }
.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }
.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }
.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }
.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }
.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }
.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; }
.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }
.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }
.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }
.#{$fa-css-prefix}-language:before { content: $fa-var-language; }
.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }
.#{$fa-css-prefix}-building:before { content: $fa-var-building; }
.#{$fa-css-prefix}-child:before { content: $fa-var-child; }
.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }
.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }
.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }
.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }
.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }
.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }
.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }
.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }
.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }
.#{$fa-css-prefix}-automobile:before,
.#{$fa-css-prefix}-car:before { content: $fa-var-car; }
.#{$fa-css-prefix}-cab:before,
.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }
.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }
.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }
.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }
.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }
.#{$fa-css-prefix}-database:before { content: $fa-var-database; }
.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }
.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }
.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }
.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }
.#{$fa-css-prefix}-file-photo-o:before,
.#{$fa-css-prefix}-file-picture-o:before,
.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }
.#{$fa-css-prefix}-file-zip-o:before,
.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }
.#{$fa-css-prefix}-file-sound-o:before,
.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }
.#{$fa-css-prefix}-file-movie-o:before,
.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }
.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }
.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }
.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }
.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }
.#{$fa-css-prefix}-life-bouy:before,
.#{$fa-css-prefix}-life-buoy:before,
.#{$fa-css-prefix}-life-saver:before,
.#{$fa-css-prefix}-support:before,
.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }
.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }
.#{$fa-css-prefix}-ra:before,
.#{$fa-css-prefix}-resistance:before,
.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }
.#{$fa-css-prefix}-ge:before,
.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }
.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }
.#{$fa-css-prefix}-git:before { content: $fa-var-git; }
.#{$fa-css-prefix}-y-combinator-square:before,
.#{$fa-css-prefix}-yc-square:before,
.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }
.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }
.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }
.#{$fa-css-prefix}-wechat:before,
.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }
.#{$fa-css-prefix}-send:before,
.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }
.#{$fa-css-prefix}-send-o:before,
.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }
.#{$fa-css-prefix}-history:before { content: $fa-var-history; }
.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }
.#{$fa-css-prefix}-header:before { content: $fa-var-header; }
.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }
.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }
.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }
.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }
.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }
.#{$fa-css-prefix}-soccer-ball-o:before,
.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }
.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }
.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }
.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }
.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }
.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }
.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }
.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }
.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }
.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }
.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }
.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }
.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }
.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }
.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }
.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }
.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }
.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }
.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }
.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }
.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }
.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }
.#{$fa-css-prefix}-at:before { content: $fa-var-at; }
.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }
.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }
.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }
.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }
.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }
.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }
.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }
.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }
.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }
.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }
.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }
.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }
.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }
.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }
.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }
.#{$fa-css-prefix}-shekel:before,
.#{$fa-css-prefix}-sheqel:before,
.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }
.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }
.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; }
.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; }
.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; }
.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; }
.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; }
.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; }
.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; }
.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; }
.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; }
.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; }
.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; }
.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; }
.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; }
.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; }
.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; }
.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; }
.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; }
.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }
.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }
.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }
.#{$fa-css-prefix}-intersex:before,
.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }
.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }
.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }
.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; }
.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; }
.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; }
.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }
.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }
.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }
.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }
.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }
.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }
.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }
.#{$fa-css-prefix}-server:before { content: $fa-var-server; }
.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; }
.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; }
.#{$fa-css-prefix}-hotel:before,
.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; }
.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; }
.#{$fa-css-prefix}-train:before { content: $fa-var-train; }
.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }
.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }
.#{$fa-css-prefix}-yc:before,
.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }
.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }
.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }
.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }
.#{$fa-css-prefix}-battery-4:before,
.#{$fa-css-prefix}-battery:before,
.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }
.#{$fa-css-prefix}-battery-3:before,
.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }
.#{$fa-css-prefix}-battery-2:before,
.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }
.#{$fa-css-prefix}-battery-1:before,
.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }
.#{$fa-css-prefix}-battery-0:before,
.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }
.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }
.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }
.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }
.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }
.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }
.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }
.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }
.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }
.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }
.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }
.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }
.#{$fa-css-prefix}-hourglass-1:before,
.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }
.#{$fa-css-prefix}-hourglass-2:before,
.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }
.#{$fa-css-prefix}-hourglass-3:before,
.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }
.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }
.#{$fa-css-prefix}-hand-grab-o:before,
.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }
.#{$fa-css-prefix}-hand-stop-o:before,
.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }
.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }
.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }
.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }
.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }
.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }
.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }
.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }
.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }
.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }
.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }
.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }
.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }
.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }
.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }
.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }
.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }
.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }
.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }
.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }
.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }
.#{$fa-css-prefix}-tv:before,
.#{$fa-css-prefix}-television:before { content: $fa-var-television; }
.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }
.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }
.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }
.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }
.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }
.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }
.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }
.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }
.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }
.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }
.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }
.#{$fa-css-prefix}-map:before { content: $fa-var-map; }
.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }
.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }
.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }
.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }
.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }
.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }
.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; }
.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; }
.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; }
.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; }
.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; }
.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; }
.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; }
.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; }
.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; }
.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; }
.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; }
.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; }
.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; }
.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; }
.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; }
.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; }
.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; }
.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; }
.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; }
.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; }
.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; }
.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; }
.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; }
.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; }
.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; }
.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; }
.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; }
.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; }
.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; }
.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; }
.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; }
.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; }
.#{$fa-css-prefix}-asl-interpreting:before,
.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; }
.#{$fa-css-prefix}-deafness:before,
.#{$fa-css-prefix}-hard-of-hearing:before,
.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; }
.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; }
.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; }
.#{$fa-css-prefix}-signing:before,
.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; }
.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; }
.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; }
.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; }
.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; }
.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; }
.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; }
.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }
.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; }
.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; }
.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; }
.#{$fa-css-prefix}-google-plus-circle:before,
.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; }
.#{$fa-css-prefix}-fa:before,
.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; }
.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; }
.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; }
.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; }
.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; }
.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; }
.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; }
.#{$fa-css-prefix}-vcard:before,
.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; }
.#{$fa-css-prefix}-vcard-o:before,
.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; }
.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; }
.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; }
.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; }
.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; }
.#{$fa-css-prefix}-drivers-license:before,
.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; }
.#{$fa-css-prefix}-drivers-license-o:before,
.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; }
.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; }
.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; }
.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; }
.#{$fa-css-prefix}-thermometer-4:before,
.#{$fa-css-prefix}-thermometer:before,
.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; }
.#{$fa-css-prefix}-thermometer-3:before,
.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; }
.#{$fa-css-prefix}-thermometer-2:before,
.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; }
.#{$fa-css-prefix}-thermometer-1:before,
.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; }
.#{$fa-css-prefix}-thermometer-0:before,
.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; }
.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; }
.#{$fa-css-prefix}-bathtub:before,
.#{$fa-css-prefix}-s15:before,
.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; }
.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; }
.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; }
.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; }
.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; }
.#{$fa-css-prefix}-times-rectangle:before,
.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; }
.#{$fa-css-prefix}-times-rectangle-o:before,
.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; }
.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; }
.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; }
.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; }
.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; }
.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; }
.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; }
.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; }
.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; }
.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; }
.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; }
.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; }

@ -0,0 +1,13 @@
// Icon Sizes
// -------------------------
/* makes the font 33% larger relative to the icon container */
.#{$fa-css-prefix}-lg {
font-size: (4em / 3);
line-height: (3em / 4);
vertical-align: -15%;
}
.#{$fa-css-prefix}-2x { font-size: 2em; }
.#{$fa-css-prefix}-3x { font-size: 3em; }
.#{$fa-css-prefix}-4x { font-size: 4em; }
.#{$fa-css-prefix}-5x { font-size: 5em; }

@ -0,0 +1,19 @@
// List Icons
// -------------------------
.#{$fa-css-prefix}-ul {
padding-left: 0;
margin-left: $fa-li-width;
list-style-type: none;
> li { position: relative; }
}
.#{$fa-css-prefix}-li {
position: absolute;
left: -$fa-li-width;
width: $fa-li-width;
top: (2em / 14);
text-align: center;
&.#{$fa-css-prefix}-lg {
left: -$fa-li-width + (4em / 14);
}
}

@ -0,0 +1,60 @@
// Mixins
// --------------------------
@mixin fa-icon() {
display: inline-block;
font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
@mixin fa-icon-rotate($degrees, $rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
-webkit-transform: rotate($degrees);
-ms-transform: rotate($degrees);
transform: rotate($degrees);
}
@mixin fa-icon-flip($horiz, $vert, $rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
-webkit-transform: scale($horiz, $vert);
-ms-transform: scale($horiz, $vert);
transform: scale($horiz, $vert);
}
// Only display content to screen readers. A la Bootstrap 4.
//
// See: http://a11yproject.com/posts/how-to-hide-content/
@mixin sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
border: 0;
}
// Use in conjunction with .sr-only to only display content when it's focused.
//
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
//
// Credit: HTML5 Boilerplate
@mixin sr-only-focusable {
&:active,
&:focus {
position: static;
width: auto;
height: auto;
margin: 0;
overflow: visible;
clip: auto;
}
}

@ -0,0 +1,15 @@
/* FONT PATH
* -------------------------- */
@font-face {
font-family: 'FontAwesome';
src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
font-weight: normal;
font-style: normal;
}

@ -0,0 +1,20 @@
// Rotated & Flipped Icons
// -------------------------
.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
// Hook for IE8-9
// -------------------------
:root .#{$fa-css-prefix}-rotate-90,
:root .#{$fa-css-prefix}-rotate-180,
:root .#{$fa-css-prefix}-rotate-270,
:root .#{$fa-css-prefix}-flip-horizontal,
:root .#{$fa-css-prefix}-flip-vertical {
filter: none;
}

@ -0,0 +1,5 @@
// Screen Readers
// -------------------------
.sr-only { @include sr-only(); }
.sr-only-focusable { @include sr-only-focusable(); }

@ -0,0 +1,20 @@
// Stacked Icons
// -------------------------
.#{$fa-css-prefix}-stack {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.#{$fa-css-prefix}-stack-1x { line-height: inherit; }
.#{$fa-css-prefix}-stack-2x { font-size: 2em; }
.#{$fa-css-prefix}-inverse { color: $fa-inverse; }

@ -0,0 +1,800 @@
// Variables
// --------------------------
$fa-font-path: "../fonts" !default;
$fa-font-size-base: 14px !default;
$fa-line-height-base: 1 !default;
//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly
$fa-css-prefix: fa !default;
$fa-version: "4.7.0" !default;
$fa-border-color: #eee !default;
$fa-inverse: #fff !default;
$fa-li-width: (30em / 14) !default;
$fa-var-500px: "\f26e";
$fa-var-address-book: "\f2b9";
$fa-var-address-book-o: "\f2ba";
$fa-var-address-card: "\f2bb";
$fa-var-address-card-o: "\f2bc";
$fa-var-adjust: "\f042";
$fa-var-adn: "\f170";
$fa-var-align-center: "\f037";
$fa-var-align-justify: "\f039";
$fa-var-align-left: "\f036";
$fa-var-align-right: "\f038";
$fa-var-amazon: "\f270";
$fa-var-ambulance: "\f0f9";
$fa-var-american-sign-language-interpreting: "\f2a3";
$fa-var-anchor: "\f13d";
$fa-var-android: "\f17b";
$fa-var-angellist: "\f209";
$fa-var-angle-double-down: "\f103";
$fa-var-angle-double-left: "\f100";
$fa-var-angle-double-right: "\f101";
$fa-var-angle-double-up: "\f102";
$fa-var-angle-down: "\f107";
$fa-var-angle-left: "\f104";
$fa-var-angle-right: "\f105";
$fa-var-angle-up: "\f106";
$fa-var-apple: "\f179";
$fa-var-archive: "\f187";
$fa-var-area-chart: "\f1fe";
$fa-var-arrow-circle-down: "\f0ab";
$fa-var-arrow-circle-left: "\f0a8";
$fa-var-arrow-circle-o-down: "\f01a";
$fa-var-arrow-circle-o-left: "\f190";
$fa-var-arrow-circle-o-right: "\f18e";
$fa-var-arrow-circle-o-up: "\f01b";
$fa-var-arrow-circle-right: "\f0a9";
$fa-var-arrow-circle-up: "\f0aa";
$fa-var-arrow-down: "\f063";
$fa-var-arrow-left: "\f060";
$fa-var-arrow-right: "\f061";
$fa-var-arrow-up: "\f062";
$fa-var-arrows: "\f047";
$fa-var-arrows-alt: "\f0b2";
$fa-var-arrows-h: "\f07e";
$fa-var-arrows-v: "\f07d";
$fa-var-asl-interpreting: "\f2a3";
$fa-var-assistive-listening-systems: "\f2a2";
$fa-var-asterisk: "\f069";
$fa-var-at: "\f1fa";
$fa-var-audio-description: "\f29e";
$fa-var-automobile: "\f1b9";
$fa-var-backward: "\f04a";
$fa-var-balance-scale: "\f24e";
$fa-var-ban: "\f05e";
$fa-var-bandcamp: "\f2d5";
$fa-var-bank: "\f19c";
$fa-var-bar-chart: "\f080";
$fa-var-bar-chart-o: "\f080";
$fa-var-barcode: "\f02a";
$fa-var-bars: "\f0c9";
$fa-var-bath: "\f2cd";
$fa-var-bathtub: "\f2cd";
$fa-var-battery: "\f240";
$fa-var-battery-0: "\f244";
$fa-var-battery-1: "\f243";
$fa-var-battery-2: "\f242";
$fa-var-battery-3: "\f241";
$fa-var-battery-4: "\f240";
$fa-var-battery-empty: "\f244";
$fa-var-battery-full: "\f240";
$fa-var-battery-half: "\f242";
$fa-var-battery-quarter: "\f243";
$fa-var-battery-three-quarters: "\f241";
$fa-var-bed: "\f236";
$fa-var-beer: "\f0fc";
$fa-var-behance: "\f1b4";
$fa-var-behance-square: "\f1b5";
$fa-var-bell: "\f0f3";
$fa-var-bell-o: "\f0a2";
$fa-var-bell-slash: "\f1f6";
$fa-var-bell-slash-o: "\f1f7";
$fa-var-bicycle: "\f206";
$fa-var-binoculars: "\f1e5";
$fa-var-birthday-cake: "\f1fd";
$fa-var-bitbucket: "\f171";
$fa-var-bitbucket-square: "\f172";
$fa-var-bitcoin: "\f15a";
$fa-var-black-tie: "\f27e";
$fa-var-blind: "\f29d";
$fa-var-bluetooth: "\f293";
$fa-var-bluetooth-b: "\f294";
$fa-var-bold: "\f032";
$fa-var-bolt: "\f0e7";
$fa-var-bomb: "\f1e2";
$fa-var-book: "\f02d";
$fa-var-bookmark: "\f02e";
$fa-var-bookmark-o: "\f097";
$fa-var-braille: "\f2a1";
$fa-var-briefcase: "\f0b1";
$fa-var-btc: "\f15a";
$fa-var-bug: "\f188";
$fa-var-building: "\f1ad";
$fa-var-building-o: "\f0f7";
$fa-var-bullhorn: "\f0a1";
$fa-var-bullseye: "\f140";
$fa-var-bus: "\f207";
$fa-var-buysellads: "\f20d";
$fa-var-cab: "\f1ba";
$fa-var-calculator: "\f1ec";
$fa-var-calendar: "\f073";
$fa-var-calendar-check-o: "\f274";
$fa-var-calendar-minus-o: "\f272";
$fa-var-calendar-o: "\f133";
$fa-var-calendar-plus-o: "\f271";
$fa-var-calendar-times-o: "\f273";
$fa-var-camera: "\f030";
$fa-var-camera-retro: "\f083";
$fa-var-car: "\f1b9";
$fa-var-caret-down: "\f0d7";
$fa-var-caret-left: "\f0d9";
$fa-var-caret-right: "\f0da";
$fa-var-caret-square-o-down: "\f150";
$fa-var-caret-square-o-left: "\f191";
$fa-var-caret-square-o-right: "\f152";
$fa-var-caret-square-o-up: "\f151";
$fa-var-caret-up: "\f0d8";
$fa-var-cart-arrow-down: "\f218";
$fa-var-cart-plus: "\f217";
$fa-var-cc: "\f20a";
$fa-var-cc-amex: "\f1f3";
$fa-var-cc-diners-club: "\f24c";
$fa-var-cc-discover: "\f1f2";
$fa-var-cc-jcb: "\f24b";
$fa-var-cc-mastercard: "\f1f1";
$fa-var-cc-paypal: "\f1f4";
$fa-var-cc-stripe: "\f1f5";
$fa-var-cc-visa: "\f1f0";
$fa-var-certificate: "\f0a3";
$fa-var-chain: "\f0c1";
$fa-var-chain-broken: "\f127";
$fa-var-check: "\f00c";
$fa-var-check-circle: "\f058";
$fa-var-check-circle-o: "\f05d";
$fa-var-check-square: "\f14a";
$fa-var-check-square-o: "\f046";
$fa-var-chevron-circle-down: "\f13a";
$fa-var-chevron-circle-left: "\f137";
$fa-var-chevron-circle-right: "\f138";
$fa-var-chevron-circle-up: "\f139";
$fa-var-chevron-down: "\f078";
$fa-var-chevron-left: "\f053";
$fa-var-chevron-right: "\f054";
$fa-var-chevron-up: "\f077";
$fa-var-child: "\f1ae";
$fa-var-chrome: "\f268";
$fa-var-circle: "\f111";
$fa-var-circle-o: "\f10c";
$fa-var-circle-o-notch: "\f1ce";
$fa-var-circle-thin: "\f1db";
$fa-var-clipboard: "\f0ea";
$fa-var-clock-o: "\f017";
$fa-var-clone: "\f24d";
$fa-var-close: "\f00d";
$fa-var-cloud: "\f0c2";
$fa-var-cloud-download: "\f0ed";
$fa-var-cloud-upload: "\f0ee";
$fa-var-cny: "\f157";
$fa-var-code: "\f121";
$fa-var-code-fork: "\f126";
$fa-var-codepen: "\f1cb";
$fa-var-codiepie: "\f284";
$fa-var-coffee: "\f0f4";
$fa-var-cog: "\f013";
$fa-var-cogs: "\f085";
$fa-var-columns: "\f0db";
$fa-var-comment: "\f075";
$fa-var-comment-o: "\f0e5";
$fa-var-commenting: "\f27a";
$fa-var-commenting-o: "\f27b";
$fa-var-comments: "\f086";
$fa-var-comments-o: "\f0e6";
$fa-var-compass: "\f14e";
$fa-var-compress: "\f066";
$fa-var-connectdevelop: "\f20e";
$fa-var-contao: "\f26d";
$fa-var-copy: "\f0c5";
$fa-var-copyright: "\f1f9";
$fa-var-creative-commons: "\f25e";
$fa-var-credit-card: "\f09d";
$fa-var-credit-card-alt: "\f283";
$fa-var-crop: "\f125";
$fa-var-crosshairs: "\f05b";
$fa-var-css3: "\f13c";
$fa-var-cube: "\f1b2";
$fa-var-cubes: "\f1b3";
$fa-var-cut: "\f0c4";
$fa-var-cutlery: "\f0f5";
$fa-var-dashboard: "\f0e4";
$fa-var-dashcube: "\f210";
$fa-var-database: "\f1c0";
$fa-var-deaf: "\f2a4";
$fa-var-deafness: "\f2a4";
$fa-var-dedent: "\f03b";
$fa-var-delicious: "\f1a5";
$fa-var-desktop: "\f108";
$fa-var-deviantart: "\f1bd";
$fa-var-diamond: "\f219";
$fa-var-digg: "\f1a6";
$fa-var-dollar: "\f155";
$fa-var-dot-circle-o: "\f192";
$fa-var-download: "\f019";
$fa-var-dribbble: "\f17d";
$fa-var-drivers-license: "\f2c2";
$fa-var-drivers-license-o: "\f2c3";
$fa-var-dropbox: "\f16b";
$fa-var-drupal: "\f1a9";
$fa-var-edge: "\f282";
$fa-var-edit: "\f044";
$fa-var-eercast: "\f2da";
$fa-var-eject: "\f052";
$fa-var-ellipsis-h: "\f141";
$fa-var-ellipsis-v: "\f142";
$fa-var-empire: "\f1d1";
$fa-var-envelope: "\f0e0";
$fa-var-envelope-o: "\f003";
$fa-var-envelope-open: "\f2b6";
$fa-var-envelope-open-o: "\f2b7";
$fa-var-envelope-square: "\f199";
$fa-var-envira: "\f299";
$fa-var-eraser: "\f12d";
$fa-var-etsy: "\f2d7";
$fa-var-eur: "\f153";
$fa-var-euro: "\f153";
$fa-var-exchange: "\f0ec";
$fa-var-exclamation: "\f12a";
$fa-var-exclamation-circle: "\f06a";
$fa-var-exclamation-triangle: "\f071";
$fa-var-expand: "\f065";
$fa-var-expeditedssl: "\f23e";
$fa-var-external-link: "\f08e";
$fa-var-external-link-square: "\f14c";
$fa-var-eye: "\f06e";
$fa-var-eye-slash: "\f070";
$fa-var-eyedropper: "\f1fb";
$fa-var-fa: "\f2b4";
$fa-var-facebook: "\f09a";
$fa-var-facebook-f: "\f09a";
$fa-var-facebook-official: "\f230";
$fa-var-facebook-square: "\f082";
$fa-var-fast-backward: "\f049";
$fa-var-fast-forward: "\f050";
$fa-var-fax: "\f1ac";
$fa-var-feed: "\f09e";
$fa-var-female: "\f182";
$fa-var-fighter-jet: "\f0fb";
$fa-var-file: "\f15b";
$fa-var-file-archive-o: "\f1c6";
$fa-var-file-audio-o: "\f1c7";
$fa-var-file-code-o: "\f1c9";
$fa-var-file-excel-o: "\f1c3";
$fa-var-file-image-o: "\f1c5";
$fa-var-file-movie-o: "\f1c8";
$fa-var-file-o: "\f016";
$fa-var-file-pdf-o: "\f1c1";
$fa-var-file-photo-o: "\f1c5";
$fa-var-file-picture-o: "\f1c5";
$fa-var-file-powerpoint-o: "\f1c4";
$fa-var-file-sound-o: "\f1c7";
$fa-var-file-text: "\f15c";
$fa-var-file-text-o: "\f0f6";
$fa-var-file-video-o: "\f1c8";
$fa-var-file-word-o: "\f1c2";
$fa-var-file-zip-o: "\f1c6";
$fa-var-files-o: "\f0c5";
$fa-var-film: "\f008";
$fa-var-filter: "\f0b0";
$fa-var-fire: "\f06d";
$fa-var-fire-extinguisher: "\f134";
$fa-var-firefox: "\f269";
$fa-var-first-order: "\f2b0";
$fa-var-flag: "\f024";
$fa-var-flag-checkered: "\f11e";
$fa-var-flag-o: "\f11d";
$fa-var-flash: "\f0e7";
$fa-var-flask: "\f0c3";
$fa-var-flickr: "\f16e";
$fa-var-floppy-o: "\f0c7";
$fa-var-folder: "\f07b";
$fa-var-folder-o: "\f114";
$fa-var-folder-open: "\f07c";
$fa-var-folder-open-o: "\f115";
$fa-var-font: "\f031";
$fa-var-font-awesome: "\f2b4";
$fa-var-fonticons: "\f280";
$fa-var-fort-awesome: "\f286";
$fa-var-forumbee: "\f211";
$fa-var-forward: "\f04e";
$fa-var-foursquare: "\f180";
$fa-var-free-code-camp: "\f2c5";
$fa-var-frown-o: "\f119";
$fa-var-futbol-o: "\f1e3";
$fa-var-gamepad: "\f11b";
$fa-var-gavel: "\f0e3";
$fa-var-gbp: "\f154";
$fa-var-ge: "\f1d1";
$fa-var-gear: "\f013";
$fa-var-gears: "\f085";
$fa-var-genderless: "\f22d";
$fa-var-get-pocket: "\f265";
$fa-var-gg: "\f260";
$fa-var-gg-circle: "\f261";
$fa-var-gift: "\f06b";
$fa-var-git: "\f1d3";
$fa-var-git-square: "\f1d2";
$fa-var-github: "\f09b";
$fa-var-github-alt: "\f113";
$fa-var-github-square: "\f092";
$fa-var-gitlab: "\f296";
$fa-var-gittip: "\f184";
$fa-var-glass: "\f000";
$fa-var-glide: "\f2a5";
$fa-var-glide-g: "\f2a6";
$fa-var-globe: "\f0ac";
$fa-var-google: "\f1a0";
$fa-var-google-plus: "\f0d5";
$fa-var-google-plus-circle: "\f2b3";
$fa-var-google-plus-official: "\f2b3";
$fa-var-google-plus-square: "\f0d4";
$fa-var-google-wallet: "\f1ee";
$fa-var-graduation-cap: "\f19d";
$fa-var-gratipay: "\f184";
$fa-var-grav: "\f2d6";
$fa-var-group: "\f0c0";
$fa-var-h-square: "\f0fd";
$fa-var-hacker-news: "\f1d4";
$fa-var-hand-grab-o: "\f255";
$fa-var-hand-lizard-o: "\f258";
$fa-var-hand-o-down: "\f0a7";
$fa-var-hand-o-left: "\f0a5";
$fa-var-hand-o-right: "\f0a4";
$fa-var-hand-o-up: "\f0a6";
$fa-var-hand-paper-o: "\f256";
$fa-var-hand-peace-o: "\f25b";
$fa-var-hand-pointer-o: "\f25a";
$fa-var-hand-rock-o: "\f255";
$fa-var-hand-scissors-o: "\f257";
$fa-var-hand-spock-o: "\f259";
$fa-var-hand-stop-o: "\f256";
$fa-var-handshake-o: "\f2b5";
$fa-var-hard-of-hearing: "\f2a4";
$fa-var-hashtag: "\f292";
$fa-var-hdd-o: "\f0a0";
$fa-var-header: "\f1dc";
$fa-var-headphones: "\f025";
$fa-var-heart: "\f004";
$fa-var-heart-o: "\f08a";
$fa-var-heartbeat: "\f21e";
$fa-var-history: "\f1da";
$fa-var-home: "\f015";
$fa-var-hospital-o: "\f0f8";
$fa-var-hotel: "\f236";
$fa-var-hourglass: "\f254";
$fa-var-hourglass-1: "\f251";
$fa-var-hourglass-2: "\f252";
$fa-var-hourglass-3: "\f253";
$fa-var-hourglass-end: "\f253";
$fa-var-hourglass-half: "\f252";
$fa-var-hourglass-o: "\f250";
$fa-var-hourglass-start: "\f251";
$fa-var-houzz: "\f27c";
$fa-var-html5: "\f13b";
$fa-var-i-cursor: "\f246";
$fa-var-id-badge: "\f2c1";
$fa-var-id-card: "\f2c2";
$fa-var-id-card-o: "\f2c3";
$fa-var-ils: "\f20b";
$fa-var-image: "\f03e";
$fa-var-imdb: "\f2d8";
$fa-var-inbox: "\f01c";
$fa-var-indent: "\f03c";
$fa-var-industry: "\f275";
$fa-var-info: "\f129";
$fa-var-info-circle: "\f05a";
$fa-var-inr: "\f156";
$fa-var-instagram: "\f16d";
$fa-var-institution: "\f19c";
$fa-var-internet-explorer: "\f26b";
$fa-var-intersex: "\f224";
$fa-var-ioxhost: "\f208";
$fa-var-italic: "\f033";
$fa-var-joomla: "\f1aa";
$fa-var-jpy: "\f157";
$fa-var-jsfiddle: "\f1cc";
$fa-var-key: "\f084";
$fa-var-keyboard-o: "\f11c";
$fa-var-krw: "\f159";
$fa-var-language: "\f1ab";
$fa-var-laptop: "\f109";
$fa-var-lastfm: "\f202";
$fa-var-lastfm-square: "\f203";
$fa-var-leaf: "\f06c";
$fa-var-leanpub: "\f212";
$fa-var-legal: "\f0e3";
$fa-var-lemon-o: "\f094";
$fa-var-level-down: "\f149";
$fa-var-level-up: "\f148";
$fa-var-life-bouy: "\f1cd";
$fa-var-life-buoy: "\f1cd";
$fa-var-life-ring: "\f1cd";
$fa-var-life-saver: "\f1cd";
$fa-var-lightbulb-o: "\f0eb";
$fa-var-line-chart: "\f201";
$fa-var-link: "\f0c1";
$fa-var-linkedin: "\f0e1";
$fa-var-linkedin-square: "\f08c";
$fa-var-linode: "\f2b8";
$fa-var-linux: "\f17c";
$fa-var-list: "\f03a";
$fa-var-list-alt: "\f022";
$fa-var-list-ol: "\f0cb";
$fa-var-list-ul: "\f0ca";
$fa-var-location-arrow: "\f124";
$fa-var-lock: "\f023";
$fa-var-long-arrow-down: "\f175";
$fa-var-long-arrow-left: "\f177";
$fa-var-long-arrow-right: "\f178";
$fa-var-long-arrow-up: "\f176";
$fa-var-low-vision: "\f2a8";
$fa-var-magic: "\f0d0";
$fa-var-magnet: "\f076";
$fa-var-mail-forward: "\f064";
$fa-var-mail-reply: "\f112";
$fa-var-mail-reply-all: "\f122";
$fa-var-male: "\f183";
$fa-var-map: "\f279";
$fa-var-map-marker: "\f041";
$fa-var-map-o: "\f278";
$fa-var-map-pin: "\f276";
$fa-var-map-signs: "\f277";
$fa-var-mars: "\f222";
$fa-var-mars-double: "\f227";
$fa-var-mars-stroke: "\f229";
$fa-var-mars-stroke-h: "\f22b";
$fa-var-mars-stroke-v: "\f22a";
$fa-var-maxcdn: "\f136";
$fa-var-meanpath: "\f20c";
$fa-var-medium: "\f23a";
$fa-var-medkit: "\f0fa";
$fa-var-meetup: "\f2e0";
$fa-var-meh-o: "\f11a";
$fa-var-mercury: "\f223";
$fa-var-microchip: "\f2db";
$fa-var-microphone: "\f130";
$fa-var-microphone-slash: "\f131";
$fa-var-minus: "\f068";
$fa-var-minus-circle: "\f056";
$fa-var-minus-square: "\f146";
$fa-var-minus-square-o: "\f147";
$fa-var-mixcloud: "\f289";
$fa-var-mobile: "\f10b";
$fa-var-mobile-phone: "\f10b";
$fa-var-modx: "\f285";
$fa-var-money: "\f0d6";
$fa-var-moon-o: "\f186";
$fa-var-mortar-board: "\f19d";
$fa-var-motorcycle: "\f21c";
$fa-var-mouse-pointer: "\f245";
$fa-var-music: "\f001";
$fa-var-navicon: "\f0c9";
$fa-var-neuter: "\f22c";
$fa-var-newspaper-o: "\f1ea";
$fa-var-object-group: "\f247";
$fa-var-object-ungroup: "\f248";
$fa-var-odnoklassniki: "\f263";
$fa-var-odnoklassniki-square: "\f264";
$fa-var-opencart: "\f23d";
$fa-var-openid: "\f19b";
$fa-var-opera: "\f26a";
$fa-var-optin-monster: "\f23c";
$fa-var-outdent: "\f03b";
$fa-var-pagelines: "\f18c";
$fa-var-paint-brush: "\f1fc";
$fa-var-paper-plane: "\f1d8";
$fa-var-paper-plane-o: "\f1d9";
$fa-var-paperclip: "\f0c6";
$fa-var-paragraph: "\f1dd";
$fa-var-paste: "\f0ea";
$fa-var-pause: "\f04c";
$fa-var-pause-circle: "\f28b";
$fa-var-pause-circle-o: "\f28c";
$fa-var-paw: "\f1b0";
$fa-var-paypal: "\f1ed";
$fa-var-pencil: "\f040";
$fa-var-pencil-square: "\f14b";
$fa-var-pencil-square-o: "\f044";
$fa-var-percent: "\f295";
$fa-var-phone: "\f095";
$fa-var-phone-square: "\f098";
$fa-var-photo: "\f03e";
$fa-var-picture-o: "\f03e";
$fa-var-pie-chart: "\f200";
$fa-var-pied-piper: "\f2ae";
$fa-var-pied-piper-alt: "\f1a8";
$fa-var-pied-piper-pp: "\f1a7";
$fa-var-pinterest: "\f0d2";
$fa-var-pinterest-p: "\f231";
$fa-var-pinterest-square: "\f0d3";
$fa-var-plane: "\f072";
$fa-var-play: "\f04b";
$fa-var-play-circle: "\f144";
$fa-var-play-circle-o: "\f01d";
$fa-var-plug: "\f1e6";
$fa-var-plus: "\f067";
$fa-var-plus-circle: "\f055";
$fa-var-plus-square: "\f0fe";
$fa-var-plus-square-o: "\f196";
$fa-var-podcast: "\f2ce";
$fa-var-power-off: "\f011";
$fa-var-print: "\f02f";
$fa-var-product-hunt: "\f288";
$fa-var-puzzle-piece: "\f12e";
$fa-var-qq: "\f1d6";
$fa-var-qrcode: "\f029";
$fa-var-question: "\f128";
$fa-var-question-circle: "\f059";
$fa-var-question-circle-o: "\f29c";
$fa-var-quora: "\f2c4";
$fa-var-quote-left: "\f10d";
$fa-var-quote-right: "\f10e";
$fa-var-ra: "\f1d0";
$fa-var-random: "\f074";
$fa-var-ravelry: "\f2d9";
$fa-var-rebel: "\f1d0";
$fa-var-recycle: "\f1b8";
$fa-var-reddit: "\f1a1";
$fa-var-reddit-alien: "\f281";
$fa-var-reddit-square: "\f1a2";
$fa-var-refresh: "\f021";
$fa-var-registered: "\f25d";
$fa-var-remove: "\f00d";
$fa-var-renren: "\f18b";
$fa-var-reorder: "\f0c9";
$fa-var-repeat: "\f01e";
$fa-var-reply: "\f112";
$fa-var-reply-all: "\f122";
$fa-var-resistance: "\f1d0";
$fa-var-retweet: "\f079";
$fa-var-rmb: "\f157";
$fa-var-road: "\f018";
$fa-var-rocket: "\f135";
$fa-var-rotate-left: "\f0e2";
$fa-var-rotate-right: "\f01e";
$fa-var-rouble: "\f158";
$fa-var-rss: "\f09e";
$fa-var-rss-square: "\f143";
$fa-var-rub: "\f158";
$fa-var-ruble: "\f158";
$fa-var-rupee: "\f156";
$fa-var-s15: "\f2cd";
$fa-var-safari: "\f267";
$fa-var-save: "\f0c7";
$fa-var-scissors: "\f0c4";
$fa-var-scribd: "\f28a";
$fa-var-search: "\f002";
$fa-var-search-minus: "\f010";
$fa-var-search-plus: "\f00e";
$fa-var-sellsy: "\f213";
$fa-var-send: "\f1d8";
$fa-var-send-o: "\f1d9";
$fa-var-server: "\f233";
$fa-var-share: "\f064";
$fa-var-share-alt: "\f1e0";
$fa-var-share-alt-square: "\f1e1";
$fa-var-share-square: "\f14d";
$fa-var-share-square-o: "\f045";
$fa-var-shekel: "\f20b";
$fa-var-sheqel: "\f20b";
$fa-var-shield: "\f132";
$fa-var-ship: "\f21a";
$fa-var-shirtsinbulk: "\f214";
$fa-var-shopping-bag: "\f290";
$fa-var-shopping-basket: "\f291";
$fa-var-shopping-cart: "\f07a";
$fa-var-shower: "\f2cc";
$fa-var-sign-in: "\f090";
$fa-var-sign-language: "\f2a7";
$fa-var-sign-out: "\f08b";
$fa-var-signal: "\f012";
$fa-var-signing: "\f2a7";
$fa-var-simplybuilt: "\f215";
$fa-var-sitemap: "\f0e8";
$fa-var-skyatlas: "\f216";
$fa-var-skype: "\f17e";
$fa-var-slack: "\f198";
$fa-var-sliders: "\f1de";
$fa-var-slideshare: "\f1e7";
$fa-var-smile-o: "\f118";
$fa-var-snapchat: "\f2ab";
$fa-var-snapchat-ghost: "\f2ac";
$fa-var-snapchat-square: "\f2ad";
$fa-var-snowflake-o: "\f2dc";
$fa-var-soccer-ball-o: "\f1e3";
$fa-var-sort: "\f0dc";
$fa-var-sort-alpha-asc: "\f15d";
$fa-var-sort-alpha-desc: "\f15e";
$fa-var-sort-amount-asc: "\f160";
$fa-var-sort-amount-desc: "\f161";
$fa-var-sort-asc: "\f0de";
$fa-var-sort-desc: "\f0dd";
$fa-var-sort-down: "\f0dd";
$fa-var-sort-numeric-asc: "\f162";
$fa-var-sort-numeric-desc: "\f163";
$fa-var-sort-up: "\f0de";
$fa-var-soundcloud: "\f1be";
$fa-var-space-shuttle: "\f197";
$fa-var-spinner: "\f110";
$fa-var-spoon: "\f1b1";
$fa-var-spotify: "\f1bc";
$fa-var-square: "\f0c8";
$fa-var-square-o: "\f096";
$fa-var-stack-exchange: "\f18d";
$fa-var-stack-overflow: "\f16c";
$fa-var-star: "\f005";
$fa-var-star-half: "\f089";
$fa-var-star-half-empty: "\f123";
$fa-var-star-half-full: "\f123";
$fa-var-star-half-o: "\f123";
$fa-var-star-o: "\f006";
$fa-var-steam: "\f1b6";
$fa-var-steam-square: "\f1b7";
$fa-var-step-backward: "\f048";
$fa-var-step-forward: "\f051";
$fa-var-stethoscope: "\f0f1";
$fa-var-sticky-note: "\f249";
$fa-var-sticky-note-o: "\f24a";
$fa-var-stop: "\f04d";
$fa-var-stop-circle: "\f28d";
$fa-var-stop-circle-o: "\f28e";
$fa-var-street-view: "\f21d";
$fa-var-strikethrough: "\f0cc";
$fa-var-stumbleupon: "\f1a4";
$fa-var-stumbleupon-circle: "\f1a3";
$fa-var-subscript: "\f12c";
$fa-var-subway: "\f239";
$fa-var-suitcase: "\f0f2";
$fa-var-sun-o: "\f185";
$fa-var-superpowers: "\f2dd";
$fa-var-superscript: "\f12b";
$fa-var-support: "\f1cd";
$fa-var-table: "\f0ce";
$fa-var-tablet: "\f10a";
$fa-var-tachometer: "\f0e4";
$fa-var-tag: "\f02b";
$fa-var-tags: "\f02c";
$fa-var-tasks: "\f0ae";
$fa-var-taxi: "\f1ba";
$fa-var-telegram: "\f2c6";
$fa-var-television: "\f26c";
$fa-var-tencent-weibo: "\f1d5";
$fa-var-terminal: "\f120";
$fa-var-text-height: "\f034";
$fa-var-text-width: "\f035";
$fa-var-th: "\f00a";
$fa-var-th-large: "\f009";
$fa-var-th-list: "\f00b";
$fa-var-themeisle: "\f2b2";
$fa-var-thermometer: "\f2c7";
$fa-var-thermometer-0: "\f2cb";
$fa-var-thermometer-1: "\f2ca";
$fa-var-thermometer-2: "\f2c9";
$fa-var-thermometer-3: "\f2c8";
$fa-var-thermometer-4: "\f2c7";
$fa-var-thermometer-empty: "\f2cb";
$fa-var-thermometer-full: "\f2c7";
$fa-var-thermometer-half: "\f2c9";
$fa-var-thermometer-quarter: "\f2ca";
$fa-var-thermometer-three-quarters: "\f2c8";
$fa-var-thumb-tack: "\f08d";
$fa-var-thumbs-down: "\f165";
$fa-var-thumbs-o-down: "\f088";
$fa-var-thumbs-o-up: "\f087";
$fa-var-thumbs-up: "\f164";
$fa-var-ticket: "\f145";
$fa-var-times: "\f00d";
$fa-var-times-circle: "\f057";
$fa-var-times-circle-o: "\f05c";
$fa-var-times-rectangle: "\f2d3";
$fa-var-times-rectangle-o: "\f2d4";
$fa-var-tint: "\f043";
$fa-var-toggle-down: "\f150";
$fa-var-toggle-left: "\f191";
$fa-var-toggle-off: "\f204";
$fa-var-toggle-on: "\f205";
$fa-var-toggle-right: "\f152";
$fa-var-toggle-up: "\f151";
$fa-var-trademark: "\f25c";
$fa-var-train: "\f238";
$fa-var-transgender: "\f224";
$fa-var-transgender-alt: "\f225";
$fa-var-trash: "\f1f8";
$fa-var-trash-o: "\f014";
$fa-var-tree: "\f1bb";
$fa-var-trello: "\f181";
$fa-var-tripadvisor: "\f262";
$fa-var-trophy: "\f091";
$fa-var-truck: "\f0d1";
$fa-var-try: "\f195";
$fa-var-tty: "\f1e4";
$fa-var-tumblr: "\f173";
$fa-var-tumblr-square: "\f174";
$fa-var-turkish-lira: "\f195";
$fa-var-tv: "\f26c";
$fa-var-twitch: "\f1e8";
$fa-var-twitter: "\f099";
$fa-var-twitter-square: "\f081";
$fa-var-umbrella: "\f0e9";
$fa-var-underline: "\f0cd";
$fa-var-undo: "\f0e2";
$fa-var-universal-access: "\f29a";
$fa-var-university: "\f19c";
$fa-var-unlink: "\f127";
$fa-var-unlock: "\f09c";
$fa-var-unlock-alt: "\f13e";
$fa-var-unsorted: "\f0dc";
$fa-var-upload: "\f093";
$fa-var-usb: "\f287";
$fa-var-usd: "\f155";
$fa-var-user: "\f007";
$fa-var-user-circle: "\f2bd";
$fa-var-user-circle-o: "\f2be";
$fa-var-user-md: "\f0f0";
$fa-var-user-o: "\f2c0";
$fa-var-user-plus: "\f234";
$fa-var-user-secret: "\f21b";
$fa-var-user-times: "\f235";
$fa-var-users: "\f0c0";
$fa-var-vcard: "\f2bb";
$fa-var-vcard-o: "\f2bc";
$fa-var-venus: "\f221";
$fa-var-venus-double: "\f226";
$fa-var-venus-mars: "\f228";
$fa-var-viacoin: "\f237";
$fa-var-viadeo: "\f2a9";
$fa-var-viadeo-square: "\f2aa";
$fa-var-video-camera: "\f03d";
$fa-var-vimeo: "\f27d";
$fa-var-vimeo-square: "\f194";
$fa-var-vine: "\f1ca";
$fa-var-vk: "\f189";
$fa-var-volume-control-phone: "\f2a0";
$fa-var-volume-down: "\f027";
$fa-var-volume-off: "\f026";
$fa-var-volume-up: "\f028";
$fa-var-warning: "\f071";
$fa-var-wechat: "\f1d7";
$fa-var-weibo: "\f18a";
$fa-var-weixin: "\f1d7";
$fa-var-whatsapp: "\f232";
$fa-var-wheelchair: "\f193";
$fa-var-wheelchair-alt: "\f29b";
$fa-var-wifi: "\f1eb";
$fa-var-wikipedia-w: "\f266";
$fa-var-window-close: "\f2d3";
$fa-var-window-close-o: "\f2d4";
$fa-var-window-maximize: "\f2d0";
$fa-var-window-minimize: "\f2d1";
$fa-var-window-restore: "\f2d2";
$fa-var-windows: "\f17a";
$fa-var-won: "\f159";
$fa-var-wordpress: "\f19a";
$fa-var-wpbeginner: "\f297";
$fa-var-wpexplorer: "\f2de";
$fa-var-wpforms: "\f298";
$fa-var-wrench: "\f0ad";
$fa-var-xing: "\f168";
$fa-var-xing-square: "\f169";
$fa-var-y-combinator: "\f23b";
$fa-var-y-combinator-square: "\f1d4";
$fa-var-yahoo: "\f19e";
$fa-var-yc: "\f23b";
$fa-var-yc-square: "\f1d4";
$fa-var-yelp: "\f1e9";
$fa-var-yen: "\f157";
$fa-var-yoast: "\f2b1";
$fa-var-youtube: "\f167";
$fa-var-youtube-play: "\f16a";
$fa-var-youtube-square: "\f166";

@ -0,0 +1,18 @@
/*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/
@import "variables";
@import "mixins";
@import "path";
@import "core";
@import "larger";
@import "fixed-width";
@import "list";
@import "bordered-pulled";
@import "animated";
@import "rotated-flipped";
@import "stacked";
@import "icons";
@import "screen-reader";

@ -0,0 +1,897 @@
<!DOCTYPE html>
<html>
<head>
<title>PE1RXF APRS server</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/styles.css">
<link rel="stylesheet" href="css/popup.css">
<link rel="stylesheet" href="css/font-awesome.min.css">
</head>
<body>
<?php
// Prevents a repost when the user refreshes the page.
// Also it handles the post itself.
session_start();
if(count($_POST) > 0) {
// figure out which form was entered
if ($_POST['ax0_message_text']) {
$_SESSION['ax0_message_text'] = $_POST['ax0_message_text'];
$_SESSION['ax0_message_path'] = $_POST['ax0_message_path'];
$_SESSION['ax0_message_destination'] = $_POST['ax0_message_destination'];
}
if ($_POST['ax1_message_text']) {
$_SESSION['ax1_message_text'] = $_POST['ax1_message_text'];
$_SESSION['ax1_message_path'] = $_POST['ax1_message_path'];
$_SESSION['ax1_message_destination'] = $_POST['ax1_message_destination'];
}
header("HTTP/1.1 303 See Other");
header("Location: http://$_SERVER[HTTP_HOST]/send_message.php");
die();
}
else {
if (isset($_SESSION['ax0_message_text'])){
$ax0_message_text = $_SESSION['ax0_message_text'];
$ax0_message_path = $_SESSION['ax0_message_path'];
$ax0_message_destination = $_SESSION['ax0_message_destination'];
//echo "Send ax0: $ax0_message_text, $ax0_message_path, $ax0_message_destination";
//$ax0_message_destination = str_pad($ax0_message_destination, 9, " ");
//echo "PE1RXF-1>APRX29,$ax0_message_path::$ax0_message_destination:$ax0_message_text";
# Send message. NOTE: send_message.sh should be executable by www-data. Also, the ax0 transmit directory should be writable by www-data
if ($ax0_message_path == "none")
$execuatable_string = sprintf("/home/marcel/ham/aprs_utils/send_message.sh -i ax0 -c \"%s\" -m \"%s\"", $ax0_message_destination, $ax0_message_text);
else
$execuatable_string = sprintf("/home/marcel/ham/aprs_utils/send_message.sh -i ax0 -c \"%s\" -p \"%s\" -m \"%s\"", $ax0_message_destination, $ax0_message_path, $ax0_message_text);
//$execuatable_string = sprintf("%'.9d\n", 123);
//echo $execuatable_string;
exec("$execuatable_string");
# Wait for the changes to take effect
sleep(1);
}
else if (isset($_SESSION['ax1_message_text'])){
$ax1_message_text = $_SESSION['ax1_message_text'];
$ax1_message_path = $_SESSION['ax1_message_path'];
$ax1_message_destination = $_SESSION['ax1_message_destination'];
//echo "Send ax1: $ax1_message_text, $ax1_message_path, $ax1_message_destination";
# Send message. NOTE: send_message.sh should be executable by www-data. Also, the ax0 transmit directory should be writable by www-data
if ($ax1_message_path == "none")
$execuatable_string = sprintf("/home/marcel/ham/aprs_utils/send_message.sh -i ax1 -c \"%s\" -m \"%s\"", $ax1_message_destination, $ax1_message_text);
else
$execuatable_string = sprintf("/home/marcel/ham/aprs_utils/send_message.sh -i ax1 -c \"%s\" -p \"%s\" -m \"%s\"", $ax1_message_destination, $ax1_message_path, $ax1_message_text);
//$execuatable_string = sprintf("/home/marcel/ham/aprs_utils/send_message.sh -i ax1 -c \"%s\" -p \"%s\" -m \"%s\"", $ax1_message_destination, $ax1_message_path, $ax1_message_text);
//echo exec("/home/marcel/ham/aprs_utils/send_message.sh -i ax1 -c $ax1_message_destination -p $ax1_message_path -m $ax1_message_text");
exec("$execuatable_string");
# Wait for the changes to take effect
sleep(1);
}
session_unset();
session_destroy();
}
// END: Prevents a repost when the user refreshes the page.
# Reads configuration file from pe1rxf-aprs-server directory, makes changes if necesary
# and writes the newly constructed file to a temporary config-file. It does not overwrite
# the original file, because user www-data can only read the program directory, not write to it.
# It's a safety thing...
# The main loop of pe1rxf-aprs-server than copies it to the program directory and removes the temporary file.
function change_parameter_value($parameter, $value)
{
$config_file = '/var/www/html/config/test.cfg';
$tmp_config_file = '/var/www/html/config/test.cfg.tmp';
$reading = fopen($config_file, 'r');
$writing = fopen($tmp_config_file, 'w');
$replaced = false;
while (!feof($reading)) {
$line = fgets($reading);
if (stristr($line,$parameter)) {
$line = "$parameter=$value\n";
//echo "New value: ", "$line";
$replaced = true;
}
fputs($writing, $line);
}
fclose($reading); fclose($writing);
// might as well not overwrite the file if we didn't replace anything
if ($replaced)
{
shell_exec("mv $tmp_config_file $config_file");
} else {
shell_exec("rm $tmp_config_file");
}
}
# Saves setting for given form: ax0 or ax1
# $a = beacon_time
# $b = beacon_destination
# $c = beacon_path
# $d = beacon_position
# $e = beacon_comment
# $f = beacon_file
# $g = transmit_directory
function save_settings($form, $a, $b=0, $c=0, $d=0, $e=0, $f=0, $g=0)
{
# Copy original config file to temporary place on web server.
# From here we can change the values
$original_config_file = '/home/marcel/ham/aprs_utils/pe1rxf-aprs-server.cfg';
$destination_config_file = '/var/www/html/config/test.cfg';
$newly_made_config_file = '/var/www/html/config/pe1rxf-aprs-server.cfg';
$fileCopied = copy("$original_config_file", "$destination_config_file");
if($fileCopied) {
//echo "# $a, $b, $c, $d, $e, $f, $g";
if ($form == "ax0" ) {
change_parameter_value("ax0_beacon_time", $a);
if ($c) change_parameter_value("ax0_beacon_path", $c);
if ($e) change_parameter_value("ax0_beacon_comment", $e);
}
else if ($form == "ax1" ) {
change_parameter_value("ax1_beacon_time", $a);
if ($c) change_parameter_value("ax1_beacon_path", $c);
if ($e) change_parameter_value("ax1_beacon_comment", $e);
}
# now make new file with new configuration for the main loop to find.
shell_exec("cp $destination_config_file $newly_made_config_file");
# and remove working file:
shell_exec("rm $destination_config_file");
} else{
#echo "Error";
}
}
# Reads configuration file from pe1rxf-aprs-server directory.
# Search this file for given paramter and returns its value.
function search_parameter_in_config_file($parameter)
{
$config_file = '/home/marcel/ham/aprs_utils/pe1rxf-aprs-server.cfg';
$reading = fopen($config_file, 'r');
while (!feof($reading)) {
$line = fgets($reading);
if ( strstr($line,$parameter) ) {
$line = substr( $line, strlen($parameter)+1 );
# Found match. Stop further search.
fclose($reading);
return rtrim($line);
}
}
}
$ax0_name = search_parameter_in_config_file("ax0_name");
$ax0_frequency = search_parameter_in_config_file("ax0_frequency");
$ax0_message1_id = search_parameter_in_config_file("ax0_message1_id");
$ax0_message2_id = search_parameter_in_config_file("ax0_message2_id");
$ax0_message3_id = search_parameter_in_config_file("ax0_message3_id");
$ax0_message4_id = search_parameter_in_config_file("ax0_message4_id");
$ax0_message1_text = search_parameter_in_config_file("ax0_message1_text");
$ax0_message2_text = search_parameter_in_config_file("ax0_message2_text");
$ax0_message3_text = search_parameter_in_config_file("ax0_message3_text");
$ax0_message4_text = search_parameter_in_config_file("ax0_message4_text");
$ax0_message1_destination = search_parameter_in_config_file("ax0_message1_destination");
$ax0_message2_destination = search_parameter_in_config_file("ax0_message2_destination");
$ax0_message3_destination = search_parameter_in_config_file("ax0_message3_destination");
$ax0_message4_destination = search_parameter_in_config_file("ax0_message4_destination");
$ax0_message1_path = search_parameter_in_config_file("ax0_message1_path");
$ax0_message2_path = search_parameter_in_config_file("ax0_message2_path");
$ax0_message3_path = search_parameter_in_config_file("ax0_message3_path");
$ax0_message4_path = search_parameter_in_config_file("ax0_message4_path");
$ax1_name = search_parameter_in_config_file("ax1_name");
$ax1_frequency = search_parameter_in_config_file("ax1_frequency");
$ax1_message1_id = search_parameter_in_config_file("ax1_message1_id");
$ax1_message2_id = search_parameter_in_config_file("ax1_message2_id");
$ax1_message3_id = search_parameter_in_config_file("ax1_message3_id");
$ax1_message4_id = search_parameter_in_config_file("ax1_message4_id");
$ax1_message1_text = search_parameter_in_config_file("ax1_message1_text");
$ax1_message2_text = search_parameter_in_config_file("ax1_message2_text");
$ax1_message3_text = search_parameter_in_config_file("ax1_message3_text");
$ax1_message4_text = search_parameter_in_config_file("ax1_message4_text");
$ax1_message1_destination = search_parameter_in_config_file("ax1_message1_destination");
$ax1_message2_destination = search_parameter_in_config_file("ax1_message2_destination");
$ax1_message3_destination = search_parameter_in_config_file("ax1_message3_destination");
$ax1_message4_destination = search_parameter_in_config_file("ax1_message4_destination");
$ax1_message1_path = search_parameter_in_config_file("ax1_message1_path");
$ax1_message2_path = search_parameter_in_config_file("ax1_message2_path");
$ax1_message3_path = search_parameter_in_config_file("ax1_message3_path");
$ax1_message4_path = search_parameter_in_config_file("ax1_message4_path");
?>
<div class="header">
<a href="index.php" >
<h1><i class="fa fa-home" aria-hidden="true"></i>&nbsp; PE1RXF APRS server</h1>
</a>
</div>
<div class="row">
<div class="col-3 col-s-3 menu">
<ul>
<li><h3><?php echo $ax0_name ?> (<?php echo $ax0_frequency ?>)</h3></li>
<li onclick="openForm_ax0_message0()">Send new message</li>
<li><b>Predefined messages:</b></li>
<li onclick="openForm_ax0_message1()"><b><?php echo $ax0_message1_id; ?></b></li>
<li onclick="openForm_ax0_message2()"><b><?php echo $ax0_message2_id; ?></b></li>
<li onclick="openForm_ax0_message3()"><b><?php echo $ax0_message3_id; ?></b></li>
<li onclick="openForm_ax0_message4()"><b><?php echo $ax0_message4_id; ?></b></li>
</ul>
</div>
<div class="col-6 col-s-9" id="main_page">
<div class="col-6 col-s-12">
<img src="images/mail-out.svg" style="cursor:pointer;" onclick="show_send_messages()"/></a>
<h1>Send messages</h1>
</div>
<div class="col-6 col-s-12">
<img src="images/mail-in.svg" style="cursor:pointer;" onclick="show_received_messages()" />
<h1>Received messages</h1>
</div>
</div>
<div class="col-6 col-s-9" id="send_messages" style="display:none">
<h1>Send messages</h1>
<h2 align="left"><?php echo $ax0_name ?> (<?php echo $ax0_frequency ?>)</h2>
<h3 align="left">
<?php
$csv = array_map('str_getcsv', file("/home/marcel/ham/aprs_utils/aprs_log/aprs_send_messages.log"));
for ($i = 0; $i < count($csv); $i++) {
if ($csv[$i][1] == "ax0") {
echo $csv[$i][2];
echo ": ";
echo $csv[$i][4];
echo "<br>";
}
}
?>
</h3>
<h2 align="left"><?php echo $ax1_name ?> (<?php echo $ax1_frequency ?>)</h2>
<h3 align="left">
<?php
$csv = array_map('str_getcsv', file("/home/marcel/ham/aprs_utils/aprs_log/aprs_send_messages.log"));
for ($i = 0; $i < count($csv); $i++) {
if ($csv[$i][1] == "ax1") {
echo $csv[$i][2];
echo ": ";
echo $csv[$i][4];
echo "<br>";
}
}
?>
</h3>
<a href=""><h1 style="color:Black;" onclick="show_main_page()"><i class="fa fa-arrow-left" aria-hidden="true"></i>&nbsp; Back</h1></a>
</div>
<div class="col-6 col-s-9" id="received_messages" style="display:none">
<h1>Received messages</h1>
<h2 align="left"><?php echo $ax0_name ?> (<?php echo $ax0_frequency ?>)</h2>
<h3 align="left">
<?php
$csv = array_map('str_getcsv', file("/home/marcel/ham/aprs_utils/aprs_log/aprs_received_messages.log"));
for ($i = 0; $i < count($csv); $i++) {
if ($csv[$i][1] == "ax0") {
echo $csv[$i][2];
echo ": ";
echo $csv[$i][4];
echo "<br>";
}
}
?>
</h3>
<h2 align="left"><?php echo $ax1_name ?> (<?php echo $ax1_frequency ?>)</h2>
<h3 align="left">
<?php
$csv = array_map('str_getcsv', file("/home/marcel/ham/aprs_utils/aprs_log/aprs_received_messages.log"));
for ($i = 0; $i < count($csv); $i++) {
if ($csv[$i][1] == "ax1") {
echo $csv[$i][2];
echo ": ";
echo $csv[$i][4];
echo "<br>";
}
}
?>
</h3>
<a href=""><h1 style="color:Black;" onclick="show_main_page()"><i class="fa fa-arrow-left" aria-hidden="true"></i>&nbsp; Back</h1></a>
</div>
<div class="col-3 col-s-12 menu">
<ul>
<li><h3><?php echo $ax1_name ?> (<?php echo $ax1_frequency ?>)</h3></li>
<li onclick="openForm_ax1_message0()">Send new message</li>
<li><b>Predefined messages:</b></li>
<li onclick="openForm_ax1_message1()"><b><?php echo $ax1_message1_id; ?></b></li>
<li onclick="openForm_ax1_message2()"><b><?php echo $ax1_message2_id; ?></b></li>
<li onclick="openForm_ax1_message3()"><b><?php echo $ax1_message3_id; ?></b></li>
<li onclick="openForm_ax1_message4()"><b><?php echo $ax1_message4_id; ?></b></li>
</ul>
</div>
</div>
<div class="loginPopup">
<div class="formPopup" id="popupForm_ax0_message0">
<form action="" class="formContainer" method="post">
<h2>Message <?php echo $ax0_frequency ?></h2>
<label for="email">
<strong>Message</strong>
</label>
<input type="text" id="email" placeholder="Message" name="ax0_message_text" required>
<label for="psw">
<strong>Destination</strong>
</label>
<input type="text" id="pwd" placeholder="Destination" name="ax0_message_destination" required>
<label for="path">
<strong>Path<br></strong>
</label>
<div class="radioLeft">
<input type="radio" class="formContainer radio" id="path_none" name="ax0_message_path" value="none" checked>
<label for="path_none">none</label><br>
<input type="radio" class="formContainer radio" id="path_wide21" name="ax0_message_path" value="WIDE2-1" <?php if ($ax0_message0_path == "WIDE2-1") echo "checked"; ?> >
<label for="path_wide21">WIDE2-1</label><br>
<input type="radio" class="formContainer radio" id="path_wide22" name="ax0_message_path" value="WIDE2-2" <?php if ($ax0_message0_path == "WIDE2-2") echo "checked"; ?> >
<label for="path_wide22">WIDE2-2</label><br>
<input type="radio" class="formContainer radio" id="path_wide33" name="ax0_message_path" value="WIDE3-3" <?php if ($ax0_message0_path == "WIDE3-3") echo "checked"; ?> >
<label for="path_wide33">WIDE3-3</label><br>
</div>
<div id="submit_ax0_message0"><button type="submit" class="btn" onclick="SubmitClicked_ax0_message0()">Submit</button></div>
<div id="submit_done_ax0_message0" style="display:none;"><button type="button" class="btn wait"><img src="images/preload.gif">Please wait...</button></div>
<div id="cancel_ax0_message0"><button type="button" class="btn cancel" onclick="closeForm_ax0_message0()">Cancel</button>
</form>
</div>
</div>
</div>
<div class="loginPopup">
<div class="formPopup" id="popupForm_ax0_message1">
<form action="" class="formContainer" method="post">
<h2>Message <?php echo $ax0_frequency ?></h2>
<label for="email">
<strong>Message</strong>
</label>
<input type="text" id="email" placeholder="Message" name="ax0_message_text" value="<?php echo $ax0_message1_text; ?>" required>
<label for="psw">
<strong>Destination</strong>
</label>
<input type="text" id="email" placeholder="Destination" name="ax0_message_destination" value="<?php echo $ax0_message1_destination; ?>" required>
<label for="path">
<strong>Path<br></strong>
</label>
<div class="radioLeft">
<input type="radio" class="formContainer radio" id="path_none" name="ax0_message_path" value="none" <?php if ($ax0_message1_path == "none") echo "checked"; ?>>
<label for="path_none">none</label><br>
<input type="radio" class="formContainer radio" id="path_wide21" name="ax0_message_path" value="WIDE2-1" <?php if ($ax0_message1_path == "WIDE2-1") echo "checked"; ?> >
<label for="path_wide21">WIDE2-1</label><br>
<input type="radio" class="formContainer radio" id="path_wide22" name="ax0_message_path" value="WIDE2-2" <?php if ($ax0_message1_path == "WIDE2-2") echo "checked"; ?> >
<label for="path_wide22">WIDE2-2</label><br>
<input type="radio" class="formContainer radio" id="path_wide33" name="ax0_message_path" value="WIDE3-3" <?php if ($ax0_message1_path == "WIDE3-3") echo "checked"; ?> >
<label for="path_wide33">WIDE3-3</label><br>
</div>
<div id="submit_ax0_message1"><button type="submit" class="btn" onclick="SubmitClicked_ax0_message1()">Submit</button></div>
<div id="submit_done_ax0_message1" style="display:none;"><button type="button" class="btn wait"><img src="images/preload.gif">Please wait...</button></div>
<div id="cancel_ax0_message1"><button type="button" class="btn cancel" onclick="closeForm_ax0_message1()">Cancel</button>
</form>
</div>
</div>
</div>
<div class="loginPopup">
<div class="formPopup" id="popupForm_ax0_message2">
<form action="" class="formContainer" method="post">
<h2>Message <?php echo $ax0_frequency ?></h2>
<label for="email">
<strong>Message</strong>
</label>
<input type="text" id="email" placeholder="Message" name="ax0_message_text" value="<?php echo $ax0_message2_text; ?>" required>
<label for="psw">
<strong>Destination</strong>
</label>
<input type="text" id="email" placeholder="Destination" name="ax0_message_destination" value="<?php echo $ax0_message2_destination; ?>" required>
<label for="path">
<strong>Path<br></strong>
</label>
<div class="radioLeft">
<input type="radio" class="formContainer radio" id="path_none" name="ax0_message_path" value="none" <?php if ($ax0_message2_path == "none") echo "checked"; ?>>
<label for="path_none">none</label><br>
<input type="radio" class="formContainer radio" id="path_wide21" name="ax0_message_path" value="WIDE2-1" <?php if ($ax0_message2_path == "WIDE2-1") echo "checked"; ?> >
<label for="path_wide21">WIDE2-1</label><br>
<input type="radio" class="formContainer radio" id="path_wide22" name="ax0_message_path" value="WIDE2-2" <?php if ($ax0_message2_path == "WIDE2-2") echo "checked"; ?> >
<label for="path_wide22">WIDE2-2</label><br>
<input type="radio" class="formContainer radio" id="path_wide33" name="ax0_message_path" value="WIDE3-3" <?php if ($ax0_message2_path == "WIDE3-3") echo "checked"; ?> >
<label for="path_wide33">WIDE3-3</label><br>
</div>
<div id="submit_ax0_message2"><button type="submit" class="btn" onclick="SubmitClicked_ax0_message2()">Submit</button></div>
<div id="submit_done_ax0_message2" style="display:none;"><button type="button" class="btn wait"><img src="images/preload.gif">Please wait...</button></div>
<div id="cancel_ax0_message2"><button type="button" class="btn cancel" onclick="closeForm_ax0_message2()">Cancel</button>
</form>
</div>
</div>
</div>
<div class="loginPopup">
<div class="formPopup" id="popupForm_ax0_message3">
<form action="" class="formContainer" method="post">
<h2>Message <?php echo $ax0_frequency ?></h2>
<label for="email">
<strong>Message</strong>
</label>
<input type="text" id="email" placeholder="Message" name="ax0_message_text" value="<?php echo $ax0_message3_text; ?>" required>
<label for="psw">
<strong>Destination</strong>
</label>
<input type="text" id="email" placeholder="Destination" name="ax0_message_destination" value="<?php echo $ax0_message3_destination; ?>" required>
<label for="path">
<strong>Path<br></strong>
</label>
<div class="radioLeft">
<input type="radio" class="formContainer radio" id="path_none" name="ax0_message_path" value="none" <?php if ($ax0_message3_path == "none") echo "checked"; ?>>
<label for="path_none">none</label><br>
<input type="radio" class="formContainer radio" id="path_wide21" name="ax0_message_path" value="WIDE2-1" <?php if ($ax0_message3_path == "WIDE2-1") echo "checked"; ?> >
<label for="path_wide21">WIDE2-1</label><br>
<input type="radio" class="formContainer radio" id="path_wide22" name="ax0_message_path" value="WIDE2-2" <?php if ($ax0_message3_path == "WIDE2-2") echo "checked"; ?> >
<label for="path_wide22">WIDE2-2</label><br>
<input type="radio" class="formContainer radio" id="path_wide33" name="ax0_message_path" value="WIDE3-3" <?php if ($ax0_message3_path == "WIDE3-3") echo "checked"; ?> >
<label for="path_wide33">WIDE3-3</label><br>
</div>
<div id="submit_ax0_message3"><button type="submit" class="btn" onclick="SubmitClicked_ax0_message3()">Submit</button></div>
<div id="submit_done_ax0_message3" style="display:none;"><button type="button" class="btn wait"><img src="images/preload.gif">Please wait...</button></div>
<div id="cancel_ax0_message3"><button type="button" class="btn cancel" onclick="closeForm_ax0_message3()">Cancel</button>
</form>
</div>
</div>
</div>
<div class="loginPopup">
<div class="formPopup" id="popupForm_ax0_message4">
<form action="" class="formContainer" method="post">
<h2>Message <?php echo $ax0_frequency ?></h2>
<label for="email">
<strong>Message</strong>
</label>
<input type="text" id="email" placeholder="Message" name="ax0_message_text" value="<?php echo $ax0_message4_text; ?>" required>
<label for="psw">
<strong>Destination</strong>
</label>
<input type="text" id="email" placeholder="Destination" name="ax0_message_destination" value="<?php echo $ax0_message4_destination; ?>" required>
<label for="path">
<strong>Path<br></strong>
</label>
<div class="radioLeft">
<input type="radio" class="formContainer radio" id="path_none" name="ax0_message_path" value="none" <?php if ($ax0_message4_path == "none") echo "checked"; ?>>
<label for="path_none">none</label><br>
<input type="radio" class="formContainer radio" id="path_wide21" name="ax0_message_path" value="WIDE2-1" <?php if ($ax0_message4_path == "WIDE2-1") echo "checked"; ?> >
<label for="path_wide21">WIDE2-1</label><br>
<input type="radio" class="formContainer radio" id="path_wide22" name="ax0_message_path" value="WIDE2-2" <?php if ($ax0_message4_path == "WIDE2-2") echo "checked"; ?> >
<label for="path_wide22">WIDE2-2</label><br>
<input type="radio" class="formContainer radio" id="path_wide33" name="ax0_message_path" value="WIDE3-3" <?php if ($ax0_message4_path == "WIDE3-3") echo "checked"; ?> >
<label for="path_wide33">WIDE3-3</label><br>
</div>
<div id="submit_ax0_message4"><button type="submit" class="btn" onclick="SubmitClicked_ax0_message4()">Submit</button></div>
<div id="submit_done_ax0_message4" style="display:none;"><button type="button" class="btn wait"><img src="images/preload.gif">Please wait...</button></div>
<div id="cancel_ax0_message4"><button type="button" class="btn cancel" onclick="closeForm_ax0_message4()">Cancel</button>
</form>
</div>
</div>
</div>
<div class="loginPopup">
<div class="formPopup" id="popupForm_ax1_message0">
<form action="" class="formContainer" method="post">
<h2>Message <?php echo $ax1_frequency ?></h2>
<label for="email">
<strong>Message</strong>
</label>
<input type="text" id="email" placeholder="Message" name="ax1_message_text" required>
<label for="psw">
<strong>Destination</strong>
</label>
<input type="text" id="email" placeholder="Destination" name="ax1_message_destination" required>
<label for="path">
<strong>Path<br></strong>
</label>
<div class="radioLeft">
<input type="radio" class="formContainer radio" id="path_none" name="ax1_message_path" value="none" checked>
<label for="path_none">none</label><br>
<input type="radio" class="formContainer radio" id="path_wide21" name="ax1_message_path" value="WIDE2-1" <?php if ($ax1_message0_path == "WIDE2-1") echo "checked"; ?> >
<label for="path_wide21">WIDE2-1</label><br>
<input type="radio" class="formContainer radio" id="path_wide22" name="ax1_message_path" value="WIDE2-2" <?php if ($ax1_message0_path == "WIDE2-2") echo "checked"; ?> >
<label for="path_wide22">WIDE2-2</label><br>
<input type="radio" class="formContainer radio" id="path_wide33" name="ax1_message_path" value="WIDE3-3" <?php if ($ax1_message0_path == "WIDE3-3") echo "checked"; ?> >
<label for="path_wide33">WIDE3-3</label><br>
</div>
<div id="submit_ax1_message0"><button type="submit" class="btn" onclick="SubmitClicked_ax1_message0()">Submit</button></div>
<div id="submit_done_ax1_message0" style="display:none;"><button type="button" class="btn wait"><img src="images/preload.gif">Please wait...</button></div>
<div id="cancel_ax1_message0"><button type="button" class="btn cancel" onclick="closeForm_ax1_message0()">Cancel</button>
</form>
</div>
</div>
</div>
<div class="loginPopup">
<div class="formPopup" id="popupForm_ax1_message1">
<form action="" class="formContainer" method="post">
<h2>Message <?php echo $ax1_frequency ?></h2>
<label for="email">
<strong>Message</strong>
</label>
<input type="text" id="email" placeholder="Message" name="ax1_message_text" value="<?php echo $ax1_message1_text; ?>" required>
<label for="psw">
<strong>Destination</strong>
</label>
<input type="text" id="email" placeholder="Destination" name="ax1_message_destination" value="<?php echo $ax1_message1_destination; ?>" required>
<label for="path">
<strong>Path<br></strong>
</label>
<div class="radioLeft">
<input type="radio" class="formContainer radio" id="path_none" name="ax1_message_path" value="none" <?php if ($ax1_message1_path == "none") echo "checked"; ?>>
<label for="path_none">none</label><br>
<input type="radio" class="formContainer radio" id="path_wide21" name="ax1_message_path" value="WIDE2-1" <?php if ($ax1_message1_path == "WIDE2-1") echo "checked"; ?> >
<label for="path_wide21">WIDE2-1</label><br>
<input type="radio" class="formContainer radio" id="path_wide22" name="ax1_message_path" value="WIDE2-2" <?php if ($ax1_message1_path == "WIDE2-2") echo "checked"; ?> >
<label for="path_wide22">WIDE2-2</label><br>
<input type="radio" class="formContainer radio" id="path_wide33" name="ax1_message_path" value="WIDE3-3" <?php if ($ax1_message1_path == "WIDE3-3") echo "checked"; ?> >
<label for="path_wide33">WIDE3-3</label><br>
</div>
<div id="submit_ax1_message1"><button type="submit" class="btn" onclick="SubmitClicked_ax1_message1()">Submit</button></div>
<div id="submit_done_ax1_message1" style="display:none;"><button type="button" class="btn wait"><img src="images/preload.gif">Please wait...</button></div>
<div id="cancel_ax1_message1"><button type="button" class="btn cancel" onclick="closeForm_ax1_message1()">Cancel</button>
</form>
</div>
</div>
</div>
<div class="loginPopup">
<div class="formPopup" id="popupForm_ax1_message2">
<form action="" class="formContainer" method="post">
<h2>Message <?php echo $ax1_frequency ?></h2>
<label for="email">
<strong>Message</strong>
</label>
<input type="text" id="email" placeholder="Message" name="ax1_message_text" value="<?php echo $ax1_message2_text; ?>" required>
<label for="psw">
<strong>Destination</strong>
</label>
<input type="text" id="email" placeholder="Destination" name="ax1_message_destination" value="<?php echo $ax1_message2_destination; ?>" required>
<label for="path">
<strong>Path<br></strong>
</label>
<div class="radioLeft">
<input type="radio" class="formContainer radio" id="path_none" name="ax1_message_path" value="none" <?php if ($ax1_message2_path == "none") echo "checked"; ?>>
<label for="path_none">none</label><br>
<input type="radio" class="formContainer radio" id="path_wide21" name="ax1_message_path" value="WIDE2-1" <?php if ($ax1_message2_path == "WIDE2-1") echo "checked"; ?> >
<label for="path_wide21">WIDE2-1</label><br>
<input type="radio" class="formContainer radio" id="path_wide22" name="ax1_message_path" value="WIDE2-2" <?php if ($ax1_message2_path == "WIDE2-2") echo "checked"; ?> >
<label for="path_wide22">WIDE2-2</label><br>
<input type="radio" class="formContainer radio" id="path_wide33" name="ax1_message_path" value="WIDE3-3" <?php if ($ax1_message2_path == "WIDE3-3") echo "checked"; ?> >
<label for="path_wide33">WIDE3-3</label><br>
</div>
<div id="submit_ax1"><button type="submit" class="btn" onclick="SubmitClicked_ax1_message2()">Submit</button></div>
<div id="submit_done_ax1" style="display:none;"><button type="button" class="btn wait"><img src="images/preload.gif">Please wait...</button></div>
<div id="cancel_ax1"><button type="button" class="btn cancel" onclick="closeForm_ax1_message2()">Cancel</button>
</form>
</div>
</div>
</div>
<div class="loginPopup">
<div class="formPopup" id="popupForm_ax1_message3">
<form action="" class="formContainer" method="post">
<h2>Message <?php echo $ax1_frequency ?></h2>
<label for="email">
<strong>Message</strong>
</label>
<input type="text" id="email" placeholder="Message" name="ax1_message_text" value="<?php echo $ax1_message3_text; ?>" required>
<label for="psw">
<strong>Destination</strong>
</label>
<input type="text" id="email" placeholder="Destination" name="ax1_message_destination" value="<?php echo $ax1_message3_destination; ?>" required>
<label for="path">
<strong>Path<br></strong>
</label>
<div class="radioLeft">
<input type="radio" class="formContainer radio" id="path_none" name="ax1_message_path" value="none" <?php if ($ax1_message3_path == "none") echo "checked"; ?>>
<label for="path_none">none</label><br>
<input type="radio" class="formContainer radio" id="path_wide21" name="ax1_message_path" value="WIDE2-1" <?php if ($ax1_message3_path == "WIDE2-1") echo "checked"; ?> >
<label for="path_wide21">WIDE2-1</label><br>
<input type="radio" class="formContainer radio" id="path_wide22" name="ax1_message_path" value="WIDE2-2" <?php if ($ax1_message3_path == "WIDE2-2") echo "checked"; ?> >
<label for="path_wide22">WIDE2-2</label><br>
<input type="radio" class="formContainer radio" id="path_wide33" name="ax1_message_path" value="WIDE3-3" <?php if ($ax1_message3_path == "WIDE3-3") echo "checked"; ?> >
<label for="path_wide33">WIDE3-3</label><br>
</div>
<div id="submit_ax1"><button type="submit" class="btn" onclick="SubmitClicked_ax1_message3()">Submit</button></div>
<div id="submit_done_ax1" style="display:none;"><button type="button" class="btn wait"><img src="images/preload.gif">Please wait...</button></div>
<div id="cancel_ax1"><button type="button" class="btn cancel" onclick="closeForm_ax1_message3()">Cancel</button>
</form>
</div>
</div>
</div>
<div class="loginPopup">
<div class="formPopup" id="popupForm_ax1_message4">
<form action="" class="formContainer" method="post">
<h2>Message <?php echo $ax1_frequency ?></h2>
<label for="email">
<strong>Message</strong>
</label>
<input type="text" id="email" placeholder="Message" name="ax1_message_text" value="<?php echo $ax1_message4_text; ?>" required>
<label for="psw">
<strong>Destination</strong>
</label>
<input type="text" id="email" placeholder="Destination" name="ax1_message_destination" value="<?php echo $ax1_message4_destination; ?>" required>
<label for="path">
<strong>Path<br></strong>
</label>
<div class="radioLeft">
<input type="radio" class="formContainer radio" id="path_none" name="ax1_message_path" value="none" <?php if ($ax1_message4_path == "none") echo "checked"; ?>>
<label for="path_none">none</label><br>
<input type="radio" class="formContainer radio" id="path_wide21" name="ax1_message_path" value="WIDE2-1" <?php if ($ax1_message4_path == "WIDE2-1") echo "checked"; ?> >
<label for="path_wide21">WIDE2-1</label><br>
<input type="radio" class="formContainer radio" id="path_wide22" name="ax1_message_path" value="WIDE2-2" <?php if ($ax1_message4_path == "WIDE2-2") echo "checked"; ?> >
<label for="path_wide22">WIDE2-2</label><br>
<input type="radio" class="formContainer radio" id="path_wide33" name="ax1_message_path" value="WIDE3-3" <?php if ($ax1_message4_path == "WIDE3-3") echo "checked"; ?> >
<label for="path_wide33">WIDE3-3</label><br>
</div>
<div id="submit_ax1"><button type="submit" class="btn" onclick="SubmitClicked_ax1_message4()">Submit</button></div>
<div id="submit_done_ax1" style="display:none;"><button type="button" class="btn wait"><img src="images/preload.gif">Please wait...</button></div>
<div id="cancel_ax1"><button type="button" class="btn cancel" onclick="closeForm_ax1_message4()">Cancel</button>
</form>
</div>
</div>
</div>
<div class="footer">
<p>Open source hardware and software. Visit https://www.meezenest.nl/mees for more information.</p>
</div>
<script>
function openForm_ax0_message0() {
document.getElementById("popupForm_ax0_message0").style.display = "block";
}
function closeForm_ax0_message0() {
document.getElementById("popupForm_ax0_message0").style.display = "none";
}
function openForm_ax0_message1() {
document.getElementById("popupForm_ax0_message1").style.display = "block";
}
function closeForm_ax0_message1() {
document.getElementById("popupForm_ax0_message1").style.display = "none";
}
function openForm_ax0_message2() {
document.getElementById("popupForm_ax0_message2").style.display = "block";
}
function closeForm_ax0_message2() {
document.getElementById("popupForm_ax0_message2").style.display = "none";
}
function openForm_ax0_message3() {
document.getElementById("popupForm_ax0_message3").style.display = "block";
}
function closeForm_ax0_message3() {
document.getElementById("popupForm_ax0_message3").style.display = "none";
}
function openForm_ax0_message4() {
document.getElementById("popupForm_ax0_message4").style.display = "block";
}
function closeForm_ax0_message4() {
document.getElementById("popupForm_ax0_message4").style.display = "none";
}
function openForm_ax1_message0() {
document.getElementById("popupForm_ax1_message0").style.display = "block";
}
function closeForm_ax1_message0() {
document.getElementById("popupForm_ax1_message0").style.display = "none";
}
function openForm_ax1_message1() {
document.getElementById("popupForm_ax1_message1").style.display = "block";
}
function closeForm_ax1_message1() {
document.getElementById("popupForm_ax1_message1").style.display = "none";
}
function openForm_ax1_message2() {
document.getElementById("popupForm_ax1_message2").style.display = "block";
}
function closeForm_ax1_message2() {
document.getElementById("popupForm_ax1_message2").style.display = "none";
}
function openForm_ax1_message3() {
document.getElementById("popupForm_ax1_message3").style.display = "block";
}
function closeForm_ax1_message3() {
document.getElementById("popupForm_ax1_message3").style.display = "none";
}
function openForm_ax1_message4() {
document.getElementById("popupForm_ax1_message4").style.display = "block";
}
function closeForm_ax1_message4() {
document.getElementById("popupForm_ax1_message4").style.display = "none";
}
function show_send_messages() {
document.getElementById("main_page").style.display = "none";
document.getElementById("received_messages").style.display = "none";
document.getElementById("send_messages").style.display = "block";
}
function show_received_messages() {
document.getElementById("main_page").style.display = "none";
document.getElementById("received_messages").style.display = "block";
document.getElementById("send_messages").style.display = "none";
}
function show_main_page() {
document.getElementById("main_page").style.display = "block";
document.getElementById("received_messages").style.display = "none";
document.getElementById("send_messages").style.display = "none";
}
/*
Replacing Submit Button with 'Loading' Image
Version 2.0
December 18, 2012
Will Bontrager Software, LLC
https://www.willmaster.com/
Copyright 2012 Will Bontrager Software, LLC
This software is provided "AS IS," without
any warranty of any kind, without even any
implied warranty such as merchantability
or fitness for a particular purpose.
Will Bontrager Software, LLC grants
you a royalty free license to use or
modify this software provided this
notice appears on all copies.
*/
function SubmitClicked_ax1_message0()
{
document.getElementById("submit_ax1_message0").style.display = "none"; // to undisplay
document.getElementById("submit_done_ax1_message0").style.display = "block"; // to display
document.getElementById("cancel_ax1_message0").style.display = "none"; // to display
return true;
}
function SubmitClicked_ax1_message1()
{
document.getElementById("submit_ax1_message1").style.display = "none"; // to undisplay
document.getElementById("submit_done_ax1_message1").style.display = "block"; // to display
document.getElementById("cancel_ax1_message1").style.display = "none"; // to display
return true;
}function SubmitClicked_ax1_message2()
{
document.getElementById("submit_ax1_message2").style.display = "none"; // to undisplay
document.getElementById("submit_done_ax1_message2").style.display = "block"; // to display
document.getElementById("cancel_ax1_message2").style.display = "none"; // to display
return true;
}
function SubmitClicked_ax1_message3()
{
document.getElementById("submit_ax1_message3").style.display = "none"; // to undisplay
document.getElementById("submit_done_ax1_message3").style.display = "block"; // to display
document.getElementById("cancel_ax1_message3").style.display = "none"; // to display
return true;
}
function SubmitClicked_ax1_message4()
{
document.getElementById("submit_ax1_message4").style.display = "none"; // to undisplay
document.getElementById("submit_done_ax1_message4").style.display = "block"; // to display
document.getElementById("cancel_ax1_message4").style.display = "none"; // to display
return true;
}
function SubmitClicked_ax0_message0()
{
document.getElementById("submit_ax0_message0").style.display = "none"; // to undisplay
document.getElementById("submit_done_ax0_message0").style.display = "block"; // to display
document.getElementById("cancel_ax0_message0").style.display = "none"; // to display
return true;
}
function SubmitClicked_ax0_message1()
{
document.getElementById("submit_ax0_message1").style.display = "none"; // to undisplay
document.getElementById("submit_done_ax0_message1").style.display = "block"; // to display
document.getElementById("cancel_ax0_message1").style.display = "none"; // to display
return true;
}
function SubmitClicked_ax0_message2()
{
document.getElementById("submit_ax0_message2").style.display = "none"; // to undisplay
document.getElementById("submit_done_ax0_message2").style.display = "block"; // to display
document.getElementById("cancel_ax0_message2").style.display = "none"; // to display
return true;
}
function SubmitClicked_ax0_message3()
{
document.getElementById("submit_ax0_message3").style.display = "none"; // to undisplay
document.getElementById("submit_done_ax0_message3").style.display = "block"; // to display
document.getElementById("cancel_ax0_message3").style.display = "none"; // to display
return true;
}
function SubmitClicked_ax0_message4()
{
document.getElementById("submit_ax0_message4").style.display = "none"; // to undisplay
document.getElementById("submit_done_ax0_message4").style.display = "block"; // to display
document.getElementById("cancel_ax0_message4").style.display = "none"; // to display
return true;
}
</script>
</body>
</html>

@ -0,0 +1,72 @@
<!DOCTYPE html>
<html>
<head>
<title>PE1RXF APRS server</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="refresh" content="600">
<link rel="stylesheet" href="css/styles.css">
<link rel="stylesheet" href="css/popup.css">
<link rel="stylesheet" href="css/font-awesome.min.css">
</head>
<body>
<?php
#Data format:
#0,1,2,3,4,5,6,7,8,9
# 0 = temperature outside
# 1 = humidity outside
# 2 = temperature small greenhouse
# 3 = humidity small greenhouse
# 4 = soil moisture small greenhouse
# 5 = soil moisture small greenhouse
# 6 = temperature large greenhouse
# 7 = humidity large greenhouse
# 8 = soil moisture large greenhouse
# 9 = soil moisture large greenhouse
$telemetry_data = array_map('str_getcsv', file("/home/marcel/ham/aprs_utils/aprs_log/latest_telemetry_PE1RXF-7.dat"));
?>
<div class="header">
<a href="index.php" >
<h1><i class="fa fa-home" aria-hidden="true"></i>&nbsp; PE1RXF APRS TELEMETRY</h1>
</a>
</div>
<div class="row">
<div class="col-3 col-s-3 menu">
<ul>
<li><h3>Temperature buiten: <?php echo $telemetry_data[0][0] ?>&deg; C</h3></li>
<li><h3>Temperature kleine kas: <?php echo $telemetry_data[0][2] ?>&deg; C</h3></li>
<li><h3>Temperature grote kas: <?php echo $telemetry_data[0][6] ?>&deg; C</h3></li>
</ul>
</div>
<div class="col-6 col-s-9" id="main_page">
<img src="telemetry/temperature_graph.png" class="large"/></a>
<img src="telemetry/humidity_graph.png" class="large"/></a>
<img src="telemetry/minmax_temperature_outside.png" class="large"/></a>
<img src="telemetry/minmax_temperature_small_greenhouse.png" class="large"/></a>
<img src="telemetry/minmax_temperature_large_greenhouse.png" class="large"/></a>
<img src="telemetry/minmax_humidity_outside.png" class="large"/></a>
<img src="telemetry/minmax_humidity_small_greenhouse.png" class="large"/></a>
<img src="telemetry/minmax_humidity_large_greenhouse.png" class="large"/></a>
</div>
<div class="col-3 col-s-12 menu">
<ul>
<li><h3>Luchtvochtigheid buiten: <?php echo $telemetry_data[0][1] ?> %</h3></li>
<li><h3>Luchtvochtigheid kleine kas: <?php echo $telemetry_data[0][3] ?> %</h3></li>
<li><h3>Luchtvochtigheid grote kas: <?php echo $telemetry_data[0][7] ?> %</h3></li>
</ul>
</div>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Loading…
Cancel
Save