diff --git a/build_release b/build_release index 4d6d412..1f4df74 100755 --- a/build_release +++ b/build_release @@ -19,8 +19,7 @@ node-sass --output css scss/main.scss cd .. # copy additional folders -cp tracks.json release/v$1/tracks.json -cp cars.json release/v$1/cars.json +cp -r config release/v$1/config cp -r db release/v$1/db cp README.md release/v$1/README.md cp LICENSE release/v$1/LICENSE diff --git a/release/v1.1.0/CHANGELOG.md b/release/v1.1.0/CHANGELOG.md new file mode 100644 index 0000000..b28f634 --- /dev/null +++ b/release/v1.1.0/CHANGELOG.md @@ -0,0 +1,32 @@ +# Changelog + +## 1.0.4 + +* fixed: some default config values +* fixed: missing system and content directories for checksum calculation +* added changing dynamic track conditions +* added wind parameters +* added pitstop window configuration +* added fixed setups +* added ability to download configuration files of configurations and running instances +* added automatic calculation of sun angle +* added better logging and log level configuration + +Note that you have to update the database schema. A migration script can be found within the db/ directory. + +## 1.0.3 + +Now providing a docker image! Configuration is now done via environment variables, see README.md for details. + +## 1.0.2 + +* fixed: added missing columns to schema.sql + +## 1.0.1 + +* added cars from red pack +* added windows 64 bit build + +## 1.0.0 + +* initial release diff --git a/release/v1.1.0/LICENSE b/release/v1.1.0/LICENSE new file mode 100644 index 0000000..ae1a182 --- /dev/null +++ b/release/v1.1.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Marvin Blum + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/release/v1.1.0/README.md b/release/v1.1.0/README.md new file mode 100644 index 0000000..3ef512b --- /dev/null +++ b/release/v1.1.0/README.md @@ -0,0 +1,166 @@ +![AC](aclogo.png) + +# Assetto Corsa server web interface + +This tool provides monitoring and management for your Assetto Corsa server instances. You can create multiple configuration profiles, start/stop server instances and watch the status of them. + +**Screenshots at the bottom of this page!** + +## Install + +Note that the scripts within the main directory are not used to start or install the server. They're for development only and not shipped with the release. Download releases from the [GitHub release page](https://github.com/DeKugelschieber/acweb/releases) instead of the release/ directory. If you find any issues installing the server or bugs, please open an issue in the issue section on GitHub. +These instructions do not provide information on how to install the Assetto Corsa server itself. On Linux, you basically install steam, login to your account and download **the Windows version** of the game, which also includes the Linux server. + +### Install using Docker + +The easiest way to install acweb is to use [Docker](https://hub.docker.com/r/kugel/acweb/): + +1. install Docker on your (Linux) server +2. pull the latest release: + +``` +docker pull kugel/acweb +``` + +3. install MySQL on your server or use a docker image +4. create the database schema (db/schema.sql + all migration scripts in appropriate order) and create the first user: + +``` +INSERT INTO `user` (`id`, `login`, `email`, `password`, `admin`, `moderator`) VALUES (NULL, 'username', 'user@email.com', 'SHA256_HASH', '1', '0'); +``` + +Note that the user password must be a SHA256 hash. You can find tools online to create one from a clear password. + +5. start the Docker container (adjust the parameters to your needs): + +``` +# expose the same port you start the server on: -p PORT:${ACWEB_HOST} +sudo docker run -d -p 80:8080 --name acweb \ + -e ACWEB_DB_USER=root \ + -e ACWEB_DB_PASSWORD=password \ + -e ACWEB_DB_HOST="tcp(127.0.0.1:3306)" \ + -e ACWEB_DB=acweb \ + -v /ac/install/path:/ac \ + -v /log/dir/path:/logs \ + kugel/acweb + +# make sure its running +sudo docker ps acweb +``` + +This will use a MySQL database installed on your host machine. To use a MySQL database running in a container, please rever to the official [MySQL image](https://hub.docker.com/_/mysql/). You have to use Dockers --link option to access it, if you don't expose the MySQL port. +To start the server, you can also use a [docker-compose file](https://docs.docker.com/compose/). I recommend to enable SSL using [letsencrypt](https://letsencrypt.org/) and a reverse proxy. +To run server instances, you need to mount the Assetto Corsa installation directory (containing the binary) to /ac. In the UI set the execution path (Settings -> AC server folder) to /ac. To save the instance logs outside the Docker container, you can mount /instance_logs. + +### Manual installation + +This instruction supposes you to use Linux. On Windows you basically need to perform the same steps. You need a MySQL database and rights to upload and execute applications. I recommend to create a user for your web interface installation. + +1. download the latest release of acweb +2. upload it to your server and unzip it +3. create the database schema (db/schema.sql + all migration scripts in appropriate order) and create the first user: + +``` +INSERT INTO `user` (`id`, `login`, `email`, `password`, `admin`, `moderator`) VALUES (NULL, 'username', 'user@email.com', 'SHA256_HASH', '1', '0'); +``` + +Note that the user password must be a SHA256 hash. You can find tools online to create one from a clear password. + +4. set the environment variables to configure your server: + +``` +# acweb host, to make it accessible from the outside use 0.0.0.0:PORT +export ACWEB_HOST=localhost:8080 +# optional log file location (will be created if it doesn't exist) +export ACWEB_LOGDIR= +# optional log level (debug, info or empty for warnings and higher) +export ACWEB_LOGLEVEL=info +# log directory for server instances, must be set +export ACWEB_INSTANCE_LOGDIR=instance_logs +# config file directory for tracks.json and cars.json +export ACWEB_CONFIG_DIR= +# path to TLS private key file +export ACWEB_TLS_PRIVATE_KEY= +# path to TLS cert file +export ACWEB_TLS_CERT= +# database user +export ACWEB_DB_USER=root +# database password +export ACWEB_DB_PASSWORD= +# database host (most likely tcp(localhost:3306)) +export ACWEB_DB_HOST= +# database name: +export ACWEB_DB=acweb +``` + +5. start it ./acweb +6. you can now visit your web interface + +## Updating + +1. download the latest release +2. upload it to your server and unzip it +3. update your MySQL database (migration scripts can be found in db/mig_FROMVERSION_TOVERSION.sql) +4. start it + +For Docker pull the latest release, execute the migration script(s) and start it. + +## Adding tracks and cars + +To add tracks and cars, from a mod for instance, you must add them to the cars.json and tracks.json configuration files to make them appear in the web interface: + +``` +[ + // a track + { + "name": "NAME", + "config": "CONFIG_TRACK", + "description": "Name", + "max_slots": NUMBER_OF_SLOTS + }, + // ... +``` + +``` +[ + // a car + { + "name": "CAR_NAME", + "description": "Car Name", + "paintings": [ + "SKIN_0", + "SKIN_1", + // ... + ] + }, + // ... +``` + +The files can be found within the config directory. To modify them using Docker, mount a volume to /config and copy the original files into it, then modify them. + +## Contribute + +To contribute please open issues and pull requests. The frontend is build using VueJs, [minvue](https://github.com/DeKugelschieber/vuejs-minify) and sass. The backend is build on Go (golang) and MySQL. For details please view the provided scripts within the main directory. + +### Contributors (alphabetical) + +macedot, vinyii + +## Links + +* [Docker Hub](https://hub.docker.com/r/kugel/acweb/) +* [Assetto Corsa Forums](http://www.assettocorsa.net/forum/index.php?threads/ac-server-web-interface.44582) +* [Spieleprogrammierer.de](https://www.spieleprogrammierer.de/12-projektvorstellungen-und-stellenangebote/26396-tool-assetto-corsa-server-web-interface/?highlight=) + +## License + +MIT + +## Screenshots + +![Screenshot 1](screenshots/screen1.png) +![Screenshot 2](screenshots/screen2.png) +![Screenshot 3](screenshots/screen3.png) +![Screenshot 4](screenshots/screen4.png) +![Screenshot 5](screenshots/screen5.png) +![Screenshot 6](screenshots/screen6.png) diff --git a/release/v1.1.0/acweb b/release/v1.1.0/acweb new file mode 100755 index 0000000..13193d8 Binary files /dev/null and b/release/v1.1.0/acweb differ diff --git a/release/v1.1.0/config/cars.json b/release/v1.1.0/config/cars.json new file mode 100755 index 0000000..6eb9e12 --- /dev/null +++ b/release/v1.1.0/config/cars.json @@ -0,0 +1,2753 @@ +[ + { + "name": "abarth500", + "description": "Abarth 500 EsseEsse", + "paintings": [ + "0_white_scorpion", + "black_red", + "grey_white", + "light_blue", + "light_blue_scorpion", + "pearl", + "pearl_scorpion", + "red_scorpion", + "red_white", + "white" + ] + }, + { + "name": "abarth500_s1", + "description": "Abarth 500 EsseEsse Step1", + "paintings": [ + "black_neon", + "dark_blue_blue", + "dark_green_yellow", + "light_blue_orange", + "maroon_white", + "orange_grey", + "red_yellow", + "silver_red", + "white_grey", + "yellow_orange" + ] + }, + { + "name": "alfa_romeo_giulietta_qv", + "description": "Giulietta QV", + "paintings": [ + "0_rosso_alfa", + "Argento_Alfa", + "Bianco_Ghiaccio", + "Blu_Anodizzato", + "Bronzo", + "Grigio_Antracite", + "Grigio_Magnesio", + "Nero", + "Nero_Etna", + "Perla_Moonlight", + "Rosso_Competizione" + ] + }, + { + "name": "alfa_romeo_giulietta_qv_le", + "description": "Giulietta QV Launch Edition 2014", + "paintings": [ + "0_rosso_alfa", + "Argento_Alfa", + "Bianco_Ghiaccio", + "Blu_Anodizzato", + "Bronzo", + "Grigio_Antracite", + "Grigio_Magnesio", + "Nero", + "Nero_Etna", + "Perla_Moonlight", + "Rosso_Competizione" + ] + }, + { + "name": "bmw_1m", + "description": "BMW 1M", + "paintings": [ + "0_orange", + "black_sapphire", + "crimson_red", + "deep_sea_blue", + "glacier_silver", + "grey", + "liquid_blue", + "midnight_blue", + "mineral_grey", + "red", + "sparkling_bronze", + "valencia_orange", + "white", + "zaphir" + ] + }, + { + "name": "bmw_1m_s3", + "description": "BMW 1M Stage 3", + "paintings": [ + "ArisTek_5", + "BMW_Bank_22", + "BMW_Motorsport_black_88", + "BMW_Motorsport_white_99", + "BMW_motorsport_07", + "Green_Motorsport_45", + "Inferno_64", + "Just_Mareo_14", + "Kunos_Racing_2", + "Midnight_Boss", + "Street_Racer", + "Taurus_3D_17", + "Yashugan_DGFX_Art_4", + "black_sapphire_02", + "black_sapphire_03", + "bmw_20", + "crimson_red_04", + "deep_sea_blue_08", + "dgfx_11", + "glacier_silver_09", + "grey_05", + "liquid_blue_10", + "midnight_blue_12", + "mineral_grey_13", + "red_01", + "sparkling_bronze_17", + "staiger_15", + "valencia_orange_18", + "white_14", + "zaphir_19" + ] + }, + { + "name": "bmw_m3_e30", + "description": "BMW M3 E30", + "paintings": [ + "0_jet_black", + "Brilliant_red", + "Cinnabar_red", + "Henna_Red", + "Macau_Blue_Metallic", + "Misano_red", + "Nogaro_Silver_metallic", + "Salmon_Silver_metallic", + "Sterling_Silver_metallic", + "alpine_white", + "diamond_black_metallic" + ] + }, + { + "name": "bmw_m3_e30_drift", + "description": "BMW M3 E30 Drift", + "paintings": [ + "DGFX_Vinyl", + "Falken", + "JTC_Drift", + "Nitto_Red", + "Nitto_White" + ] + }, + { + "name": "bmw_m3_e30_dtm", + "description": "BMW M3 E30 Gr.A 92", + "paintings": [ + "0_fina_7", + "LUK", + "black", + "bmw" + ] + }, + { + "name": "bmw_m3_e30_gra", + "description": "BMW M3 E30 Group A", + "paintings": [ + "0_Sterling_Silver_metallic", + "Brilliant_red", + "Cinnabar_red", + "Henna_Red", + "Jet_Black", + "Macau_Blue_Metallic", + "Misano_red", + "Nogaro_Silver_metallic", + "Salmon_Silver_metallic", + "alpine_white", + "diamond_black_metallic" + ] + }, + { + "name": "bmw_m3_e30_s1", + "description": "BMW M3 E30 Step1", + "paintings": [ + "2_Tone_White_Red", + "Burnt_Orange", + "Diamond_Black_metallic", + "Germany", + "Nogaro_Silver_metallic", + "Sterling_Silver_metallic", + "Street_2", + "Street_Racer", + "alpine_white" + ] + }, + { + "name": "bmw_m3_e92", + "description": "BMW M3 E92", + "paintings": [ + "0_monte_carlo_blue", + "Atlantis_metallic", + "Azurite_Black", + "Barbera_Red", + "Black_Sapphire_metallic", + "Brilliant_White", + "Dakar_Yellow", + "Frozen_Black", + "Hellrot", + "Laguna_Seca_Blue", + "Marrakesh_Brown", + "Midnight_Blue", + "Moonstone", + "Orange", + "Phoenix_Yellow", + "Power_Green", + "Red", + "Santorini_Blue", + "Titanium_Silver" + ] + }, + { + "name": "bmw_m3_e92_drift", + "description": "BMW M3 E92 drift", + "paintings": [ + "BMW_Academy", + "Falken", + "GSR", + "Hankook", + "Koni_7", + "Monster_Falken", + "Rockstar", + "drivemotive" + ] + }, + { + "name": "bmw_m3_e92_s1", + "description": "BMW M3 E92 Step1", + "paintings": [ + "0_monte_carlo_blue", + "Atlantis_metallic", + "Barbera_Red", + "Black_Sapphire_metallic", + "Dakar_Yellow", + "Frozen_Black", + "Hellrot", + "Moonstone", + "Nvidia", + "Orange", + "Phoenix_Yellow", + "Power_Green", + "Red", + "Titanium_Silver", + "basic", + "drivemotive" + ] + }, + { + "name": "bmw_m3_gt2", + "description": "BMW M3 GT2", + "paintings": [ + "0_BMW_Motorsport", + "ADVAN", + "DSD", + "Digigrafet", + "Endless", + "Falken", + "Ozoshi", + "kunos_racing", + "kunos_racing_80", + "kunos_racing_81" + ] + }, + { + "name": "bmw_z4", + "description": "BMW Z4 E89", + "paintings": [ + "0_space_grey_metal", + "alpine_white", + "atacama_yellow", + "black_sapphire_metal", + "crimson_red", + "deep_sea_blue_metal", + "jet_black", + "melbourne_red_metal", + "mineral_white_metal", + "orion_silver_metal", + "titamium_silver_metal" + ] + }, + { + "name": "bmw_z4_drift", + "description": "BMW Z4 E89 Drift", + "paintings": [ + "Falken", + "drift_418", + "drift_419", + "ksart_17", + "ksart_18" + ] + }, + { + "name": "bmw_z4_gt3", + "description": "BMW Z4 GT3", + "paintings": [ + "0_bmw_motorsport_2013_black", + "TCR_2014_097", + "TCR_2014_903", + "Vita4one", + "assetto_z", + "bmw_motorsport_2012", + "bmw_motorsport_2013_white", + "fanatec", + "marc_vds_2013", + "scuderia_ecosse", + "walkenhorst_motorsport", + "xdrive_20_z" + ] + }, + { + "name": "bmw_z4_s1", + "description": "BMW Z4 E89 Step1", + "paintings": [ + "0_red", + "black", + "black_matte", + "blue", + "ksart_black", + "ksart_orange", + "ksart_white", + "white" + ] + }, + { + "name": "ferrari_312t", + "description": "Ferrari 312T", + "paintings": [ + "00_racing_12", + "01_ita_11", + "02_ita_1", + "03_racing_2", + "04_racing_4", + "05_racing_5", + "06_racing_6", + "07_racing_3" + ] + }, + { + "name": "ferrari_458", + "description": "Ferrari 458 Italia", + "paintings": [ + "00_rosso_scuderia", + "01_rosso_scuderia_dark_top", + "02_giallo_modena", + "03_blupozzi", + "04_grigio_scuro", + "05_giallo_modena_dark_top", + "06_avorio", + "07_rosso_corsa", + "08_rosso_mugello", + "09_bianco_avus" + ] + }, + { + "name": "ferrari_458_gt2", + "description": "Ferrari 458 GT2", + "paintings": [ + "00_red", + "2011_Team_Sofrev_ASP_20", + "2014_Team_Sofrev_ASP_GTE_58", + "AF_Corse_WEC_2014_71", + "af_corse_51", + "black_38", + "black_matte", + "kessel1_52", + "kunos_14", + "rosso_corsa", + "white", + "yellow" + ] + }, + { + "name": "ferrari_458_s3", + "description": "Ferrari 458 Italia Stage 3", + "paintings": [ + "00_rosso_scuderia", + "01_rosso_scuderia_dark_top", + "02_giallo_modena", + "03_blupozzi", + "04_grigio_scuro", + "05_giallo_modena_dark_top", + "06_avorio", + "07_rosso_corsa", + "08_rosso_mugello", + "09_bianco_avus" + ] + }, + { + "name": "ferrari_599xxevo", + "description": "Ferrari 599XX EVO", + "paintings": [ + "1", + "2", + "24", + "25", + "27", + "4", + "40", + "97" + ] + }, + { + "name": "ferrari_f40", + "description": "Ferrari F40", + "paintings": [ + "01_red" + ] + }, + { + "name": "ferrari_f40_s3", + "description": "Ferrari F40 Stage 3", + "paintings": [ + "01_yellow", + "02_black", + "03_red", + "04_blue", + "05_grey", + "06_white" + ] + }, + { + "name": "ferrari_laferrari", + "description": "Ferrari LaFerrari", + "paintings": [ + "00_rosso_scuderia", + "01_giallo_modena", + "02_rosso_corsa_r", + "04_grigio_scuro", + "05_blupozzi_r", + "06_bianco_avus", + "07_avorio_r", + "08_rosso_mugello", + "09_rosso_scuderia_r", + "10_giallo_modena_r", + "11_rosso_corsa", + "12_grigio_scuro_r", + "13_blupozzi", + "14_bianco_avus_r", + "15_avorio", + "16_rosso_mugello_r" + ] + }, + { + "name": "ks_abarth500_assetto_corse", + "description": "Abarth 500 Assetto Corse", + "paintings": [ + "0_official", + "black_neon", + "dark_blue", + "dark_green_yellow", + "light_blue_orange", + "maroon_white", + "orange_grey", + "racing_500", + "racing_501", + "racing_502", + "red_yellow", + "silver_red", + "white_grey", + "yellow_orange", + "ze_507", + "ze_508", + "ze_509" + ] + }, + { + "name": "ks_abarth_595ss", + "description": "Abarth 595 SS", + "paintings": [ + "1_official", + "2_official", + "avorio_antico", + "azzurro_acquamarina", + "beige_sabbia", + "bianco", + "blu_oriente", + "blue_medio", + "blue_scuro", + "grigio_garda", + "grigio_medio", + "rosso_corallo", + "rosso_corallo_scuro", + "rosso_medio" + ] + }, + { + "name": "ks_abarth_595ss_s1", + "description": "Abarth 595 SS Step 1", + "paintings": [ + "3_official", + "black", + "blue", + "campione", + "checkered", + "orange", + "red", + "yellow" + ] + }, + { + "name": "ks_abarth_595ss_s2", + "description": "Abarth 595 SS Step 2", + "paintings": [ + "4_official", + "black", + "blue", + "orange", + "red", + "yellow" + ] + }, + { + "name": "ks_alfa_mito_qv", + "description": "Alfa Romeo Mito QV", + "paintings": [ + "0_rosso_alfa", + "Biancospino", + "Blu_Tornado", + "Grigio_Grafite", + "Grigio_Techno", + "Nero", + "Nero_Etna", + "Rosso" + ] + }, + { + "name": "ks_alfa_romeo_155_v6", + "description": "Alfa Romeo 155 TI V6", + "paintings": [ + "0_racing_8", + "basic", + "racing_18", + "racing_19", + "racing_21", + "racing_5", + "racing_6", + "racing_7", + "racing_9", + "racing_91" + ] + }, + { + "name": "ks_alfa_romeo_4c", + "description": "Alfa Romeo 4C", + "paintings": [ + "0_rosso_alfa", + "bianco", + "bianco_black_rims", + "bianco_madreperla", + "bianco_madreperla_black_rims", + "grigio_basalto", + "grigio_basalto_black_rims", + "nero", + "nero_black_rims", + "orange_satin", + "orange_satin_black_rims", + "red", + "red_black_rims", + "red_black_rims_pastel", + "red_pastel", + "rosso_alfa_black_rims", + "rosso_alfa_black_rims_pastel", + "rosso_alfa_pastel" + ] + }, + { + "name": "ks_alfa_romeo_gta", + "description": "Alfa Romeo GTA", + "paintings": [ + "0_rosso_alfa", + "101_williams", + "10_marte", + "12_martocci", + "159_lugo", + "22_lavezzi", + "262_carrera", + "2_porzio", + "3_lemont", + "41_barthez", + "42_cardinali", + "46_jackermeier", + "4_marquez", + "55_coneja", + "61_perez", + "71_yoshida", + "72_johnson", + "84_lasarthe", + "91_raucci", + "96_colado", + "99_willis", + "black", + "cerulean", + "corn_yellow", + "dark_brown", + "dark_cerulean", + "dark_tangerine", + "denim", + "dim_gray", + "dodger_blue", + "fractal", + "golden_rod", + "monza_red", + "real_red", + "sangria_red" + ] + }, + { + "name": "ks_audi_a1s1", + "description": "Audi S1", + "paintings": [ + "00_sepang_blue_pearl_effect_br", + "01_vegas_yellow_br", + "02_misano_red_pearl_br", + "03_floret_silver_metallic_gr", + "03_scuba_blue_metallic_br", + "04_floret_silver_metallic_br", + "05_daytona_grey_pearl_br", + "06_glacier_white_metallic_br", + "07_nano_grey_metallic_gr", + "09_misano_red_pearl_gr", + "10_mythos_black_metallic_br", + "11_mythos_black_metallic_gr", + "12_nano_grey_metallic_br", + "13_glacier_white_metallic_gr", + "14_daytona_grey_pearl_gr", + "15_scuba_blue_metallic_gr", + "16_sepang_blue_pearl_effect_gr", + "17_vegas_yellow_gr", + "18_brilliant_black_br" + ] + }, + { + "name": "ks_audi_r8_lms", + "description": "Audi R8 LMS Ultra", + "paintings": [ + "2014_Hankook_C_Abt_09", + "2014_Hankook_C_Abt_10", + "2015_C_Abt_Racing_1", + "2015_C_Abt_Racing_2", + "2015_C_Abt_Racing_3", + "2015_WRT_1", + "2015_WRT_2", + "2015_WRT_3", + "audi_sport", + "factory_grey", + "factory_matte", + "factory_white" + ] + }, + { + "name": "ks_audi_r8_plus", + "description": "Audi R8 V10 Plus", + "paintings": [ + "00_brilliant_red_t", + "01_sepang_blue_matte_t", + "03_daytona_gray_pearl", + "04_estoril_blue_crystal", + "05_ibis_white_t", + "06_ice_silver_metallic", + "07_panther_black_crystal_t", + "08_phantom_black_pearl", + "09_samoa_orange_metallic_t", + "10_sepang_blue_pearl", + "11_suzuka_gray_metallic_t", + "12_teak_brown_metallic", + "Brilliant_Red", + "Ibis_White", + "Panther_Black_Crystal", + "Samoa_Orange_Metallic", + "Sepang_Blue_Matte", + "Suzuka_Gray_Metallic", + "daytona_gray_pearl_t", + "estoril_blue_crystal_t", + "ice_silver_metallic_t", + "phantom_black_pearl_t", + "sepang_blue_pearl_t", + "teak_brown_metallic_t" + ] + }, + { + "name": "ks_audi_sport_quattro", + "description": "Audi Sport quattro", + "paintings": [ + "00_tornado_red_rings", + "01_alpine_white", + "02_black", + "03_copenhagen_blue_rings", + "04_malachite_green", + "05_tornado_red", + "06_alpine_white_rings", + "07_copenhagen_blue", + "08_malachite_green_rings" + ] + }, + { + "name": "ks_audi_sport_quattro_rally", + "description": "Audi Sport quattro S1 E2", + "paintings": [ + "00_racing_2", + "01_roc_4", + "02_sanremo_5", + "03_racing_1", + "04_montecarlo_6" + ] + }, + { + "name": "ks_audi_sport_quattro_s1", + "description": "Audi Sport quattro Step1", + "paintings": [ + "00_copenhagen_blue_rings", + "01_alpine_white", + "02_black", + "03_tornado_red_rings", + "04_malachite_green", + "05_tornado_red", + "06_alpine_white_rings", + "07_copenhagen_blue", + "08_malachite_green_rings" + ] + }, + { + "name": "ks_bmw_m235i_racing", + "description": "BMW M235i Racing", + "paintings": [ + "00_racing_1", + "00_racing_171", + "racing_1", + "racing_2", + "racing_233", + "racing_235", + "racing_310", + "racing_44", + "racing_669", + "racing_71", + "racing_903", + "racing_909" + ] + }, + { + "name": "ks_bmw_m4", + "description": "BMW M4", + "paintings": [ + "0_austin_yellow_metallic", + "alpinweiss_iii_pastel", + "azuritschwarz_metallic", + "champagne_metallic", + "m_black_stripe", + "m_white_stripe", + "m_white_stripe_2", + "mineral_grau_metallic", + "mineral_white_metallic", + "sakhir_orange", + "saphirschwarz_metallic", + "silverstone_ii_metallic", + "smocked_topaz", + "tananit_blue_metallic", + "yas_marina_blue_metallic" + ] + }, + { + "name": "ks_bmw_m4_akrapovic", + "description": "BMW M4 Akrapovic", + "paintings": [ + "0_akrapovic", + "AH_Exclusive", + "Blackbox", + "akrapovic_m", + "alpinweiss_iii_pastel", + "austin_yellow_metallic", + "azuritschwarz_metallic", + "champagne_metallic", + "mineral_grau_metallic", + "mineral_white_metallic", + "sakhir_orange", + "saphirschwarz_metallic", + "silverstone_ii_metallic", + "smocked_topaz", + "tananit_blue_metallic", + "yas_marina_blue_metallic" + ] + }, + { + "name": "ks_corvette_c7_stingray", + "description": "Chevrolet Corvette C7 Stingray", + "paintings": [ + "00_velocity_yellow", + "01_torch_red", + "02_black_s", + "03_laguna_blue_sw", + "04_blade_silver_met_s", + "05_cyber_grey_s", + "06_lime_rock_green", + "07_night_race_blue_met_s", + "08_arctic_white_sr", + "Arctic_White_S", + "Arctic_White_SB", + "Black", + "Black_SG", + "Blade_Silver_Met", + "Crystal_Red", + "Cyber_Grey", + "Laguna_Blue", + "Laguna_Blue_SB", + "Lime_Rock_Green_S", + "Night_Race_Blue_Met", + "Torch_Red_SB", + "Torch_Red_SW", + "Velocity_Yellow_SB", + "Velocity_Yellow_SG", + "x_pacecar" + ] + }, + { + "name": "ks_corvette_c7r", + "description": "Chevrolet Corvette C7R", + "paintings": [ + "0_racing_3", + "101", + "12", + "15", + "22", + "23", + "25", + "26", + "4", + "40", + "41", + "42", + "46", + "55", + "63", + "64", + "72", + "racing_00" + ] + }, + { + "name": "ks_ferrari_488_gt3", + "description": "Ferrari 488 GT3", + "paintings": [ + "00_rosso_scuderia", + "01_racing_483", + "02_racing_487", + "03_racing_480", + "04_racing_500", + "05_racing_502", + "06_racing_489", + "07_racing_501", + "08_racing_490", + "09_racing_491", + "10_racing_492", + "11_racing_493", + "12_racing_494", + "13_racing_495", + "14_racing_496", + "15_racing_497", + "16_racing_498", + "17_racing_499", + "18_racing_503", + "19_racing_504", + "20_racing_505" + ] + }, + { + "name": "ks_ferrari_488_gtb", + "description": "Ferrari 488 GTB", + "paintings": [ + "00_rosso_scuderia", + "01_rosso_corsa_b", + "02_rosso_mugello", + "03_nero_pastello", + "04_giallo_modena_b", + "05_avorio", + "06_bianco_avus_b", + "07_blu_abu_dhabi", + "08_grigio_ferro_b", + "avorio_b", + "bianco_avus", + "blu_abu_dhabi_b", + "giallo_modena", + "grigio_ferro", + "rosso_corsa", + "rosso_mugello_b", + "rosso_scuderia_b" + ] + }, + { + "name": "ks_ferrari_f138", + "description": "Ferrari F138", + "paintings": [ + "00_official", + "01_ferrari_3", + "02_ferrari_4" + ] + }, + { + "name": "ks_ferrari_fxx_k", + "description": "Ferrari FXX K", + "paintings": [ + "01_rosso_ferrari_10", + "02_giallo_ferrari_15", + "02_red_yellow_13", + "03_black_yellow_44", + "04_blu_white_27", + "05_rosso_ferrari_69", + "06_red_silver_52", + "07_white_red_47" + ] + }, + { + "name": "ks_ferrari_sf15t", + "description": "Ferrari SF15-T", + "paintings": [ + "00_default", + "01_ferrari_5", + "02_ferrari_7" + ] + }, + { + "name": "ks_ford_escort_mk1", + "description": "Ford Escort RS1600", + "paintings": [ + "blue_white", + "classic_1", + "classic_112", + "classic_2", + "classic_34", + "classic_85", + "classic_zakspeed_25", + "grey_black", + "light_blue", + "lime_black", + "mexico_beige", + "mexico_black", + "mexico_copper", + "mexico_green", + "mexico_silver", + "orange_black", + "red_white", + "white_blue", + "yellow_black" + ] + }, + { + "name": "ks_ford_gt40", + "description": "Ford GT40", + "paintings": [ + "0_blue_stripes", + "15", + "19", + "29", + "beige", + "green", + "grey", + "orange", + "racing_6", + "racing_7", + "racing_9", + "racing_dark", + "racing_mcqueen", + "red", + "scuderia", + "white", + "yellow_stripes" + ] + }, + { + "name": "ks_ford_mustang_2015", + "description": "Ford Mustang 2015", + "paintings": [ + "00_deep_impact_blue_metallic_s", + "01_black", + "02_triple_yellow_tricoat_s2", + "03_deep_impact_blue_metallic", + "04_ingot_silver_metallic", + "05_competition_orange_s", + "06_oxford_white", + "07_race_red_s", + "08_guard_metallic", + "09_ruby_red_metallic_s", + "10_triple_yellow_tricoat", + "11_race_red", + "12_magnetic_metallic", + "13_black_s", + "14_competition_orange", + "15_oxford_white_s", + "16_ingot_silver_metallic_s", + "17_ruby_red_metallic", + "18_guard_metallic_s2", + "19_magnetic_metallic_s2" + ] + }, + { + "name": "ks_glickenhaus_scg003", + "description": "SCG 003C", + "paintings": [ + "0_mimetic", + "macchina1", + "macchina2" + ] + }, + { + "name": "ks_lamborghini_aventador_sv", + "description": "Lamborghini Aventador SV", + "paintings": [ + "00_rosso_bia_glittered", + "01_giallo_evros_solid", + "02_arancio_argos_pearl", + "03_azzurro_thetys_metal", + "04_verde_ithaca_pearl", + "05_nero_pegaso_metal", + "06_verde_ermes_metal", + "07_oro_elios_metal", + "08_rosso_mars_metallic", + "09_grigio_thalasso_metal", + "10_giallo_horus_matt", + "11_blue_cepheus_pearl", + "12_grigio_telesto_pearl", + "13_arancio_atlas_pearl", + "14_blu_fontus_metal", + "15_grigio_estoque_metal", + "16_marrone_apus_matt", + "17_nero_nemesis_matt", + "18_bianco_isis", + "19_grigio_titans_matt", + "20_grigio_lynx_metal", + "21_new_giallo_orion_pearl", + "22_giallo_tenerife_pearl", + "23_blu_sideris_glittered", + "24_blu_nethus_metal", + "25_blu_caelum_metal", + "26_bianco_canopus_matt", + "27_blu_glauco_solid", + "28_balloon_white_pearl", + "29_blu_hera_metal", + "30_grigio_antares_metal", + "31_nero_aldebaran_solid", + "32_rosso_efesto_metal", + "33_verde_scandal_solid" + ] + }, + { + "name": "ks_lamborghini_countach", + "description": "Lamborghini Countach", + "paintings": [ + "0_oro_sahara_metal", + "WalterWolf_black", + "WalterWolf_blue", + "WalterWolf_green", + "WalterWolf_red", + "argento_luna_metal", + "bianco_polo_park", + "blu_acapulco_metal", + "blu_tahiti_metal", + "canna_fucile_metal", + "nero_tenebre", + "nero_tenebre_gold", + "rosso_siviglia", + "rosso_siviglia_gold" + ] + }, + { + "name": "ks_lamborghini_countach_s1", + "description": "Lamborghini Countach S1", + "paintings": [ + "0_oro_sahara_metal", + "WalterWolf_black", + "WalterWolf_blue", + "WalterWolf_green", + "WalterWolf_red", + "argento_luna_metal", + "bianco_polo_park", + "blu_acapulco_metal", + "blu_tahiti_metal", + "canna_fucile_metal", + "nero_tenebre", + "nero_tenebre_gold", + "rosso_siviglia", + "rosso_siviglia_gold" + ] + }, + { + "name": "ks_lamborghini_gallardo_sl", + "description": "Lamborghini Gallardo SL", + "paintings": [ + "0_verde_ithaca_pearl", + "arancio_borealis_pearl", + "bianco_canopus", + "bianco_monocerus", + "blu_ely", + "edizione_technica", + "giallo_horus_matt", + "giallo_midas_pearl", + "grigio_telesto", + "nero_nemesis_matt", + "nero_noctis", + "rosso_mars", + "striped_grey", + "striped_orange", + "striped_yellow", + "tricolor_black", + "tricolor_white" + ] + }, + { + "name": "ks_lamborghini_gallardo_sl_s3", + "description": "Lamborghini Gallardo SL Step3", + "paintings": [ + "striped_black_orange", + "striped_grey", + "striped_orange", + "striped_orange_black", + "striped_yellow", + "tricolor_black", + "tricolor_white" + ] + }, + { + "name": "ks_lamborghini_huracan_gt3", + "description": "Lamborghini Huracan GT3", + "paintings": [ + "0_Racing_green", + "Racing_Black", + "Racing_Black_matte", + "Racing_BlizzardBlue", + "Racing_Cinnabar", + "Racing_Grey", + "Racing_Lime", + "Racing_Orange", + "Racing_Orange_matte", + "Racing_Red", + "Racing_Violet", + "Racing_White", + "Racing_Yellow", + "Racing_apricot", + "Racing_blue", + "Racing_copper", + "Racing_darkgreen", + "Racing_darkred", + "Racing_grey_matte" + ] + }, + { + "name": "ks_lamborghini_huracan_st", + "description": "Lamborghini Huracan ST", + "paintings": [ + "0_Racing_63", + "Racing_18", + "Racing_23", + "Racing_25", + "Racing_26", + "Racing_28", + "Racing_29", + "Racing_35", + "Racing_36", + "Racing_37", + "Racing_38", + "Racing_39", + "Racing_52", + "Racing_53", + "Racing_55", + "Racing_56", + "Racing_68", + "Racing_69", + "Racing_76", + "Racing_79", + "Racing_82", + "Racing_99" + ] + }, + { + "name": "ks_lamborghini_miura_sv", + "description": "Lamborghini Miura P400 SV", + "paintings": [ + "Arancio_Gold", + "Arancio_Silver", + "Argento", + "Azzuro_Cielo", + "Bianco", + "Bleu_Medio", + "Bleu_Notte", + "Bleu_Tahiti", + "Champagne", + "Giallo_Miura", + "Nero_Cangiante_Gold", + "Nero_Cangiante_Silver", + "Rosso_Corsa_Gold", + "Rosso_Corsa_Silver", + "Rosso_Rubino_Metalizzato", + "Verde_Inglese", + "Verde_Miura", + "Verde_Rio_Metalizzato_Gold", + "Verde_Rio_Metalizzato_Silver" + ] + }, + { + "name": "ks_lotus_25", + "description": "Lotus Type 25", + "paintings": [ + "racing_01", + "racing_02", + "racing_03", + "racing_04", + "racing_05", + "racing_06", + "racing_07", + "racing_08", + "racing_09", + "racing_10", + "racing_11", + "racing_12", + "racing_13", + "racing_14", + "racing_15", + "racing_16", + "racing_17", + "racing_18", + "racing_19", + "racing_20", + "racing_21" + ] + }, + { + "name": "ks_lotus_72d", + "description": "Lotus 72D", + "paintings": [ + "classic_lotus_5", + "gold_2", + "lotus_10", + "lotus_11", + "lotus_12", + "lotus_13", + "lotus_14", + "lotus_15", + "lotus_16", + "lotus_3", + "lotus_4", + "lotus_5", + "lotus_6", + "lotus_7", + "lotus_8", + "lotus_9" + ] + }, + { + "name": "ks_maserati_250f_12cyl", + "description": "Maserati 250F 12 cylinder", + "paintings": [ + "00_racing_06", + "01_racing_02", + "02_racing_12", + "03_racing_14", + "04_racing_15", + "05_racing_18", + "06_racing_22", + "07_racing_24", + "08_racing_26", + "09_racing_282", + "10_racing_283", + "11_racing_29", + "12_racing_30", + "13_racing_33", + "14_racing_52", + "15_racing_53", + "16_racing_54" + ] + }, + { + "name": "ks_maserati_250f_6cyl", + "description": "Maserati 250F 6 cylinder", + "paintings": [ + "00_racing_01", + "01_racing_03", + "02_racing_05", + "03_racing_06", + "04_racing_13", + "05_racing_16", + "06_racing_20", + "07_racing_21", + "08_racing_24", + "09_racing_25", + "10_racing_27", + "11_racing_28", + "12_racing_56" + ] + }, + { + "name": "ks_maserati_gt_mc_gt4", + "description": "Maserati GranTurismo MC GT4", + "paintings": [ + "00_official", + "01_racing_12", + "02_racing_14", + "03_racing_17", + "04_racing_34", + "05_racing_56", + "06_racing_58", + "07_racing_67", + "08_racing_82", + "09_racing_89", + "10_racing_40", + "11_racing_41", + "12_racing_44", + "13_racing_65", + "14_racing_190", + "15_red" + ] + }, + { + "name": "ks_maserati_levante", + "description": "Maserati Levante S", + "paintings": [ + "00_nero_ribelle", + "01_champagne", + "02_blu_emozione", + "03_grigio", + "04_rosso_rubino", + "05_grigio_metallo", + "06_rame", + "07_grigio_maratea", + "08_blu_passione", + "09_bianco", + "10_bianco_alpi", + "11_nero", + "12_verde_ossido" + ] + }, + { + "name": "ks_mazda_787b", + "description": "Mazda 787B", + "paintings": [ + "00_renown_55", + "01_renown_lm_55", + "02_mazda_18", + "03_mazda_56", + "04_mazda_201" + ] + }, + { + "name": "ks_mazda_miata", + "description": "Mazda Miata NA", + "paintings": [ + "00_classic_red", + "01_mariner_blue", + "02_crystal_white", + "03_silver_stone_metallic_red", + "04_brilliant_black", + "05_sunburst_yellow", + "06_white_tan", + "07_montego_blue_mica", + "08_merlot_mica_tan", + "09_marina_green_mica", + "10_twilight_blue", + "11_british_racing_green_lim", + "12_black_lim", + "13_black_red_lim", + "14_montego_blue_lim", + "15_laguna_blue_lim", + "16_merlot_lim", + "17_starlight_blue_lim", + "18_marina_green_lim", + "19_twilight_blue_lim" + ] + }, + { + "name": "ks_mazda_mx5_cup", + "description": "Mazda MX5 Cup", + "paintings": [ + "00_official", + "01_cup_07", + "02_cup_23", + "03_cup_24", + "04_cup_29", + "05_cup_36", + "06_cup_55", + "07_cup_56", + "08_cup_57", + "09_cup_58", + "10_cup_60", + "11_cup_61", + "12_cup_62", + "13_cup_70", + "14_cup_87", + "15_speedsource_71", + "17_arisoil_72" + ] + }, + { + "name": "ks_mazda_mx5_nd", + "description": "Mazda MX5 ND", + "paintings": [ + "00_soul_red_metallic", + "01_jet_black_mica", + "02_artic_white", + "03_ceramic_metallic", + "04_blue_reflex_mica", + "05_meteor_grey_mica", + "06_crystal_white_pearlescent" + ] + }, + { + "name": "ks_mazda_rx7_spirit_r", + "description": "Mazda RX-7 Spirit R", + "paintings": [ + "00_blaze_red_b", + "01_pure_white", + "02_titanium_grey_b", + "03_competition_yellow", + "04_blue_mica_b", + "05_brilliant_black", + "06_blaze_red", + "07_pure_white_b", + "08_titanium_grey", + "09_competition_yellow_b", + "10_blue_mica" + ] + }, + { + "name": "ks_mazda_rx7_tuned", + "description": "Mazda RX-7 Tuned", + "paintings": [ + "00_orange_s2", + "01_blaze_red_s1", + "02_blue_mica_s2", + "03_competition_yellow_s1", + "04_brilliant_black_s2", + "05_titanium_grey_s1", + "06_white_stripe_s2", + "07_kunos_63", + "08_kunos_66", + "09_kunos_64", + "10_kunos_65", + "11_orange_s1", + "12_blaze_red_s2", + "13_blue_mica_s1", + "14_competition_yellow_s2", + "15_brilliant_black_s1", + "16_titanium_grey_s2", + "17_white_stripe_s1", + "18_mspeed" + ] + }, + { + "name": "ks_mclaren_650_gt3", + "description": "McLaren 650S GT3", + "paintings": [ + "00_racing_59", + "racing_2", + "racing_3", + "racing_57", + "racing_58", + "racing_60", + "racing_61", + "racing_62", + "racing_63", + "racing_64", + "racing_65", + "w_great_britain" + ] + }, + { + "name": "ks_mclaren_f1_gtr", + "description": "McLaren F1 GTR", + "paintings": [ + "0_orange", + "Fina_39", + "Fina_42", + "Gulf_24", + "Gulf_33", + "dark_grey", + "default", + "grey", + "red" + ] + }, + { + "name": "ks_mclaren_p1", + "description": "McLaren P1", + "paintings": [ + "0_mclaren_orange", + "azure_blue", + "carbon_black", + "mercury_red", + "pearl_white", + "silver", + "volcano_orange", + "volcano_red", + "volcano_yellow", + "yellow" + ] + }, + { + "name": "ks_mercedes_190_evo2", + "description": "Mercedes-Benz 190E EVO II", + "paintings": [ + "0_Sonax_3", + "Argento_Iridio_65", + "Blue_71", + "Grigio_Alanite_designo_68", + "Mystic_White_designo_55", + "Nero_Ossidiana_72", + "Rosso_Opale_67", + "Silver_Blue_13", + "Yellow_Blue_12", + "alpine_white_64", + "black_66" + ] + }, + { + "name": "ks_mercedes_amg_gt3", + "description": "Mercedes-Benz AMG GT3", + "paintings": [ + "0_0fficial", + "racing_69", + "racing_70", + "racing_71", + "racing_72", + "racing_73", + "racing_74", + "racing_75", + "racing_76" + ] + }, + { + "name": "ks_mercedes_c9", + "description": "Mercedes-Benz C9 1989 LM", + "paintings": [ + "00_sauber_63", + "01_sauber_61", + "02_michelin_63", + "03_aeg_61", + "04_aeg_olympia_62", + "05_team_redline_blue", + "06_team_redline_classic", + "07_team_redline_navy", + "08_team_redline_red", + "09_team_redline_white" + ] + }, + { + "name": "ks_nissan_370z", + "description": "Nissan 370z Nismo", + "paintings": [ + "00_pearl_white_met", + "01_magnetic_black_met", + "02_solid_red_solid", + "03_brillant_silver_met" + ] + }, + { + "name": "ks_nissan_gtr", + "description": "Nissan GT-R NISMO", + "paintings": [ + "0_pearl_white", + "jet_black", + "solid_red", + "super_silver" + ] + }, + { + "name": "ks_nissan_gtr_gt3", + "description": "Nissan GT-R GT3", + "paintings": [ + "0_Nissan_12", + "2t_94", + "2t_95", + "2t_96", + "2t_97", + "JRM_22", + "JRM_23", + "JRM_230", + "Nissan_98", + "ac_15", + "ac_36", + "ac_67", + "gt3_91", + "gt3_92", + "gt3_93", + "kunosart_112", + "kunosart_121", + "nismo_88", + "nismo_89", + "nismo_90" + ] + }, + { + "name": "ks_nissan_skyline_r34", + "description": "Nissan Skyline GTR R34 V-Spec", + "paintings": [ + "00_bayside_blue", + "01_active_red", + "02_athlete_silver", + "03_black_pearl", + "04_lightning_yellow", + "05_pearl_white", + "06_sonic_silver", + "07_midnight_purple_ii", + "08_millennium_jade", + "09_silica_breath" + ] + }, + { + "name": "ks_porsche_718_boxster_s", + "description": "Porsche 718 Boxster S", + "paintings": [ + "00_gt_silver_metallic", + "01_miami_blue", + "02_carmine_red", + "03_black", + "04_white", + "05_racing_yellow", + "06_guards_red", + "07_carrara_white_metallic", + "08_jet_black_metallic", + "09_graphite_blue_metallic", + "10_rhodium_silver_metallic", + "11_night_blue_metallic", + "12_agate_grey_metallic", + "13_lava_orange", + "14_sapphire_blue_metallic", + "15_mahogany_metallic" + ] + }, + { + "name": "ks_porsche_718_boxster_s_pdk", + "description": "Porsche 718 Boxster S PDK", + "paintings": [ + "00_carmine_red", + "01_lava_orange", + "02_miami_blue", + "03_black", + "04_white", + "05_racing_yellow", + "06_guards_red", + "07_carrara_white_metallic", + "08_jet_black_metallic", + "09_graphite_blue_metallic", + "10_rhodium_silver_metallic", + "11_night_blue_metallic", + "12_agate_grey_metallic", + "13_gt_silver_metallic", + "14_sapphire_blue_metallic", + "15_mahogany_metallic" + ] + }, + { + "name": "ks_porsche_718_cayman_s", + "description": "Porsche 718 Cayman S", + "paintings": [ + "00_graphite_blue_metallic", + "01_carmine_red", + "02_lava_orange", + "03_black", + "04_white", + "05_racing_yellow", + "06_guards_red", + "07_carrara_white_metallic", + "08_jet_black_metallic", + "09_miami_blue", + "10_rhodium_silver_metallic", + "11_night_blue_metallic", + "12_agate_grey_metallic", + "13_gt_silver_metallic", + "14_sapphire_blue_metallic", + "15_mahogany_metallic" + ] + }, + { + "name": "ks_porsche_718_spyder_rs", + "description": "Porsche 718 RS 60 Spyder", + "paintings": [ + "00_racing_42", + "01_racing_34", + "02_racing_50", + "03_racing_136", + "04_racing_silver" + ] + }, + { + "name": "ks_porsche_908_lh", + "description": "Porsche 908 LH", + "paintings": [ + "00_racing_64", + "01_racing_25", + "02_racing_60", + "03_racing_33", + "04_racing_10", + "05_racing_5" + ] + }, + { + "name": "ks_porsche_911_carrera_rsr", + "description": "Porsche 911 Carrera RSR 3.0", + "paintings": [ + "00_imsa_74", + "01_racing_red", + "02_kremer", + "03_kunosracing_17", + "04_kunosracing_52", + "05_kunosracing_56", + "06_carrera_white", + "07_carrera_blue", + "08_carrera_green", + "09_carrera_black", + "10_carrera_grey", + "11_carrera_lime", + "12_carrera_red", + "13_carrera_76", + "14_carrera_brown", + "15_carrera_purple", + "16_carrera_cyan", + "17_carrera_burgundy", + "18_kunosracing_57", + "19_kunosracing_58", + "20_kunosracing_59", + "21_kunosracing_75" + ] + }, + { + "name": "ks_porsche_911_gt1", + "description": "Porsche 911 GT1-98", + "paintings": [ + "00_racing_26", + "01_racing_25", + "02_racing_5", + "03_racing_6" + ] + }, + { + "name": "ks_porsche_911_gt3_cup_2017", + "description": "Porsche 911 GT3 Cup 2017", + "paintings": [ + "00_cup", + "01_racing_912", + "02_racing_917", + "03_racing_919", + "04_racing_915", + "05_racing_913", + "06_racing_922", + "07_racing_914", + "08_racing_920", + "09_racing_921", + "10_racing_918", + "11_racing_923", + "12_racing_924", + "13_racing_925", + "14_racing_926", + "15_racing_927", + "16_racing_928", + "17_racing_929", + "18_racing_930", + "19_racing_916", + "20_racing_931" + ] + }, + { + "name": "ks_porsche_911_gt3_r_2016", + "description": "Porsche 911 GT3 R 2016", + "paintings": [ + "00_gt3", + "01_racing_912", + "02_racing_911", + "03_racing_910" + ] + }, + { + "name": "ks_porsche_911_gt3_rs", + "description": "Porsche 911 GT3 RS", + "paintings": [ + "00_lava_orange", + "01_ultraviolet", + "02_gt_silver_metallic", + "03_white" + ] + }, + { + "name": "ks_porsche_911_r", + "description": "Porsche 911 R", + "paintings": [ + "00_white_red", + "01_silver_green", + "02_white", + "03_gt_silver_metallic", + "04_silver_red", + "05_white_green" + ] + }, + { + "name": "ks_porsche_911_rsr_2017", + "description": "Porsche 911 RSR 2017", + "paintings": [ + "00_rsr", + "01_racing_911", + "02_racing_912" + ] + }, + { + "name": "ks_porsche_917_30", + "description": "Porsche 917/30 Spyder", + "paintings": [ + "00_chassis_002_racing", + "01_chassis_003_racing", + "02_chassis_006_racing", + "03_chassis_004_private", + "04_chassis_005_private" + ] + }, + { + "name": "ks_porsche_917_k", + "description": "Porsche 917 K", + "paintings": [ + "00_racing_21", + "01_racing_20", + "02_racing_1", + "03_racing_2", + "04_racing_3", + "05_racing_23", + "06_racing_32", + "07_racing_16" + ] + }, + { + "name": "ks_porsche_918_spyder", + "description": "Porsche 918 Spyder", + "paintings": [ + "00_salzburg_racing_03", + "01_salzburg_racing_25", + "02_rhodium_silver_metallic", + "03_liquid_metal_silver", + "04_guards_red", + "05_black_matte", + "06_basalt_black_metallic", + "07_black", + "08_dark_blue_metallic", + "09_gt_silver_metallic", + "10_liquid_metal_chrome_blue", + "11_meteor_grey_metallic", + "12_racing_yellow", + "13_sapphire_blue_metallic", + "14_white", + "15_salzburg_racing_28", + "16_salzburg_racing_04", + "17_salzburg_racing_05", + "18_salzburg_racing_01" + ] + }, + { + "name": "ks_porsche_919_hybrid_2015", + "description": "Porsche 919 Hybrid 2015", + "paintings": [ + "00_lms_19", + "01_lms_17", + "02_lms_18" + ] + }, + { + "name": "ks_porsche_919_hybrid_2016", + "description": "Porsche 919 Hybrid 2016", + "paintings": [ + "00_lms_02", + "01_lms_01" + ] + }, + { + "name": "ks_porsche_935_78_moby_dick", + "description": "Porsche 935/78 'Moby Dick'", + "paintings": [ + "00_racing_01", + "01_racing_43", + "02_racing_27", + "03_racing_30", + "04_racing_70", + "05_racing_66", + "06_racing_79" + ] + }, + { + "name": "ks_porsche_962c_longtail", + "description": "Porsche 962 C Long Tail", + "paintings": [ + "00_racing_17_87", + "01_racing_18_87", + "02_racing_1_87", + "03_racing_17_88", + "04_racing_19_88", + "05_racing_10", + "06_racing_11", + "07_racing_12", + "08_racing_4", + "09_racing_77" + ] + }, + { + "name": "ks_porsche_962c_shorttail", + "description": "Porsche 962 C Short Tail", + "paintings": [ + "00_racing_01", + "01_racing_02", + "02_racing_17", + "03_racing_7", + "04_racing_99", + "05_racing_78", + "06_racing_18" + ] + }, + { + "name": "ks_porsche_991_carrera_s", + "description": "Porsche 911 Carrera S", + "paintings": [ + "00_guards_red", + "01_black", + "02_white", + "03_agate_grey_metallic", + "04_racing_yellow", + "05_carmine_red", + "06_lava_orange", + "07_miami_blue", + "08_carrara_white_metallic", + "09_jet_black_metallic", + "10_graphite_blue_metallic", + "11_rhodium_silver_metallic", + "12_sapphire_blue_metallic", + "13_night_blue_metallic", + "14_gt_silver_metallic", + "15_mahogany_metallic" + ] + }, + { + "name": "ks_porsche_991_turbo_s", + "description": "Porsche 911 Turbo S", + "paintings": [ + "00_miami_blue", + "01_black", + "02_white", + "03_agate_grey_metallic", + "04_racing_yellow", + "05_carmine_red", + "06_lava_orange", + "07_guards_red", + "08_carrara_white_metallic", + "09_jet_black_metallic", + "10_graphite_blue_metallic", + "11_rhodium_silver_metallic", + "12_sapphire_blue_metallic", + "13_night_blue_metallic", + "14_gt_silver_metallic", + "15_mahogany_metallic" + ] + }, + { + "name": "ks_porsche_cayenne", + "description": "Porsche Cayenne Turbo S", + "paintings": [ + "00_black", + "01_meteor_grey_metallic", + "02_white", + "03_carmine_red", + "04_purpurite_metallic", + "05_carrara_white_metallic", + "06_jet_black_metallic", + "07_moonlight_blue_metallic", + "08_rhodium_silver_metallic", + "09_sapphire_blue_metallic", + "10_palladium_metallic", + "11_mahogany_metallic" + ] + }, + { + "name": "ks_porsche_cayman_gt4_clubsport", + "description": "Porsche Cayman GT4 Clubsport", + "paintings": [ + "00_clubsport", + "02_cup_01", + "03_cup_02", + "04_cup_03", + "05_cup_05", + "06_cup_06", + "07_cup_07", + "08_cup_08", + "09_cup_09", + "10_cup_10", + "11_cup_11", + "12_cup_12", + "13_cup_13", + "14_cup_26", + "15_cup_33", + "16_cup_46", + "17_cup_76", + "18_cup_62", + "19_cup_63", + "20_cup_64" + ] + }, + { + "name": "ks_porsche_cayman_gt4_std", + "description": "Porsche Cayman GT4", + "paintings": [ + "00_racing_yellow", + "01_agate_grey_metallic", + "02_black", + "03_carmine_red", + "04_carrara_white_metallic", + "05_gt_silver_metallic", + "06_guards_red", + "07_jet_black_metallic", + "08_rhodium_silver_metallic", + "09_sapphire_blue_metallic", + "10_white", + "11_dark_blue_metallic" + ] + }, + { + "name": "ks_porsche_macan", + "description": "Porsche Macan Turbo", + "paintings": [ + "00_agate_grey_metallic", + "01_black", + "02_white", + "03_carmine_red", + "05_carrara_white_metallic", + "06_jet_black_metallic", + "07_volcano_grey_metallic", + "08_rhodium_silver_metallic", + "09_sapphire_blue_metallic", + "10_night_blue_metallic", + "11_mahogany_metallic", + "12_meteor_grey_metallic" + ] + }, + { + "name": "ks_porsche_panamera", + "description": "Porsche Panamera Turbo", + "paintings": [ + "00_sapphire_blue_metallic", + "01_black", + "02_white", + "03_carmine_red", + "04_gt_silver_metallic", + "05_carrara_white_metallic", + "06_jet_black_metallic", + "07_volcano_grey_metallic", + "08_rhodium_silver_metallic", + "09_agate_grey_metallic", + "10_night_blue_metallic", + "11_mahogany_metallic", + "12_palladium_metallic", + "13_amethyst_metallic", + "14_chalk" + ] + }, + { + "name": "ks_praga_r1", + "description": "Praga R1", + "paintings": [ + "00_praga_cars_racing_blue", + "01_praga_cars_racing_9", + "02_gryphon_racing_69", + "04_monticello_motor_club_36", + "05_robert_haub_69", + "06_power_sport_racing_56", + "07_gryphon_racing_69", + "08_blueberry_racing_771", + "09_racing_praga_27", + "10_Gryphon_racing_13", + "11_blueberry_racing_770", + "12_endurance_2015_01" + ] + }, + { + "name": "ks_ruf_rt12r", + "description": "RUF RT12 R", + "paintings": [ + "0_official", + "Green", + "black", + "black_matte_silver", + "blue", + "kunos_fanatec", + "light_blue", + "light_green", + "lime", + "orange", + "purple", + "red", + "silver", + "silver_matte", + "silver_matte_gr", + "white", + "yellow" + ] + }, + { + "name": "ks_ruf_rt12r_awd", + "description": "RUF RT12 R AWD", + "paintings": [ + "0_official", + "Green", + "black", + "black_matte_silver", + "blue", + "kunos", + "light_blue", + "light_green", + "lime", + "orange", + "purple", + "red", + "silver", + "silver_matte", + "silver_matte_gr", + "white", + "yellow" + ] + }, + { + "name": "ks_toyota_ae86", + "description": "Toyota AE86", + "paintings": [ + "00_white", + "01_black", + "02_blue_met", + "03_silver_gray", + "04_red", + "05_white_carbon", + "06_dark_orange_met", + "07_wine_met", + "08_black_met", + "09_light_topaz_met", + "10_lt_bluemd_blue", + "11_shell_met", + "12_medium_blue_met", + "14_silver_black", + "15_white_bhood", + "16_yellow" + ] + }, + { + "name": "ks_toyota_ae86_drift", + "description": "Toyota AE86 Drift", + "paintings": [ + "00_ksdrift7", + "01_ksdrift3", + "02_ksdrift8", + "03_ksdrift5", + "04_ksdrift4", + "05_ksdrift2", + "06_ksdrift6", + "07_ksdrift1" + ] + }, + { + "name": "ks_toyota_ae86_tuned", + "description": "Toyota AE86 Tuned", + "paintings": [ + "01_spooler_16", + "02_spooler_17", + "03_toyo_84", + "04_trd_86", + "05_white_carbon" + ] + }, + { + "name": "ks_toyota_gt86", + "description": "Toyota GT86", + "paintings": [ + "0_fusion_orange", + "crystal_black", + "crystal_white_pearl", + "dark_grey", + "galaxy_blue", + "gravity_blue", + "ice_silver", + "ignition_red", + "lightning_red", + "rsrnurburg", + "velocity_orange", + "vivid_yellow" + ] + }, + { + "name": "ks_toyota_supra_mkiv", + "description": "Toyota Supra MKIV", + "paintings": [ + "00_super_red", + "01_dark_green_pearl_met", + "02_super_white", + "03_silver_met", + "04_black", + "05_blue_pearl_met" + ] + }, + { + "name": "ks_toyota_supra_mkiv_drift", + "description": "Toyota Supra MKIV Drift", + "paintings": [ + "00_orange", + "01_black", + "02_blue", + "03_red", + "04_silver", + "05_white", + "06_yellow", + "07_ksart", + "08_classic_yellow" + ] + }, + { + "name": "ks_toyota_supra_mkiv_tuned", + "description": "Toyota Supra MKIV Time Attack", + "paintings": [ + "00_kunos", + "01_art", + "03_tims", + "04_toyo_stripe", + "05_red_carbon", + "06_black_carbon", + "07_purple_carbon", + "08_white_carbon", + "09_lime_carbon", + "10_silver_stripe", + "11_black_stripe", + "12_blue_stripe", + "13_white_stripe" + ] + }, + { + "name": "ktm_xbow_r", + "description": "KTM X-Bow R", + "paintings": [ + "00_orange_14", + "01_blue_01", + "02_isotope_green_10", + "03_dark_grey_06", + "04_yellow_07", + "05_light_blue_04", + "06_red_18", + "07_dark_grey_09", + "08_orange_19", + "09_red_15", + "10_blue_02", + "11_carbon_03", + "12_cyan_05", + "13_light_grey_08", + "14_isotope_green_11", + "15_lemon_12", + "16_light_grey_13", + "17_green_20" + ] + }, + { + "name": "lotus_2_eleven", + "description": "Lotus 2-Eleven", + "paintings": [ + "2_eleven", + "kunos_racing_40", + "kunos_racing_41", + "red" + ] + }, + { + "name": "lotus_2_eleven_gt4", + "description": "Lotus 2-Eleven GT4", + "paintings": [ + "2ELEVEN_13", + "2ELEVEN_14", + "2ELEVEN_15", + "2ELEVEN_16", + "Atech_Green_07", + "Atech_Orange_08", + "Cloud9_19", + "Cloud9_20", + "DGFX_Blue_06", + "DGFX_Red_05", + "Kunos_Racing_11", + "Kunos_Racing_12", + "Lotus_Black_03", + "Lotus_Green_01", + "Lotus_White_04", + "Lotus_Yellow_02", + "Mareo_Wins_09", + "Mareo_Wins_10", + "Taurus_17", + "Taurus_18" + ] + }, + { + "name": "lotus_49", + "description": "Lotus Type 49", + "paintings": [ + "00_default", + "1967_02", + "1967_03", + "1967_05", + "1967_06", + "1967_12", + "1967_14", + "1967_15", + "1967_16", + "1967_18", + "1967_20", + "1967_29", + "1967_32", + "1967_34", + "1967__07", + "1967__17", + "racing_22", + "racing_5" + ] + }, + { + "name": "lotus_98t", + "description": "Lotus 98T", + "paintings": [ + "0_delonghi_11", + "DeLonghi_12", + "Mullberry_17", + "Mullberry_18", + "brokmans_13", + "brokmans_14", + "craft_03", + "craft_04", + "dline_01", + "dline_02", + "dome_15", + "dome_16", + "eastern_07", + "eastern_08", + "epoxo_09", + "epoxo_10", + "race_trim_19", + "race_trim_20", + "wilson_05", + "wilson_06" + ] + }, + { + "name": "lotus_elise_sc", + "description": "Lotus Elise SC", + "paintings": [ + "0_racing_green", + "black_metallic", + "blue_metallic", + "grey_metallic", + "orange_metallic", + "signature_grey", + "silver_metallic", + "solid_red", + "solid_yellow", + "white_metallic" + ] + }, + { + "name": "lotus_elise_sc_s1", + "description": "Lotus Elise SC Step1", + "paintings": [ + "0_Motorsport_Green", + "Aquamarine_Blue", + "Autumn_Bronze", + "Chrome_Orange", + "Ice_White", + "Laser_Blue", + "Quartz_Silver", + "Sienna_Brown", + "Starlight_Black", + "Velvet_Red" + ] + }, + { + "name": "lotus_elise_sc_s2", + "description": "Lotus Elise SC Step2", + "paintings": [ + "0_Racing_Green_Stripe", + "Amethyst_Grey", + "Ardent_Red", + "Canyon_Red", + "Frost_Blue", + "Isotope_Green", + "Liquid_Blue", + "Persian_Blue", + "Solar_Yellow", + "Storm_Titanium" + ] + }, + { + "name": "lotus_evora_gtc", + "description": "Lotus Evora GTC", + "paintings": [ + "Burnt_Orange", + "Carbon_Grey", + "Motorsport_Green", + "Motorsport_Green_Cosworth", + "Phantom_Black", + "Quartz_Silver", + "Solar_Yellow", + "battery_tender", + "bull_run", + "racing_green", + "red" + ] + }, + { + "name": "lotus_evora_gte", + "description": "Lotus Evora GTE", + "paintings": [ + "0_yellow", + "black_red", + "grey", + "kunos_racing_72", + "red", + "red_stripes", + "white_black" + ] + }, + { + "name": "lotus_evora_gte_carbon", + "description": "Lotus Evora GTE Carbon", + "paintings": [ + "carbon" + ] + }, + { + "name": "lotus_evora_gx", + "description": "Lotus Evora GX", + "paintings": [ + "Burnt_Orange", + "Carbon_Grey", + "Motorsport_Green", + "Phantom_Black", + "Quartz_Silver", + "Solar_Yellow", + "battery_tender", + "default", + "racing_green", + "red" + ] + }, + { + "name": "lotus_evora_s", + "description": "Lotus Evora S", + "paintings": [ + "0_Racing_Green", + "Aquamarine_Blue", + "Aspen_White", + "Canyon_Red", + "Chrome_Orange", + "Nightfall_Blue", + "Quartz_Silver", + "Solar_Yellow" + ] + }, + { + "name": "lotus_evora_s_s2", + "description": "Lotus Evora S Stage 2", + "paintings": [ + "0_Motorsport_Green", + "Amethyst_Grey", + "Ardent_Red", + "Autumn_Bronze", + "Carbon_Grey", + "Phantom_Black", + "Sienna_Brown" + ] + }, + { + "name": "lotus_exige_240", + "description": "Lotus Exige 240R", + "paintings": [ + "orange", + "red" + ] + }, + { + "name": "lotus_exige_240_s3", + "description": "Lotus Exige 240R Stage3", + "paintings": [ + "0_motorsport_green_stripe", + "black", + "blue_dsd", + "light_blue_orange", + "orange_aris", + "red_dgfx", + "tcr_2014" + ] + }, + { + "name": "lotus_exige_s", + "description": "Lotus Exige S", + "paintings": [ + "0_racing_green", + "Amethyst_Grey", + "Aquamarine_Blue", + "Ardent_Red", + "Artic_Silver", + "Aspen_White", + "Autumn_Bronze", + "Burnt_Orange", + "Canyon_Red", + "Carbon_Grey", + "Chrome_Orange", + "Frost_Blue", + "Graphite_Grey", + "Ice_White", + "Isotope_Green", + "Laser_Blue", + "Liquid_Blue", + "Motorsport_Green", + "Nightfall_Blue", + "Persian_Blue", + "Phantom_Black", + "Quartz_Silver", + "Sienna_Brown", + "Solar_Yellow", + "Starlight_Black", + "Storm_Titanium", + "Velvet_Red" + ] + }, + { + "name": "lotus_exige_s_roadster", + "description": "Lotus Exige S roadster", + "paintings": [ + "0_racing_green", + "Amethyst_Grey", + "Ardent_Red", + "Artic_Silver", + "Aspen_White", + "Autumn_Bronze", + "Burnt_Orange", + "Canyon_Red", + "Motorsport_Green", + "Nightfall_Blue", + "Phantom_Black", + "Solar_Yellow" + ] + }, + { + "name": "lotus_exige_scura", + "description": "Lotus Exige Scura", + "paintings": [ + "scura" + ] + }, + { + "name": "lotus_exige_v6_cup", + "description": "Lotus Exige V6 CUP", + "paintings": [ + "0_solar_yellow", + "Ardent_Red", + "Chrome_Orange", + "Grey", + "Nightfall_Blue", + "Quartz_Silver", + "Starlight_Black", + "racing_green" + ] + }, + { + "name": "lotus_exos_125", + "description": "Lotus Exos 125", + "paintings": [ + "0_Lotus", + "Premiere", + "carbon" + ] + }, + { + "name": "lotus_exos_125_s1", + "description": "Lotus Exos 125 Stage 1", + "paintings": [ + "00_racing_green", + "01_lotus_legends", + "02_racing_23", + "03_racing_24", + "04_racing_25", + "05_racing_68", + "06_racing_22", + "07_kunos_racing", + "08_kunos_black", + "09_kunos_green", + "10_kunos_red", + "11_black_red", + "12_german_grey" + ] + }, + { + "name": "mclaren_mp412c", + "description": "McLaren MP4-12C", + "paintings": [ + "0_mclaren_orange", + "azure_blue", + "carbon_black", + "mercury_red", + "orange_rsr", + "pearl_white", + "silver", + "silver_rsr", + "volcano_orange", + "volcano_red", + "volcano_yellow" + ] + }, + { + "name": "mclaren_mp412c_gt3", + "description": "McLaren MP4-12C GT3", + "paintings": [ + "0_2013-Official_McLaren", + "2012-Gemballa_Racing", + "2012-United_Autosports", + "2012-g_racing", + "2013-ART_GrandPrix", + "2013-Hexis_Racing" + ] + }, + { + "name": "mercedes_sls", + "description": "Mercedes SLS AMG", + "paintings": [ + "Argento_Iridio", + "Grigio_Alanite_designo", + "Mystic_White_designo", + "Nero_Ossidiana", + "Rosso_Opale" + ] + }, + { + "name": "mercedes_sls_gt3", + "description": "Mercedes SLS AMG GT3", + "paintings": [ + "0_AMG", + "ALL_INKL_37", + "ALL_INKL_38", + "Black_Falcon_Dubai_24H_1", + "Black_Falcon_Dubai_24H_2", + "Black_Falcon_Porta_9", + "Black_Falcon_SB_Mobel_Boss_10", + "Kunos_zp_115", + "Kunos_zp_116", + "Kunos_zp_117", + "TCR_2014_05", + "TCR_2014_65", + "kunos_zp_121" + ] + }, + { + "name": "p4-5_2011", + "description": "P4/5 Competizione 2011", + "paintings": [ + "2011" + ] + }, + { + "name": "pagani_huayra", + "description": "Pagani Huayra", + "paintings": [ + "2013_car_of_the_year", + "black", + "cadet_grey", + "casper", + "cerulean", + "dark_grey", + "dark_sienna", + "firebrick", + "graphite", + "ice", + "light_grey", + "light_sapphire", + "mountbatten_violet", + "night_black", + "ochre", + "orange", + "peru", + "red", + "rust", + "scarlet", + "silver", + "slate_blue", + "slate_violet", + "titanium", + "white", + "yellow" + ] + }, + { + "name": "pagani_zonda_r", + "description": "Pagani Zonda R", + "paintings": [ + "00_default", + "01_world_record", + "02_kunos_racing" + ] + }, + { + "name": "ruf_yellowbird", + "description": "RUF CTR Yellowbird", + "paintings": [ + "00_yellowbird_black", + "01_yellowbird_silver", + "02_yellowbird_silverblack", + "03_black", + "04_green", + "05_blue", + "06_red_blackrims", + "07_blue_blackrims", + "08_green_blackrims", + "09_red", + "10_black_blackrims" + ] + }, + { + "name": "shelby_cobra_427sc", + "description": "Shelby Cobra 427 S/C", + "paintings": [ + "50th_anniversary", + "black_15", + "black_34", + "blue_44", + "blue_95", + "brick_red_90", + "dark_blue_52", + "dark_blue_96", + "dark_red_98", + "light_blue_67", + "light_blue_69", + "red_27", + "red_71", + "silver_6", + "silver_8", + "white_11", + "white_23", + "white_60", + "yellow_13", + "yellow_33" + ] + }, + { + "name": "tatuusfa1", + "description": "Tatuus FA01", + "paintings": [ + "scheme_0", + "scheme_1", + "scheme_2", + "scheme_3", + "scheme_4" + ] + } +] diff --git a/release/v1.1.0/config/tracks.json b/release/v1.1.0/config/tracks.json new file mode 100755 index 0000000..e226bee --- /dev/null +++ b/release/v1.1.0/config/tracks.json @@ -0,0 +1,266 @@ +[ + { + "name": "drift", + "config": "", + "description": "Drift", + "max_slots": 18 + }, + { + "name": "imola", + "config": "", + "description": "Imola", + "max_slots": 24 + }, + { + "name": "ks_barcelona", + "config": "layout_gp", + "description": "Ks_barcelona - Layout_gp", + "max_slots": 24 + }, + { + "name": "ks_barcelona", + "config": "layout_moto", + "description": "Ks_barcelona - Layout_moto", + "max_slots": 24 + }, + { + "name": "ks_black_cat_county", + "config": "layout_int", + "description": "Ks_black_cat_county - Layout_int", + "max_slots": 24 + }, + { + "name": "ks_black_cat_county", + "config": "layout_long", + "description": "Ks_black_cat_county - Layout_long", + "max_slots": 24 + }, + { + "name": "ks_black_cat_county", + "config": "layout_short", + "description": "Ks_black_cat_county - Layout_short", + "max_slots": 24 + }, + { + "name": "ks_brands_hatch", + "config": "gp", + "description": "Ks_brands_hatch - Gp", + "max_slots": 24 + }, + { + "name": "ks_brands_hatch", + "config": "indy", + "description": "Ks_brands_hatch - Indy", + "max_slots": 24 + }, + { + "name": "ks_drag", + "config": "drag1000", + "description": "Ks_drag - Drag1000", + "max_slots": 2 + }, + { + "name": "ks_drag", + "config": "drag200", + "description": "Ks_drag - Drag200", + "max_slots": 2 + }, + { + "name": "ks_drag", + "config": "drag2000", + "description": "Ks_drag - Drag2000", + "max_slots": 2 + }, + { + "name": "ks_drag", + "config": "drag400", + "description": "Ks_drag - Drag400", + "max_slots": 2 + }, + { + "name": "ks_drag", + "config": "drag500", + "description": "Ks_drag - Drag500", + "max_slots": 2 + }, + { + "name": "ks_highlands", + "config": "layout_drift", + "description": "Ks_highlands - Layout_drift", + "max_slots": 24 + }, + { + "name": "ks_highlands", + "config": "layout_int", + "description": "Ks_highlands - Layout_int", + "max_slots": 24 + }, + { + "name": "ks_highlands", + "config": "layout_long", + "description": "Ks_highlands - Layout_long", + "max_slots": 24 + }, + { + "name": "ks_highlands", + "config": "layout_short", + "description": "Ks_highlands - Layout_short", + "max_slots": 24 + }, + { + "name": "ks_monza66", + "config": "full", + "description": "Ks_monza66 - Full", + "max_slots": 25 + }, + { + "name": "ks_monza66", + "config": "junior", + "description": "Ks_monza66 - Junior", + "max_slots": 25 + }, + { + "name": "ks_monza66", + "config": "road", + "description": "Ks_monza66 - Road", + "max_slots": 25 + }, + { + "name": "ks_nordschleife", + "config": "endurance", + "description": "Ks_nordschleife - Endurance", + "max_slots": 24 + }, + { + "name": "ks_nordschleife", + "config": "endurance_cup", + "description": "Ks_nordschleife - Endurance_cup", + "max_slots": 24 + }, + { + "name": "ks_nordschleife", + "config": "nordschleife", + "description": "Ks_nordschleife - Nordschleife", + "max_slots": 24 + }, + { + "name": "ks_nordschleife", + "config": "touristenfahrten", + "description": "Ks_nordschleife - Touristenfahrten", + "max_slots": 32 + }, + { + "name": "ks_nurburgring", + "config": "layout_gp_a", + "description": "Ks_nurburgring - Layout_gp_a", + "max_slots": 24 + }, + { + "name": "ks_nurburgring", + "config": "layout_gp_b", + "description": "Ks_nurburgring - Layout_gp_b", + "max_slots": 24 + }, + { + "name": "ks_nurburgring", + "config": "layout_sprint_a", + "description": "Ks_nurburgring - Layout_sprint_a", + "max_slots": 24 + }, + { + "name": "ks_nurburgring", + "config": "layout_sprint_b", + "description": "Ks_nurburgring - Layout_sprint_b", + "max_slots": 24 + }, + { + "name": "ks_red_bull_ring", + "config": "layout_gp", + "description": "Ks_red_bull_ring - Layout_gp", + "max_slots": 24 + }, + { + "name": "ks_red_bull_ring", + "config": "layout_national", + "description": "Ks_red_bull_ring - Layout_national", + "max_slots": 24 + }, + { + "name": "ks_silverstone", + "config": "gp", + "description": "Ks_silverstone - Gp", + "max_slots": 24 + }, + { + "name": "ks_silverstone", + "config": "international", + "description": "Ks_silverstone - International", + "max_slots": 24 + }, + { + "name": "ks_silverstone", + "config": "national", + "description": "Ks_silverstone - National", + "max_slots": 24 + }, + { + "name": "ks_silverstone1967", + "config": "", + "description": "Ks_silverstone1967", + "max_slots": 20 + }, + { + "name": "ks_vallelunga", + "config": "classic_circuit", + "description": "Ks_vallelunga - Classic_circuit", + "max_slots": 24 + }, + { + "name": "ks_vallelunga", + "config": "club_circuit", + "description": "Ks_vallelunga - Club_circuit", + "max_slots": 24 + }, + { + "name": "ks_vallelunga", + "config": "extended_circuit", + "description": "Ks_vallelunga - Extended_circuit", + "max_slots": 24 + }, + { + "name": "ks_zandvoort", + "config": "", + "description": "Ks_zandvoort", + "max_slots": 18 + }, + { + "name": "magione", + "config": "", + "description": "Magione", + "max_slots": 18 + }, + { + "name": "monza", + "config": "", + "description": "Monza", + "max_slots": 26 + }, + { + "name": "mugello", + "config": "", + "description": "Mugello", + "max_slots": 24 + }, + { + "name": "spa", + "config": "", + "description": "Spa", + "max_slots": 24 + }, + { + "name": "trento-bondone", + "config": "", + "description": "Trento-bondone", + "max_slots": 4 + } +] diff --git a/release/v1.1.0/db/mig_1.0.3_1.1.0.sql b/release/v1.1.0/db/mig_1.0.3_1.1.0.sql new file mode 100644 index 0000000..2c6340b --- /dev/null +++ b/release/v1.1.0/db/mig_1.0.3_1.1.0.sql @@ -0,0 +1,19 @@ +ALTER TABLE `cars` +ADD COLUMN `fixed_setup` varchar(100) NOT NULL AFTER `position`; + +ALTER TABLE `configurations` +ADD COLUMN `legal_tyres` varchar(100) NOT NULL AFTER `track_config`, +ADD COLUMN `udp_plugin_local_port` int(10) NOT NULL AFTER `legal_tyres`, +ADD COLUMN `udp_plugin_address` varchar(100) NOT NULL AFTER `udp_plugin_local_port`, +ADD COLUMN `race_pit_window_start` int(100) NOT NULL AFTER `udp_plugin_address`, +ADD COLUMN `race_pit_window_end` int(100) NOT NULL AFTER `race_pit_window_start`, +ADD COLUMN `reversed_grid_race_positions` int(100) NOT NULL AFTER `race_pit_window_end`; + +ALTER TABLE `weather` +ADD COLUMN `wind_base_speed_min` int(10) NOT NULL AFTER `road_variation`, +ADD COLUMN `wind_base_speed_max` int(10) NOT NULL AFTER `wind_base_speed_min`, +ADD COLUMN `wind_base_direction` int(10) NOT NULL AFTER `wind_base_speed_max`, +ADD COLUMN `wind_variation_direction` int(10) NOT NULL AFTER `wind_base_direction`, +DROP COLUMN `realistic_road_temp`; + +ALTER TABLE `configurations` DROP COLUMN `time`; diff --git a/release/v1.1.0/db/schema.sql b/release/v1.1.0/db/schema.sql new file mode 100644 index 0000000..e67d073 --- /dev/null +++ b/release/v1.1.0/db/schema.sql @@ -0,0 +1,140 @@ +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET time_zone = "+00:00"; + +CREATE TABLE `cars` ( + `id` int(10) UNSIGNED NOT NULL, + `configuration` int(10) UNSIGNED NOT NULL, + `car` varchar(100) NOT NULL, + `painting` varchar(100) NOT NULL, + `spectator` tinyint(1) NOT NULL, + `driver` varchar(40) NOT NULL, + `team` varchar(40) NOT NULL, + `guid` varchar(100) NOT NULL, + `position` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE `configurations` ( + `id` int(10) UNSIGNED NOT NULL, + `name` varchar(200) NOT NULL, + `pwd` varchar(40) NOT NULL, + `admin_pwd` varchar(40) NOT NULL, + `pickup_mode` tinyint(1) NOT NULL, + `lock_entry_list` tinyint(1) NOT NULL, + `race_overtime` int(11) NOT NULL, + `max_slots` int(11) NOT NULL, + `welcome` varchar(200) NOT NULL, + `description` text NOT NULL, + `udp` int(11) NOT NULL, + `tcp` int(11) NOT NULL, + `http` int(11) NOT NULL, + `packets_hz` int(11) NOT NULL, + `loop_mode` tinyint(1) NOT NULL, + `show_in_lobby` tinyint(1) NOT NULL, + `threads` int(11) NOT NULL, + `abs` varchar(40) NOT NULL, + `tc` varchar(40) NOT NULL, + `stability_aid` tinyint(1) NOT NULL, + `auto_clutch` tinyint(1) NOT NULL, + `tyre_blankets` tinyint(1) NOT NULL, + `force_virtual_mirror` tinyint(1) NOT NULL, + `fuel_rate` int(11) NOT NULL, + `damage_rate` int(11) NOT NULL, + `tires_wear_rate` int(11) NOT NULL, + `allowed_tires_out` int(11) NOT NULL, + `max_ballast` int(11) NOT NULL, + `disable_gas_cut_penality` tinyint(1) NOT NULL, + `result_screen_time` int(11) NOT NULL, + `dynamic_track` tinyint(1) NOT NULL, + `track_condition` varchar(40) NOT NULL, + `start_value` int(11) NOT NULL, + `randomness` int(11) NOT NULL, + `transferred_grip` int(11) NOT NULL, + `laps_to_improve_grip` int(11) NOT NULL, + `kick_vote_quorum` int(11) NOT NULL, + `session_vote_quorum` int(11) NOT NULL, + `vote_duration` int(11) NOT NULL, + `blacklist` varchar(40) NOT NULL, + `max_collisions_km` int(11) NOT NULL, + `booking` tinyint(1) NOT NULL, + `booking_time` int(11) NOT NULL, + `practice` tinyint(1) NOT NULL, + `practice_time` int(11) NOT NULL, + `can_join_practice` tinyint(1) NOT NULL, + `qualify` tinyint(1) NOT NULL, + `qualify_time` int(11) NOT NULL, + `can_join_qualify` tinyint(1) NOT NULL, + `race` tinyint(1) NOT NULL, + `race_laps` int(11) NOT NULL, + `race_time` int(11) NOT NULL, + `race_wait_time` int(11) NOT NULL, + `race_extra_lap` tinyint(1) NOT NULL, + `join_type` varchar(40) NOT NULL, + `time` varchar(20) NOT NULL, + `sun_angle` int(11) NOT NULL, + `track` varchar(100) NOT NULL, + `track_config` varchar(100) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE `settings` ( + `id` int(10) UNSIGNED NOT NULL, + `folder` text NOT NULL, + `executable` text NOT NULL, + `args` varchar(500) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE `user` ( + `id` int(10) UNSIGNED NOT NULL, + `login` varchar(40) NOT NULL, + `email` varchar(200) NOT NULL, + `password` varchar(64) NOT NULL, + `admin` tinyint(1) NOT NULL, + `moderator` tinyint(1) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE `weather` ( + `id` int(10) UNSIGNED NOT NULL, + `configuration` int(10) UNSIGNED NOT NULL, + `weather` varchar(40) NOT NULL, + `base_ambient_temp` int(11) NOT NULL, + `realistic_road_temp` int(11) NOT NULL, + `base_road_temp` int(11) NOT NULL, + `ambient_variation` int(11) NOT NULL, + `road_variation` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + + +ALTER TABLE `cars` + ADD PRIMARY KEY (`id`), + ADD KEY `cars_config_fk` (`configuration`); + +ALTER TABLE `configurations` + ADD PRIMARY KEY (`id`); + +ALTER TABLE `settings` + ADD PRIMARY KEY (`id`); + +ALTER TABLE `user` + ADD PRIMARY KEY (`id`); + +ALTER TABLE `weather` + ADD PRIMARY KEY (`id`), + ADD KEY `weather_config_fk` (`configuration`); + + +ALTER TABLE `cars` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=42; +ALTER TABLE `configurations` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; +ALTER TABLE `settings` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2; +ALTER TABLE `user` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2; +ALTER TABLE `weather` + MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=16; + +ALTER TABLE `cars` + ADD CONSTRAINT `cars_config_fk` FOREIGN KEY (`configuration`) REFERENCES `configurations` (`id`); + +ALTER TABLE `weather` + ADD CONSTRAINT `weather_config_fk` FOREIGN KEY (`configuration`) REFERENCES `configurations` (`id`); + diff --git a/release/v1.1.0/public/app.js b/release/v1.1.0/public/app.js new file mode 100644 index 0000000..765a7f4 --- /dev/null +++ b/release/v1.1.0/public/app.js @@ -0,0 +1,2079 @@ +var VERSION = '1.1.0'; +var _MS_PER_DAY = 1000 * 60 * 60 * 24; + +// Returns date in format dd.mm.yyyy hh:mi:ss. +Date.prototype.formatDE = function(withTime){ + var day = _addLeadingZero(this.getDate()); + var month = _addLeadingZero(this.getMonth()+1); + var year = this.getFullYear(); + var hours = _addLeadingZero(this.getHours()); + var minutes = _addLeadingZero(this.getMinutes()); + var seconds = _addLeadingZero(this.getSeconds()); + + return [day, month, year].join('.')+' '+[hours, minutes, seconds].join(':'); +}; + +// Returns date in format dd.mm.yyyy. +Date.prototype.formatDDMMYYYY = function(){ + var day = _addLeadingZero(this.getDate()); + var month = _addLeadingZero(this.getMonth()+1); + var year = this.getFullYear(); + + return [day, month, year].join('.'); +}; + +// Returns date in format yyyy-mm-dd. +Date.prototype.formatYYYYMMDD = function(){ + var day = _addLeadingZero(this.getDate()); + var month = _addLeadingZero(this.getMonth()+1); + var year = this.getFullYear(); + + return [year, month, day].join('-'); +}; + +// Returns date in format hh:mi. +Date.prototype.formatHHMI = function(){ + var hours = _addLeadingZero(this.getHours()); + var minutes = _addLeadingZero(this.getMinutes()); + + return [hours, minutes].join(':'); +}; + +// Parses time only from given ISO string. +Date.parseTime = function(time){ + var date = new Date(0); + var hours = parseInt(time.substring(11, 13)); + var minutes = parseInt(time.substring(14, 16)); + + date.setHours(hours); + date.setMinutes(minutes); + + return date; +}; + +function _addLeadingZero(time){ + if(time < 10){ + return '0'+time + } + + return time +} +// Extracts hours and minutes in 24h format from string in format hh:mi +// and returns them as object. Throws an error if time is invalid. +function parseTime(time){ + var split = time.split(':'); + var hours = parseInt(split[0]); + var minutes = parseInt(split[1]); + + if(hours < 0 || hours > 23 || minutes < 0 || minutes > 59){ + throw 'Hours and minutes must be within range 00-23 and 00-59'; + } + + return {hours: hours, minutes: minutes}; +} + +// Returns hours, minutes for given date in format hh:mi. +function getTimeHHMI(date){ + var minutes = date/1000/60; + var hours = Math.floor(minutes/60); + minutes -= hours*60; + hours = _addLeadingZero(hours); + minutes = _addLeadingZero(minutes); + + return [hours, minutes].join(':'); +} +var SessionService = { + data: { + userId: 0 + }, + init: function(data){ + if(!data){ + return; + } + + this.data.userId = data.user_id; + }, + login: function(router, data){ + this.init(data.data); + router.push('/instance'); + }, + logout: function(router){ + this.data.userId = 0; + + Vue.http.put('/api/logout') + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + } + + router.push('/'); + }); + } +}; +Vue.component('msg', { + props: ['type', 'msg'], + template: '
\ + {{msg}}\ +
' +}); +Vue.component('hmenu', { + template: '', + data: function(){ + return { + version: VERSION + } + }, + methods: { + performLogout: function(){ + SessionService.logout(this.$router); + } + } +}); +Vue.component('About', { + template: '
\ + \ +\ +
\ +

About

\ + \ +
\ +
\ + Assetto Corsa server web interface
\ + Version {{version}}
\ + © 2017 Marvin Blum
\ +
\ + View on GitHub\ +
\ +
\ +
\ +
', + data: function(){ + return { + version: VERSION + } + } +}); +Vue.component('Configuration', { + template: '
\ + \ +\ +
\ +

Configurations

\ + \ +
\ +
\ +

Create/Edit Configuration

\ +\ + \ + \ + \ + \ +\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +

Basic Settings

Name:
Password:
Admin password:
Pickup mode:
Lock entry list:
Race Pit Window Start:
Race Pit Window End:
Reversed Grid Race Postion:
Loop mode:
Show on lobby:
Max. slots:
Result screen time:
Welcome message:
Description:

Advanced Settings

UDP port:
TCP port:
HTTP port:
Packets Hz:
Threads:\ + \ +

Assists

ABS:\ + \ +
TC:\ + \ +
Stability aid:
Auto clutch:
Tyre blankets:
Force virtual mirror:

Realism

Fuel rate:
Damage rate:
Tires wear rate:
Allowed tires out:\ + \ +
Max ballast:
Disable gas cut penality:
Legal Tyres:
UDP Plugin Local Port:
UDP Plugin Address:

Dynamic Track

Dynamic track:
Condition:\ + \ +
Start value:
Randomness:
Transferred grip:
Laps to improve grip:

Voting

Kick vote quorum:
Session vote quorum:
Vote duration:
Blacklist:\ + \ +
Max. collisions per KM:

Booking

Booking:
Booking time:

Practice

Practice:
Practice time:
Can join:

Qualify

Qualify:
Qualify time:
Can join:

Race

Race:
Race laps:
Race time:
Race overtime:
Race wait time:
Race extra lap:
Join type:\ + \ +

Time

Time:\ + \ + (08:00 - 18:00, 30 minute steps)\ +
Sun angle:

Weather

\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
Weather:\ + \ + \ + \ +
Base ambient temp:
Base road temp:
Ambient variation:
Road variation:
Wind Base Speed Min:
Wind Base Speed Max:
Wind Base Direction:
Wind Variation Direction:
\ +

Track

\ +
\ +
\ + {{track.name}}\ + ({{track.max_slots}})\ + {{track.description}}\ +
\ +
\ +

Cars/Entry List

\ + \ + \ + \ + \ + \ + \ +
\ + Car\ +\ +
\ +
\ + {{car.name}}\ + {{car.description}}\ +
\ +
\ +
\ + Painting\ +\ +
\ +
\ + {{painting}}\ +
\ +
\ +
\ + Slot Settings\ +\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
Spectator:
Driver:
Team:
GUID:
Fixed Setup:
\ +
\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
CarPaintingSpectatorDriverTeamGUIDFixed Setup
{{car.car}}{{car.painting}}{{car.spectator}}{{car.driver}}{{car.team}}{{car.guid}}{{car.fixed_setup}}\ + \ + \ + \ +
\ +
\ +\ + \ + \ + \ + \ +\ + \ + \ +
\ +
\ +
\ +\ +
\ +
\ +

Remove Configuration

\ +\ + \ +\ +

Do you really want to remove this configuration? This won\'t stop any instances currently running.

\ +\ + \ + \ +
\ +
\ +\ +
\ +
\ + \ + \ +\ + \ +\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
IDNameInfo
{{config.id}}{{config.name}}{{config.track}}\ + \ + \ + \ + \ + \ + \ +
\ +
\ +
\ +
\ +
', + data: function(){ + return { + configs: [], + tracks: [], + cars: [], + activePaintings: [], + selectedTrack: 0, + selectedCar: 0, + selectedPainting: 0, + spectator: false, + driver: '', + team: '', + guid: '', + fixed_setup: '', + // --- + selectedCars: [], + weather: [], + // --- + _id: 0, + name: 'Servername', + pwd: '', + admin_pwd: '', + pickup_mode: true, + lock_entry_list: false, + race_overtime: 60, + max_slots: 0, + result_screen_time: 60, + welcome: '', + description: '', + udp: 9600, + tcp: 9600, + http: 8081, + packets_hz: 18, + loop_mode: true, + show_in_lobby: true, + threads: 2, + abs: 1, + tc: 1, + stability_aid: false, + auto_clutch: false, + tyre_blankets: true, + force_virtual_mirror: true, + fuel_rate: 100, + damage_rate: 50, + tires_wear_rate: 100, + allowed_tires_out: 2, + max_ballast: 150, + disable_gas_cut_penality: false, + dynamic_track: true, + condition: 'CUSTOM', + start_value: 100, + randomness: 0, + transferred_grip: 100, + laps_to_improve_grip: 1, + kick_vote_quorum: 70, + session_vote_quorum: 70, + vote_duration: 15, + blacklist: 0, + max_collisions_km: 5, + booking: false, + booking_time: 0, + practice: true, + practice_time: 15, + can_join_practice: true, + qualify: true, + qualify_time: 15, + can_join_qualify: true, + race: true, + race_laps: 10, + race_time: 0, + race_wait_time: 60, + race_extra_lap: false, + join_type: 1, + time: '14:00', + sun_angle: 16, + track: '', + legal_tyres: '', + udp_plugin_local_port: 0, + udp_plugin_address: '', + race_pit_window_start: 0, + race_pit_window_end: 0, + reversed_grid_race_positions: 0, + // --- + err: 0, + addEditConfig: false, + removeConfig: false, + saved: false, + removed: false + } + }, + mounted: function(){ + this._load(); + }, + watch: { + condition: function (value) { + this.populateDynamicTrackWithPreset(value); + }, + time: function (value) { + this.calculateSunAngleByTime(value); + } + }, + methods: { + _load: function(){ + this.$http.get('/api/configuration') + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + return; + } + + this.configs = resp.data; + }); + + this.$http.get('/api/tracks') + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + return; + } + + this.tracks = resp.data; + }); + + this.$http.get('/api/cars') + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + return; + } + + this.cars = resp.data; + + if(this.cars.length){ + this.activePaintings = this.cars[0].paintings; + } + }); + }, + _reset: function(){ + this.spectator = false; + this.driver = ''; + this.team = ''; + this.guid = ''; + this.fixed_setup = ''; + + this.selectedCars = []; + this.weather = []; + + this._id = 0; + this.name = 'Servername'; + this.pwd = ''; + this.admin_pwd = ''; + this.pickup_mode = true; + this.lock_entry_list = false; + this.race_overtime = 60; + this.max_slots = 0; + this.result_screen_time = 60; + this.welcome = ''; + this.description = ''; + this.udp = 9600; + this.tcp = 9600; + this.http = 8081; + this.packets_hz = 18; + this.loop_mode = true; + this.show_in_lobby = true; + this.threads = 2; + this.abs = 1; + this.tc = 1; + this.stability_aid = false; + this.auto_clutch = false; + this.tyre_blankets = true; + this.force_virtual_mirror = true; + this.fuel_rate = 100; + this.damage_rate = 50; + this.tires_wear_rate = 100; + this.allowed_tires_out = 2; + this.max_ballast = 150; + this.disable_gas_cut_penality = false; + this.dynamic_track = true; + this.condition = 'CUSTOM'; + this.start_value = 100; + this.randomness = 0; + this.transferred_grip = 100; + this.laps_to_improve_grip = 1; + this.kick_vote_quorum = 70; + this.session_vote_quorum = 70; + this.vote_duration = 15; + this.blacklist = 0; + this.max_collisions_km = 5; + this.booking = false; + this.booking_time = 0; + this.practice = true; + this.practice_time = 15; + this.can_join_practice = true; + this.qualify = true; + this.qualify_time = 15; + this.can_join_qualify = true; + this.race = true; + this.race_laps = 10; + this.race_time = 0; + this.race_wait_time = 60; + this.race_extra_lap = false; + this.join_type = 1; + this.time = '14:00'; + this.sun_angle = 16; + this.track = ''; + this.legal_tyres = ''; + this.udp_plugin_local_port = 0; + this.udp_plugin_address = ''; + this.race_pit_window_start = 0; + this.race_pit_window_end = 0; + this.reversed_grid_race_positions = 0; + + this.err = 0; + this.addEditConfig = false; + this.removeConfig = false; + this.saved = false; + this.removed = false; + }, + _openConfig: function(id, copy){ + this.$http.get('/api/configuration', {params: {id: id}}) + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + return; + } + + // config + this.name = resp.data.name; + this.pwd = resp.data.pwd; + this.admin_pwd = resp.data.admin_pwd; + this.pickup_mode = resp.data.pickup_mode; + this.lock_entry_list = resp.data.lock_entry_list; + this.race_overtime = resp.data.race_overtime; + this.max_slots = resp.data.max_slots; + this.welcome = resp.data.welcome; + this.description = resp.data.description; + this.udp = resp.data.udp; + this.tcp = resp.data.tcp; + this.http = resp.data.http; + this.packets_hz = resp.data.packets_hz; + this.loop_mode = resp.data.loop_mode; + this.show_in_lobby = resp.data.show_in_lobby; + this.threads = resp.data.threads; + this.abs = resp.data.abs; + this.tc = resp.data.tc; + this.stability_aid = resp.data.stability_aid; + this.auto_clutch = resp.data.auto_clutch; + this.tyre_blankets = resp.data.tyre_blankets; + this.force_virtual_mirror = resp.data.force_virtual_mirror; + this.fuel_rate = resp.data.fuel_rate; + this.damage_rate = resp.data.damage_rate; + this.tires_wear_rate = resp.data.tires_wear_rate; + this.allowed_tires_out = resp.data.allowed_tires_out; + this.max_ballast = resp.data.max_ballast; + this.disable_gas_cut_penality = resp.data.disable_gas_cut_penality; + this.result_screen_time = resp.data.result_screen_time; + this.dynamic_track = resp.data.dynamic_track; + this.condition = resp.data.condition; + this.start_value = resp.data.start_value; + this.randomness = resp.data.randomness; + this.transferred_grip = resp.data.transferred_grip; + this.laps_to_improve_grip = resp.data.laps_to_improve_grip; + this.kick_vote_quorum = resp.data.kick_vote_quorum; + this.session_vote_quorum = resp.data.session_vote_quorum; + this.vote_duration = resp.data.vote_duration; + this.blacklist = resp.data.blacklist; + this.max_collisions_km = resp.data.max_collisions_km; + this.booking = resp.data.booking; + this.booking_time = resp.data.booking_time; + this.practice = resp.data.practice; + this.practice_time = resp.data.practice_time; + this.can_join_practice = resp.data.can_join_practice; + this.qualify = resp.data.qualify; + this.qualify_time = resp.data.qualify_time; + this.can_join_qualify = resp.data.can_join_qualify; + this.race = resp.data.race; + this.race_laps = resp.data.race_laps; + this.race_time = resp.data.race_time; + this.race_wait_time = resp.data.race_wait_time; + this.race_extra_lap = resp.data.race_extra_lap; + this.join_type = resp.data.join_type; + this.sun_angle = resp.data.sun_angle; + this.time = this.calculateTimeBySunAngle(this.sun_angle); + this.legal_tyres = resp.data.legal_tyres; + this.udp_plugin_local_port = resp.data.udp_plugin_local_port; + this.udp_plugin_address = resp.data.udp_plugin_address; + this.race_pit_window_start = resp.data.race_pit_window_start; + this.race_pit_window_end = resp.data.race_pit_window_end; + this.reversed_grid_race_positions = resp.data.reversed_grid_race_positions; + + if(copy){ + this.name += ' (copy)'; + } + + // track + for(var i = 0; i < this.tracks.length; i++){ + if(this.tracks[i].name == resp.data.track && this.tracks[i].config == resp.data.track_config){ + this.selectTrack(i); + break; + } + } + + // weather + this.weather = resp.data.weather; + + if(copy){ + for(var i = 0; i < this.weather.length; i++){ + this.weather[i].id = 0; + } + } + + // cars + this.selectedCars = resp.data.cars; + + if(copy){ + for(var i = 0; i < this.selectedCars.length; i++){ + this.selectedCars[i].id = 0; + } + } + + this.addEditConfig = true; + }); + }, + openAddEditConfig: function(id){ + this._reset(); + + if(id){ + this._id = id; + this._openConfig(id, false); + } + else{ + this.addEditConfig = true; + } + }, + openRemoveConfig: function(id){ + this._reset(); + + if(!id){ + return; + } + + this._id = id; + this.removeConfig = true; + }, + copyConfig: function(id){ + this._openConfig(id, true); + }, + performAddEditConfig: function(){ + for(var i = 0; i < this.weather.length; i++){ + this.weather[i].base_ambient_temp = parseInt(this.weather[i].base_ambient_temp); + this.weather[i].base_road_temp = parseInt(this.weather[i].base_road_temp); + this.weather[i].ambient_variation = parseInt(this.weather[i].ambient_variation); + this.weather[i].road_variation = parseInt(this.weather[i].road_variation); + this.weather[i].wind_base_speed_min = parseInt(this.weather[i].wind_base_speed_min); + this.weather[i].wind_base_speed_max = parseInt(this.weather[i].wind_base_speed_max); + this.weather[i].wind_base_direction = parseInt(this.weather[i].wind_base_direction); + this.weather[i].wind_variation_direction = parseInt(this.weather[i].wind_variation_direction); + } + + for(var i = 0; i < this.selectedCars.length; i++){ + this.selectedCars[i].position = i; + } + + var data = { + id: this._id, + name: this.name, + pwd: this.pwd, + admin_pwd: this.admin_pwd, + pickup_mode: this.pickup_mode, + lock_entry_list: this.lock_entry_list, + race_overtime: parseInt(this.race_overtime), + max_slots: parseInt(this.max_slots), + welcome: this.welcome, + description: this.description, + udp: parseInt(this.udp), + tcp: parseInt(this.tcp), + http: parseInt(this.http), + packets_hz: parseInt(this.packets_hz), + loop_mode: this.loop_mode, + show_in_lobby: this.show_in_lobby, + threads: parseInt(this.threads), + abs: parseInt(this.abs), + tc: parseInt(this.tc), + stability_aid: this.stability_aid, + auto_clutch: this.auto_clutch, + tyre_blankets: this.tyre_blankets, + force_virtual_mirror: this.force_virtual_mirror, + fuel_rate: parseInt(this.fuel_rate), + damage_rate: parseInt(this.damage_rate), + tires_wear_rate: parseInt(this.tires_wear_rate), + allowed_tires_out: parseInt(this.allowed_tires_out), + max_ballast: parseInt(this.max_ballast), + disable_gas_cut_penality: this.disable_gas_cut_penality, + result_screen_time: parseInt(this.result_screen_time), + dynamic_track: this.dynamic_track, + condition: this.condition, + start_value: parseInt(this.start_value), + randomness: parseInt(this.randomness), + transferred_grip: parseInt(this.transferred_grip), + laps_to_improve_grip: parseInt(this.laps_to_improve_grip), + kick_vote_quorum: parseInt(this.kick_vote_quorum), + session_vote_quorum: parseInt(this.session_vote_quorum), + vote_duration: parseInt(this.vote_duration), + blacklist: parseInt(this.blacklist), + max_collisions_km: parseInt(this.max_collisions_km), + booking: this.booking, + booking_time: parseInt(this.booking_time), + practice: this.practice, + practice_time: parseInt(this.practice_time), + can_join_practice: this.can_join_practice, + qualify: this.qualify, + qualify_time: parseInt(this.qualify_time), + can_join_qualify: this.can_join_qualify, + race: this.race, + race_laps: parseInt(this.race_laps), + race_time: parseInt(this.race_time), + race_wait_time: parseInt(this.race_wait_time), + race_extra_lap: this.race_extra_lap, + join_type: parseInt(this.join_type), + sun_angle: parseInt(this.sun_angle), + time: this.calculateTimeBySunAngle(parseInt(this.sun_angle)), + weather: this.weather, + track: this.track.name, + track_config: this.track.config, + legal_tyres: this.legal_tyres, + udp_plugin_local_port: parseInt(this.udp_plugin_local_port), + udp_plugin_address: this.udp_plugin_address, + race_pit_window_start: parseInt(this.race_pit_window_start), + race_pit_window_end: parseInt(this.race_pit_window_end), + reversed_grid_race_positions: parseInt(this.reversed_grid_race_positions), + cars: this.selectedCars + }; + + this.$http.post('/api/configuration', data) + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + this.err = resp.data.code; + return; + } + + this._reset(); + this._load(); + this.saved = true; + }); + }, + performRemoveConfig: function(){ + this.$http.delete('/api/configuration', {params: {id: this._id}}) + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + this.err = resp.data.code; + return; + } + + this._reset(); + this._load(); + this.removed = true; + }); + }, + addWeather: function(){ + this.weather.push({ + weather: 'Clear', + base_ambient_temp: 20, + base_road_temp: 18, + ambient_variation: 1, + road_variation: 1, + wind_base_speed_min: 0, + wind_base_speed_max: 0, + wind_base_direction: 0, + wind_variation_direction: 0 + }); + }, + removeWeather: function(i){ + this.weather.splice(i, 1); + }, + selectTrack: function(i){ + this.selectedTrack = i; + this.track = this.tracks[i]; + }, + selectCar: function(i){ + this.selectedCar = i; + this.selectedPainting = 0; + this.activePaintings = this.cars[i].paintings; + }, + selectPainting: function(i){ + this.selectedPainting = i; + }, + addCar: function(){ + var car = this.cars[this.selectedCar]; + this.selectedCars.push({ + car: car.name, + painting: car.paintings[this.selectedPainting], + spectator: this.spectator, + driver: this.driver, + team: this.team, + guid: this.guid, + position: this.selectedCars.length, + fixed_setup: this.fixed_setup + }); + + // only reset driver and GUID in case user wants to add multiple similar slots + this.driver = ''; + this.guid = ''; + }, + carUp: function(i){ + if(i == 0){ + return; + } + + var car = this.selectedCars[i-1]; + Vue.set(this.selectedCars, i-1, this.selectedCars[i]); + Vue.set(this.selectedCars, i, car); + }, + carDown: function(i){ + if(i == this.selectedCars.length-1){ + return; + } + + var car = this.selectedCars[i+1]; + Vue.set(this.selectedCars, i+1, this.selectedCars[i]); + Vue.set(this.selectedCars, i, car); + }, + removeCar: function(i){ + this.selectedCars.splice(i, 1); + }, + populateDynamicTrackWithPreset: function(preset) { + switch(preset) { + case 'DUSTY': + this.start_value = 86; + this.randomness = 1; + this.transferred_grip = 50; + this.laps_to_improve_grip = 30; + break; + case 'OLD': + this.start_value = 89; + this.randomness = 3; + this.transferred_grip = 80; + this.laps_to_improve_grip = 50; + break; + case 'SLOW': + this.start_value = 96; + this.randomness = 1; + this.transferred_grip = 80; + this.laps_to_improve_grip = 300; + break; + case 'GREEN': + this.start_value = 95; + this.randomness = 2; + this.transferred_grip = 90; + this.laps_to_improve_grip = 132; + break; + case 'FAST': + this.start_value = 98; + this.randomness = 2; + this.transferred_grip = 80; + this.laps_to_improve_grip = 700; + break; + case 'OPTIMUM': + this.start_value = 100; + this.randomness = 0; + this.transferred_grip = 100; + this.laps_to_improve_grip = 1; + break; + } + }, + generateCfgDownloadUrl: function (id) { + return '/api/configuration?id=' + id + '&dl=1'; + }, + calculateSunAngleByTime: function(time) { + var totalHours = parseInt(time.replace(':', ''), 10); + + if (isNaN(totalHours) || totalHours < 800 || totalHours > 1800) { + // Invalid date, default to 0 (13:00) + this.sun_angle = 0; + return; + } + + var timeParts = time.split(':'); + var hours = parseInt(timeParts[0], 10); + var minutes = parseInt(timeParts[1], 10); + + // Calculate the time in minutes and subtract 13 hours + // The sun angle can range from -80 to 80 in the time frame 08:00h - 18:00h + // e.g. 08:00 = 480min. - 780min. = -300 / 30 = -10 * 8 = -80 + // e.g. 13:00 = 780min. - 780min. = 0 / 30 = 0 * 8 = 0 + // e.g. 16:30 = 990min. - 780min. = 210 / 30 = 7 * 8 = 56 + var totalMinutes = (hours * 60 + minutes) - 780; + + this.sun_angle = Math.floor(totalMinutes / 30) * 8; + }, + calculateTimeBySunAngle: function(sun_angle) { + var totalHours = ((sun_angle / 8) * 30 + 780) / 60; + var hrs = totalHours.toString(); + + return Math.floor(totalHours).toString() + ':' + (hrs[hrs.length - 1] === '5' ? '30' : '00'); + } + } +}); +Vue.component('Instance', { + template: '
\ + \ +\ +
\ +

Status

\ +\ +
\ +
\ +

Start New Instance

\ +\ + \ + \ +\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
Name:
Configuration:\ + \ +
\ + \ + \ +
\ +
\ +
\ +
\ +\ +
\ +
\ +

Stop Instance

\ +\ + \ +\ +

Do you really want to stop this server instance?

\ +\ + \ + \ +
\ +
\ +\ +
\ +
\ +

Log Output

\ +\ + \ +\ + \ +
\ +
\ +\ +
\ +
\ +

Active Server Instances

\ +\ + \ + \ +\ + \ +\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
PIDInstanceConfiguration
{{instance.pid}}{{instance.name}}\ + {{instance.configuration.name}}
\ + {{instance.configuration.track}}
\ + TCP: {{instance.configuration.tcp}} UPD: {{instance.configuration.udp}}\ +
\ + \ + \ + \ + \ +
\ +
\ +
\ +\ +
\ +
\ +

Log Files

\ +\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
FilenameDateSize
{{log.file}}{{log.date}}{{log.size}}\ + \ +
\ +
\ +
\ +
\ +
', + data: function(){ + return { + _pid: 0, + instances: [], + configs: [], + logs: [], + err: 0, + name: '', + config: 0, + log: '', + showLog: false, + started: false, + stopped: false, + startInstance: false, + stopInstance: false + } + }, + mounted: function(){ + this._load(); + }, + methods: { + _load: function(){ + this.$http.get('/api/configuration') + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + return; + } + + this.configs = resp.data; + this._loadInstances(); + }); + + this.$http.get('/api/instance/log') + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + return; + } + + this.logs = resp.data; + + // reverse + for(var i = this.logs.length-1; i >= 0; i--){ + this.logs[i].date = new Date(this.logs[i].date).formatDE(); + + if(this.logs[i].size > 1024*1024){ + this.logs[i].size = Math.round(this.logs[i].size/1024/1024*100)/100+' MB'; + } + else if(this.logs[i].size > 1024){ + this.logs[i].size = Math.round(this.logs[i].size/1024*100)/100+' KB'; + } + else{ + this.logs[i].size = Math.round(this.logs[i].size*100)/100+' Byte'; + } + } + }); + }, + _loadInstances: function(){ + this.$http.get('/api/instance') + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + return; + } + + this.instances = resp.data; + + for(var i = 0; i < this.instances.length; i++){ + this.instances[i].configuration = this._getConfigName(this.instances[i].configuration); + } + }); + }, + _getConfigName: function(id){ + for(i in this.configs){ + if(id == this.configs[i].id){ + return this.configs[i]; + } + } + + return null; + }, + _reset: function(){ + this.err = 0; + this.name = ''; + this.config = 0; + this.log = ''; + this.showLog = false; + this.started = false; + this.stopped = false; + this.startInstance = false; + this.stopInstance = false; + }, + performStart: function(){ + this.$http.post('/api/instance', {name: this.name, config: this.config}) + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + this.err = resp.data.code; + return; + } + + this._reset(); + this._load(); + this.started = true; + }); + }, + showStopInstance: function(pid){ + this._reset(); + + if(!pid){ + return; + } + + this._pid = pid; + this.stopInstance = true; + }, + performStop: function(){ + this.$http.delete('/api/instance', {params: {pid: this._pid}}) + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + this.err = resp.data.code; + return; + } + + this._reset(); + this._load(); + this.stopped = true; + }); + }, + openLog: function(file){ + this._reset(); + + this.$http.get('/api/instance/log', {params: {file: file}}) + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + return; + } + + var log = resp.data.substr(1, resp.data.length-2).split('\\n'); + this.log = log.join('\n'); + this.showLog = true; + }); + }, + generateInstanceDownloadUrl: function (id) { + return '/api/configuration?id=' + id + '&dl=2'; + } + } +}); +Vue.component('Login', { + template: '
\ +
\ + \ +
\ +\ +
\ +
\ +

Login

\ +\ + \ +\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
Login/E-Mail:
Password:
\ +
\ +
\ +
\ +\ +
\ +
\ + Version {{version}} | © 2017 Marvin Blum | GitHub\ +
\ +
\ +
', + data: function(){ + return { + version: VERSION, + err: 0, + login: '', + pwd: '' + } + }, + methods: { + performLogin: function(){ + this.$http.post('/api/login', {login: this.login, pwd: this.pwd}) + .then(function(resp){ + if(resp.data.code){ + this.err = resp.data.code; + return; + } + + SessionService.login(this.$router, resp.data); + }); + } + } +}); +Vue.component('Settings', { + template: '
\ + \ +\ +
\ +

Settings

\ + \ +
\ +
\ +

Server Settings

\ +\ + \ + \ + \ +\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
AC server folder:
Executable:
Arguments:
\ +
\ +
\ +
\ +\ +
\ +
\ + The AC server folder must be the full path to your AC server installation folder, containing the acServer executable. Example: /home/acuser/steam/steamapps/common/Assetto Corsa Dedicated Server
\ + Executable is the executable file to start a server instance. Example: acServer
\ + Arguments are the arguments passed to the executable to start a server instance, separated by spaces. Example: linux

\ +\ + Make sure the web interface has the permissions to read, write and execute within the server folder. If you cannot start instances, please test your settings on your server.\ +
\ +
\ +
\ +
', + data: function(){ + return { + err: 0, + folder: '', + executable: '', + args: '', + saved: false + } + }, + mounted: function(){ + this._load(); + }, + methods: { + _load: function(){ + this.$http.get('/api/settings') + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + return; + } + + this.folder = resp.data.folder; + this.executable = resp.data.executable; + this.args = resp.data.args; + }); + }, + performSave: function(){ + this.saved = false; + + this.$http.post('/api/settings', {folder: this.folder, + executable: this.executable, + args: this.args}) + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + this.err = resp.data.code; + return; + } + + this.saved = true; + }); + } + } +}); +Vue.component('User', { + template: '
\ + \ +\ +
\ +

User

\ +\ +
\ +
\ +

Create/Edit User

\ +\ + \ + \ + \ + \ + \ +\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
Login:
E-Mail:
Password:
Repeat password:
Administrator:
Moderator:
\ + \ + \ +
\ +
\ +
\ +
\ +\ +
\ +
\ +

Remove User

\ +\ + \ +\ +

Do you really want to remove this user?

\ +\ + \ + \ +
\ +
\ +\ +
\ +
\ + \ + \ +\ + \ +\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
IDLoginE-MailRole
{{u.id}}{{u.login}}{{u.email}}\ + Administrator\ + Moderator\ + \ + \ + \ +
\ +
\ +
\ +\ +
\ +
\ + Administrators have full access and can change all settings (including changing user passwords).
\ + Moderators can start/stop server instances and create, change and remove configurations.
\ + Other users have read access, except for user E-Mail addresses.\ +
\ +
\ +
\ +
', + data: function(){ + return { + user: [], + _id: 0, + login: '', + email: '', + pwd1: '', + pwd2: '', + admin: false, + moderator: false, + err: 0, + addEditUser: false, + removeUser: false, + userSaved: false, + userRemoved: false + } + }, + mounted: function(){ + this._load(); + }, + methods: { + _load: function(){ + this.$http.get('/api/user') + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + return; + } + + this.user = resp.data; + }); + }, + _reset: function(){ + this._id = 0; + this.login = ''; + this.email = ''; + this.pwd1 = ''; + this.pwd2 = ''; + this.admin = false; + this.moderator = false; + this.err = 0; + this.addEditUser = false; + this.removeUser = false; + this.userSaved = false; + this.userRemoved = false; + }, + openAddEditUser: function(id){ + this._reset(); + + if(id){ + this._id = id; + + this.$http.get('/api/user', {params: {id: id}}) + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + return; + } + + this.login = resp.data.login; + this.email = resp.data.email; + this.admin = resp.data.admin; + this.moderator = resp.data.moderator; + this.addEditUser = true; + }); + } + else{ + this.addEditUser = true; + } + }, + openRemoveUser: function(id){ + this._reset(); + + if(!id){ + return; + } + + this._id = id; + this.removeUser = true; + }, + performAddEditUser: function(){ + this.$http.post('/api/user', {id: this._id, + login: this.login, + email: this.email, + pwd1: this.pwd1, + pwd2: this.pwd2, + admin: this.admin, + moderator: this.moderator}) + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + this.err = resp.data.code; + return; + } + + this._reset(); + this._load(); + this.userSaved = true; + }); + }, + performRemoveUser: function(){ + this.$http.delete('/api/user', {params: {id: this._id}}) + .then(function(resp){ + if(resp.data.code){ + console.log(resp.data.code+': '+resp.data.msg); + this.err = resp.data.code; + return; + } + + this._reset(); + this._load(); + this.userRemoved = true; + }); + } + } +}); +Vue.use(VueRouter); +Vue.use(VueResource); + +var router = new VueRouter({ + routes: [ + { + path: '/', + component: Vue.component('Login') + }, + { + path: '/instance', + component: Vue.component('Instance') + }, + { + path: '/configuration', + component: Vue.component('Configuration') + }, + { + path: '/settings', + component: Vue.component('Settings') + }, + { + path: '/user', + component: Vue.component('User') + }, + { + path: '/about', + component: Vue.component('About') + }, + { + path: '*', + component: Vue.component('Dashboard') + } + ] +}); + +// Simple login check with redirection when not logged in. +router.beforeEach(function(to, from, next){ + Vue.http.get('/api/session') + .then(function(resp){ + // if not logged in and not on login page, redirect to login + if(resp.data.code && to.path != '/'){ + next('/'); + return; + } + + // if login or password page, but logged in, redirect to start page + if(!resp.data.code && to.path == '/'){ + next('/instance'); + return; + } + + SessionService.init(resp.data.data); + next(); + }); +}); + +window.onload = function(){ + new Vue({el: '#app', router: router}); +}; diff --git a/release/v1.1.0/public/css/main.css b/release/v1.1.0/public/css/main.css new file mode 100644 index 0000000..be3a7a8 --- /dev/null +++ b/release/v1.1.0/public/css/main.css @@ -0,0 +1,2653 @@ +@charset "UTF-8"; +@font-face { + font-family: "Roboto"; + font-style: normal; + font-weight: 400; + src: url("../fonts/Roboto-Regular.ttf"); } + +@font-face { + font-family: "Roboto"; + font-style: italic; + font-weight: 400; + src: url("../fonts/Roboto-Italic.ttf"); } + +@font-face { + font-family: "Roboto"; + font-style: normal; + font-weight: 300; + src: url("../fonts/Roboto-Thin.ttf"); } + +@font-face { + font-family: "Roboto"; + font-style: italic; + font-weight: 300; + src: url("../fonts/Roboto-ThinItalic.ttf"); } + +@font-face { + font-family: "Roboto"; + font-style: normal; + font-weight: 700; + src: url("../fonts/Roboto-Bold.ttf"); } + +@font-face { + font-family: "Roboto"; + font-style: italic; + font-weight: 700; + src: url("../fonts/Roboto-BoldItalic.ttf"); } + +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url("../fonts/fontawesome-webfont.eot?v=4.7.0"); + src: url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"), url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"), url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"), url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"), url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg"); + font-weight: normal; + font-style: normal; } + +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -15%; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-fw { + width: 1.28571em; + text-align: center; } + +.fa-ul { + padding-left: 0; + margin-left: 2.14286em; + list-style-type: none; } + .fa-ul > li { + position: relative; } + +.fa-li { + position: absolute; + left: -2.14286em; + width: 2.14286em; + top: 0.14286em; + text-align: center; } + .fa-li.fa-lg { + left: -1.85714em; } + +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eee; + border-radius: .1em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left { + margin-right: .3em; } + +.fa.fa-pull-right { + margin-left: .3em; } + +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; } + +.pull-left { + float: left; } + +.fa.pull-left { + margin-right: .3em; } + +.fa.pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-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); } } + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; } + +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; } + +.fa-stack-1x, .fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: ""; } + +.fa-music:before { + content: ""; } + +.fa-search:before { + content: ""; } + +.fa-envelope-o:before { + content: ""; } + +.fa-heart:before { + content: ""; } + +.fa-star:before { + content: ""; } + +.fa-star-o:before { + content: ""; } + +.fa-user:before { + content: ""; } + +.fa-film:before { + content: ""; } + +.fa-th-large:before { + content: ""; } + +.fa-th:before { + content: ""; } + +.fa-th-list:before { + content: ""; } + +.fa-check:before { + content: ""; } + +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: ""; } + +.fa-search-plus:before { + content: ""; } + +.fa-search-minus:before { + content: ""; } + +.fa-power-off:before { + content: ""; } + +.fa-signal:before { + content: ""; } + +.fa-gear:before, +.fa-cog:before { + content: ""; } + +.fa-trash-o:before { + content: ""; } + +.fa-home:before { + content: ""; } + +.fa-file-o:before { + content: ""; } + +.fa-clock-o:before { + content: ""; } + +.fa-road:before { + content: ""; } + +.fa-download:before { + content: ""; } + +.fa-arrow-circle-o-down:before { + content: ""; } + +.fa-arrow-circle-o-up:before { + content: ""; } + +.fa-inbox:before { + content: ""; } + +.fa-play-circle-o:before { + content: ""; } + +.fa-rotate-right:before, +.fa-repeat:before { + content: ""; } + +.fa-refresh:before { + content: ""; } + +.fa-list-alt:before { + content: ""; } + +.fa-lock:before { + content: ""; } + +.fa-flag:before { + content: ""; } + +.fa-headphones:before { + content: ""; } + +.fa-volume-off:before { + content: ""; } + +.fa-volume-down:before { + content: ""; } + +.fa-volume-up:before { + content: ""; } + +.fa-qrcode:before { + content: ""; } + +.fa-barcode:before { + content: ""; } + +.fa-tag:before { + content: ""; } + +.fa-tags:before { + content: ""; } + +.fa-book:before { + content: ""; } + +.fa-bookmark:before { + content: ""; } + +.fa-print:before { + content: ""; } + +.fa-camera:before { + content: ""; } + +.fa-font:before { + content: ""; } + +.fa-bold:before { + content: ""; } + +.fa-italic:before { + content: ""; } + +.fa-text-height:before { + content: ""; } + +.fa-text-width:before { + content: ""; } + +.fa-align-left:before { + content: ""; } + +.fa-align-center:before { + content: ""; } + +.fa-align-right:before { + content: ""; } + +.fa-align-justify:before { + content: ""; } + +.fa-list:before { + content: ""; } + +.fa-dedent:before, +.fa-outdent:before { + content: ""; } + +.fa-indent:before { + content: ""; } + +.fa-video-camera:before { + content: ""; } + +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: ""; } + +.fa-pencil:before { + content: ""; } + +.fa-map-marker:before { + content: ""; } + +.fa-adjust:before { + content: ""; } + +.fa-tint:before { + content: ""; } + +.fa-edit:before, +.fa-pencil-square-o:before { + content: ""; } + +.fa-share-square-o:before { + content: ""; } + +.fa-check-square-o:before { + content: ""; } + +.fa-arrows:before { + content: ""; } + +.fa-step-backward:before { + content: ""; } + +.fa-fast-backward:before { + content: ""; } + +.fa-backward:before { + content: ""; } + +.fa-play:before { + content: ""; } + +.fa-pause:before { + content: ""; } + +.fa-stop:before { + content: ""; } + +.fa-forward:before { + content: ""; } + +.fa-fast-forward:before { + content: ""; } + +.fa-step-forward:before { + content: ""; } + +.fa-eject:before { + content: ""; } + +.fa-chevron-left:before { + content: ""; } + +.fa-chevron-right:before { + content: ""; } + +.fa-plus-circle:before { + content: ""; } + +.fa-minus-circle:before { + content: ""; } + +.fa-times-circle:before { + content: ""; } + +.fa-check-circle:before { + content: ""; } + +.fa-question-circle:before { + content: ""; } + +.fa-info-circle:before { + content: ""; } + +.fa-crosshairs:before { + content: ""; } + +.fa-times-circle-o:before { + content: ""; } + +.fa-check-circle-o:before { + content: ""; } + +.fa-ban:before { + content: ""; } + +.fa-arrow-left:before { + content: ""; } + +.fa-arrow-right:before { + content: ""; } + +.fa-arrow-up:before { + content: ""; } + +.fa-arrow-down:before { + content: ""; } + +.fa-mail-forward:before, +.fa-share:before { + content: ""; } + +.fa-expand:before { + content: ""; } + +.fa-compress:before { + content: ""; } + +.fa-plus:before { + content: ""; } + +.fa-minus:before { + content: ""; } + +.fa-asterisk:before { + content: ""; } + +.fa-exclamation-circle:before { + content: ""; } + +.fa-gift:before { + content: ""; } + +.fa-leaf:before { + content: ""; } + +.fa-fire:before { + content: ""; } + +.fa-eye:before { + content: ""; } + +.fa-eye-slash:before { + content: ""; } + +.fa-warning:before, +.fa-exclamation-triangle:before { + content: ""; } + +.fa-plane:before { + content: ""; } + +.fa-calendar:before { + content: ""; } + +.fa-random:before { + content: ""; } + +.fa-comment:before { + content: ""; } + +.fa-magnet:before { + content: ""; } + +.fa-chevron-up:before { + content: ""; } + +.fa-chevron-down:before { + content: ""; } + +.fa-retweet:before { + content: ""; } + +.fa-shopping-cart:before { + content: ""; } + +.fa-folder:before { + content: ""; } + +.fa-folder-open:before { + content: ""; } + +.fa-arrows-v:before { + content: ""; } + +.fa-arrows-h:before { + content: ""; } + +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: ""; } + +.fa-twitter-square:before { + content: ""; } + +.fa-facebook-square:before { + content: ""; } + +.fa-camera-retro:before { + content: ""; } + +.fa-key:before { + content: ""; } + +.fa-gears:before, +.fa-cogs:before { + content: ""; } + +.fa-comments:before { + content: ""; } + +.fa-thumbs-o-up:before { + content: ""; } + +.fa-thumbs-o-down:before { + content: ""; } + +.fa-star-half:before { + content: ""; } + +.fa-heart-o:before { + content: ""; } + +.fa-sign-out:before { + content: ""; } + +.fa-linkedin-square:before { + content: ""; } + +.fa-thumb-tack:before { + content: ""; } + +.fa-external-link:before { + content: ""; } + +.fa-sign-in:before { + content: ""; } + +.fa-trophy:before { + content: ""; } + +.fa-github-square:before { + content: ""; } + +.fa-upload:before { + content: ""; } + +.fa-lemon-o:before { + content: ""; } + +.fa-phone:before { + content: ""; } + +.fa-square-o:before { + content: ""; } + +.fa-bookmark-o:before { + content: ""; } + +.fa-phone-square:before { + content: ""; } + +.fa-twitter:before { + content: ""; } + +.fa-facebook-f:before, +.fa-facebook:before { + content: ""; } + +.fa-github:before { + content: ""; } + +.fa-unlock:before { + content: ""; } + +.fa-credit-card:before { + content: ""; } + +.fa-feed:before, +.fa-rss:before { + content: ""; } + +.fa-hdd-o:before { + content: ""; } + +.fa-bullhorn:before { + content: ""; } + +.fa-bell:before { + content: ""; } + +.fa-certificate:before { + content: ""; } + +.fa-hand-o-right:before { + content: ""; } + +.fa-hand-o-left:before { + content: ""; } + +.fa-hand-o-up:before { + content: ""; } + +.fa-hand-o-down:before { + content: ""; } + +.fa-arrow-circle-left:before { + content: ""; } + +.fa-arrow-circle-right:before { + content: ""; } + +.fa-arrow-circle-up:before { + content: ""; } + +.fa-arrow-circle-down:before { + content: ""; } + +.fa-globe:before { + content: ""; } + +.fa-wrench:before { + content: ""; } + +.fa-tasks:before { + content: ""; } + +.fa-filter:before { + content: ""; } + +.fa-briefcase:before { + content: ""; } + +.fa-arrows-alt:before { + content: ""; } + +.fa-group:before, +.fa-users:before { + content: ""; } + +.fa-chain:before, +.fa-link:before { + content: ""; } + +.fa-cloud:before { + content: ""; } + +.fa-flask:before { + content: ""; } + +.fa-cut:before, +.fa-scissors:before { + content: ""; } + +.fa-copy:before, +.fa-files-o:before { + content: ""; } + +.fa-paperclip:before { + content: ""; } + +.fa-save:before, +.fa-floppy-o:before { + content: ""; } + +.fa-square:before { + content: ""; } + +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: ""; } + +.fa-list-ul:before { + content: ""; } + +.fa-list-ol:before { + content: ""; } + +.fa-strikethrough:before { + content: ""; } + +.fa-underline:before { + content: ""; } + +.fa-table:before { + content: ""; } + +.fa-magic:before { + content: ""; } + +.fa-truck:before { + content: ""; } + +.fa-pinterest:before { + content: ""; } + +.fa-pinterest-square:before { + content: ""; } + +.fa-google-plus-square:before { + content: ""; } + +.fa-google-plus:before { + content: ""; } + +.fa-money:before { + content: ""; } + +.fa-caret-down:before { + content: ""; } + +.fa-caret-up:before { + content: ""; } + +.fa-caret-left:before { + content: ""; } + +.fa-caret-right:before { + content: ""; } + +.fa-columns:before { + content: ""; } + +.fa-unsorted:before, +.fa-sort:before { + content: ""; } + +.fa-sort-down:before, +.fa-sort-desc:before { + content: ""; } + +.fa-sort-up:before, +.fa-sort-asc:before { + content: ""; } + +.fa-envelope:before { + content: ""; } + +.fa-linkedin:before { + content: ""; } + +.fa-rotate-left:before, +.fa-undo:before { + content: ""; } + +.fa-legal:before, +.fa-gavel:before { + content: ""; } + +.fa-dashboard:before, +.fa-tachometer:before { + content: ""; } + +.fa-comment-o:before { + content: ""; } + +.fa-comments-o:before { + content: ""; } + +.fa-flash:before, +.fa-bolt:before { + content: ""; } + +.fa-sitemap:before { + content: ""; } + +.fa-umbrella:before { + content: ""; } + +.fa-paste:before, +.fa-clipboard:before { + content: ""; } + +.fa-lightbulb-o:before { + content: ""; } + +.fa-exchange:before { + content: ""; } + +.fa-cloud-download:before { + content: ""; } + +.fa-cloud-upload:before { + content: ""; } + +.fa-user-md:before { + content: ""; } + +.fa-stethoscope:before { + content: ""; } + +.fa-suitcase:before { + content: ""; } + +.fa-bell-o:before { + content: ""; } + +.fa-coffee:before { + content: ""; } + +.fa-cutlery:before { + content: ""; } + +.fa-file-text-o:before { + content: ""; } + +.fa-building-o:before { + content: ""; } + +.fa-hospital-o:before { + content: ""; } + +.fa-ambulance:before { + content: ""; } + +.fa-medkit:before { + content: ""; } + +.fa-fighter-jet:before { + content: ""; } + +.fa-beer:before { + content: ""; } + +.fa-h-square:before { + content: ""; } + +.fa-plus-square:before { + content: ""; } + +.fa-angle-double-left:before { + content: ""; } + +.fa-angle-double-right:before { + content: ""; } + +.fa-angle-double-up:before { + content: ""; } + +.fa-angle-double-down:before { + content: ""; } + +.fa-angle-left:before { + content: ""; } + +.fa-angle-right:before { + content: ""; } + +.fa-angle-up:before { + content: ""; } + +.fa-angle-down:before { + content: ""; } + +.fa-desktop:before { + content: ""; } + +.fa-laptop:before { + content: ""; } + +.fa-tablet:before { + content: ""; } + +.fa-mobile-phone:before, +.fa-mobile:before { + content: ""; } + +.fa-circle-o:before { + content: ""; } + +.fa-quote-left:before { + content: ""; } + +.fa-quote-right:before { + content: ""; } + +.fa-spinner:before { + content: ""; } + +.fa-circle:before { + content: ""; } + +.fa-mail-reply:before, +.fa-reply:before { + content: ""; } + +.fa-github-alt:before { + content: ""; } + +.fa-folder-o:before { + content: ""; } + +.fa-folder-open-o:before { + content: ""; } + +.fa-smile-o:before { + content: ""; } + +.fa-frown-o:before { + content: ""; } + +.fa-meh-o:before { + content: ""; } + +.fa-gamepad:before { + content: ""; } + +.fa-keyboard-o:before { + content: ""; } + +.fa-flag-o:before { + content: ""; } + +.fa-flag-checkered:before { + content: ""; } + +.fa-terminal:before { + content: ""; } + +.fa-code:before { + content: ""; } + +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: ""; } + +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: ""; } + +.fa-location-arrow:before { + content: ""; } + +.fa-crop:before { + content: ""; } + +.fa-code-fork:before { + content: ""; } + +.fa-unlink:before, +.fa-chain-broken:before { + content: ""; } + +.fa-question:before { + content: ""; } + +.fa-info:before { + content: ""; } + +.fa-exclamation:before { + content: ""; } + +.fa-superscript:before { + content: ""; } + +.fa-subscript:before { + content: ""; } + +.fa-eraser:before { + content: ""; } + +.fa-puzzle-piece:before { + content: ""; } + +.fa-microphone:before { + content: ""; } + +.fa-microphone-slash:before { + content: ""; } + +.fa-shield:before { + content: ""; } + +.fa-calendar-o:before { + content: ""; } + +.fa-fire-extinguisher:before { + content: ""; } + +.fa-rocket:before { + content: ""; } + +.fa-maxcdn:before { + content: ""; } + +.fa-chevron-circle-left:before { + content: ""; } + +.fa-chevron-circle-right:before { + content: ""; } + +.fa-chevron-circle-up:before { + content: ""; } + +.fa-chevron-circle-down:before { + content: ""; } + +.fa-html5:before { + content: ""; } + +.fa-css3:before { + content: ""; } + +.fa-anchor:before { + content: ""; } + +.fa-unlock-alt:before { + content: ""; } + +.fa-bullseye:before { + content: ""; } + +.fa-ellipsis-h:before { + content: ""; } + +.fa-ellipsis-v:before { + content: ""; } + +.fa-rss-square:before { + content: ""; } + +.fa-play-circle:before { + content: ""; } + +.fa-ticket:before { + content: ""; } + +.fa-minus-square:before { + content: ""; } + +.fa-minus-square-o:before { + content: ""; } + +.fa-level-up:before { + content: ""; } + +.fa-level-down:before { + content: ""; } + +.fa-check-square:before { + content: ""; } + +.fa-pencil-square:before { + content: ""; } + +.fa-external-link-square:before { + content: ""; } + +.fa-share-square:before { + content: ""; } + +.fa-compass:before { + content: ""; } + +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: ""; } + +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: ""; } + +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: ""; } + +.fa-euro:before, +.fa-eur:before { + content: ""; } + +.fa-gbp:before { + content: ""; } + +.fa-dollar:before, +.fa-usd:before { + content: ""; } + +.fa-rupee:before, +.fa-inr:before { + content: ""; } + +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: ""; } + +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: ""; } + +.fa-won:before, +.fa-krw:before { + content: ""; } + +.fa-bitcoin:before, +.fa-btc:before { + content: ""; } + +.fa-file:before { + content: ""; } + +.fa-file-text:before { + content: ""; } + +.fa-sort-alpha-asc:before { + content: ""; } + +.fa-sort-alpha-desc:before { + content: ""; } + +.fa-sort-amount-asc:before { + content: ""; } + +.fa-sort-amount-desc:before { + content: ""; } + +.fa-sort-numeric-asc:before { + content: ""; } + +.fa-sort-numeric-desc:before { + content: ""; } + +.fa-thumbs-up:before { + content: ""; } + +.fa-thumbs-down:before { + content: ""; } + +.fa-youtube-square:before { + content: ""; } + +.fa-youtube:before { + content: ""; } + +.fa-xing:before { + content: ""; } + +.fa-xing-square:before { + content: ""; } + +.fa-youtube-play:before { + content: ""; } + +.fa-dropbox:before { + content: ""; } + +.fa-stack-overflow:before { + content: ""; } + +.fa-instagram:before { + content: ""; } + +.fa-flickr:before { + content: ""; } + +.fa-adn:before { + content: ""; } + +.fa-bitbucket:before { + content: ""; } + +.fa-bitbucket-square:before { + content: ""; } + +.fa-tumblr:before { + content: ""; } + +.fa-tumblr-square:before { + content: ""; } + +.fa-long-arrow-down:before { + content: ""; } + +.fa-long-arrow-up:before { + content: ""; } + +.fa-long-arrow-left:before { + content: ""; } + +.fa-long-arrow-right:before { + content: ""; } + +.fa-apple:before { + content: ""; } + +.fa-windows:before { + content: ""; } + +.fa-android:before { + content: ""; } + +.fa-linux:before { + content: ""; } + +.fa-dribbble:before { + content: ""; } + +.fa-skype:before { + content: ""; } + +.fa-foursquare:before { + content: ""; } + +.fa-trello:before { + content: ""; } + +.fa-female:before { + content: ""; } + +.fa-male:before { + content: ""; } + +.fa-gittip:before, +.fa-gratipay:before { + content: ""; } + +.fa-sun-o:before { + content: ""; } + +.fa-moon-o:before { + content: ""; } + +.fa-archive:before { + content: ""; } + +.fa-bug:before { + content: ""; } + +.fa-vk:before { + content: ""; } + +.fa-weibo:before { + content: ""; } + +.fa-renren:before { + content: ""; } + +.fa-pagelines:before { + content: ""; } + +.fa-stack-exchange:before { + content: ""; } + +.fa-arrow-circle-o-right:before { + content: ""; } + +.fa-arrow-circle-o-left:before { + content: ""; } + +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: ""; } + +.fa-dot-circle-o:before { + content: ""; } + +.fa-wheelchair:before { + content: ""; } + +.fa-vimeo-square:before { + content: ""; } + +.fa-turkish-lira:before, +.fa-try:before { + content: ""; } + +.fa-plus-square-o:before { + content: ""; } + +.fa-space-shuttle:before { + content: ""; } + +.fa-slack:before { + content: ""; } + +.fa-envelope-square:before { + content: ""; } + +.fa-wordpress:before { + content: ""; } + +.fa-openid:before { + content: ""; } + +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: ""; } + +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: ""; } + +.fa-yahoo:before { + content: ""; } + +.fa-google:before { + content: ""; } + +.fa-reddit:before { + content: ""; } + +.fa-reddit-square:before { + content: ""; } + +.fa-stumbleupon-circle:before { + content: ""; } + +.fa-stumbleupon:before { + content: ""; } + +.fa-delicious:before { + content: ""; } + +.fa-digg:before { + content: ""; } + +.fa-pied-piper-pp:before { + content: ""; } + +.fa-pied-piper-alt:before { + content: ""; } + +.fa-drupal:before { + content: ""; } + +.fa-joomla:before { + content: ""; } + +.fa-language:before { + content: ""; } + +.fa-fax:before { + content: ""; } + +.fa-building:before { + content: ""; } + +.fa-child:before { + content: ""; } + +.fa-paw:before { + content: ""; } + +.fa-spoon:before { + content: ""; } + +.fa-cube:before { + content: ""; } + +.fa-cubes:before { + content: ""; } + +.fa-behance:before { + content: ""; } + +.fa-behance-square:before { + content: ""; } + +.fa-steam:before { + content: ""; } + +.fa-steam-square:before { + content: ""; } + +.fa-recycle:before { + content: ""; } + +.fa-automobile:before, +.fa-car:before { + content: ""; } + +.fa-cab:before, +.fa-taxi:before { + content: ""; } + +.fa-tree:before { + content: ""; } + +.fa-spotify:before { + content: ""; } + +.fa-deviantart:before { + content: ""; } + +.fa-soundcloud:before { + content: ""; } + +.fa-database:before { + content: ""; } + +.fa-file-pdf-o:before { + content: ""; } + +.fa-file-word-o:before { + content: ""; } + +.fa-file-excel-o:before { + content: ""; } + +.fa-file-powerpoint-o:before { + content: ""; } + +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: ""; } + +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: ""; } + +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: ""; } + +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: ""; } + +.fa-file-code-o:before { + content: ""; } + +.fa-vine:before { + content: ""; } + +.fa-codepen:before { + content: ""; } + +.fa-jsfiddle:before { + content: ""; } + +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: ""; } + +.fa-circle-o-notch:before { + content: ""; } + +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: ""; } + +.fa-ge:before, +.fa-empire:before { + content: ""; } + +.fa-git-square:before { + content: ""; } + +.fa-git:before { + content: ""; } + +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: ""; } + +.fa-tencent-weibo:before { + content: ""; } + +.fa-qq:before { + content: ""; } + +.fa-wechat:before, +.fa-weixin:before { + content: ""; } + +.fa-send:before, +.fa-paper-plane:before { + content: ""; } + +.fa-send-o:before, +.fa-paper-plane-o:before { + content: ""; } + +.fa-history:before { + content: ""; } + +.fa-circle-thin:before { + content: ""; } + +.fa-header:before { + content: ""; } + +.fa-paragraph:before { + content: ""; } + +.fa-sliders:before { + content: ""; } + +.fa-share-alt:before { + content: ""; } + +.fa-share-alt-square:before { + content: ""; } + +.fa-bomb:before { + content: ""; } + +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: ""; } + +.fa-tty:before { + content: ""; } + +.fa-binoculars:before { + content: ""; } + +.fa-plug:before { + content: ""; } + +.fa-slideshare:before { + content: ""; } + +.fa-twitch:before { + content: ""; } + +.fa-yelp:before { + content: ""; } + +.fa-newspaper-o:before { + content: ""; } + +.fa-wifi:before { + content: ""; } + +.fa-calculator:before { + content: ""; } + +.fa-paypal:before { + content: ""; } + +.fa-google-wallet:before { + content: ""; } + +.fa-cc-visa:before { + content: ""; } + +.fa-cc-mastercard:before { + content: ""; } + +.fa-cc-discover:before { + content: ""; } + +.fa-cc-amex:before { + content: ""; } + +.fa-cc-paypal:before { + content: ""; } + +.fa-cc-stripe:before { + content: ""; } + +.fa-bell-slash:before { + content: ""; } + +.fa-bell-slash-o:before { + content: ""; } + +.fa-trash:before { + content: ""; } + +.fa-copyright:before { + content: ""; } + +.fa-at:before { + content: ""; } + +.fa-eyedropper:before { + content: ""; } + +.fa-paint-brush:before { + content: ""; } + +.fa-birthday-cake:before { + content: ""; } + +.fa-area-chart:before { + content: ""; } + +.fa-pie-chart:before { + content: ""; } + +.fa-line-chart:before { + content: ""; } + +.fa-lastfm:before { + content: ""; } + +.fa-lastfm-square:before { + content: ""; } + +.fa-toggle-off:before { + content: ""; } + +.fa-toggle-on:before { + content: ""; } + +.fa-bicycle:before { + content: ""; } + +.fa-bus:before { + content: ""; } + +.fa-ioxhost:before { + content: ""; } + +.fa-angellist:before { + content: ""; } + +.fa-cc:before { + content: ""; } + +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: ""; } + +.fa-meanpath:before { + content: ""; } + +.fa-buysellads:before { + content: ""; } + +.fa-connectdevelop:before { + content: ""; } + +.fa-dashcube:before { + content: ""; } + +.fa-forumbee:before { + content: ""; } + +.fa-leanpub:before { + content: ""; } + +.fa-sellsy:before { + content: ""; } + +.fa-shirtsinbulk:before { + content: ""; } + +.fa-simplybuilt:before { + content: ""; } + +.fa-skyatlas:before { + content: ""; } + +.fa-cart-plus:before { + content: ""; } + +.fa-cart-arrow-down:before { + content: ""; } + +.fa-diamond:before { + content: ""; } + +.fa-ship:before { + content: ""; } + +.fa-user-secret:before { + content: ""; } + +.fa-motorcycle:before { + content: ""; } + +.fa-street-view:before { + content: ""; } + +.fa-heartbeat:before { + content: ""; } + +.fa-venus:before { + content: ""; } + +.fa-mars:before { + content: ""; } + +.fa-mercury:before { + content: ""; } + +.fa-intersex:before, +.fa-transgender:before { + content: ""; } + +.fa-transgender-alt:before { + content: ""; } + +.fa-venus-double:before { + content: ""; } + +.fa-mars-double:before { + content: ""; } + +.fa-venus-mars:before { + content: ""; } + +.fa-mars-stroke:before { + content: ""; } + +.fa-mars-stroke-v:before { + content: ""; } + +.fa-mars-stroke-h:before { + content: ""; } + +.fa-neuter:before { + content: ""; } + +.fa-genderless:before { + content: ""; } + +.fa-facebook-official:before { + content: ""; } + +.fa-pinterest-p:before { + content: ""; } + +.fa-whatsapp:before { + content: ""; } + +.fa-server:before { + content: ""; } + +.fa-user-plus:before { + content: ""; } + +.fa-user-times:before { + content: ""; } + +.fa-hotel:before, +.fa-bed:before { + content: ""; } + +.fa-viacoin:before { + content: ""; } + +.fa-train:before { + content: ""; } + +.fa-subway:before { + content: ""; } + +.fa-medium:before { + content: ""; } + +.fa-yc:before, +.fa-y-combinator:before { + content: ""; } + +.fa-optin-monster:before { + content: ""; } + +.fa-opencart:before { + content: ""; } + +.fa-expeditedssl:before { + content: ""; } + +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: ""; } + +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: ""; } + +.fa-battery-2:before, +.fa-battery-half:before { + content: ""; } + +.fa-battery-1:before, +.fa-battery-quarter:before { + content: ""; } + +.fa-battery-0:before, +.fa-battery-empty:before { + content: ""; } + +.fa-mouse-pointer:before { + content: ""; } + +.fa-i-cursor:before { + content: ""; } + +.fa-object-group:before { + content: ""; } + +.fa-object-ungroup:before { + content: ""; } + +.fa-sticky-note:before { + content: ""; } + +.fa-sticky-note-o:before { + content: ""; } + +.fa-cc-jcb:before { + content: ""; } + +.fa-cc-diners-club:before { + content: ""; } + +.fa-clone:before { + content: ""; } + +.fa-balance-scale:before { + content: ""; } + +.fa-hourglass-o:before { + content: ""; } + +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: ""; } + +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: ""; } + +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: ""; } + +.fa-hourglass:before { + content: ""; } + +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: ""; } + +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: ""; } + +.fa-hand-scissors-o:before { + content: ""; } + +.fa-hand-lizard-o:before { + content: ""; } + +.fa-hand-spock-o:before { + content: ""; } + +.fa-hand-pointer-o:before { + content: ""; } + +.fa-hand-peace-o:before { + content: ""; } + +.fa-trademark:before { + content: ""; } + +.fa-registered:before { + content: ""; } + +.fa-creative-commons:before { + content: ""; } + +.fa-gg:before { + content: ""; } + +.fa-gg-circle:before { + content: ""; } + +.fa-tripadvisor:before { + content: ""; } + +.fa-odnoklassniki:before { + content: ""; } + +.fa-odnoklassniki-square:before { + content: ""; } + +.fa-get-pocket:before { + content: ""; } + +.fa-wikipedia-w:before { + content: ""; } + +.fa-safari:before { + content: ""; } + +.fa-chrome:before { + content: ""; } + +.fa-firefox:before { + content: ""; } + +.fa-opera:before { + content: ""; } + +.fa-internet-explorer:before { + content: ""; } + +.fa-tv:before, +.fa-television:before { + content: ""; } + +.fa-contao:before { + content: ""; } + +.fa-500px:before { + content: ""; } + +.fa-amazon:before { + content: ""; } + +.fa-calendar-plus-o:before { + content: ""; } + +.fa-calendar-minus-o:before { + content: ""; } + +.fa-calendar-times-o:before { + content: ""; } + +.fa-calendar-check-o:before { + content: ""; } + +.fa-industry:before { + content: ""; } + +.fa-map-pin:before { + content: ""; } + +.fa-map-signs:before { + content: ""; } + +.fa-map-o:before { + content: ""; } + +.fa-map:before { + content: ""; } + +.fa-commenting:before { + content: ""; } + +.fa-commenting-o:before { + content: ""; } + +.fa-houzz:before { + content: ""; } + +.fa-vimeo:before { + content: ""; } + +.fa-black-tie:before { + content: ""; } + +.fa-fonticons:before { + content: ""; } + +.fa-reddit-alien:before { + content: ""; } + +.fa-edge:before { + content: ""; } + +.fa-credit-card-alt:before { + content: ""; } + +.fa-codiepie:before { + content: ""; } + +.fa-modx:before { + content: ""; } + +.fa-fort-awesome:before { + content: ""; } + +.fa-usb:before { + content: ""; } + +.fa-product-hunt:before { + content: ""; } + +.fa-mixcloud:before { + content: ""; } + +.fa-scribd:before { + content: ""; } + +.fa-pause-circle:before { + content: ""; } + +.fa-pause-circle-o:before { + content: ""; } + +.fa-stop-circle:before { + content: ""; } + +.fa-stop-circle-o:before { + content: ""; } + +.fa-shopping-bag:before { + content: ""; } + +.fa-shopping-basket:before { + content: ""; } + +.fa-hashtag:before { + content: ""; } + +.fa-bluetooth:before { + content: ""; } + +.fa-bluetooth-b:before { + content: ""; } + +.fa-percent:before { + content: ""; } + +.fa-gitlab:before { + content: ""; } + +.fa-wpbeginner:before { + content: ""; } + +.fa-wpforms:before { + content: ""; } + +.fa-envira:before { + content: ""; } + +.fa-universal-access:before { + content: ""; } + +.fa-wheelchair-alt:before { + content: ""; } + +.fa-question-circle-o:before { + content: ""; } + +.fa-blind:before { + content: ""; } + +.fa-audio-description:before { + content: ""; } + +.fa-volume-control-phone:before { + content: ""; } + +.fa-braille:before { + content: ""; } + +.fa-assistive-listening-systems:before { + content: ""; } + +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: ""; } + +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: ""; } + +.fa-glide:before { + content: ""; } + +.fa-glide-g:before { + content: ""; } + +.fa-signing:before, +.fa-sign-language:before { + content: ""; } + +.fa-low-vision:before { + content: ""; } + +.fa-viadeo:before { + content: ""; } + +.fa-viadeo-square:before { + content: ""; } + +.fa-snapchat:before { + content: ""; } + +.fa-snapchat-ghost:before { + content: ""; } + +.fa-snapchat-square:before { + content: ""; } + +.fa-pied-piper:before { + content: ""; } + +.fa-first-order:before { + content: ""; } + +.fa-yoast:before { + content: ""; } + +.fa-themeisle:before { + content: ""; } + +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: ""; } + +.fa-fa:before, +.fa-font-awesome:before { + content: ""; } + +.fa-handshake-o:before { + content: ""; } + +.fa-envelope-open:before { + content: ""; } + +.fa-envelope-open-o:before { + content: ""; } + +.fa-linode:before { + content: ""; } + +.fa-address-book:before { + content: ""; } + +.fa-address-book-o:before { + content: ""; } + +.fa-vcard:before, +.fa-address-card:before { + content: ""; } + +.fa-vcard-o:before, +.fa-address-card-o:before { + content: ""; } + +.fa-user-circle:before { + content: ""; } + +.fa-user-circle-o:before { + content: ""; } + +.fa-user-o:before { + content: ""; } + +.fa-id-badge:before { + content: ""; } + +.fa-drivers-license:before, +.fa-id-card:before { + content: ""; } + +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: ""; } + +.fa-quora:before { + content: ""; } + +.fa-free-code-camp:before { + content: ""; } + +.fa-telegram:before { + content: ""; } + +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: ""; } + +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: ""; } + +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: ""; } + +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: ""; } + +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: ""; } + +.fa-shower:before { + content: ""; } + +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: ""; } + +.fa-podcast:before { + content: ""; } + +.fa-window-maximize:before { + content: ""; } + +.fa-window-minimize:before { + content: ""; } + +.fa-window-restore:before { + content: ""; } + +.fa-times-rectangle:before, +.fa-window-close:before { + content: ""; } + +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: ""; } + +.fa-bandcamp:before { + content: ""; } + +.fa-grav:before { + content: ""; } + +.fa-etsy:before { + content: ""; } + +.fa-imdb:before { + content: ""; } + +.fa-ravelry:before { + content: ""; } + +.fa-eercast:before { + content: ""; } + +.fa-microchip:before { + content: ""; } + +.fa-snowflake-o:before { + content: ""; } + +.fa-superpowers:before { + content: ""; } + +.fa-wpexplorer:before { + content: ""; } + +.fa-meetup:before { + content: ""; } + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; } + +.shadow-l1, .box, .menu, input[type~="submit"], button, a.button { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); } + +.shadow-l2 { + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23); } + +.shadow-l3 { + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); } + +.shadow-l4 { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); } + +.shadow-l5 { + box-shadow: 0 19px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22); } + +@keyframes shadow1to3 { + from { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); } + to { + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); } } + +@keyframes shadow1to2 { + from { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); } + to { + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23); } } + +.font, html, body, input, select, textarea, button, a.button { + font-family: "Roboto"; + font-size: 16px; + color: #333; } + +html, body { + padding: 0; + margin: 0; + line-height: 1.5; + background: #FAFAFA; } + +.wrapper { + padding: 20px; } + +.box { + background: #fff; + margin: 0 0 20px 0; } + +.msg, .success, .warn, .error { + padding: 20px; + margin: 20px 0 20px 0; + background: #fff; + border-style: solid; + border-width: 1px 1px 1px 5px; } + .msg .close, .success .close, .warn .close, .error .close { + float: right; + margin: 0 0 -10px 0; } + .msg .close:hover, .success .close:hover, .warn .close:hover, .error .close:hover { + cursor: pointer; } + +.success { + border-color: #4CAF50; } + +.warn { + border-color: #FFEB3B; } + +.error { + border-color: #F44336; } + +.login { + max-width: 400px; + margin: 100px auto 20px auto; } + .login .center { + text-align: center; } + .login .version { + font-size: 12px; + text-align: center; } + +.menu { + position: fixed; + width: 100%; + top: 0; + height: 40px; + background: #212121; + padding: 0 20px 0 20px; } + .menu .wrapper { + padding: 0 20px 0 20px; } + .menu .logo { + float: left; + width: 40px; + height: 40px; + margin: 0 20px 0 0; + background: url("../img/aclogo_small.png"); } + .menu a { + display: block; + float: left; + padding: 8px 15px 8px 15px; + color: #fff; + font-weight: bold; } + .menu a:hover { + background: #EEEEEE; + color: #333; } + .menu .right { + float: right; } + +.main { + padding: 20px; + margin: 40px 0 0 0; } + +img.track { + float: left; + margin: 0 20px 0 0; } + +.select { + height: 400px; + overflow-y: scroll; + border: 1px solid #EEEEEE; + margin: 5px; } + .select .option { + padding: 5px; } + .select .option:hover { + cursor: pointer; + background: #EEEEEE; + color: #333; } + .select .selected { + background: #ea141e; + color: #fff; } + +.fa:hover { + cursor: pointer; } + +h1, h2, h3, h4 { + display: block; + margin: 10px 0 10px 0; + padding: 0; + font-weight: bold; } + +h1 { + font-size: 30px; + margin-left: 20px; } + +h2 { + font-size: 26px; + margin-bottom: 15px; } + +h3 { + font-size: 24px; + margin-bottom: 10px; } + +h4 { + font-size: 22px; + margin-bottom: 10px; } + +hr { + width: 100%; + height: 1px; + background: #EEEEEE; + margin: 20px 0 20px 0; + border-width: 0; } + +a { + color: #ea141e; + text-decoration: none; } + +a:hover { + color: #333; } + +p { + margin: 10px 0 10px 0; + padding: 0; } + +table { + margin: 10px 0 10px 0; + width: 100%; + display: border-box; } + table tr { + padding: 0; + margin: 0; } + table tr td { + padding: 5px; + margin: 0; } + table tr td.w5 { + width: 5%; } + table tr td.w10 { + width: 10%; } + table tr td.w15 { + width: 15%; } + table tr td.w20 { + width: 20%; } + table tr td.w25 { + width: 25%; } + table tr td.w30 { + width: 30%; } + table tr td.w33 { + width: 33.33%; } + table tr td.w35 { + width: 35%; } + table tr td.w40 { + width: 40%; } + table tr td.w50 { + width: 50%; } + table tr td.w55 { + width: 55%; } + table thead tr { + background: #212121; + color: #fff; } + table tbody td { + border-style: solid; + border-color: #ea141e; + border-width: 0 0 1px 0; } + +table.small { + width: auto; + font-size: 16px; } + +td.top { + vertical-align: top; + padding-top: 12px; } + +img { + max-width: 100%; + margin: 10px 0 10px 0; } + +input, select, textarea, button, a.button { + display: inline-block; + padding: 5px; + margin: 5px 0 5px 0; + border: 1px solid #9E9E9E; + border-width: 0 0 1px 0; + border-radius: 1px; + background: #fff; } + input .fa, select .fa, textarea .fa, button .fa, a.button .fa { + margin: 0 5px 0 0; } + +input:focus, select:focus, textarea:focus { + border-color: #9E9E9E; } + +input[readonly] { + color: #ccc; + border-color: #ccc; } + +.full-width, textarea { + box-sizing: border-box; + width: 100%; } + +input.w5 { + width: 5%; } + +input.w10 { + width: 10%; } + +input.w20 { + width: 20%; } + +input.w30 { + width: 30%; } + +input.w50 { + width: 50%; } + +input.w70 { + width: 70%; } + +textarea { + min-height: 100px; + border-width: 1px; } + +input[type~="submit"], button, a.button { + background: #ea141e; + border-width: 0; + color: #fff; + padding: 5px 15px 5px 15px; } + +input[type~="submit"]:hover, button:hover, a.button:hover { + cursor: pointer; + animation-name: shadow1to3; + animation-duration: 0.3s; + animation-fill-mode: forwards; } + +input[type~="checkbox"] { + width: auto; } + +input.no-margin, button.no-margin { + margin: 0; } + +a.button .fa { + margin: 0 5px 0 0; } + +a.icon-link { + color: #333; } diff --git a/release/v1.1.0/public/fonts/FontAwesome.otf b/release/v1.1.0/public/fonts/FontAwesome.otf new file mode 100644 index 0000000..401ec0f Binary files /dev/null and b/release/v1.1.0/public/fonts/FontAwesome.otf differ diff --git a/release/v1.1.0/public/fonts/Roboto-Bold.ttf b/release/v1.1.0/public/fonts/Roboto-Bold.ttf new file mode 100644 index 0000000..68822ca Binary files /dev/null and b/release/v1.1.0/public/fonts/Roboto-Bold.ttf differ diff --git a/release/v1.1.0/public/fonts/Roboto-BoldItalic.ttf b/release/v1.1.0/public/fonts/Roboto-BoldItalic.ttf new file mode 100644 index 0000000..aebf8eb Binary files /dev/null and b/release/v1.1.0/public/fonts/Roboto-BoldItalic.ttf differ diff --git a/release/v1.1.0/public/fonts/Roboto-Italic.ttf b/release/v1.1.0/public/fonts/Roboto-Italic.ttf new file mode 100644 index 0000000..2041cbc Binary files /dev/null and b/release/v1.1.0/public/fonts/Roboto-Italic.ttf differ diff --git a/release/v1.1.0/public/fonts/Roboto-Regular.ttf b/release/v1.1.0/public/fonts/Roboto-Regular.ttf new file mode 100644 index 0000000..0e58508 Binary files /dev/null and b/release/v1.1.0/public/fonts/Roboto-Regular.ttf differ diff --git a/release/v1.1.0/public/fonts/Roboto-Thin.ttf b/release/v1.1.0/public/fonts/Roboto-Thin.ttf new file mode 100644 index 0000000..8779333 Binary files /dev/null and b/release/v1.1.0/public/fonts/Roboto-Thin.ttf differ diff --git a/release/v1.1.0/public/fonts/Roboto-ThinItalic.ttf b/release/v1.1.0/public/fonts/Roboto-ThinItalic.ttf new file mode 100644 index 0000000..b79cb26 Binary files /dev/null and b/release/v1.1.0/public/fonts/Roboto-ThinItalic.ttf differ diff --git a/release/v1.1.0/public/fonts/fontawesome-webfont.eot b/release/v1.1.0/public/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/release/v1.1.0/public/fonts/fontawesome-webfont.eot differ diff --git a/release/v1.1.0/public/fonts/fontawesome-webfont.svg b/release/v1.1.0/public/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/release/v1.1.0/public/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/release/v1.1.0/public/fonts/fontawesome-webfont.ttf b/release/v1.1.0/public/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/release/v1.1.0/public/fonts/fontawesome-webfont.ttf differ diff --git a/release/v1.1.0/public/fonts/fontawesome-webfont.woff b/release/v1.1.0/public/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/release/v1.1.0/public/fonts/fontawesome-webfont.woff differ diff --git a/release/v1.1.0/public/fonts/fontawesome-webfont.woff2 b/release/v1.1.0/public/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/release/v1.1.0/public/fonts/fontawesome-webfont.woff2 differ diff --git a/release/v1.1.0/public/img/aclogo.png b/release/v1.1.0/public/img/aclogo.png new file mode 100644 index 0000000..f45e84c Binary files /dev/null and b/release/v1.1.0/public/img/aclogo.png differ diff --git a/release/v1.1.0/public/img/aclogo_small.png b/release/v1.1.0/public/img/aclogo_small.png new file mode 100644 index 0000000..165135b Binary files /dev/null and b/release/v1.1.0/public/img/aclogo_small.png differ diff --git a/release/v1.1.0/public/index.html b/release/v1.1.0/public/index.html new file mode 100644 index 0000000..b8b8873 --- /dev/null +++ b/release/v1.1.0/public/index.html @@ -0,0 +1,23 @@ + + + + Assetto Corsa Web + + + + + + + + + + + + + + +
+ +
+ + diff --git a/release/v1.1.0/public/js/vue-resource.min.js b/release/v1.1.0/public/js/vue-resource.min.js new file mode 100644 index 0000000..2883ea9 --- /dev/null +++ b/release/v1.1.0/public/js/vue-resource.min.js @@ -0,0 +1,7 @@ +/*! + * vue-resource v1.2.1 + * https://github.com/pagekit/vue-resource + * Released under the MIT License. + */ + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.VueResource=e()}(this,function(){"use strict";function t(t){this.state=J,this.value=void 0,this.deferred=[];var e=this;try{t(function(t){e.resolve(t)},function(t){e.reject(t)})}catch(t){e.reject(t)}}function e(t,e){t instanceof Promise?this.promise=t:this.promise=new Promise(t.bind(e)),this.context=e}function n(t){"undefined"!=typeof console&&Q&&console.warn("[VueResource warn]: "+t)}function o(t){"undefined"!=typeof console&&console.error(t)}function r(t,e){return G(t,e)}function i(t){return t?t.replace(/^\s*|\s*$/g,""):""}function u(t){return t?t.toLowerCase():""}function s(t){return t?t.toUpperCase():""}function a(t){return"string"==typeof t}function c(t){return"function"==typeof t}function f(t){return null!==t&&"object"==typeof t}function h(t){return f(t)&&Object.getPrototypeOf(t)==Object.prototype}function p(t){return"undefined"!=typeof Blob&&t instanceof Blob}function d(t){return"undefined"!=typeof FormData&&t instanceof FormData}function l(t,n,o){var r=e.resolve(t);return arguments.length<2?r:r.then(n,o)}function m(t,e,n){return n=n||{},c(n)&&(n=n.call(e)),v(t.bind({$vm:e,$options:n}),t,{$options:n})}function y(t,e){var n,o;if(tt(t))for(n=0;n=200&&r<300,this.status=r||0,this.statusText=i||"",this.headers=new bt(o),this.body=t,a(t)?this.bodyText=t:p(t)&&(this.bodyBlob=t,B(t)&&(this.bodyText=H(t)))};gt.prototype.blob=function(){return l(this.bodyBlob)},gt.prototype.text=function(){return l(this.bodyText)},gt.prototype.json=function(){return l(this.text(),function(t){return JSON.parse(t)})};var wt=function(t){this.body=null,this.params={},et(this,t,{method:s(t.method||"GET")}),this.headers instanceof bt||(this.headers=new bt(this.headers))};wt.prototype.getUrl=function(){return $(this)},wt.prototype.getBody=function(){return this.body},wt.prototype.respondWith=function(t,e){return new gt(t,et(e||{},{url:this.getUrl()}))};var Tt={Accept:"application/json, text/plain, */*"},xt={"Content-Type":"application/json;charset=utf-8"};return L.options={},L.headers={put:xt,post:xt,patch:xt,delete:xt,common:Tt,custom:{}},L.interceptors=[ht,pt,at,ft,dt,st],["get","delete","head","jsonp"].forEach(function(t){L[t]=function(e,n){return this(et(n||{},{url:e,method:t}))}}),["post","put","patch"].forEach(function(t){L[t]=function(e,n,o){return this(et(o||{},{url:e,method:t,body:n}))}}),q.actions={get:{method:"GET"},save:{method:"POST"},query:{method:"GET"},update:{method:"PUT"},remove:{method:"DELETE"},delete:{method:"DELETE"}},"undefined"!=typeof window&&window.Vue&&window.Vue.use(N),N}); \ No newline at end of file diff --git a/release/v1.1.0/public/js/vue-router.min.js b/release/v1.1.0/public/js/vue-router.min.js new file mode 100644 index 0000000..ac5900f --- /dev/null +++ b/release/v1.1.0/public/js/vue-router.min.js @@ -0,0 +1,6 @@ +/** + * vue-router v2.2.1 + * (c) 2017 Evan You + * @license MIT + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.VueRouter=e()}(this,function(){"use strict";function t(t,e){t||"undefined"!=typeof console&&console.warn("[vue-router] "+e)}function e(e,n){switch(typeof n){case"undefined":return;case"object":return n;case"function":return n(e);case"boolean":return n?e.params:void 0;default:t(!1,'props in "'+e.path+'" is a '+typeof n+", expecting an object, function or boolean.")}}function n(t,e){if(void 0===e&&(e={}),t){var n;try{n=r(t)}catch(t){n={}}for(var o in e)n[o]=e[o];return n}return e}function r(t){var e={};return(t=t.trim().replace(/^(\?|#|&)/,""))?(t.split("&").forEach(function(t){var n=t.replace(/\+/g," ").split("="),r=_t(n.shift()),o=n.length>0?_t(n.join("=")):null;void 0===e[r]?e[r]=o:Array.isArray(e[r])?e[r].push(o):e[r]=[e[r],o]}),e):e}function o(t){var e=t?Object.keys(t).map(function(e){var n=t[e];if(void 0===n)return"";if(null===n)return Ct(e);if(Array.isArray(n)){var r=[];return n.slice().forEach(function(t){void 0!==t&&(null===t?r.push(Ct(e)):r.push(Ct(e)+"="+Ct(t)))}),r.join("&")}return Ct(e)+"="+Ct(n)}).filter(function(t){return t.length>0}).join("&"):null;return e?"?"+e:""}function i(t,e,n){var r={name:e.name||t&&t.name,meta:t&&t.meta||{},path:e.path||"/",hash:e.hash||"",query:e.query||{},params:e.params||{},fullPath:u(e),matched:t?a(t):[]};return n&&(r.redirectedFrom=u(n)),Object.freeze(r)}function a(t){for(var e=[];t;)e.unshift(t),t=t.parent;return e}function u(t){var e=t.path,n=t.query;void 0===n&&(n={});var r=t.hash;return void 0===r&&(r=""),(e||"/")+o(n)+r}function c(t,e){return e===$t?t===e:!!e&&(t.path&&e.path?t.path.replace(Tt,"")===e.path.replace(Tt,"")&&t.hash===e.hash&&s(t.query,e.query):!(!t.name||!e.name)&&(t.name===e.name&&t.hash===e.hash&&s(t.query,e.query)&&s(t.params,e.params)))}function s(t,e){void 0===t&&(t={}),void 0===e&&(e={});var n=Object.keys(t),r=Object.keys(e);return n.length===r.length&&n.every(function(n){return String(t[n])===String(e[n])})}function p(t,e){return 0===t.path.replace(Tt,"/").indexOf(e.path.replace(Tt,"/"))&&(!e.hash||t.hash===e.hash)&&f(t.query,e.query)}function f(t,e){for(var n in e)if(!(n in t))return!1;return!0}function h(t){if(!(t.metaKey||t.ctrlKey||t.shiftKey||t.defaultPrevented||void 0!==t.button&&0!==t.button)){if(t.target&&t.target.getAttribute){var e=t.target.getAttribute("target");if(/\b_blank\b/i.test(e))return}return t.preventDefault&&t.preventDefault(),!0}}function l(t){if(t)for(var e,n=0;n=0&&(e=t.slice(r),t=t.slice(0,r));var o=t.indexOf("?");return o>=0&&(n=t.slice(o+1),t=t.slice(0,o)),{path:t,query:n,hash:e}}function m(t){return t.replace(/\/\//g,"/")}function g(t,e,n){var r=e||Object.create(null),o=n||Object.create(null);return t.forEach(function(t){w(r,o,t)}),{pathMap:r,nameMap:o}}function w(t,e,n,r,o){var i=n.path,a=n.name,u={path:b(i,r),components:n.components||{default:n.component},instances:{},name:a,parent:r,matchAs:o,redirect:n.redirect,beforeEnter:n.beforeEnter,meta:n.meta||{},props:null==n.props?{}:n.components?n.props:{default:n.props}};if(n.children&&n.children.forEach(function(n){var r=o?m(o+"/"+n.path):void 0;w(t,e,n,u,r)}),void 0!==n.alias)if(Array.isArray(n.alias))n.alias.forEach(function(o){var i={path:o,children:n.children};w(t,e,i,r,u.path)});else{var c={path:n.alias,children:n.children};w(t,e,c,r,u.path)}t[u.path]||(t[u.path]=u),a&&(e[a]||(e[a]=u))}function b(t,e){return t=t.replace(/\/$/,""),"/"===t[0]?t:null==e?t:m(e.path+"/"+t)}function x(t,e){for(var n,r=[],o=0,i=0,a="",u=e&&e.delimiter||"/";null!=(n=Ft.exec(t));){var c=n[0],s=n[1],p=n.index;if(a+=t.slice(i,p),i=p+c.length,s)a+=s[1];else{var f=t[i],h=n[2],l=n[3],d=n[4],y=n[5],v=n[6],m=n[7];a&&(r.push(a),a="");var g=null!=h&&null!=f&&f!==h,w="+"===v||"*"===v,b="?"===v||"*"===v,x=n[2]||u,k=d||y;r.push({name:l||o++,prefix:h||"",delimiter:x,optional:b,repeat:w,partial:g,asterisk:!!m,pattern:k?A(k):m?".*":"[^"+j(x)+"]+?"})}}return i-1&&(r.params[c]=e.params[c]);if(i)return r.path=U(i.path,r.params,'named route "'+o+'"'),u(i,r,n)}else if(r.path){r.params={};for(var f in s)if(B(f,r.params,r.path))return u(s[f],r,n)}return u(null,r)}function o(e,n){var o=e.redirect,a="function"==typeof o?o(i(e,n)):o;if("string"==typeof a&&(a={path:a}),!a||"object"!=typeof a)return u(null,n);var c=a,s=c.name,f=c.path,h=n.query,l=n.hash,d=n.params;if(h=c.hasOwnProperty("query")?c.query:h,l=c.hasOwnProperty("hash")?c.hash:l,d=c.hasOwnProperty("params")?c.params:d,s){p[s];return r({_normalized:!0,name:s,query:h,hash:l,params:d},void 0,n)}if(f){var y=H(f,e),v=U(y,d,'redirect route with path "'+y+'"');return r({_normalized:!0,path:v,query:h,hash:l},void 0,n)}return t(!1,"invalid redirect option: "+JSON.stringify(a)),u(null,n)}function a(t,e,n){var o=U(n,e.params,'aliased route with path "'+n+'"'),i=r({_normalized:!0,path:o});if(i){var a=i.matched,c=a[a.length-1];return e.params=i.params,u(c,e)}return u(null,e)}function u(t,e,n){return t&&t.redirect?o(t,n||e):t&&t.matchAs?a(t,e,t.matchAs):i(t,e,n)}var c=g(e),s=c.pathMap,p=c.nameMap;return{match:r,addRoutes:n}}function B(t,e,n){var r=P(t),o=r.regexp,i=r.keys,a=n.match(o);if(!a)return!1;if(!e)return!0;for(var u=1,c=a.length;u=t.length?n():t[o]?e(t[o],function(){r(o+1)}):r(o+1)};r(0)}function nt(t){if(!t)if(Pt){var e=document.querySelector("base");t=e?e.getAttribute("href"):"/"}else t="/";return"/"!==t.charAt(0)&&(t="/"+t),t.replace(/\/$/,"")}function rt(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n=0?e:0)+"#"+t)}function kt(t,e,n){var r="hash"===n?"#"+e:e;return t?m(t+"/"+r):r}var Ot,Rt={name:"router-view",functional:!0,props:{name:{type:String,default:"default"}},render:function(t,n){var r=n.props,o=n.children,i=n.parent,a=n.data;a.routerView=!0;for(var u=r.name,c=i.$route,s=i._routerViewCache||(i._routerViewCache={}),p=0,f=!1;i;)i.$vnode&&i.$vnode.data.routerView&&p++,i._inactive&&(f=!0),i=i.$parent;if(a.routerViewDepth=p,f)return t(s[u],a,o);var h=c.matched[p];if(!h)return s[u]=null,t();var l=s[u]=h.components[u],d=a.hook||(a.hook={});return d.init=function(t){h.instances[u]=t.child},d.prepatch=function(t,e){h.instances[u]=e.child},d.destroy=function(t){h.instances[u]===t.child&&(h.instances[u]=void 0)},a.props=e(c,h.props&&h.props[u]),t(l,a,o)}},Et=/[!'()*]/g,jt=function(t){return"%"+t.charCodeAt(0).toString(16)},At=/%2C/g,Ct=function(t){return encodeURIComponent(t).replace(Et,jt).replace(At,",")},_t=decodeURIComponent,Tt=/\/?$/,$t=i(null,{path:"/"}),St=[String,Object],qt=[String,Array],Lt={name:"router-link",props:{to:{type:St,required:!0},tag:{type:String,default:"a"},exact:Boolean,append:Boolean,replace:Boolean,activeClass:String,event:{type:qt,default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),a=o.location,u=o.route,s=o.href,f={},d=this.activeClass||n.options.linkActiveClass||"router-link-active",y=a.path?i(null,a):u;f[d]=this.exact?c(r,y):p(r,y);var v=function(t){h(t)&&(e.replace?n.replace(a):n.push(a))},m={click:h};Array.isArray(this.event)?this.event.forEach(function(t){m[t]=v}):m[this.event]=v;var g={class:f};if("a"===this.tag)g.on=m,g.attrs={href:s};else{var w=l(this.$slots.default);if(w){w.isStatic=!1;var b=Ot.util.extend,x=w.data=b({},w.data);x.on=m;var k=w.data.attrs=b({},w.data.attrs);k.href=s}else g.on=m}return t(this.tag,g,this.$slots.default)}},Pt="undefined"!=typeof window,Ut=Array.isArray||function(t){return"[object Array]"==Object.prototype.toString.call(t)},zt=Ut,Mt=L,Vt=x,Bt=k,Ht=E,It=q,Ft=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");Mt.parse=Vt,Mt.compile=Bt,Mt.tokensToFunction=Ht,Mt.tokensToRegExp=It;var Dt=Object.create(null),Jt=Object.create(null),Kt=Object.create(null),Nt=Pt&&function(){var t=window.navigator.userAgent;return(t.indexOf("Android 2.")===-1&&t.indexOf("Android 4.0")===-1||t.indexOf("Mobile Safari")===-1||t.indexOf("Chrome")!==-1||t.indexOf("Windows Phone")!==-1)&&(window.history&&"pushState"in window.history)}(),Xt=Pt&&window.performance&&window.performance.now?window.performance:Date,Yt=W(),Wt=function(t,e){this.router=t,this.base=nt(e),this.current=$t,this.pending=null,this.ready=!1,this.readyCbs=[]};Wt.prototype.listen=function(t){this.cb=t},Wt.prototype.onReady=function(t){this.ready?t():this.readyCbs.push(t)},Wt.prototype.transitionTo=function(t,e,n){var r=this,o=this.router.match(t,this.current);this.confirmTransition(o,function(){r.updateRoute(o),e&&e(o),r.ensureURL(),r.ready||(r.ready=!0,r.readyCbs.forEach(function(t){t(o)}))},n)},Wt.prototype.confirmTransition=function(t,e,n){var r=this,o=this.current,i=function(){n&&n()};if(c(t,o)&&t.matched.length===o.matched.length)return this.ensureURL(),i();var a=rt(this.current.matched,t.matched),u=a.updated,s=a.deactivated,p=a.activated,f=[].concat(at(s),this.router.beforeHooks,ut(u),p.map(function(t){return t.beforeEnter}),ht(p));this.pending=t;var h=function(e,n){return r.pending!==t?i():void e(t,o,function(t){t===!1?(r.ensureURL(!0),i()):"string"==typeof t||"object"==typeof t?("object"==typeof t&&t.replace?r.replace(t):r.push(t),i()):n(t)})};et(f,h,function(){var n=[],o=function(){return r.current===t},a=st(p,n,o);et(a,h,function(){return r.pending!==t?i():(r.pending=null,e(t),void(r.router.app&&r.router.app.$nextTick(function(){n.forEach(function(t){return t()})})))})})},Wt.prototype.updateRoute=function(t){var e=this.current;this.current=t,this.cb&&this.cb(t),this.router.afterHooks.forEach(function(n){n&&n(t,e)})};var Gt=function(t){function e(e,n){var r=this;t.call(this,e,n);var o=e.options.scrollBehavior;o&&I(),window.addEventListener("popstate",function(t){r.transitionTo(vt(r.base),function(t){o&&F(e,t,r.current,!0)})})}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,function(t){Z(m(r.base+t.fullPath)),F(r.router,t,r.current,!1),e&&e(t)},n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,function(t){tt(m(r.base+t.fullPath)),F(r.router,t,r.current,!1),e&&e(t)},n)},e.prototype.ensureURL=function(t){if(vt(this.base)!==this.current.fullPath){var e=m(this.base+this.current.fullPath);t?Z(e):tt(e)}},e.prototype.getCurrentLocation=function(){return vt(this.base)},e}(Wt),Qt=function(t){function e(e,n,r){t.call(this,e,n),r&&mt(this.base)||gt()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;window.addEventListener("hashchange",function(){gt()&&t.transitionTo(wt(),function(t){xt(t.fullPath)})})},e.prototype.push=function(t,e,n){this.transitionTo(t,function(t){bt(t.fullPath),e&&e(t)},n)},e.prototype.replace=function(t,e,n){this.transitionTo(t,function(t){xt(t.fullPath),e&&e(t)},n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;wt()!==e&&(t?bt(e):xt(e))},e.prototype.getCurrentLocation=function(){return wt()},e}(Wt),Zt=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)},n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)},n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,function(){e.index=n,e.updateRoute(r)})}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Wt),te=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.afterHooks=[],this.matcher=V(t.routes||[]);var e=t.mode||"hash";switch(this.fallback="history"===e&&!Nt,this.fallback&&(e="hash"),Pt||(e="abstract"),this.mode=e,e){case"history":this.history=new Gt(this,t.base);break;case"hash":this.history=new Qt(this,t.base,this.fallback);break;case"abstract":this.history=new Zt(this,t.base)}},ee={currentRoute:{}};return te.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},ee.currentRoute.get=function(){return this.history&&this.history.current},te.prototype.init=function(t){var e=this;if(this.apps.push(t),!this.app){this.app=t;var n=this.history;if(n instanceof Gt)n.transitionTo(n.getCurrentLocation());else if(n instanceof Qt){var r=function(){n.setupListeners()};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen(function(t){e.apps.forEach(function(e){e._route=t})})}},te.prototype.beforeEach=function(t){this.beforeHooks.push(t)},te.prototype.afterEach=function(t){this.afterHooks.push(t)},te.prototype.onReady=function(t){this.history.onReady(t)},te.prototype.push=function(t,e,n){this.history.push(t,e,n)},te.prototype.replace=function(t,e,n){this.history.replace(t,e,n)},te.prototype.go=function(t){this.history.go(t)},te.prototype.back=function(){this.go(-1)},te.prototype.forward=function(){this.go(1)},te.prototype.getMatchedComponents=function(t){var e=t?this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map(function(t){return Object.keys(t.components).map(function(e){return t.components[e]})})):[]},te.prototype.resolve=function(t,e,n){var r=z(t,e||this.history.current,n),o=this.match(r,e),i=o.redirectedFrom||o.fullPath,a=this.history.base,u=kt(a,i,this.mode);return{location:r,route:o,href:u,normalizedTo:r,resolved:o}},te.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==$t&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(te.prototype,ee),te.install=d,te.version="2.2.1",Pt&&window.Vue&&window.Vue.use(te),te}); \ No newline at end of file diff --git a/release/v1.1.0/public/js/vue.min.js b/release/v1.1.0/public/js/vue.min.js new file mode 100644 index 0000000..d079a74 --- /dev/null +++ b/release/v1.1.0/public/js/vue.min.js @@ -0,0 +1,8 @@ +/*! + * Vue.js v2.2.6 + * (c) 2014-2017 Evan You + * Released under the MIT License. + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Vue=t()}(this,function(){"use strict";function e(e){return null==e?"":"object"==typeof e?JSON.stringify(e,null,2):String(e)}function t(e){var t=parseFloat(e);return isNaN(t)?e:t}function n(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i-1)return e.splice(n,1)}}function i(e,t){return $i.call(e,t)}function o(e){return"string"==typeof e||"number"==typeof e}function a(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}function s(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n}function c(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function u(e,t){for(var n in t)e[n]=t[n];return e}function l(e){return null!==e&&"object"==typeof e}function f(e){return ki.call(e)===Ai}function p(e){for(var t={},n=0;n=0&&co[n].id>e.id;)n--;co.splice(Math.max(n,po)+1,0,e)}else co.push(e);lo||(lo=!0,zi(de))}}function he(e){mo.clear(),me(e,mo)}function me(e,t){var n,r,i=Array.isArray(e);if((i||l(e))&&Object.isExtensible(e)){if(e.__ob__){var o=e.__ob__.dep.id;if(t.has(o))return;t.add(o)}if(i)for(n=e.length;n--;)me(e[n],t);else for(r=Object.keys(e),n=r.length;n--;)me(e[r[n]],t)}}function ge(e,t,n){go.get=function(){return this[t][n]},go.set=function(e){this[t][n]=e},Object.defineProperty(e,n,go)}function ye(e){e._watchers=[];var t=e.$options;t.props&&_e(e,t.props),t.methods&&ke(e,t.methods),t.data?be(e):k(e._data={},!0),t.computed&&we(e,t.computed),t.watch&&Ae(e,t.watch)}function _e(e,t){var n=e.$options.propsData||{},r=e._props={},i=e.$options._propKeys=[],o=!e.$parent;Qi.shouldConvert=o;for(var a in t)!function(o){i.push(o);var a=P(o,t,n,e);A(r,o,a),o in e||ge(e,"_props",o)}(a);Qi.shouldConvert=!0}function be(e){var t=e.$options.data;t=e._data="function"==typeof t?$e(t,e):t||{},f(t)||(t={});for(var n=Object.keys(t),r=e.$options.props,o=n.length;o--;)r&&i(r,n[o])||g(n[o])||ge(e,"_data",n[o]);k(t,!0)}function $e(e,t){try{return e.call(t)}catch(e){return U(e,t,"data()"),{}}}function we(e,t){var n=e._computedWatchers=Object.create(null);for(var r in t){var i=t[r],o="function"==typeof i?i:i.get;n[r]=new ho(e,o,d,yo),r in e||xe(e,r,i)}}function xe(e,t,n){"function"==typeof n?(go.get=Ce(t),go.set=d):(go.get=n.get?n.cache!==!1?Ce(t):n.get:d,go.set=n.set?n.set:d),Object.defineProperty(e,t,go)}function Ce(e){return function(){var t=this._computedWatchers&&this._computedWatchers[e];if(t)return t.dirty&&t.evaluate(),qi.target&&t.depend(),t.value}}function ke(e,t){e.$options.props;for(var n in t)e[n]=null==t[n]?d:s(t[n],e)}function Ae(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i-1:e instanceof RegExp&&e.test(t)}function ft(e,t){for(var n in e){var r=e[n];if(r){var i=ut(r.componentOptions);i&&!t(i)&&(pt(r),e[n]=null)}}}function pt(e){e&&(e.componentInstance._inactive||fe(e.componentInstance,"deactivated"),e.componentInstance.$destroy())}function dt(e){for(var t=e.data,n=e,r=e;r.componentInstance;)r=r.componentInstance._vnode,r.data&&(t=vt(r.data,t));for(;n=n.parent;)n.data&&(t=vt(t,n.data));return ht(t)}function vt(e,t){return{staticClass:mt(e.staticClass,t.staticClass),class:e.class?[e.class,t.class]:t.class}}function ht(e){var t=e.class,n=e.staticClass;return n||t?mt(n,gt(t)):""}function mt(e,t){return e?t?e+" "+t:e:t||""}function gt(e){var t="";if(!e)return t;if("string"==typeof e)return e;if(Array.isArray(e)){for(var n,r=0,i=e.length;r-1?Zo[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Zo[e]=/HTMLUnknownElement/.test(t.toString())}function bt(e){if("string"==typeof e){var t=document.querySelector(e);return t?t:document.createElement("div")}return e}function $t(e,t){var n=document.createElement(e);return"select"!==e?n:(t.data&&t.data.attrs&&void 0!==t.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n)}function wt(e,t){return document.createElementNS(zo[e],t)}function xt(e){return document.createTextNode(e)}function Ct(e){return document.createComment(e)}function kt(e,t,n){e.insertBefore(t,n)}function At(e,t){e.removeChild(t)}function Ot(e,t){e.appendChild(t)}function Tt(e){return e.parentNode}function St(e){return e.nextSibling}function Et(e){return e.tagName}function jt(e,t){e.textContent=t}function Nt(e,t,n){e.setAttribute(t,n)}function It(e,t){var n=e.data.ref;if(n){var i=e.context,o=e.componentInstance||e.elm,a=i.$refs;t?Array.isArray(a[n])?r(a[n],o):a[n]===o&&(a[n]=void 0):e.data.refInFor?Array.isArray(a[n])&&a[n].indexOf(o)<0?a[n].push(o):a[n]=[o]:a[n]=o}}function Lt(e){return void 0===e||null===e}function Dt(e){return void 0!==e&&null!==e}function Mt(e){return e===!0}function Pt(e,t){return e.key===t.key&&e.tag===t.tag&&e.isComment===t.isComment&&Dt(e.data)===Dt(t.data)&&Rt(e,t)}function Rt(e,t){if("input"!==e.tag)return!0;var n;return(Dt(n=e.data)&&Dt(n=n.attrs)&&n.type)===(Dt(n=t.data)&&Dt(n=n.attrs)&&n.type)}function Ft(e,t,n){var r,i,o={};for(r=t;r<=n;++r)i=e[r].key,Dt(i)&&(o[i]=r);return o}function Ht(e,t){(e.data.directives||t.data.directives)&&Ut(e,t)}function Ut(e,t){var n,r,i,o=e===Qo,a=t===Qo,s=Bt(e.data.directives,e.context),c=Bt(t.data.directives,t.context),u=[],l=[];for(n in c)r=s[n],i=c[n],r?(i.oldValue=r.value,zt(i,"update",t,e),i.def&&i.def.componentUpdated&&l.push(i)):(zt(i,"bind",t,e),i.def&&i.def.inserted&&u.push(i));if(u.length){var f=function(){for(var n=0;n=0&&" "===(m=e.charAt(h));h--);m&&oa.test(m)||(l=!0)}}else void 0===o?(v=i+1,o=e.slice(0,i).trim()):t();if(void 0===o?o=e.slice(0,i).trim():0!==v&&t(),a)for(i=0;i=Oo}function ln(e){return 34===e||39===e}function fn(e){var t=1;for(jo=Eo;!un();)if(e=cn(),ln(e))pn(e);else if(91===e&&t++,93===e&&t--,0===t){No=Eo;break}}function pn(e){for(var t=e;!un()&&(e=cn())!==t;);}function dn(e,t,n){Io=n;var r=t.value,i=t.modifiers,o=e.tag,a=e.attrsMap.type;if("select"===o)mn(e,r,i);else if("input"===o&&"checkbox"===a)vn(e,r,i);else if("input"===o&&"radio"===a)hn(e,r,i);else if("input"===o||"textarea"===o)gn(e,r,i);else if(!Si.isReservedTag(o))return on(e,r,i),!1;return!0}function vn(e,t,n){var r=n&&n.number,i=nn(e,"value")||"null",o=nn(e,"true-value")||"true",a=nn(e,"false-value")||"false";Qt(e,"checked","Array.isArray("+t+")?_i("+t+","+i+")>-1"+("true"===o?":("+t+")":":_q("+t+","+o+")")),tn(e,sa,"var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+o+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$c){$$i<0&&("+t+"=$$a.concat($$v))}else{$$i>-1&&("+t+"=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{"+t+"=$$c}",null,!0)}function hn(e,t,n){var r=n&&n.number,i=nn(e,"value")||"null";i=r?"_n("+i+")":i,Qt(e,"checked","_q("+t+","+i+")"),tn(e,sa,an(t,i),null,!0)}function mn(e,t,n){var r=n&&n.number,i='Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = "_value" in o ? o._value : o.value;return '+(r?"_n(val)":"val")+"})",o="var $$selectedVal = "+i+";";o=o+" "+an(t,"$event.target.multiple ? $$selectedVal : $$selectedVal[0]"),tn(e,"change",o,null,!0)}function gn(e,t,n){var r=e.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=!o&&"range"!==r,u=o?"change":"range"===r?aa:"input",l="$event.target.value";s&&(l="$event.target.value.trim()"),a&&(l="_n("+l+")");var f=an(t,l);c&&(f="if($event.target.composing)return;"+f),Qt(e,"value","("+t+")"),tn(e,u,f,null,!0),(s||a||"number"===r)&&tn(e,"blur","$forceUpdate()")}function yn(e){var t;e[aa]&&(t=Di?"change":"input",e[t]=[].concat(e[aa],e[t]||[]),delete e[aa]),e[sa]&&(t=Hi?"click":"change",e[t]=[].concat(e[sa],e[t]||[]),delete e[sa])}function _n(e,t,n,r){if(n){var i=t,o=Lo;t=function(n){null!==(1===arguments.length?i(n):i.apply(null,arguments))&&bn(e,t,r,o)}}Lo.addEventListener(e,t,r)}function bn(e,t,n,r){(r||Lo).removeEventListener(e,t,n)}function $n(e,t){if(e.data.on||t.data.on){var n=t.data.on||{},r=e.data.on||{};Lo=t.elm,yn(n),K(n,r,_n,bn,t.context)}}function wn(e,t){if(e.data.domProps||t.data.domProps){var n,r,i=t.elm,o=e.data.domProps||{},a=t.data.domProps||{};a.__ob__&&(a=t.data.domProps=u({},a));for(n in o)null==a[n]&&(i[n]="");for(n in a)if(r=a[n],"textContent"!==n&&"innerHTML"!==n||(t.children&&(t.children.length=0),r!==o[n]))if("value"===n){i._value=r;var s=null==r?"":String(r);xn(i,t,s)&&(i.value=s)}else i[n]=r}}function xn(e,t,n){return!e.composing&&("option"===t.tag||Cn(e,n)||kn(e,n))}function Cn(e,t){return document.activeElement!==e&&e.value!==t}function kn(e,n){var r=e.value,i=e._vModifiers;return i&&i.number||"number"===e.type?t(r)!==t(n):i&&i.trim?r.trim()!==n.trim():r!==n}function An(e){var t=On(e.style);return e.staticStyle?u(e.staticStyle,t):t}function On(e){return Array.isArray(e)?p(e):"string"==typeof e?la(e):e}function Tn(e,t){var n,r={};if(t)for(var i=e;i.componentInstance;)i=i.componentInstance._vnode,i.data&&(n=An(i.data))&&u(r,n);(n=An(e.data))&&u(r,n);for(var o=e;o=o.parent;)o.data&&(n=An(o.data))&&u(r,n);return r}function Sn(e,t){var n=t.data,r=e.data;if(n.staticStyle||n.style||r.staticStyle||r.style){var i,o,a=t.elm,s=e.data.staticStyle,c=e.data.style||{},l=s||c,f=On(t.data.style)||{};t.data.style=f.__ob__?u({},f):f;var p=Tn(t,!0);for(o in l)null==p[o]&&da(a,o,"");for(o in p)(i=p[o])!==l[o]&&da(a,o,null==i?"":i)}}function En(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(/\s+/).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function jn(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(/\s+/).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t);else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");e.setAttribute("class",n.trim())}}function Nn(e){if(e){if("object"==typeof e){var t={};return e.css!==!1&&u(t,ga(e.name||"v")),u(t,e),t}return"string"==typeof e?ga(e):void 0}}function In(e){ka(function(){ka(e)})}function Ln(e,t){(e._transitionClasses||(e._transitionClasses=[])).push(t),En(e,t)}function Dn(e,t){e._transitionClasses&&r(e._transitionClasses,t),jn(e,t)}function Mn(e,t,n){var r=Pn(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===_a?wa:Ca,c=0,u=function(){e.removeEventListener(s,l),n()},l=function(t){t.target===e&&++c>=a&&u()};setTimeout(function(){c0&&(n=_a,l=a,f=o.length):t===ba?u>0&&(n=ba,l=u,f=c.length):(l=Math.max(a,u),n=l>0?a>u?_a:ba:null,f=n?n===_a?o.length:c.length:0),{type:n,timeout:l,propCount:f,hasTransform:n===_a&&Aa.test(r[$a+"Property"])}}function Rn(e,t){for(;e.length1}function zn(e,t){t.data.show||Hn(t)}function Jn(e,t,n){var r=t.value,i=e.multiple;if(!i||Array.isArray(r)){for(var o,a,s=0,c=e.options.length;s-1,a.selected!==o&&(a.selected=o);else if(v(qn(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function Kn(e,t){for(var n=0,r=t.length;n=0&&a[i].lowerCasedTag!==s;i--);else i=0;if(i>=0){for(var c=a.length-1;c>=i;c--)t.end&&t.end(a[c].tag,n,r);a.length=i,o=i&&a[i-1].tag}else"br"===s?t.start&&t.start(e,[],!0,n,r):"p"===s&&(t.start&&t.start(e,[],!1,n,r),t.end&&t.end(e,n,r))}for(var i,o,a=[],s=t.expectHTML,c=t.isUnaryTag||Oi,u=t.canBeLeftOpenTag||Oi,l=0;e;){if(i=e,o&&ys(o)){var f=o.toLowerCase(),p=_s[f]||(_s[f]=new RegExp("([\\s\\S]*?)(]*>)","i")),d=0,v=e.replace(p,function(e,n,r){return d=r.length,ys(f)||"noscript"===f||(n=n.replace(//g,"$1").replace(//g,"$1")),t.chars&&t.chars(n),""});l+=e.length-v.length,e=v,r(f,l-d,l)}else{var h=e.indexOf("<");if(0===h){if(Ya.test(e)){var m=e.indexOf("-->");if(m>=0){n(m+3);continue}}if(Qa.test(e)){var g=e.indexOf("]>");if(g>=0){n(g+2);continue}}var y=e.match(Ga);if(y){n(y[0].length);continue}var _=e.match(Za);if(_){var b=l;n(_[0].length),r(_[1],b,l);continue}var $=function(){var t=e.match(qa);if(t){var r={tagName:t[1],attrs:[],start:l};n(t[0].length);for(var i,o;!(i=e.match(Wa))&&(o=e.match(Ja));)n(o[0].length),r.attrs.push(o);if(i)return r.unarySlash=i[1],n(i[0].length),r.end=l,r}}();if($){!function(e){var n=e.tagName,i=e.unarySlash;s&&("p"===o&&Va(n)&&r(o),u(n)&&o===n&&r(n));for(var l=c(n)||"html"===n&&"head"===o||!!i,f=e.attrs.length,p=new Array(f),d=0;d=0){for(x=e.slice(h);!(Za.test(x)||qa.test(x)||Ya.test(x)||Qa.test(x)||(C=x.indexOf("<",1))<0);)h+=C,x=e.slice(h);w=e.substring(0,h),n(h)}h<0&&(w=e,e=""),t.chars&&w&&t.chars(w)}if(e===i){t.chars&&t.chars(e);break}}r()}function ur(e,t){var n=t?Cs(t):xs;if(n.test(e)){for(var r,i,o=[],a=n.lastIndex=0;r=n.exec(e);){i=r.index,i>a&&o.push(JSON.stringify(e.slice(a,i)));var s=Wt(r[1].trim());o.push("_s("+s+")"),a=i+r[0].length}return a0,Pi=Li&&Li.indexOf("edge/")>0,Ri=Li&&Li.indexOf("android")>0,Fi=Li&&/iphone|ipad|ipod|ios/.test(Li),Hi=Li&&/chrome\/\d+/.test(Li)&&!Pi,Ui=function(){return void 0===yi&&(yi=!Ii&&"undefined"!=typeof global&&"server"===global.process.env.VUE_ENV),yi},Bi=Ii&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,Vi="undefined"!=typeof Symbol&&b(Symbol)&&"undefined"!=typeof Reflect&&b(Reflect.ownKeys),zi=function(){function e(){r=!1;var e=n.slice(0);n.length=0;for(var t=0;t1?c(n):n;for(var r=c(arguments,1),i=0,o=n.length;i1&&(t[n[0].trim()]=n[1].trim())}}),t}),fa=/^--/,pa=/\s*!important$/,da=function(e,t,n){fa.test(t)?e.style.setProperty(t,n):pa.test(n)?e.style.setProperty(t,n.replace(pa,""),"important"):e.style[ha(t)]=n},va=["Webkit","Moz","ms"],ha=a(function(e){if(Do=Do||document.createElement("div"),"filter"!==(e=wi(e))&&e in Do.style)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=0;np?(u=Lt(n[m+1])?null:n[m+1].elm,h(e,u,n,f,m,r)):f>m&&g(e,t,l,p)}function b(e,t,n,r){if(e!==t){if(Mt(t.isStatic)&&Mt(e.isStatic)&&t.key===e.key&&(Mt(t.isCloned)||Mt(t.isOnce)))return t.elm=e.elm,void(t.componentInstance=e.componentInstance);var i,o=t.data;Dt(o)&&Dt(i=o.hook)&&Dt(i=i.prepatch)&&i(e,t);var a=t.elm=e.elm,s=e.children,c=t.children;if(Dt(o)&&p(t)){for(i=0;i',n.innerHTML.indexOf(t)>0}("\n"," "),Ua=n("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),Ba=n("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),Va=n("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),za=[/"([^"]*)"+/.source,/'([^']*)'+/.source,/([^\s"'=<>`]+)/.source],Ja=new RegExp("^\\s*"+/([^\s"'<>\/=]+)/.source+"(?:\\s*("+/(?:=)/.source+")\\s*(?:"+za.join("|")+"))?"),Ka="[a-zA-Z_][\\w\\-\\.]*",qa=new RegExp("^<((?:"+Ka+"\\:)?"+Ka+")"),Wa=/^\s*(\/?)>/,Za=new RegExp("^<\\/((?:"+Ka+"\\:)?"+Ka+")[^>]*>"),Ga=/^]+>/i,Ya=/^