diff --git a/.claude/multi-node.md b/.claude/multi-node.md index cedf445..84c4b79 100644 --- a/.claude/multi-node.md +++ b/.claude/multi-node.md @@ -305,20 +305,20 @@ Phase 6: CLI Commands 6.1 Node Management File: cmd/mining/cmd/node.go -// miner-cli node init --name "rig-alpha" --role worker -// miner-cli node init --name "control-center" --role controller +// miner-ctrl node init --name "rig-alpha" --role worker +// miner-ctrl node init --name "control-center" --role controller var nodeInitCmd = &cobra.Command{ Use: "init", Short: "Initialize node identity", } -// miner-cli node info +// miner-ctrl node info var nodeInfoCmd = &cobra.Command{ Use: "info", Short: "Show node identity and status", } -// miner-cli node serve --listen :9091 +// miner-ctrl node serve --listen :9091 var nodeServeCmd = &cobra.Command{ Use: "serve", Short: "Start P2P server for remote connections", @@ -327,25 +327,25 @@ Short: "Start P2P server for remote connections", 6.2 Peer Management File: cmd/mining/cmd/peer.go -// miner-cli peer add --address 192.168.1.100:9091 --name "rig-alpha" +// miner-ctrl peer add --address 192.168.1.100:9091 --name "rig-alpha" var peerAddCmd = &cobra.Command{ Use: "add", Short: "Add a peer node (initiates handshake)", } -// miner-cli peer list +// miner-ctrl peer list var peerListCmd = &cobra.Command{ Use: "list", Short: "List registered peers with status", } -// miner-cli peer remove +// miner-ctrl peer remove var peerRemoveCmd = &cobra.Command{ Use: "remove", Short: "Remove a peer from registry", } -// miner-cli peer ping +// miner-ctrl peer ping var peerPingCmd = &cobra.Command{ Use: "ping", Short: "Ping a peer and update metrics", @@ -354,33 +354,33 @@ Short: "Ping a peer and update metrics", 6.3 Remote Operations File: cmd/mining/cmd/remote.go -// miner-cli remote status [peer-id] +// miner-ctrl remote status [peer-id] // Shows stats from all peers or specific peer var remoteStatusCmd = &cobra.Command{ Use: "status", Short: "Get mining status from remote peers", } -// miner-cli remote start --profile +// miner-ctrl remote start --profile var remoteStartCmd = &cobra.Command{ Use: "start", Short: "Start miner on remote peer", } -// miner-cli remote stop [miner-name] +// miner-ctrl remote stop [miner-name] var remoteStopCmd = &cobra.Command{ Use: "stop", Short: "Stop miner on remote peer", } -// miner-cli remote deploy --profile -// miner-cli remote deploy --miner xmrig +// miner-ctrl remote deploy --profile +// miner-ctrl remote deploy --miner xmrig var remoteDeployCmd = &cobra.Command{ Use: "deploy", Short: "Deploy config or miner bundle to remote peer", } -// miner-cli remote logs --lines 100 +// miner-ctrl remote logs --lines 100 var remoteLogsCmd = &cobra.Command{ Use: "logs", Short: "Get console logs from remote miner", diff --git a/.gitignore b/.gitignore index 47dea98..93c9fe8 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ *.dylib *.log -miner-cli +miner-ctrl # Test binary, built with `go test -c` *.test diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 37f5310..3752cf5 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -11,9 +11,9 @@ before: - sh -c 'cd ui && npm install && npm run build' builds: - - id: mining-cli + - id: mining-ctrl main: ./cmd/mining - binary: miner-cli + binary: miner-ctrl env: - CGO_ENABLED=0 @@ -109,5 +109,5 @@ announce: skip: false discord: enabled: true - message_template: "miner-cli {{.Tag}} is out! Check it out at {{ .ReleaseURL }}" + message_template: "miner-ctrl {{.Tag}} is out! Check it out at {{ .ReleaseURL }}" author: "Lethean Releases" diff --git a/CLAUDE.md b/CLAUDE.md index d4d85c8..1ac1141 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,7 +6,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ```bash # Build the CLI binary -make build # Outputs: miner-cli +make build # Outputs: miner-ctrl # Run tests make test # Tests with race detection and coverage diff --git a/Dockerfile.node b/Dockerfile.node index 6c5a23c..ac98882 100644 --- a/Dockerfile.node +++ b/Dockerfile.node @@ -19,7 +19,7 @@ RUN go mod download COPY . . # Build the CLI -RUN CGO_ENABLED=0 go build -o miner-cli ./cmd/mining +RUN CGO_ENABLED=0 go build -o miner-ctrl ./cmd/mining # Runtime image FROM alpine:3.19 @@ -30,7 +30,7 @@ WORKDIR /app RUN apk add --no-cache ca-certificates # Copy the binary -COPY --from=builder /app/miner-cli /usr/local/bin/miner-cli +COPY --from=builder /app/miner-ctrl /usr/local/bin/miner-ctrl # Create config directories RUN mkdir -p /root/.config/lethean-desktop /root/.local/share/lethean-desktop @@ -39,5 +39,5 @@ RUN mkdir -p /root/.config/lethean-desktop /root/.local/share/lethean-desktop EXPOSE 9091 # Default command shows help -ENTRYPOINT ["miner-cli"] +ENTRYPOINT ["miner-ctrl"] CMD ["--help"] diff --git a/Makefile b/Makefile index 45fcd12..ae82a6d 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: all build test clean install run demo help lint fmt vet docs install-swag dev package e2e e2e-ui e2e-api # Variables -BINARY_NAME=miner-cli +BINARY_NAME=miner-ctrl MAIN_PACKAGE=./cmd/mining GO=go GOFLAGS=-v diff --git a/README.md b/README.md index d0556f3..63ac27c 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ GoLang Miner management with embedable RESTful control - A modern, modular package for managing cryptocurrency miners. ```bash -miner-cli serve --host localhost --port 9090 --namespace /api/v1/mining +miner-ctrl serve --host localhost --port 9090 --namespace /api/v1/mining ``` ```html @@ -61,27 +61,27 @@ go get github.com/Snider/Mining ### CLI Commands -The `miner-cli` provides the following commands: +The `miner-ctrl` provides the following commands: ``` -miner-cli completion Generate the autocompletion script for the specified shell -miner-cli doctor Check and refresh the status of installed miners -miner-cli help Help about any command -miner-cli install Install or update a miner -miner-cli list List running and available miners -miner-cli serve Start the mining service and interactive shell -miner-cli start Start a new miner -miner-cli status Get status of a running miner -miner-cli stop Stop a running miner -miner-cli uninstall Uninstall a miner -miner-cli update Check for updates to installed miners +miner-ctrl completion Generate the autocompletion script for the specified shell +miner-ctrl doctor Check and refresh the status of installed miners +miner-ctrl help Help about any command +miner-ctrl install Install or update a miner +miner-ctrl list List running and available miners +miner-ctrl serve Start the mining service and interactive shell +miner-ctrl start Start a new miner +miner-ctrl status Get status of a running miner +miner-ctrl stop Stop a running miner +miner-ctrl uninstall Uninstall a miner +miner-ctrl update Check for updates to installed miners ``` -For more details on any command, use `miner-cli [command] --help`. +For more details on any command, use `miner-ctrl [command] --help`. ### RESTful API Endpoints -When running the `miner-cli serve` command, the following RESTful API endpoints are exposed (default base path `/api/v1/mining`): +When running the `miner-ctrl serve` command, the following RESTful API endpoints are exposed (default base path `/api/v1/mining`): - `GET /api/v1/mining/info` - Get cached miner installation information and system details. - `POST /api/v1/mining/doctor` - Perform a live check on all available miners to verify their installation status, version, and path. @@ -108,7 +108,7 @@ Swagger documentation is typically available at `http://:/api/v1/min ```bash # Build the CLI -go build -o miner-cli ./cmd/mining +go build -o miner-ctrl ./cmd/mining # Run tests go test ./... diff --git a/cmd/mining/cmd/serve.go b/cmd/mining/cmd/serve.go index 26be02f..9ba0043 100644 --- a/cmd/mining/cmd/serve.go +++ b/cmd/mining/cmd/serve.go @@ -155,7 +155,7 @@ var serveCmd = &cobra.Command{ } default: fmt.Fprintf(os.Stderr, "Unknown command: %s. Only 'start', 'status', 'stop', 'list' are directly supported in this shell.\n", command) - fmt.Fprintf(os.Stderr, "For other commands, please run them directly from your terminal (e.g., 'miner-cli doctor').\n") + fmt.Fprintf(os.Stderr, "For other commands, please run them directly from your terminal (e.g., 'miner-ctrl doctor').\n") } fmt.Print(">> ") } diff --git a/docker-compose.p2p.yml b/docker-compose.p2p.yml index 85250d4..0d995c7 100644 --- a/docker-compose.p2p.yml +++ b/docker-compose.p2p.yml @@ -4,9 +4,9 @@ # docker-compose -f docker-compose.p2p.yml up -d # # Then in another terminal: -# docker exec -it mining-controller miner-cli node info -# docker exec -it mining-worker1 miner-cli node info -# docker exec -it mining-controller miner-cli peer add --address mining-worker1:9091 --name worker1 +# docker exec -it mining-controller miner-ctrl node info +# docker exec -it mining-worker1 miner-ctrl node info +# docker exec -it mining-controller miner-ctrl peer add --address mining-worker1:9091 --name worker1 version: '3.8' @@ -28,8 +28,8 @@ services: command: - -c - | - miner-cli node init --name controller --role controller - miner-cli node serve --listen :9091 + miner-ctrl node init --name controller --role controller + miner-ctrl node serve --listen :9091 worker1: build: @@ -48,8 +48,8 @@ services: command: - -c - | - miner-cli node init --name worker1 --role worker - miner-cli node serve --listen :9091 + miner-ctrl node init --name worker1 --role worker + miner-ctrl node serve --listen :9091 worker2: build: @@ -68,8 +68,8 @@ services: command: - -c - | - miner-cli node init --name worker2 --role worker - miner-cli node serve --listen :9091 + miner-ctrl node init --name worker2 --role worker + miner-ctrl node serve --listen :9091 networks: mining-p2p: diff --git a/docs/API.md b/docs/API.md index e34ff55..cf46f7f 100644 --- a/docs/API.md +++ b/docs/API.md @@ -1,12 +1,12 @@ # Mining API Documentation -The Mining project provides a comprehensive RESTful API for managing cryptocurrency miners. This API is served by the `miner-cli serve` command. +The Mining project provides a comprehensive RESTful API for managing cryptocurrency miners. This API is served by the `miner-ctrl serve` command. ## Swagger Documentation The project includes automatically generated Swagger (OpenAPI) documentation. -When you run the service (e.g., `miner-cli serve`), the Swagger UI is available at: +When you run the service (e.g., `miner-ctrl serve`), the Swagger UI is available at: ``` http://:/api/v1/mining/swagger/index.html diff --git a/docs/CLI.md b/docs/CLI.md index b8eb722..59460a1 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -1,6 +1,6 @@ # Mining CLI Documentation -The `miner-cli` is the command-line interface for the Mining project. It allows you to manage miners directly from the terminal or start a REST API server. +The `miner-ctrl` is the command-line interface for the Mining project. It allows you to manage miners directly from the terminal or start a REST API server. ## Installation @@ -20,7 +20,7 @@ Starts the mining service and interactive shell. **Usage:** ```bash -miner-cli serve [flags] +miner-ctrl serve [flags] ``` **Flags:** @@ -33,7 +33,7 @@ Start a new miner. **Usage:** ```bash -miner-cli start [miner-type] [flags] +miner-ctrl start [miner-type] [flags] ``` ### `stop` @@ -41,7 +41,7 @@ Stop a running miner. **Usage:** ```bash -miner-cli stop [miner-name] +miner-ctrl stop [miner-name] ``` ### `status` @@ -49,7 +49,7 @@ Get status of a running miner. **Usage:** ```bash -miner-cli status [miner-name] +miner-ctrl status [miner-name] ``` ### `list` @@ -57,7 +57,7 @@ List running and available miners. **Usage:** ```bash -miner-cli list +miner-ctrl list ``` ### `install` @@ -65,7 +65,7 @@ Install or update a miner. **Usage:** ```bash -miner-cli install [miner-type] +miner-ctrl install [miner-type] ``` ### `uninstall` @@ -73,7 +73,7 @@ Uninstall a miner. **Usage:** ```bash -miner-cli uninstall [miner-type] +miner-ctrl uninstall [miner-type] ``` ### `update` @@ -81,7 +81,7 @@ Check for updates to installed miners. **Usage:** ```bash -miner-cli update +miner-ctrl update ``` ### `doctor` @@ -89,7 +89,7 @@ Check and refresh the status of installed miners. **Usage:** ```bash -miner-cli doctor +miner-ctrl doctor ``` ### `completion` @@ -97,5 +97,5 @@ Generate the autocompletion script for the specified shell (bash, zsh, fish, pow **Usage:** ```bash -miner-cli completion [shell] +miner-ctrl completion [shell] ``` diff --git a/miner/NOTICE b/miner/NOTICE new file mode 100644 index 0000000..d1f6ea0 --- /dev/null +++ b/miner/NOTICE @@ -0,0 +1,65 @@ +NOTICE - Third Party Software Attribution +========================================= + +This directory contains derivative works based on the XMRig project ecosystem. +These components are incorporated into this project under the compatibility +provisions of the European Union Public Licence v1.2 (EUPL-1.2), which lists +GPL-3.0 as a compatible licence (see Appendix of EUPL-1.2). + +Original Works and Copyright Holders +------------------------------------ + +core/ Based on XMRig + Copyright (c) 2018-2024 SChernykh + Copyright (c) 2016-2024 XMRig + Original: https://github.com/xmrig/xmrig + License: GPL-3.0 + +cuda/ Based on XMRig CUDA Plugin + Copyright (c) 2018-2024 SChernykh + Copyright (c) 2016-2024 XMRig + Original: https://github.com/xmrig/xmrig-cuda + License: GPL-3.0 + +proxy/ Based on XMRig Proxy + Copyright (c) 2018-2024 SChernykh + Copyright (c) 2016-2024 XMRig + Original: https://github.com/xmrig/xmrig-proxy + License: GPL-3.0 + +deps/ Based on XMRig Dependencies + Original: https://github.com/xmrig/xmrig-deps + License: Various (see individual components) + +config/ Based on XMRig Config + Copyright (c) 2018-2024 SChernykh + Copyright (c) 2016-2024 XMRig + Original: https://github.com/nicehash/xmrig-config + License: GPL-3.0 + +workers/ Based on XMRig Workers + Copyright (c) 2018-2024 SChernykh + Copyright (c) 2016-2024 XMRig + Original: https://github.com/xmrig/xmrig-workers + License: GPL-3.0 + +heatmap/ Based on XMRig Nonces Heatmap + Original: https://github.com/xmrig/xmrig-nonces-heatmap + License: GPL-3.0 + +Licence Compatibility Statement +------------------------------- + +Per EUPL-1.2 Article 5 (Compatibility clause): + +"If the Licensee Distributes or Communicates Derivative Works or copies thereof +based upon both the Work and another work licensed under a Compatible Licence, +this Distribution or Communication can be done under the terms of this +Compatible Licence." + +GPL-3.0 is explicitly listed as a Compatible Licence in the EUPL-1.2 Appendix. +The modifications and derivative works in this directory are distributed under +EUPL-1.2, the project's primary licence. + +All original copyright notices have been preserved in the source files as +required by both GPL-3.0 and EUPL-1.2 attribution requirements. diff --git a/miner/config/.babelrc b/miner/config/.babelrc new file mode 100644 index 0000000..7ea1ab4 --- /dev/null +++ b/miner/config/.babelrc @@ -0,0 +1,8 @@ +{ + "presets": [ + ["env", {"modules": false, "loose": true}], "stage-2", "react" + ], + "plugins": [ + "react-hot-loader/babel" + ] +} diff --git a/miner/config/.editorconfig b/miner/config/.editorconfig new file mode 100644 index 0000000..9a24d50 --- /dev/null +++ b/miner/config/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.json] +insert_final_newline = false \ No newline at end of file diff --git a/miner/config/.gitignore b/miner/config/.gitignore new file mode 100644 index 0000000..bc43036 --- /dev/null +++ b/miner/config/.gitignore @@ -0,0 +1,4 @@ +/node_modules +/.idea +/bower_components +/report.html diff --git a/miner/config/CLAUDE.md b/miner/config/CLAUDE.md new file mode 100644 index 0000000..2563f48 --- /dev/null +++ b/miner/config/CLAUDE.md @@ -0,0 +1,84 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Build & Development Commands + +```bash +# Install dependencies (required first time) +npm install -g bower +npm install +bower install + +# Development server (http://127.0.0.1:8081 with hot reload) +npm start + +# Production build (outputs to public/) +npm run build +``` + +## Architecture Overview + +XMRig Config is a **pure client-side React/Redux SPA** for generating XMRig miner configurations. It runs entirely in the browser with no backend - all configuration stays local. + +### Tech Stack +- **React 16.2** with **Redux 3.7** for state management +- **React Router 4** for client-side routing +- **Webpack 4** (bundling) + **Grunt** (CSS/asset processing) +- **LESS** for stylesheets, **Bootstrap 3** for UI + +### Source Structure (`src/`) + +``` +src/ +├── index.js # App entry point +├── routes.js # Main routing configuration +├── components/ # Presentational React components +│ ├── modals/ # Modal dialogs (add/edit/delete pools, threads, presets) +│ ├── misc/ # Misc settings sub-components +│ ├── network/ # Network/pool sub-components +│ └── start/ # Startup settings sub-components +├── containers/ # Redux-connected components +│ ├── xmrig/ # CPU miner containers +│ ├── amd/ # AMD miner containers (legacy) +│ ├── nvidia/ # NVIDIA miner containers (legacy) +│ └── proxy/ # Proxy containers +├── actions/ # Redux action creators +├── reducers/ # Redux reducers (config, modal, notification, presets) +├── store/ # Redux store setup (dev vs prod) +├── constants/ # Action types, modal types, product definitions +├── lib/ # Utilities (config generation, pool handling, serialization) +└── less/ # LESS stylesheets +``` + +### Redux State Shape + +```javascript +{ + config: { + xmrig: {...}, // CPU miner settings + 'xmrig-amd': {...}, // AMD miner (legacy) + 'xmrig-nvidia': {...}, // NVIDIA miner (legacy) + proxy: {...} // XMRig Proxy settings + }, + notification: {...}, // Toast notifications + modal: {...}, // Active modal state + presets: {...}, // Saved configurations + router: {...} // React Router state +} +``` + +### Key Files + +- **`src/lib/config.js`** (~12KB): Core config generation logic - serializes Redux state to XMRig JSON config and command-line args +- **`src/reducers/config.js`**: Largest reducer, handles all miner configuration state +- **`src/routes.js`**: Defines routes for each miner type (`/xmrig`, `/xmrig-amd`, `/xmrig-nvidia`, `/proxy`, `/presets`) + +### Build Pipeline + +1. **Development** (`npm start`): Grunt compiles LESS → Webpack dev server with HMR on :8081 +2. **Production** (`npm run build`): Webpack production build → Grunt minifies CSS/JS → filerev hashes assets + +### Deployment + +Copy the `public/` directory to any static web server. Nginx config example in `config/xmrig-config.conf`. diff --git a/miner/config/Gruntfile.js b/miner/config/Gruntfile.js new file mode 100644 index 0000000..7c1b69a --- /dev/null +++ b/miner/config/Gruntfile.js @@ -0,0 +1,131 @@ +'use strict'; + + +module.exports = function (grunt) { + grunt.initConfig({ + less: { + all: { + options: { + strictMath: true, + outputSourceFiles: true + }, + files: { + 'public/assets/css/bootstrap.css': 'src/less/bootstrap.less', + 'public/assets/css/app.css': 'src/less/app.less' + } + } + }, + autoprefixer: { + options: { + browsers: [ + 'Android 2.3', + 'Android >= 4', + 'Chrome >= 20', + 'Firefox >= 24', // Firefox 24 is the latest ESR + 'Explorer >= 8', + 'iOS >= 6', + 'Opera >= 12', + 'Safari >= 6' + ] + }, + all: { + src: [ + 'public/assets/css/bootstrap.css', + 'public/assets/css/app.css' + ] + } + }, + csscomb: { + options: { + config: 'bower_components/bootstrap/less/.csscomb.json' + }, + all: { + expand: true, + cwd: 'public/assets/css', + src: [ + 'bootstrap.css', + 'app.css' + ], + dest: 'public/assets/css' + } + }, + cssmin: { + options: { + compatibility: 'ie8', + keepSpecialComments: 0, + advanced: false + }, + all: { + files: { + 'public/assets/css/bootstrap.css': 'public/assets/css/bootstrap.css', + 'public/assets/css/app.css': 'public/assets/css/app.css' + } + } + }, + concat: { + common: { + files: { + 'public/assets/js/jquery.plugins.js': [ + 'bower_components/bootstrap/js/collapse.js', + 'bower_components/bootstrap/js/dropdown.js', + 'bower_components/bootstrap/js/modal.js', + 'bower_components/bootstrap/js/tab.js' + ] + } + } + }, + uglify: { + all: { + files: { + 'public/assets/js/jquery.plugins.js': 'public/assets/js/jquery.plugins.js' + } + } + }, + filerev: { + options: { + algorithm: 'sha256', + length: 8 + }, + js: { + src: [ + 'public/assets/js/jquery.plugins.js' + ] + }, + css: { + src: [ + 'public/assets/css/app.css', + 'public/assets/css/bootstrap.css' + ] + } + }, + filerev_replace: { + options: { + assets_root: 'public' + }, + views: { + src: 'public/**/*.html' + } + }, + watch: { + "css": { + files: [ + 'src/less/**/*.less' + ], + tasks: ['less'] + } + } + }); + + grunt.loadNpmTasks('grunt-contrib-less'); + grunt.loadNpmTasks('grunt-autoprefixer'); + grunt.loadNpmTasks('grunt-csscomb'); + grunt.loadNpmTasks('grunt-contrib-cssmin'); + grunt.loadNpmTasks('grunt-contrib-concat'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-filerev'); + grunt.loadNpmTasks('grunt-filerev-replace'); + grunt.loadNpmTasks('grunt-contrib-watch'); + + grunt.registerTask('devel', ['less', 'autoprefixer', 'csscomb', 'concat']); + grunt.registerTask('default', ['devel', 'cssmin', 'uglify', 'filerev', 'filerev_replace']); +}; diff --git a/miner/config/LICENSE b/miner/config/LICENSE new file mode 100644 index 0000000..9cecc1d --- /dev/null +++ b/miner/config/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/miner/config/README.md b/miner/config/README.md new file mode 100644 index 0000000..6025159 --- /dev/null +++ b/miner/config/README.md @@ -0,0 +1,38 @@ +# XMRig Config + +XMRig config generator & editor, available online https://config.xmrig.com + +* Settings editor for all XMRig miners and proxy. +* Generate command line and `config.json`. +* Easy configurations share via links. +* Pure Single Page Application, serverless, no tracking. + +# Install +### Easy +* Just copy [public](https://github.com/xmrig/xmrig-config/tree/master/public) directory to your webserver root. +* If you use nginx, edit and copy [xmrig-config.conf](https://github.com/xmrig/xmrig-config/blob/master/config/xmrig-config.conf) to proper location. + +### Advanced +* Dependences +``` +npm install -g bower +npm install +bower install +``` +* Development server http://127.0.0.1:8081 +``` +npm start +``` +* Production files +``` +npm run build +``` + +## Donations + +* XMR: `48edfHu7V9Z84YzzMa6fUueoELZ9ZRXq9VetWzYGzKt52XU5xvqgzYnDK9URnRoJMk1j8nLwEVsaSWJ4fhdUyZijBGUicoD` +* BTC: `1P7ujsXeX7GxQwHNnJsRMgAdNkFZmNVqJT` + +## Contacts +* support@xmrig.com +* [reddit](https://www.reddit.com/user/XMRig/) diff --git a/miner/config/bower.json b/miner/config/bower.json new file mode 100644 index 0000000..6ed7bc5 --- /dev/null +++ b/miner/config/bower.json @@ -0,0 +1,9 @@ +{ + "name": "xmrig-config", + "main": "index.js", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "bootstrap": "3.3.7" + } +} diff --git a/miner/config/config/xmrig-config.conf b/miner/config/config/xmrig-config.conf new file mode 100644 index 0000000..3835ba3 --- /dev/null +++ b/miner/config/config/xmrig-config.conf @@ -0,0 +1,14 @@ +server { + listen 80; + + access_log /var/www/xmrig-config/log/nginx_access.log; + error_log /var/www/xmrig-config/log/nginx_errors.log info; + + server_name config.xmrig.com; + + root /var/www/xmrig-config/public; + + location / { + try_files $uri /index.html; + } +} \ No newline at end of file diff --git a/miner/config/log/.gitignore b/miner/config/log/.gitignore new file mode 100644 index 0000000..a3a0c8b --- /dev/null +++ b/miner/config/log/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/miner/config/package.json b/miner/config/package.json new file mode 100644 index 0000000..3ed2de0 --- /dev/null +++ b/miner/config/package.json @@ -0,0 +1,67 @@ +{ + "name": "xmrig-config", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "grunt devel && webpack-dev-server --port 8081", + "build": "webpack -p --config webpack.prod.config && grunt" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@bitbucket.org/impomezia/xmrig-config.git" + }, + "author": "", + "license": "ISC", + "homepage": "https://bitbucket.org/impomezia/xmrig-config#readme", + "devDependencies": { + "@fortawesome/fontawesome": "1.1.8", + "@fortawesome/fontawesome-free-brands": "5.0.13", + "@fortawesome/fontawesome-free-solid": "5.0.13", + "@fortawesome/react-fontawesome": "0.0.18", + "babel-core": "6.26.3", + "babel-loader": "7.1.4", + "babel-polyfill": "6.26.0", + "babel-preset-env": "1.6.1", + "babel-preset-react": "6.24.1", + "babel-preset-stage-2": "6.24.1", + "bs58": "4.0.1", + "classnames": "2.2.6", + "clipboard": "2.0.4", + "file-saver": "1.3.8", + "grunt": "1.0.4", + "grunt-autoprefixer": "3.0.4", + "grunt-contrib-concat": "1.0.1", + "grunt-contrib-cssmin": "3.0.0", + "grunt-contrib-less": "2.0.0", + "grunt-contrib-uglify": "3.3.0", + "grunt-contrib-watch": "1.1.0", + "grunt-csscomb": "4.0.0", + "grunt-filerev": "2.3.1", + "grunt-filerev-replace": "0.1.5", + "history": "4.7.2", + "html-webpack-plugin": "3.1.0", + "immutability-helper": "2.6.6", + "lodash": "4.17.15", + "random-id": "0.0.2", + "react": "16.2.0", + "react-autosize-textarea": "3.0.2", + "react-clipboard.js": "1.1.3", + "react-dom": "16.2.1", + "react-hot-loader": "4.0.0", + "react-redux": "5.0.7", + "react-router-dom": "4.2.2", + "react-router-redux": "5.0.0-alpha.9", + "redux": "3.7.2", + "redux-devtools": "3.4.1", + "redux-devtools-dock-monitor": "1.1.3", + "redux-devtools-log-monitor": "1.4.0", + "redux-logger": "3.0.6", + "redux-thunk": "2.2.0", + "uglifyjs-webpack-plugin": "1.2.4", + "webpack": "4.2.0", + "webpack-bundle-analyzer": "3.6.0", + "webpack-cli": "2.0.15", + "webpack-dev-server": "3.1.11" + } +} diff --git a/miner/config/public/assets/css/app.2871079f.css b/miner/config/public/assets/css/app.2871079f.css new file mode 100644 index 0000000..c6129f2 --- /dev/null +++ b/miner/config/public/assets/css/app.2871079f.css @@ -0,0 +1 @@ +.nav-wizard>li{float:left}.nav-wizard>li>a{position:relative;padding:15px 20px;font-size:16px;background-color:#eee}.nav-wizard>li>a .badge{margin-left:3px;color:#eee;background-color:#337ab7}.nav-wizard>li:not(:first-child)>a{padding-left:45px}.nav-wizard>li:not(:first-child)>a:before{position:absolute;top:0;left:0;width:0;height:0;content:"";border-top:26px inset transparent;border-bottom:26px inset transparent;border-left:26px solid #fff}.nav-wizard>li:not(:last-child)>a{margin-right:6px}.nav-wizard>li:not(:last-child)>a:after{position:absolute;top:0;right:-26px;z-index:2;width:0;height:0;content:"";border-top:26px inset transparent;border-bottom:26px inset transparent;border-left:26px solid #eee}.nav-wizard>li:first-child>a{border-top-left-radius:4px;border-bottom-left-radius:4px}.nav-wizard>li:last-child>a{border-top-right-radius:4px;border-bottom-right-radius:4px}.nav-wizard>li.done:hover>a,.nav-wizard>li:hover>a{background-color:#d5d5d5}.nav-wizard>li.done:hover>a:before,.nav-wizard>li:hover>a:before{border-right-color:#d5d5d5}.nav-wizard>li.done:hover>a:after,.nav-wizard>li:hover>a:after{border-left-color:#d5d5d5}.nav-wizard>li.done>a{background-color:#e2e2e2}.nav-wizard>li.done>a:before{border-right-color:#e2e2e2}.nav-wizard>li.done>a:after{border-left-color:#e2e2e2}.nav-wizard>li.active>a,.nav-wizard>li.active>a:focus,.nav-wizard>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-wizard>li.active>a:after{border-left-color:#337ab7}.nav-wizard>li.active>a .badge{color:#337ab7;background-color:#fff}.nav-wizard>li.disabled>a{color:#777}.nav-wizard>li.disabled>a:focus,.nav-wizard>li.disabled>a:hover{color:#777;text-decoration:none;cursor:default;background-color:#eee}.nav-wizard>li.disabled>a:before{border-right-color:#eee}.nav-wizard>li.disabled>a:after{border-left-color:#eee}.nav-wizard.nav-justified>li{float:none}.nav-wizard.nav-justified>li>a{padding:15px 20px;font-size:16px}@media (max-width:768px){.nav-wizard.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-wizard.nav-justified>li>a:after,.nav-wizard.nav-justified>li>a:before{border:none!important}}body{padding-top:65px}.dropdown-menu>li>a{padding:8px 20px;cursor:pointer}.dropdown-menu>li>a.text-danger{color:#a94442}.dropdown-menu>li>.btn-group{margin:0 12px}.dropdown-menu .divider{margin:6px 0}.btn-group.open li .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.pager{text-align:left}.jumbotron{padding:30px}.jumbotron>h1{margin-top:0;font-size:24px}.jumbotron>p{margin:0}.modal-content .alert{margin-bottom:0;border-radius:0}.no-margin-top{margin-top:0}.no-margin-bottom{margin-bottom:0!important}.list-group-item:focus,.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}.list-group-item>.pull-right{margin-top:-1px}.list-group-item>.pull-right>.btn-sm{margin-top:-4px}.list-group-item>.pull-right>.btn-xs{margin-top:-4px}.text-or{width:100%;margin:30px 0;line-height:.1em;text-align:center;border-bottom:1px solid #eaeaea}.text-or>span{padding:0 10px;background:#fff}.checkbox-list-group .list-group-item{padding:14px 10px 14px 14px}.checkbox-list-group .list-group-item .pool-line{padding-right:50px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkbox-list-group .list-group-item>.pull-right>.btn{margin-top:-6px}.checkbox-list-group .list-group-item>.checkbox{margin:0}.checkbox-list-group .list-group-item>.checkbox input[type=checkbox]{margin-left:-15px}.text-bold{font-weight:700}.table-middle>tbody>tr>td{vertical-align:middle}.navbar{border:none}.navbar-inverse .navbar-brand{color:#eee;text-transform:uppercase}@media (min-width:768px){.navbar-right{margin-right:0}}#notification{position:fixed;top:3px;right:0;left:0;z-index:2000;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}#notification>.alert{min-width:250px;padding:10px 15px;margin-bottom:0;-webkit-animation:fadein .2s;-o-animation:fadein .2s;animation:fadein .2s}#notification>.alert-dismissible .close{top:0;right:-8px;opacity:.4}@-webkit-keyframes fadein{from{opacity:.1}to{opacity:1}}@-o-keyframes fadein{from{opacity:.1}to{opacity:1}}@keyframes fadein{from{opacity:.1}to{opacity:1}} \ No newline at end of file diff --git a/miner/config/public/assets/css/bootstrap.a5290058.css b/miner/config/public/assets/css/bootstrap.a5290058.css new file mode 100644 index 0000000..106b4ff --- /dev/null +++ b/miner/config/public/assets/css/bootstrap.a5290058.css @@ -0,0 +1 @@ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:4px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:3px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.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}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:3px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:2px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:3px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:2px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:2px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:4px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:4px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:3px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:4px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:2px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:2px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:3px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:4px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:2px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:3px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:2px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:4px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:3px 3px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:3px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:3px 3px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:3px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:3px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:3px 3px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:3px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:3px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:3px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:3px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:2px;border-bottom-left-radius:2px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:2px;border-bottom-right-radius:2px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:4px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:3px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:3px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:2px;border-top-right-radius:2px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:2px;border-top-right-radius:2px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:2px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:2px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:2px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:2px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:3px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:4px}.well-sm{padding:9px;border-radius:2px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:4px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/miner/config/public/assets/img/xmrig_logo.svg b/miner/config/public/assets/img/xmrig_logo.svg new file mode 100644 index 0000000..71c33eb --- /dev/null +++ b/miner/config/public/assets/img/xmrig_logo.svg @@ -0,0 +1 @@ +Xr_icon \ No newline at end of file diff --git a/miner/config/public/assets/js/9201d6129fc39fb1fc71.js b/miner/config/public/assets/js/9201d6129fc39fb1fc71.js new file mode 100644 index 0000000..fc92dc5 --- /dev/null +++ b/miner/config/public/assets/js/9201d6129fc39fb1fc71.js @@ -0,0 +1,2 @@ +/*! For license information please see 9201d6129fc39fb1fc71.js.LICENSE */ +!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},r.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/",r(r.s=731)}([function(e,t,r){"use strict";e.exports=r(526)},function(e,t,r){"use strict";e.exports=r(527)},function(e,t,r){"use strict";(function(e){var n;r.d(t,"h",function(){return i}),r.d(t,"g",function(){return _}),r.d(t,"e",function(){return c}),r.d(t,"f",function(){return u}),r.d(t,"a",function(){return s}),r.d(t,"c",function(){return l}),r.d(t,"b",function(){return f}),r.d(t,"d",function(){return p}),r.d(t,"n",function(){return d}),r.d(t,"m",function(){return h}),r.d(t,"o",function(){return E}),r.d(t,"j",function(){return m}),r.d(t,"k",function(){return v}),r.d(t,"i",function(){return M}),r.d(t,"l",function(){return g}),r.d(t,"p",function(){return O}),(n=r(1).enterModule)&&n(e);var o,a,i="xmrig",_="proxy",c="amd",u="nvidia",s=0,l=1,f=2,p=3,d=0,h=1,E=2,m=0,v=1,M=4,g=5,O=function(e,t){switch(e){case s:return"cryptonight";case l:return"cryptonight-lite";case f:return"cryptonight-heavy";case p:return"cryptonight-pico"}return"cryptonight"};o=r(1).default,a=r(1).leaveModule,o&&(o.register(i,"KIND_XMRIG","C:/monero/xmrig-config/src/constants/options.js"),o.register(_,"KIND_PROXY","C:/monero/xmrig-config/src/constants/options.js"),o.register(c,"KIND_AMD_LEGACY","C:/monero/xmrig-config/src/constants/options.js"),o.register(u,"KIND_NVIDIA_LEGACY","C:/monero/xmrig-config/src/constants/options.js"),o.register(s,"ALGO_CRYPTONIGHT","C:/monero/xmrig-config/src/constants/options.js"),o.register(l,"ALGO_CRYPTONIGHT_LITE","C:/monero/xmrig-config/src/constants/options.js"),o.register(f,"ALGO_CRYPTONIGHT_HEAVY","C:/monero/xmrig-config/src/constants/options.js"),o.register(p,"ALGO_CRYPTONIGHT_PICO","C:/monero/xmrig-config/src/constants/options.js"),o.register(d,"OS_WINDOWS","C:/monero/xmrig-config/src/constants/options.js"),o.register(h,"OS_LINUX","C:/monero/xmrig-config/src/constants/options.js"),o.register(E,"OS_X","C:/monero/xmrig-config/src/constants/options.js"),o.register(m,"MODE_AUTO","C:/monero/xmrig-config/src/constants/options.js"),o.register(v,"MODE_MANUAL","C:/monero/xmrig-config/src/constants/options.js"),o.register(2,"MODE_NONE","C:/monero/xmrig-config/src/constants/options.js"),o.register(3,"MODE_SIMPLE","C:/monero/xmrig-config/src/constants/options.js"),o.register(M,"MODE_ADVANCED","C:/monero/xmrig-config/src/constants/options.js"),o.register(g,"MODE_UNAVAILABLE","C:/monero/xmrig-config/src/constants/options.js"),o.register(O,"algoName","C:/monero/xmrig-config/src/constants/options.js"),a(e))}).call(this,r(5)(e))},function(e,t,r){e.exports=r(515)()},function(e,t,r){var n=r(13),o=r(45),a=r(35),i=r(34),_=r(44),c=function(e,t,r){var u,s,l,f,p=e&c.F,d=e&c.G,h=e&c.S,E=e&c.P,m=e&c.B,v=d?n:h?n[t]||(n[t]={}):(n[t]||{}).prototype,M=d?o:o[t]||(o[t]={}),g=M.prototype||(M.prototype={});for(u in d&&(r=t),r)l=((s=!p&&v&&void 0!==v[u])?v:r)[u],f=m&&s?_(l,n):E&&"function"==typeof l?_(Function.call,l):l,v&&i(v,u,l,e&c.U),M[u]!=l&&a(M,u,f),E&&g[u]!=l&&(g[u]=l)};n.core=o,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,e.exports=c},function(e,t){e.exports=function(e){if(!e.webpackPolyfill){var t=Object.create(e);t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),Object.defineProperty(t,"exports",{enumerable:!0}),t.webpackPolyfill=1}return t}},function(e,t,r){"use strict";(function(e){var n,o=r(98),a=r(3),i=r.n(a),_=r(0),c=r.n(_),u="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},s=(function(e){var t,r,n,o,a,i,_,c,s,l,f,p,d,h,E;t=u,r=function(e,t,n){if(!c(t)||l(t)||f(t)||p(t)||_(t))return t;var o,a=0,i=0;if(s(t))for(o=[],i=t.length;a=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r},h=function(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t2&&void 0!==arguments[2]?arguments[2]:{},n=(t.children||[]).map(E.bind(null,e)),o=Object.keys(t.attributes||{}).reduce(function(e,r){var n=t.attributes[r];switch(r){case"class":e.attrs.className=n,delete t.attributes.class;break;case"style":e.attrs.style=n.split(";").map(function(e){return e.trim()}).filter(function(e){return e}).reduce(function(e,t){var r,n=t.indexOf(":"),o=s.camelize(t.slice(0,n)),a=t.slice(n+1).trim();return o.startsWith("webkit")?e[(r=o,r.charAt(0).toUpperCase()+r.slice(1))]=a:e[o]=a,e},{});break;default:0===r.indexOf("aria-")||0===r.indexOf("data-")?e.attrs[r.toLowerCase()]=n:e.attrs[s.camelize(r)]=n}return e},{attrs:{}}),a=r.style,i=void 0===a?{}:a,_=d(r,["style"]);return o.attrs.style=p({},o.attrs.style,i),e.apply(void 0,[t.tag,p({},o.attrs,_)].concat(h(n)))}var m=!1;try{m=!0}catch(e){}var v=function(){var e;!m&&console&&"function"==typeof console.error&&(e=console).error.apply(e,arguments)};function M(e,t){return Array.isArray(t)&&t.length>0||!Array.isArray(t)&&t?f({},e,t):{}}function g(e){return null===e?null:"object"===(void 0===e?"undefined":l(e))&&e.prefix&&e.iconName?e:Array.isArray(e)&&2===e.length?{prefix:e[0],iconName:e[1]}:"string"==typeof e?{prefix:"fas",iconName:e}:void 0}function O(e){var t=e.icon,r=e.mask,n=e.symbol,a=e.className,i=g(t),_=M("classes",[].concat(h(function(e){var t,r=(t={"fa-spin":e.spin,"fa-pulse":e.pulse,"fa-fw":e.fixedWidth,"fa-border":e.border,"fa-li":e.listItem,"fa-flip-horizontal":"horizontal"===e.flip||"both"===e.flip,"fa-flip-vertical":"vertical"===e.flip||"both"===e.flip},f(t,"fa-"+e.size,null!==e.size),f(t,"fa-rotate-"+e.rotation,null!==e.rotation),f(t,"fa-pull-"+e.pull,null!==e.pull),t);return Object.keys(r).map(function(e){return r[e]?e:null}).filter(function(e){return e})}(e)),h(a.split(" ")))),u=M("transform","string"==typeof e.transform?o.a.parse.transform(e.transform):e.transform),s=M("mask",g(r)),l=o.a.icon(i,p({},_,u,s,{symbol:n}));if(!l)return v("Could not find icon",i),null;var d=l.abstract,m=E.bind(null,c.a.createElement),P={};return Object.keys(e).forEach(function(t){O.defaultProps.hasOwnProperty(t)||(P[t]=e[t])}),m(d[0],P)}O.propTypes={border:i.a.bool,className:i.a.string,mask:i.a.oneOfType([i.a.object,i.a.array,i.a.string]),fixedWidth:i.a.bool,flip:i.a.oneOf(["horizontal","vertical","both"]),icon:i.a.oneOfType([i.a.object,i.a.array,i.a.string]),listItem:i.a.bool,pull:i.a.oneOf(["right","left"]),pulse:i.a.bool,name:i.a.string,rotation:i.a.oneOf([90,180,270]),size:i.a.oneOf(["lg","xs","sm","1x","2x","3x","4x","5x","6x","7x","8x","9x","10x"]),spin:i.a.bool,symbol:i.a.oneOfType([i.a.bool,i.a.string]),transform:i.a.oneOfType([i.a.string,i.a.object])},O.defaultProps={border:!1,className:"",mask:null,fixedWidth:!1,flip:null,icon:null,listItem:!1,pull:null,pulse:!1,name:"",rotation:null,size:null,spin:!1,symbol:!1,transform:null},o.a.noAuto(),t.a=O}).call(this,r(84))},function(e,t,r){"use strict";(function(e){r.d(t,"e",function(){return u}),r.d(t,"d",function(){return s}),r.d(t,"f",function(){return l}),r.d(t,"a",function(){return f}),r.d(t,"c",function(){return p}),r.d(t,"b",function(){return d});var n,o=r(0),a=r.n(o),i=r(6);(n=r(1).enterModule)&&n(e);var _,c,u=function(e){var t=e.children;return a.a.createElement("div",{className:"modal-dialog"},a.a.createElement("div",{className:"modal-content"},t))},s=function(e){var t=e.children,r=e.dismiss;return a.a.createElement("div",{className:"modal-header"},a.a.createElement("button",{type:"button",className:"close",onClick:r},a.a.createElement(i.a,{icon:"times-circle",size:"lg"})),t)},l=function(e){var t=e.children;return a.a.createElement("h4",{className:"modal-title"},t)},f=function(e){var t=e.children;return a.a.createElement("div",{className:"modal-body"},t)},p=function(e){var t=e.children;return a.a.createElement("div",{className:"modal-footer"},t)},d=function(e){var t=e.dismiss;return a.a.createElement("button",{type:"button",className:"btn btn-default hidden-xs",onClick:t},a.a.createElement(i.a,{icon:"times"})," Cancel")};_=r(1).default,c=r(1).leaveModule,_&&(_.register(u,"Modal","C:/monero/xmrig-config/src/components/modals/Modal.js"),_.register(s,"Header","C:/monero/xmrig-config/src/components/modals/Modal.js"),_.register(l,"Title","C:/monero/xmrig-config/src/components/modals/Modal.js"),_.register(f,"Body","C:/monero/xmrig-config/src/components/modals/Modal.js"),_.register(p,"Footer","C:/monero/xmrig-config/src/components/modals/Modal.js"),_.register(d,"Cancel","C:/monero/xmrig-config/src/components/modals/Modal.js"),_.register(function(e){return e.enabled?a.a.createElement("span",null,a.a.createElement("i",{className:"fa fa-spinner fa-spin fa-lg text-muted"})," "):null},"Spinner","C:/monero/xmrig-config/src/components/modals/Modal.js"),c(e))}).call(this,r(5)(e))},function(e,t,r){"use strict";var n=r(20),o=r.n(n),a=r(0),i=r.n(a),_=r(3),c=r.n(_),u=r(142),s=r.n(u),l=r(144),f=l.a;function p(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var d=function(e){function t(){var r,n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var o=arguments.length,a=Array(o),i=0;i ignores the history prop. To use a custom history, use `import { Router }` instead of `import { BrowserRouter as Router }`.")},t.prototype.render=function(){return i.a.createElement(f,{history:this.history,children:this.props.children})},t}(i.a.Component);d.propTypes={basename:c.a.string,forceRefresh:c.a.bool,getUserConfirmation:c.a.func,keyLength:c.a.number,children:c.a.node};var h=d,E=r(370),m=r.n(E);function v(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var M=function(e){function t(){var r,n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var o=arguments.length,a=Array(o),i=0;i ignores the history prop. To use a custom history, use `import { Router }` instead of `import { HashRouter as Router }`.")},t.prototype.render=function(){return i.a.createElement(f,{history:this.history,children:this.props.children})},t}(i.a.Component);M.propTypes={basename:c.a.string,getUserConfirmation:c.a.func,hashType:c.a.oneOf(["hashbang","noslash","slash"]),children:c.a.node};var g=M,O=r(19),P=r.n(O),y=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}(e,["replace","to","innerRef"]);P()(this.context.router,"You should not use outside a ");var o=this.context.router.history.createHref("string"==typeof t?{pathname:t}:t);return i.a.createElement("a",y({},n,{onClick:this.handleClick,href:o,ref:r}))},t}(i.a.Component);D.propTypes={onClick:c.a.func,target:c.a.string,replace:c.a.bool,to:c.a.oneOfType([c.a.string,c.a.object]).isRequired,innerRef:c.a.oneOfType([c.a.string,c.a.func])},D.defaultProps={replace:!1},D.contextTypes={router:c.a.shape({history:c.a.shape({push:c.a.func.isRequired,replace:c.a.func.isRequired,createHref:c.a.func.isRequired}).isRequired}).isRequired};var w=D,T=r(28),A=r.n(T),R=r(201),L=r(200),x=function(e){var t=e.pathname,r=e.search,n=e.hash,o=t||"/";return r&&"?"!==r&&(o+="?"===r.charAt(0)?r:"?"+r),n&&"#"!==n&&(o+="#"===n.charAt(0)?n:"#"+n),o},I=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{},t=e.getUserConfirmation,r=e.initialEntries,n=void 0===r?["/"]:r,a=e.initialIndex,i=void 0===a?0:a,_=e.keyLength,c=void 0===_?6:_,u=function(){var e=null,t=[];return{setPrompt:function(t){return o()(null==e,"A history supports only one prompt at a time"),e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,r,n,a){if(null!=e){var i="function"==typeof e?e(t,r):e;"string"==typeof i?"function"==typeof n?n(i,a):(o()(!1,"A history needs a getUserConfirmation function in order to use a prompt message"),a(!0)):a(!1!==i)}else a(!0)},appendListener:function(e){var r=!0,n=function(){r&&e.apply(void 0,arguments)};return t.push(n),function(){r=!1,t=t.filter(function(e){return e!==n})}},notifyListeners:function(){for(var e=arguments.length,r=Array(e),n=0;nt?r.splice(t,r.length-t,n):r.push(n),s({action:"PUSH",location:n,index:t,entries:r})}})},replace:function(e,r){o()(!("object"===(void 0===e?"undefined":U(e))&&void 0!==e.state&&void 0!==r),"You should avoid providing a 2nd state argument to replace when the 1st argument is a location-like object that already has state; it is ignored");var n=k(e,r,l(),E.location);u.confirmTransitionTo(n,"REPLACE",t,function(e){e&&(E.entries[E.index]=n,s({action:"REPLACE",location:n}))})},go:h,goBack:function(){return h(-1)},goForward:function(){return h(1)},canGo:function(e){var t=E.index+e;return t>=0&&t0&&void 0!==arguments[0]&&arguments[0];return u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return E};function j(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var S=function(e){function t(){var r,n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var o=arguments.length,a=Array(o),i=0;i ignores the history prop. To use a custom history, use `import { Router }` instead of `import { MemoryRouter as Router }`.")},t.prototype.render=function(){return i.a.createElement(l.a,{history:this.history,children:this.props.children})},t}(i.a.Component);S.propTypes={initialEntries:c.a.array,initialIndex:c.a.number,getUserConfirmation:c.a.func,keyLength:c.a.number,children:c.a.node};var N=S,F=r(143),q=Object.assign||function(e){for(var t=1;t or withRouter() outside a ");var c=t.route,u=(n||c.location).pathname;return Object(F.a)(u,{path:o,strict:a,exact:i,sensitive:_},c.match)},t.prototype.componentWillMount=function(){A()(!(this.props.component&&this.props.render),"You should not use and in the same route; will be ignored"),A()(!(this.props.component&&this.props.children&&!z(this.props.children)),"You should not use and in the same route; will be ignored"),A()(!(this.props.render&&this.props.children&&!z(this.props.children)),"You should not use and in the same route; will be ignored")},t.prototype.componentWillReceiveProps=function(e,t){A()(!(e.location&&!this.props.location),' elements should not change from uncontrolled to controlled (or vice versa). You initially used no "location" prop and then provided one on a subsequent render.'),A()(!(!e.location&&this.props.location),' elements should not change from controlled to uncontrolled (or vice versa). You provided a "location" prop initially but omitted it on a subsequent render.'),this.setState({match:this.computeMatch(e,t.router)})},t.prototype.render=function(){var e=this.state.match,t=this.props,r=t.children,n=t.component,o=t.render,a=this.context.router,_=a.history,c=a.route,u=a.staticContext,s={match:e,location:this.props.location||c.location,history:_,staticContext:u};return n?e?i.a.createElement(n,s):null:o?e?o(s):null:"function"==typeof r?r(s):r&&!z(r)?i.a.Children.only(r):null},t}(i.a.Component);V.propTypes={computedMatch:c.a.object,path:c.a.string,exact:c.a.bool,strict:c.a.bool,sensitive:c.a.bool,component:c.a.func,render:c.a.func,children:c.a.oneOfType([c.a.func,c.a.node]),location:c.a.object},V.contextTypes={router:c.a.shape({history:c.a.object.isRequired,route:c.a.object.isRequired,staticContext:c.a.object})},V.childContextTypes={router:c.a.object.isRequired};var $=V,Y=$,G=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}(e,["to","exact","strict","location","activeClassName","className","activeStyle","style","isActive","ariaCurrent"]);return i.a.createElement(Y,{path:"object"===(void 0===t?"undefined":X(t))?t.pathname:t,exact:r,strict:n,location:o,children:function(e){var r=e.location,n=e.match,o=!!(s?s(n,r):n);return i.a.createElement(w,G({to:t,className:o?[_,a].filter(function(e){return e}).join(" "):_,style:o?G({},u,c):u,"aria-current":o&&l},f))}})};J.propTypes={to:w.propTypes.to,exact:c.a.bool,strict:c.a.bool,location:c.a.object,activeClassName:c.a.string,className:c.a.string,activeStyle:c.a.object,style:c.a.object,isActive:c.a.func,ariaCurrent:c.a.oneOf(["page","step","location","true"])},J.defaultProps={activeClassName:"active",ariaCurrent:"true"};var Q=J,Z=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,e.apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.enable=function(e){this.unblock&&this.unblock(),this.unblock=this.context.router.history.block(e)},t.prototype.disable=function(){this.unblock&&(this.unblock(),this.unblock=null)},t.prototype.componentWillMount=function(){P()(this.context.router,"You should not use outside a "),this.props.when&&this.enable(this.props.message)},t.prototype.componentWillReceiveProps=function(e){e.when?this.props.when&&this.props.message===e.message||this.enable(e.message):this.disable()},t.prototype.componentWillUnmount=function(){this.disable()},t.prototype.render=function(){return null},t}(i.a.Component);Z.propTypes={when:c.a.bool,message:c.a.oneOfType([c.a.func,c.a.string]).isRequired},Z.defaultProps={when:!0},Z.contextTypes={router:c.a.shape({history:c.a.shape({block:c.a.func.isRequired}).isRequired}).isRequired};var ee=Z,te=r(141),re=r.n(te),ne={},oe=0,ae=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"/",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return"/"===e?e:function(e){var t=e,r=ne[t]||(ne[t]={});if(r[e])return r[e];var n=re.a.compile(e);return oe<1e4&&(r[e]=n,oe++),n}(e)(t,{pretty:!0})},ie=Object.assign||function(e){for(var t=1;t outside a "),this.isStatic()&&this.perform()},t.prototype.componentDidMount=function(){this.isStatic()||this.perform()},t.prototype.componentDidUpdate=function(e){var t=k(e.to),r=k(this.props.to);!function(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&Object(L.default)(e.state,t.state)}(t,r)?this.perform():A()(!1,"You tried to redirect to the same route you're currently on: \""+r.pathname+r.search+'"')},t.prototype.computeTo=function(e){var t=e.computedMatch,r=e.to;return t?"string"==typeof r?ae(r,t.params):ie({},r,{pathname:ae(r.pathname,t.params)}):r},t.prototype.perform=function(){var e=this.context.router.history,t=this.props.push,r=this.computeTo(this.props);t?e.push(r):e.replace(r)},t.prototype.render=function(){return null},t}(i.a.Component);_e.propTypes={computedMatch:c.a.object,push:c.a.bool,from:c.a.string,to:c.a.oneOfType([c.a.string,c.a.object]).isRequired},_e.defaultProps={push:!1},_e.contextTypes={router:c.a.shape({history:c.a.shape({push:c.a.func.isRequired,replace:c.a.func.isRequired}).isRequired,staticContext:c.a.object}).isRequired};var ce=_e,ue=Object.assign||function(e){for(var t=1;t",e)}},he=function(){},Ee=function(e){function t(){var r,n;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var o=arguments.length,a=Array(o),i=0;i ignores the history prop. To use a custom history, use `import { Router }` instead of `import { StaticRouter as Router }`.")},t.prototype.render=function(){var e=this.props,t=e.basename,r=(e.context,e.location),n=function(e,t){var r={};for(var n in e)t.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}(e,["basename","context","location"]),o={createHref:this.createHref,action:"POP",location:function(e,t){if(!e)return t;var r=le(e);return 0!==t.pathname.indexOf(r)?t:ue({},t,{pathname:t.pathname.substr(r.length)})}(t,k(r)),push:this.handlePush,replace:this.handleReplace,go:de("go"),goBack:de("goBack"),goForward:de("goForward"),listen:this.handleListen,block:this.handleBlock};return i.a.createElement(l.a,ue({},n,{history:o}))},t}(i.a.Component);Ee.propTypes={basename:c.a.string,context:c.a.object.isRequired,location:c.a.oneOfType([c.a.string,c.a.object])},Ee.defaultProps={basename:"",location:"/"},Ee.childContextTypes={router:c.a.object.isRequired};var me=Ee,ve=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,e.apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.componentWillMount=function(){P()(this.context.router,"You should not use outside a ")},t.prototype.componentWillReceiveProps=function(e){A()(!(e.location&&!this.props.location),' elements should not change from uncontrolled to controlled (or vice versa). You initially used no "location" prop and then provided one on a subsequent render.'),A()(!(!e.location&&this.props.location),' elements should not change from controlled to uncontrolled (or vice versa). You provided a "location" prop initially but omitted it on a subsequent render.')},t.prototype.render=function(){var e=this.context.router.route,t=this.props.children,r=this.props.location||e.location,n=void 0,o=void 0;return i.a.Children.forEach(t,function(t){if(null==n&&i.a.isValidElement(t)){var a=t.props,_=a.path,c=a.exact,u=a.strict,s=a.sensitive,l=a.from,f=_||l;o=t,n=Object(F.a)(r.pathname,{path:f,exact:c,strict:u,sensitive:s},e.match)}}),n?i.a.cloneElement(o,{location:r,computedMatch:n}):null},t}(i.a.Component);ve.contextTypes={router:c.a.shape({route:c.a.object.isRequired}).isRequired},ve.propTypes={children:c.a.node,location:c.a.object};var Me=ve,ge=F.a,Oe=r(140),Pe=r.n(Oe),ye=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}(t,["wrappedComponentRef"]);return i.a.createElement($,{children:function(t){return i.a.createElement(e,ye({},n,t,{ref:r}))}})};return t.displayName="withRouter("+(e.displayName||e.name)+")",t.WrappedComponent=e,t.propTypes={wrappedComponentRef:c.a.func},Pe()(t,e)};r.d(t,!1,function(){return h}),r.d(t,!1,function(){return g}),r.d(t,"a",function(){return w}),r.d(t,!1,function(){return N}),r.d(t,!1,function(){return Q}),r.d(t,!1,function(){return ee}),r.d(t,"b",function(){return ce}),r.d(t,"c",function(){return Y}),r.d(t,!1,function(){return f}),r.d(t,!1,function(){return me}),r.d(t,"d",function(){return Me}),r.d(t,!1,function(){return ge}),r.d(t,!1,function(){return be})},function(e,t,r){"use strict";var n=r(0),o=r(3),a=r.n(o),i=a.a.shape({trySubscribe:a.a.func.isRequired,tryUnsubscribe:a.a.func.isRequired,notifyNestedSubs:a.a.func.isRequired,isSubscribed:a.a.func.isRequired}),_=a.a.shape({subscribe:a.a.func.isRequired,dispatch:a.a.func.isRequired,getState:a.a.func.isRequired});function c(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"store",r=arguments[1]||t+"Subscription",o=function(e){function o(r,n){!function(e,t){if(!(e instanceof o))throw new TypeError("Cannot call a class as a function")}(this);var a=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,e.call(this,r,n));return a[t]=r.store,a}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(o,e),o.prototype.getChildContext=function(){var e;return(e={})[t]=this[t],e[r]=null,e},o.prototype.render=function(){return n.Children.only(this.props.children)},o}(n.Component);return o.propTypes={store:_.isRequired,children:a.a.element.isRequired},o.childContextTypes=((e={})[t]=_.isRequired,e[r]=i,e),o}var u=c(),s=r(140),l=r.n(s),f=r(19),p=r.n(f),d=null,h={notify:function(){}},E=function(){function e(t,r,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.store=t,this.parentSub=r,this.onStateChange=n,this.unsubscribe=null,this.listeners=h}return e.prototype.addNestedSub=function(e){return this.trySubscribe(),this.listeners.subscribe(e)},e.prototype.notifyNestedSubs=function(){this.listeners.notify()},e.prototype.isSubscribed=function(){return Boolean(this.unsubscribe)},e.prototype.trySubscribe=function(){var e,t;this.unsubscribe||(this.unsubscribe=this.parentSub?this.parentSub.addNestedSub(this.onStateChange):this.store.subscribe(this.onStateChange),this.listeners=(e=[],t=[],{clear:function(){t=d,e=d},notify:function(){for(var r=e=t,n=0;n1&&void 0!==arguments[1]?arguments[1]:{},a=o.getDisplayName,c=void 0===a?function(e){return"ConnectAdvanced("+e+")"}:a,u=o.methodName,s=void 0===u?"connectAdvanced":u,f=o.renderCountProp,d=void 0===f?void 0:f,h=o.shouldHandleStateChanges,O=void 0===h||h,P=o.storeKey,y=void 0===P?"store":P,b=o.withRef,C=void 0!==b&&b,D=function(e,t){var r={};for(var n in e)t.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}(o,["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef"]),w=y+"Subscription",T=v++,A=((t={})[y]=_,t[w]=i,t),R=((r={})[w]=i,r);return function(t){p()("function"==typeof t,"You must pass a component to the function returned by "+s+". Instead received "+JSON.stringify(t));var r=t.displayName||t.name||"Component",o=c(r),a=m({},D,{getDisplayName:c,methodName:s,renderCountProp:d,shouldHandleStateChanges:O,storeKey:y,withRef:C,displayName:o,wrappedComponentName:r,WrappedComponent:t}),i=function(r){function i(e,t){!function(e,t){if(!(e instanceof i))throw new TypeError("Cannot call a class as a function")}(this);var n=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,r.call(this,e,t));return n.version=T,n.state={},n.renderCount=0,n.store=e[y]||t[y],n.propsMode=Boolean(e[y]),n.setWrappedInstance=n.setWrappedInstance.bind(n),p()(n.store,'Could not find "'+y+'" in either the context or props of "'+o+'". Either wrap the root component in a , or explicitly pass "'+y+'" as a prop to "'+o+'".'),n.initSelector(),n.initSubscription(),n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(i,r),i.prototype.getChildContext=function(){var e,t=this.propsMode?null:this.subscription;return(e={})[w]=t||this.context[w],e},i.prototype.componentDidMount=function(){O&&(this.subscription.trySubscribe(),this.selector.run(this.props),this.selector.shouldComponentUpdate&&this.forceUpdate())},i.prototype.componentWillReceiveProps=function(e){this.selector.run(e)},i.prototype.shouldComponentUpdate=function(){return this.selector.shouldComponentUpdate},i.prototype.componentWillUnmount=function(){this.subscription&&this.subscription.tryUnsubscribe(),this.subscription=null,this.notifyNestedSubs=g,this.store=null,this.selector.run=g,this.selector.shouldComponentUpdate=!1},i.prototype.getWrappedInstance=function(){return p()(C,"To access the wrapped instance, you need to specify { withRef: true } in the options argument of the "+s+"() call."),this.wrappedInstance},i.prototype.setWrappedInstance=function(e){this.wrappedInstance=e},i.prototype.initSelector=function(){var t=e(this.store.dispatch,a);this.selector=function(e,t){var r={run:function(n){try{var o=e(t.getState(),n);(o!==r.props||r.error)&&(r.shouldComponentUpdate=!0,r.props=o,r.error=null)}catch(e){r.shouldComponentUpdate=!0,r.error=e}}};return r}(t,this.store),this.selector.run(this.props)},i.prototype.initSubscription=function(){if(O){var e=(this.propsMode?this.props:this.context)[w];this.subscription=new E(this.store,e,this.onStateChange.bind(this)),this.notifyNestedSubs=this.subscription.notifyNestedSubs.bind(this.subscription)}},i.prototype.onStateChange=function(){this.selector.run(this.props),this.selector.shouldComponentUpdate?(this.componentDidUpdate=this.notifyNestedSubsOnComponentDidUpdate,this.setState(M)):this.notifyNestedSubs()},i.prototype.notifyNestedSubsOnComponentDidUpdate=function(){this.componentDidUpdate=void 0,this.notifyNestedSubs()},i.prototype.isSubscribed=function(){return Boolean(this.subscription)&&this.subscription.isSubscribed()},i.prototype.addExtraProps=function(e){if(!(C||d||this.propsMode&&this.subscription))return e;var t=m({},e);return C&&(t.ref=this.setWrappedInstance),d&&(t[d]=this.renderCount++),this.propsMode&&this.subscription&&(t[w]=this.subscription),t},i.prototype.render=function(){var e=this.selector;if(e.shouldComponentUpdate=!1,e.error)throw e.error;return Object(n.createElement)(t,this.addExtraProps(e.props))},i}(n.Component);return i.WrappedComponent=t,i.displayName=o,i.childContextTypes=R,i.contextTypes=A,i.propTypes=A,l()(i,t)}}var P=Object.prototype.hasOwnProperty;function y(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!=e&&t!=t}function b(e,t){if(y(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(var o=0;o=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}(t,["initMapStateToProps","initMapDispatchToProps","initMergeProps"]),i=r(e,a),_=n(e,a),c=o(e,a);return(a.pure?function(e,t,r,n,o){var a=o.areStatesEqual,i=o.areOwnPropsEqual,_=o.areStatePropsEqual,c=!1,u=void 0,s=void 0,l=void 0,f=void 0,p=void 0;function d(o,c){var d,h,E=!i(c,s),m=!a(o,u);return u=o,s=c,E&&m?(l=e(u,s),t.dependsOnOwnProps&&(f=t(n,s)),p=r(l,f,s)):E?(e.dependsOnOwnProps&&(l=e(u,s)),t.dependsOnOwnProps&&(f=t(n,s)),p=r(l,f,s)):m?(d=e(u,s),h=!_(d,l),l=d,h&&(p=r(l,f,s)),p):p}return function(o,a){return c?d(o,a):(l=e(u=o,s=a),f=t(n,s),p=r(l,f,s),c=!0,p)}}:function(e,t,r,n){return function(o,a){return r(e(o,a),t(n,a),a)}})(i,_,c,e,a)}var U=Object.assign||function(e){for(var t=1;t=0;n--){var o=t[n](e);if(o)return o}return function(t,n){throw new Error("Invalid value of type "+typeof e+" for "+r+" argument when connecting component "+n.wrappedComponentName+".")}}function W(e,t){return e===t}var K=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.connectHOC,r=void 0===t?O:t,n=e.mapStateToPropsFactories,o=void 0===n?R:n,a=e.mapDispatchToPropsFactories,i=void 0===a?A:a,_=e.mergePropsFactories,c=void 0===_?I:_,u=e.selectorFactory,s=void 0===u?k:u;return function(e,t,n){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},_=a.pure,u=void 0===_||_,l=a.areStatesEqual,f=void 0===l?W:l,p=a.areOwnPropsEqual,d=void 0===p?b:p,h=a.areStatePropsEqual,E=void 0===h?b:h,m=a.areMergedPropsEqual,v=void 0===m?b:m,M=function(e,t){var r={};for(var n in e)t.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}(a,["pure","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","areMergedPropsEqual"]),g=B(e,o,"mapStateToProps"),O=B(t,i,"mapDispatchToProps"),P=B(n,c,"mergeProps");return r(s,U({methodName:"connect",getDisplayName:function(e){return"Connect("+e+")"},shouldHandleStateChanges:Boolean(e),initMapStateToProps:g,initMapDispatchToProps:O,initMergeProps:P,pure:u,areStatesEqual:f,areOwnPropsEqual:d,areStatePropsEqual:E,areMergedPropsEqual:v},M))}}();r.d(t,"a",function(){return u}),r.d(t,!1,function(){return c}),r.d(t,!1,function(){return O}),r.d(t,"b",function(){return K})},function(e,t,r){"use strict";(function(e){r.d(t,"c",function(){return _}),r.d(t,"a",function(){return c}),r.d(t,"d",function(){return u}),r.d(t,"b",function(){return s});var n,o=r(14);(n=r(1).enterModule)&&n(e);var a,i,_=function(e,t){return{type:o.i,kind:e,options:t}},c=function(e,t){return{type:o.a,kind:e,pool:t}},u=function(e,t){return{type:o.j,kind:e,pool:t}},s=function(e,t){return{type:o.b,kind:e,pool:t}};a=r(1).default,i=r(1).leaveModule,a&&(a.register(_,"update","C:/monero/xmrig-config/src/actions/config.js"),a.register(c,"addPool","C:/monero/xmrig-config/src/actions/config.js"),a.register(u,"updatePool","C:/monero/xmrig-config/src/actions/config.js"),a.register(s,"deletePool","C:/monero/xmrig-config/src/actions/config.js"),i(e))}).call(this,r(5)(e))},function(e,t,r){"use strict";(function(e){var n;r.d(t,"l",function(){return i}),r.d(t,"d",function(){return _}),r.d(t,"k",function(){return c}),r.d(t,"e",function(){return u}),r.d(t,"f",function(){return s}),r.d(t,"m",function(){return l}),r.d(t,"c",function(){return f}),r.d(t,"j",function(){return p}),r.d(t,"g",function(){return d}),r.d(t,"a",function(){return h}),r.d(t,"h",function(){return E}),r.d(t,"b",function(){return m}),r.d(t,"i",function(){return v}),(n=r(1).enterModule)&&n(e);var o,a,i="MODAL_NONE",_="MODAL_ADD_POOL",c="MODAL_EDIT_POOL",u="MODAL_DELETE_POOL",s="MODAL_DELETE_PRESET",l="MODAL_SHARE_PRESET",f="MODAL_ADD_OCL_THREAD",p="MODAL_EDIT_OCL_THREAD",d="MODAL_DELETE_THREAD",h="MODAL_ADD_CPU_THREAD",E="MODAL_EDIT_CPU_THREAD",m="MODAL_ADD_CUDA_THREAD",v="MODAL_EDIT_CUDA_THREAD";o=r(1).default,a=r(1).leaveModule,o&&(o.register(i,"MODAL_NONE","C:/monero/xmrig-config/src/constants/ModalTypes.js"),o.register(_,"MODAL_ADD_POOL","C:/monero/xmrig-config/src/constants/ModalTypes.js"),o.register(c,"MODAL_EDIT_POOL","C:/monero/xmrig-config/src/constants/ModalTypes.js"),o.register(u,"MODAL_DELETE_POOL","C:/monero/xmrig-config/src/constants/ModalTypes.js"),o.register(s,"MODAL_DELETE_PRESET","C:/monero/xmrig-config/src/constants/ModalTypes.js"),o.register(l,"MODAL_SHARE_PRESET","C:/monero/xmrig-config/src/constants/ModalTypes.js"),o.register(f,"MODAL_ADD_OCL_THREAD","C:/monero/xmrig-config/src/constants/ModalTypes.js"),o.register(p,"MODAL_EDIT_OCL_THREAD","C:/monero/xmrig-config/src/constants/ModalTypes.js"),o.register(d,"MODAL_DELETE_THREAD","C:/monero/xmrig-config/src/constants/ModalTypes.js"),o.register(h,"MODAL_ADD_CPU_THREAD","C:/monero/xmrig-config/src/constants/ModalTypes.js"),o.register(E,"MODAL_EDIT_CPU_THREAD","C:/monero/xmrig-config/src/constants/ModalTypes.js"),o.register(m,"MODAL_ADD_CUDA_THREAD","C:/monero/xmrig-config/src/constants/ModalTypes.js"),o.register(v,"MODAL_EDIT_CUDA_THREAD","C:/monero/xmrig-config/src/constants/ModalTypes.js"),a(e))}).call(this,r(5)(e))},function(e,t,r){var n=r(16);e.exports=function(e){if(!n(e))throw TypeError(e+" is not an object!");return e}},function(e,t){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},function(e,t,r){"use strict";(function(e){var n;r.d(t,"i",function(){return i}),r.d(t,"a",function(){return _}),r.d(t,"j",function(){return c}),r.d(t,"b",function(){return u}),r.d(t,"g",function(){return s}),r.d(t,"h",function(){return l}),r.d(t,"d",function(){return f}),r.d(t,"c",function(){return p}),r.d(t,"f",function(){return d}),r.d(t,"e",function(){return h}),(n=r(1).enterModule)&&n(e);var o,a,i="UPDATE",_="ADD_POOL",c="UPDATE_POOL",u="DELETE_POOL",s="PRESET_ADD_OR_CHANGE",l="PRESET_DELETE",f="MODAL_SHOW",p="MODAL_HIDE",d="NOTIFICATION_SHOW",h="NOTIFICATION_HIDE";o=r(1).default,a=r(1).leaveModule,o&&(o.register(i,"UPDATE","C:/monero/xmrig-config/src/constants/ActionTypes.js"),o.register(_,"ADD_POOL","C:/monero/xmrig-config/src/constants/ActionTypes.js"),o.register(c,"UPDATE_POOL","C:/monero/xmrig-config/src/constants/ActionTypes.js"),o.register(u,"DELETE_POOL","C:/monero/xmrig-config/src/constants/ActionTypes.js"),o.register(s,"PRESET_ADD_OR_CHANGE","C:/monero/xmrig-config/src/constants/ActionTypes.js"),o.register(l,"PRESET_DELETE","C:/monero/xmrig-config/src/constants/ActionTypes.js"),o.register(f,"MODAL_SHOW","C:/monero/xmrig-config/src/constants/ActionTypes.js"),o.register(p,"MODAL_HIDE","C:/monero/xmrig-config/src/constants/ActionTypes.js"),o.register(d,"NOTIFICATION_SHOW","C:/monero/xmrig-config/src/constants/ActionTypes.js"),o.register(h,"NOTIFICATION_HIDE","C:/monero/xmrig-config/src/constants/ActionTypes.js"),a(e))}).call(this,r(5)(e))},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,r){"use strict";(function(e){r.d(t,"b",function(){return u}),r.d(t,"a",function(){return s});var n,o=r(14),a=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{};return{type:o.d,subtype:e,data:t}},u=function(e,t,r){return new Promise(function(n,o){return r(c(e,a({},t,{resolve:n,reject:o})))})},s=function(){return{type:o.c}};i=r(1).default,_=r(1).leaveModule,i&&(i.register(c,"show","C:/monero/xmrig-config/src/actions/modals.js"),i.register(u,"showAsync","C:/monero/xmrig-config/src/actions/modals.js"),i.register(s,"dismiss","C:/monero/xmrig-config/src/actions/modals.js"),_(e))}).call(this,r(5)(e))},function(e,t,r){var n=r(105)("wks"),o=r(82),a=r(13).Symbol,i="function"==typeof a;(e.exports=function(e){return n[e]||(n[e]=i&&a[e]||(i?a:o)("Symbol."+e))}).store=n},function(e,t,r){"use strict";e.exports=function(e,t,r,n,o,a,i,_){if(!e){var c;if(void 0===t)c=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[r,n,o,a,i,_],s=0;(c=new Error(t.replace(/%s/g,function(){return u[s++]}))).name="Invariant Violation"}throw c.framesToPop=1,c}}},function(e,t,r){"use strict";e.exports=function(){}},function(e,t,r){var n=r(42),o=Math.min;e.exports=function(e){return e>0?o(n(e),9007199254740991):0}},function(module,__webpack_exports__,__webpack_require__){"use strict";(function(module){var react__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),react__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__),enterModule;function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}enterModule=__webpack_require__(1).enterModule,enterModule&&enterModule(module);var AsyncModal=function(_React$PureComponent){function AsyncModal(e){_classCallCheck(this,AsyncModal);var t=_possibleConstructorReturn(this,_React$PureComponent.call(this,e));return t.success=!1,t}return _inherits(AsyncModal,_React$PureComponent),AsyncModal.prototype.componentWillUnmount=function(){this.success||this.props.reject(new Error("dismiss"))},AsyncModal.prototype.resolve=function(e){this.success=!0,this.props.resolve(e),this.props.dismiss()},AsyncModal.prototype.__reactstandin__regenerateByEval=function __reactstandin__regenerateByEval(key,code){this[key]=eval(code)},AsyncModal}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent),_default=AsyncModal,reactHotLoader,leaveModule;__webpack_exports__.a=_default,reactHotLoader=__webpack_require__(1).default,leaveModule=__webpack_require__(1).leaveModule,reactHotLoader&&(reactHotLoader.register(AsyncModal,"AsyncModal","C:/monero/xmrig-config/src/components/modals/AsyncModal.js"),reactHotLoader.register(_default,"default","C:/monero/xmrig-config/src/components/modals/AsyncModal.js"),leaveModule(module))}).call(this,__webpack_require__(5)(module))},function(module,__webpack_exports__,__webpack_require__){"use strict";(function(module){var react__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),react__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__),enterModule;function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}enterModule=__webpack_require__(1).enterModule,enterModule&&enterModule(module);var Form=function(_React$PureComponent){function Form(e){_classCallCheck(this,Form);var t=_possibleConstructorReturn(this,_React$PureComponent.call(this,e));return t.handleInputChange=function(e){var r,n=e.target,o="checkbox"===n.type?+n.checked:"number"===n.type?+n.value:n.value;t.props.update(((r={})[n.name]=o,r))},t}return _inherits(Form,_React$PureComponent),Form.prototype.__reactstandin__regenerateByEval=function __reactstandin__regenerateByEval(key,code){this[key]=eval(code)},Form}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent),_default=Form,reactHotLoader,leaveModule;__webpack_exports__.a=_default,reactHotLoader=__webpack_require__(1).default,leaveModule=__webpack_require__(1).leaveModule,reactHotLoader&&(reactHotLoader.register(Form,"Form","C:/monero/xmrig-config/src/components/Form.js"),reactHotLoader.register(_default,"default","C:/monero/xmrig-config/src/components/Form.js"),leaveModule(module))}).call(this,__webpack_require__(5)(module))},function(e,t,r){e.exports=!r(15)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,r){var n=r(12),o=r(269),a=r(50),i=Object.defineProperty;t.f=r(24)?Object.defineProperty:function(e,t,r){if(n(e),t=a(t,!0),n(r),o)try{return i(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},function(e,t,r){var n=r(49);e.exports=function(e){return Object(n(e))}},function(module,__webpack_exports__,__webpack_require__){"use strict";(function(module){var react__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),react__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__),classnames__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(54),classnames__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__),react_router_dom__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(8),_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(6),_constants_products__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(87),_constants_options__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(2),enterModule;function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}enterModule=__webpack_require__(1).enterModule,enterModule&&enterModule(module);var Navbar=function(_React$PureComponent){function Navbar(){return _classCallCheck(this,Navbar),_possibleConstructorReturn(this,_React$PureComponent.apply(this,arguments))}return _inherits(Navbar,_React$PureComponent),Navbar.prototype.render=function(){return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("nav",{className:"navbar navbar-inverse navbar-fixed-top"},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div",{className:"container"},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div",{className:"navbar-header"},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button",{type:"button",className:"navbar-toggle collapsed","data-toggle":"collapse","data-target":"#navbar","aria-expanded":"false","aria-controls":"navbar"},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span",{className:"sr-only"},"Toggle navigation"),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span",{className:"icon-bar"}),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span",{className:"icon-bar"}),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span",{className:"icon-bar"})),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__.a,{to:"/",className:"navbar-brand"},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img",{alt:"Brand",src:"/assets/img/xmrig_logo.svg",width:32,height:32,style:{marginTop:-6}})),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__.a,{to:"/",className:"navbar-brand"},"XMRig CONFIG")),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div",{id:"navbar",className:"collapse navbar-collapse"},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("ul",{className:"nav navbar-nav"},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li",{className:"dropdown"},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a",{href:"#",className:"dropdown-toggle","data-toggle":"dropdown"},this.props.type?_constants_products__WEBPACK_IMPORTED_MODULE_4__.a[this.props.type].name:"Products"," ",react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span",{className:"caret"})),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("ul",{className:"dropdown-menu"},this.renderProduct(_constants_options__WEBPACK_IMPORTED_MODULE_5__.h),this.renderProduct(_constants_options__WEBPACK_IMPORTED_MODULE_5__.e),this.renderProduct(_constants_options__WEBPACK_IMPORTED_MODULE_5__.f),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li",{className:"divider"}),this.renderProduct(_constants_options__WEBPACK_IMPORTED_MODULE_5__.g))),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li",{className:classnames__WEBPACK_IMPORTED_MODULE_1___default()({active:"/presets"===this.props.path})},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__.a,{to:"/presets"},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_3__.a,{icon:"sliders-h"})," Presets"))),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p",{className:"navbar-text navbar-right"},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a",{title:"Twitter",href:"https://twitter.com/xmrig_dev",target:"_blank",className:"navbar-link",style:{marginRight:12}},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_3__.a,{size:"lg",icon:["fab","twitter"]})),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a",{title:"reddit",href:"https://www.reddit.com/u/XMRig",target:"_blank",className:"navbar-link",style:{marginRight:12}},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_3__.a,{size:"lg",icon:["fab","reddit"]})),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a",{title:"Telegram",href:"https://t.me/xmrig",target:"_blank",className:"navbar-link",style:{marginRight:12}},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_3__.a,{size:"lg",icon:["fab","telegram"]})),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a",{title:"GitHub",href:"https://github.com/xmrig/xmrig-config",target:"_blank",className:"navbar-link"},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_3__.a,{size:"lg",icon:["fab","github"]}))))))},Navbar.prototype.renderProduct=function(e){return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li",{className:classnames__WEBPACK_IMPORTED_MODULE_1___default()({active:this.props.type===e})},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__.a,{to:function(e,t){switch(t){case"":case"/network":case"/misc":case"/result":return"/"+e+t;case"/threads":return e===_constants_options__WEBPACK_IMPORTED_MODULE_5__.g?"/"+e:"/"+e+t;default:return"/"+e}}(e,this.props.path)},_constants_products__WEBPACK_IMPORTED_MODULE_4__.a[e].name))},Navbar.prototype.__reactstandin__regenerateByEval=function __reactstandin__regenerateByEval(key,code){this[key]=eval(code)},Navbar}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent),_default=Navbar,reactHotLoader,leaveModule;__webpack_exports__.a=_default,reactHotLoader=__webpack_require__(1).default,leaveModule=__webpack_require__(1).leaveModule,reactHotLoader&&(reactHotLoader.register(Navbar,"Navbar","C:/monero/xmrig-config/src/components/Navbar.js"),reactHotLoader.register(_default,"default","C:/monero/xmrig-config/src/components/Navbar.js"),leaveModule(module))}).call(this,__webpack_require__(5)(module))},function(e,t,r){"use strict";e.exports=function(){}},function(e,t,r){var n=r(19),o=Object.prototype.hasOwnProperty,a=Array.prototype.splice,i=Object.prototype.toString,_=function(e){return i.call(e).slice(8,-1)},c=Object.assign||function(e,t){return u(t).forEach(function(r){o.call(t,r)&&(e[r]=t[r])}),e},u="function"==typeof Object.getOwnPropertySymbols?function(e){return Object.keys(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.keys(e)};function s(e){if(Array.isArray(e))return c(e.constructor(e.length),e);if("Map"===_(e))return new Map(e);if("Set"===_(e))return new Set(e);if(e&&"object"==typeof e){var t=e.constructor&&e.constructor.prototype;return c(Object.create(t||null),e)}return e}function l(){var e=c({},f);return t.extend=function(t,r){e[t]=r},t.isEquals=function(e,t){return e===t},t;function t(r,a){if("function"==typeof a)return a(r);Array.isArray(r)&&Array.isArray(a)||n(!Array.isArray(a),"update(): You provided an invalid spec to update(). The spec may not contain an array except as the value of $set, $push, $unshift, $splice or any custom command allowing an array value."),n("object"==typeof a&&null!==a,"update(): You provided an invalid spec to update(). The spec and every included key path must be plain objects containing one of the following commands: %s.",Object.keys(e).join(", "));var i=r;return u(a).forEach(function(n){if(o.call(e,n)){var _=r===i;i=e[n](a[n],i,a,r),_&&t.isEquals(i,r)&&(i=r)}else{var c=t(r[n],a[n]);t.isEquals(c,i[n])&&(void 0!==c||o.call(r,n))||(i===r&&(i=s(r)),i[n]=c)}}),i}}var f={$push:function(e,t,r){return d(t,r,"$push"),e.length?t.concat(e):t},$unshift:function(e,t,r){return d(t,r,"$unshift"),e.length?e.concat(t):t},$splice:function(e,t,r,o){return function(e,t){n(Array.isArray(e),"Expected $splice target to be an array; got %s",e),E(t.$splice)}(t,r),e.forEach(function(e){E(e),t===o&&e.length&&(t=s(o)),a.apply(t,e)}),t},$set:function(e,t,r){return function(e){n(1===Object.keys(e).length,"Cannot have more than one key in an object with $set")}(r),e},$toggle:function(e,t){h(e,"$toggle");var r=e.length?s(t):t;return e.forEach(function(e){r[e]=!t[e]}),r},$unset:function(e,t,r,n){return h(e,"$unset"),e.forEach(function(e){Object.hasOwnProperty.call(t,e)&&(t===n&&(t=s(n)),delete t[e])}),t},$add:function(e,t,r,n){return m(t,"$add"),h(e,"$add"),"Map"===_(t)?e.forEach(function(e){var r=e[0],o=e[1];t===n&&t.get(r)!==o&&(t=s(n)),t.set(r,o)}):e.forEach(function(e){t!==n||t.has(e)||(t=s(n)),t.add(e)}),t},$remove:function(e,t,r,n){return m(t,"$remove"),h(e,"$remove"),e.forEach(function(e){t===n&&t.has(e)&&(t=s(n)),t.delete(e)}),t},$merge:function(e,t,r,o){var a,i;return a=t,n((i=e)&&"object"==typeof i,"update(): $merge expects a spec of type 'object'; got %s",i),n(a&&"object"==typeof a,"update(): $merge expects a target of type 'object'; got %s",a),u(e).forEach(function(r){e[r]!==t[r]&&(t===o&&(t=s(o)),t[r]=e[r])}),t},$apply:function(e,t){var r;return n("function"==typeof(r=e),"update(): expected spec of $apply to be a function; got %s.",r),e(t)}},p=l();function d(e,t,r){n(Array.isArray(e),"update(): expected target of %s to be an array; got %s.",r,e),h(t[r],r)}function h(e,t){n(Array.isArray(e),"update(): expected spec of %s to be an array; got %s. Did you forget to wrap your parameter in an array?",t,e)}function E(e){n(Array.isArray(e),"update(): expected spec of $splice to be an array of arrays; got %s. Did you forget to wrap your parameters in an array?",e)}function m(e,t){var r=_(e);n("Map"===r||"Set"===r,"update(): %s expects a target of type Set or Map; got %s",t,r)}e.exports=p,e.exports.default=p,e.exports.newContext=l},function(e,t,r){"use strict";(function(e){var n;r.d(t,"c",function(){return i}),r.d(t,"d",function(){return _}),r.d(t,"b",function(){return c}),r.d(t,"e",function(){return u}),r.d(t,"a",function(){return s}),(n=r(1).enterModule)&&n(e);var o,a,i="NOTIFICATION_NONE",_="success",c="info",u="warning",s="danger";o=r(1).default,a=r(1).leaveModule,o&&(o.register(i,"NOTIFICATION_NONE","C:/monero/xmrig-config/src/constants/NotificationTypes.js"),o.register(_,"NOTIFICATION_SUCCESS","C:/monero/xmrig-config/src/constants/NotificationTypes.js"),o.register(c,"NOTIFICATION_INFO","C:/monero/xmrig-config/src/constants/NotificationTypes.js"),o.register(u,"NOTIFICATION_WARNING","C:/monero/xmrig-config/src/constants/NotificationTypes.js"),o.register(s,"NOTIFICATION_ERROR","C:/monero/xmrig-config/src/constants/NotificationTypes.js"),a(e))}).call(this,r(5)(e))},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t){var r=Array.isArray;e.exports=r},function(e,t,r){var n=r(4),o=r(15),a=r(49),i=/"/g,_=function(e,t,r,n){var o=String(a(e)),_="<"+t;return""!==r&&(_+=" "+r+'="'+String(n).replace(i,""")+'"'),_+">"+o+""};e.exports=function(e,t){var r={};r[e]=t(_),n(n.P+n.F*o(function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}),"String",r)}},function(e,t,r){var n=r(13),o=r(35),a=r(39),i=r(82)("src"),_=r(727),c=(""+_).split("toString");r(45).inspectSource=function(e){return _.call(e)},(e.exports=function(e,t,r,_){var u="function"==typeof r;u&&(a(r,"name")||o(r,"name",t)),e[t]!==r&&(u&&(a(r,i)||o(r,i,e[t]?""+e[t]:c.join(String(t)))),e===n?e[t]=r:_?e[t]?e[t]=r:o(e,t,r):(delete e[t],o(e,t,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[i]||_.call(this)})},function(e,t,r){var n=r(25),o=r(83);e.exports=r(24)?function(e,t,r){return n.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},function(e,t,r){var n=r(39),o=r(26),a=r(189)("IE_PROTO"),i=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=o(e),n(e,a)?e[a]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?i:null}},function(e,t,r){var n=r(103),o=r(83),a=r(38),i=r(50),_=r(39),c=r(269),u=Object.getOwnPropertyDescriptor;t.f=r(24)?u:function(e,t){if(e=a(e),t=i(t,!0),c)try{return u(e,t)}catch(e){}if(_(e,t))return o(!n.f.call(e,t),e[t])}},function(e,t,r){var n=r(104),o=r(49);e.exports=function(e){return n(o(e))}},function(e,t){var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(module,__webpack_exports__,__webpack_require__){"use strict";(function(module){var react__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),react__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__),react_router_dom__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(8),_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(6),enterModule;function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}enterModule=__webpack_require__(1).enterModule,enterModule&&enterModule(module);var Tabs=function(_React$PureComponent){function Tabs(){return _classCallCheck(this,Tabs),_possibleConstructorReturn(this,_React$PureComponent.apply(this,arguments))}return _inherits(Tabs,_React$PureComponent),Tabs.prototype.render=function(){return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("ul",{className:"nav nav-wizard nav-justified"},this.renderTab("flag","","Start"),this.renderTab("plug","/network","Network"),this.renderThreads(),this.renderTab("cog","/misc","Misc"),this.renderTab("flag-checkered","/result","Result"))},Tabs.prototype.renderTab=function(e,t,r){return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li",{className:this.props.path===t?"active":""},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_1__.a,{to:"/"+this.props.type+t},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_2__.a,{icon:e})," ",r))},Tabs.prototype.renderThreads=function(){if("proxy"!==this.props.type)return this.renderTab("microchip","/threads","Threads")},Tabs.prototype.__reactstandin__regenerateByEval=function __reactstandin__regenerateByEval(key,code){this[key]=eval(code)},Tabs}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent),_default=Tabs,reactHotLoader,leaveModule;__webpack_exports__.a=_default,reactHotLoader=__webpack_require__(1).default,leaveModule=__webpack_require__(1).leaveModule,reactHotLoader&&(reactHotLoader.register(Tabs,"Tabs","C:/monero/xmrig-config/src/components/Tabs.js"),reactHotLoader.register(_default,"default","C:/monero/xmrig-config/src/components/Tabs.js"),leaveModule(module))}).call(this,__webpack_require__(5)(module))},function(e,t,r){"use strict";var n=r(15);e.exports=function(e,t){return!!e&&n(function(){t?e.call(null,function(){},1):e.call(null)})}},function(e,t){var r=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},function(e,t){var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t,r){var n=r(31);e.exports=function(e,t,r){if(n(e),void 0===t)return e;switch(r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,o){return e.call(t,r,n,o)}}return function(){return e.apply(t,arguments)}}},function(e,t){var r=e.exports={version:"2.6.10"};"number"==typeof __e&&(__e=r)},function(e,t,r){var n=r(227),o="object"==typeof self&&self&&self.Object===Object&&self,a=n||o||Function("return this")();e.exports=a},function(e,t,r){var n=r(44),o=r(104),a=r(26),i=r(21),_=r(173);e.exports=function(e,t){var r=1==e,c=2==e,u=3==e,s=4==e,l=6==e,f=5==e||l,p=t||_;return function(t,_,d){for(var h,E,m=a(t),v=o(m),M=n(_,d,3),g=i(v.length),O=0,P=r?p(t,g):c?p(t,0):void 0;g>O;O++)if((f||O in v)&&(E=M(h=v[O],O,m),e))if(r)P[O]=E;else if(E)switch(e){case 3:return!0;case 5:return h;case 6:return O;case 2:P.push(h)}else if(s)return!1;return l?-1:u||s?s:P}}},function(e,t,r){var n=r(4),o=r(45),a=r(15);e.exports=function(e,t){var r=(o.Object||{})[e]||Object[e],i={};i[e]=t(r),n(n.S+n.F*a(function(){r(1)}),"Object",i)}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,r){var n=r(16);e.exports=function(e,t){if(!n(e))return e;var r,o;if(t&&"function"==typeof(r=e.toString)&&!n(o=r.call(e)))return o;if("function"==typeof(r=e.valueOf)&&!n(o=r.call(e)))return o;if(!t&&"function"==typeof(r=e.toString)&&!n(o=r.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(module,__webpack_exports__,__webpack_require__){"use strict";(function(module){var react__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),react__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__),_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(6),_Navbar__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(27),enterModule;function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}enterModule=__webpack_require__(1).enterModule,enterModule&&enterModule(module);var NoMatch=function(_React$PureComponent){function NoMatch(){return _classCallCheck(this,NoMatch),_possibleConstructorReturn(this,_React$PureComponent.apply(this,arguments))}return _inherits(NoMatch,_React$PureComponent),NoMatch.prototype.render=function(){return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div",null,react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_Navbar__WEBPACK_IMPORTED_MODULE_2__.a,{type:"",path:""}),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div",{className:"container text-center text-danger"},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p",null,react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_1__.a,{icon:"exclamation-triangle",size:"5x"})),react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("p",{className:"text-bold"},"404 Not Found")))},NoMatch.prototype.__reactstandin__regenerateByEval=function __reactstandin__regenerateByEval(key,code){this[key]=eval(code)},NoMatch}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent),_default=NoMatch,reactHotLoader,leaveModule;__webpack_exports__.a=_default,reactHotLoader=__webpack_require__(1).default,leaveModule=__webpack_require__(1).leaveModule,reactHotLoader&&(reactHotLoader.register(NoMatch,"NoMatch","C:/monero/xmrig-config/src/components/NoMatch.js"),reactHotLoader.register(_default,"default","C:/monero/xmrig-config/src/components/NoMatch.js"),leaveModule(module))}).call(this,__webpack_require__(5)(module))},function(module,__webpack_exports__,__webpack_require__){"use strict";(function(module){var react__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),react__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__),_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(6),_Navbar__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(27),enterModule;function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}enterModule=__webpack_require__(1).enterModule,enterModule&&enterModule(module);var Deprecated=function(_React$PureComponent){function Deprecated(){return _classCallCheck(this,Deprecated),_possibleConstructorReturn(this,_React$PureComponent.apply(this,arguments))}return _inherits(Deprecated,_React$PureComponent),Deprecated.prototype.render=function(){return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div",{className:"alert alert-danger"},react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_1__.a,{icon:"exclamation-triangle"})," This config editor is deprecated and not support latest miner versions use ",react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a",{className:"alert-link",href:"https://xmrig.com/wizard"},"xmrig.com/wizard")," instead.")},Deprecated.prototype.__reactstandin__regenerateByEval=function __reactstandin__regenerateByEval(key,code){this[key]=eval(code)},Deprecated}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent),_default=Deprecated,reactHotLoader,leaveModule;__webpack_exports__.a=_default,reactHotLoader=__webpack_require__(1).default,leaveModule=__webpack_require__(1).leaveModule,reactHotLoader&&(reactHotLoader.register(Deprecated,"Deprecated","C:/monero/xmrig-config/src/components/Deprecated.js"),reactHotLoader.register(_default,"default","C:/monero/xmrig-config/src/components/Deprecated.js"),leaveModule(module))}).call(this,__webpack_require__(5)(module))},function(e,t,r){"use strict";var n=r(205),o=r(204),a={INIT:"@@redux/INIT"};function i(e,t,r){var _;if("function"==typeof t&&void 0===r&&(r=t,t=void 0),void 0!==r){if("function"!=typeof r)throw new Error("Expected the enhancer to be a function.");return r(i)(e,t)}if("function"!=typeof e)throw new Error("Expected the reducer to be a function.");var c=e,u=t,s=[],l=s,f=!1;function p(){l===s&&(l=s.slice())}function d(){return u}function h(e){if("function"!=typeof e)throw new Error("Expected listener to be a function.");var t=!0;return p(),l.push(e),function(){if(t){t=!1,p();var r=l.indexOf(e);l.splice(r,1)}}}function E(e){if(!Object(n.a)(e))throw new Error("Actions must be plain objects. Use custom middleware for async actions.");if(void 0===e.type)throw new Error('Actions may not have an undefined "type" property. Have you misspelled a constant?');if(f)throw new Error("Reducers may not dispatch actions.");try{f=!0,u=c(u,e)}finally{f=!1}for(var t=s=l,r=0;r0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];if(c)throw c;for(var n=!1,o={},a=0;ar;)o[r]=t[r++];return o},Ae=function(e,t,r){N(e,t,{get:function(){return this._d[r]}})},Re=function(e){var t,r,n,o,a,i,_=P(e),c=arguments.length,s=c>1?arguments[1]:void 0,l=void 0!==s,f=w(_);if(void 0!=f&&!y(f)){for(i=f.call(_),n=[],t=0;!(a=i.next()).done;t++)n.push(a.value);_=n}for(l&&c>2&&(s=u(s,arguments[2],2)),t=0,r=h(_.length),o=De(this,r);r>t;t++)o[t]=l?s(_[t],t):_[t];return o},Le=function(){for(var e=0,t=arguments.length,r=De(this,t);t>e;)r[e]=arguments[e++];return r},xe=!!z&&a(function(){pe.call(new z(1))}),Ie=function(){return pe.apply(xe?le.call(Ce(this)):Ce(this),arguments)},ke={copyWithin:function(e,t){return K.call(Ce(this),e,t,arguments.length>2?arguments[2]:void 0)},every:function(e){return Q(Ce(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return W.apply(Ce(this),arguments)},filter:function(e){return we(this,X(Ce(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return Z(Ce(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return ee(Ce(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){G(Ce(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return re(Ce(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return te(Ce(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return ue.apply(Ce(this),arguments)},lastIndexOf:function(e){return ie.apply(Ce(this),arguments)},map:function(e){return Oe(Ce(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return _e.apply(Ce(this),arguments)},reduceRight:function(e){return ce.apply(Ce(this),arguments)},reverse:function(){for(var e,t=Ce(this).length,r=Math.floor(t/2),n=0;n1?arguments[1]:void 0)},sort:function(e){return se.call(Ce(this),e)},subarray:function(e,t){var r=Ce(this),n=r.length,o=m(e,n);return new(x(r,r[me]))(r.buffer,r.byteOffset+o*r.BYTES_PER_ELEMENT,h((void 0===t?n:m(t,n))-o))}},Ue=function(e,t){return we(this,le.call(Ce(this),e,t))},Be=function(e){Ce(this);var t=be(arguments[1],1),r=this.length,n=P(e),o=h(n.length),a=0;if(o+t>r)throw q("Wrong length!");for(;a255?255:255&n),o.v[p](r*t+o.o,n,Pe)}(this,r,e)},enumerable:!0})};M?(d=r(function(e,r,n,o){s(e,d,u,"_d");var a,i,_,c,l=0,p=0;if(O(r)){if(!(r instanceof $||"ArrayBuffer"==(c=g(r))||"SharedArrayBuffer"==c))return Me in r?Te(d,r):Re.call(d,r);a=r,p=be(n,t);var m=r.byteLength;if(void 0===o){if(m%t)throw q("Wrong length!");if((i=m-p)<0)throw q("Wrong length!")}else if((i=h(o)*t)+p>m)throw q("Wrong length!");_=i/t}else _=E(r),a=new $(i=_*t);for(f(e,"_d",{b:a,o:p,l:i,e:_,v:new Y(a)});l<_;)w(e,l++)}),y=d.prototype=b(Ne),f(y,"constructor",d)):a(function(){d(1)})&&a(function(){new d(-1)})&&U(function(e){new d,new d(null),new d(1.5),new d(e)},!0)||(d=r(function(e,r,n,o){var a;return s(e,d,u),O(r)?r instanceof $||"ArrayBuffer"==(a=g(r))||"SharedArrayBuffer"==a?void 0!==o?new m(r,be(n,t),o):void 0!==n?new m(r,be(n,t)):new m(r):Me in r?Te(d,r):Re.call(d,r):new m(E(r))}),G(v!==Function.prototype?D(m).concat(D(v)):D(m),function(e){e in d||f(d,e,m[e])}),d.prototype=y,n||(y.constructor=d));var T=y[de],A=!!T&&("values"==T.name||void 0==T.name),R=We.values;f(d,Ee,!0),f(y,Me,u),f(y,ge,!0),f(y,me,d),(c?new d(1)[he]==u:he in y)||N(y,he,{get:function(){return u}}),P[u]=d,i(i.G+i.W+i.F*(d!=m),P),i(i.S,u,{BYTES_PER_ELEMENT:t}),i(i.S+i.F*a(function(){m.of.call(d,1)}),u,{from:Re,of:Le}),"BYTES_PER_ELEMENT"in y||f(y,"BYTES_PER_ELEMENT",t),i(i.P,u,ke),B(u),i(i.P+i.F*ye,u,{set:Be}),i(i.P+i.F*!A,u,We),n||y.toString==fe||(y.toString=fe),i(i.P+i.F*a(function(){new d(1).slice()}),u,{slice:Ue}),i(i.P+i.F*(a(function(){return[1,2].toLocaleString()!=new d([1,2]).toLocaleString()})||!a(function(){y.toLocaleString.call([1,2])})),u,{toLocaleString:Ie}),k[u]=A?T:R,n||A||f(y,de,R)}}else e.exports=function(){}},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__),function(module){var react__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),react__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__),_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(6),_AsyncModal__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(22),_Modal__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(7),_actions_config__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(10),_constants_ModalTypes__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(11),_actions_modals__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(17),enterModule;function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}enterModule=__webpack_require__(1).enterModule,enterModule&&enterModule(module);var DeletePoolModal=function(_AsyncModal){function DeletePoolModal(){var e,t;_classCallCheck(this,DeletePoolModal);for(var r=arguments.length,n=Array(r),o=0;o=a.length)break;u=a[_++]}else{if((_=a.next()).done)break;u=_.value}var s=u;o.push("-b "+s)}1===t.mode&&o.push("-m simple"),1!==t.workers&&o.push("--workers "+m[t.workers]),t.diff>=100&&o.push("--custom-diff "+t.diff)}if(e===l.h){var p=t.cpuThreads;p.mode===l.j?(p.av&&o.push("--av "+p.av+" --safe"),75!==p.max&&o.push("--max-cpu-usage "+p.max),2!==p.priority&&o.push("--cpu-priority "+p.priority)):p.mode===l.k&&(p.av&&o.push("--av "+p.av),p.safe&&o.push("--safe"),2!==p.priority&&o.push("--cpu-priority "+p.priority),p.affinity&&o.push("--cpu-affinity "+p.affinity),p.noPages&&o.push("--no-huge-pages"),p.count&&o.push("-t "+p.count))}if(e===l.e){var d=t.oclThreads;d.mode===l.k&&(o.push("--opencl-platform "+d.platform),d.threads&&d.threads.length&&(o.push("--opencl-devices"),o.push(d.threads.map(function(e){return e.index}).join(",")),o.push("--opencl-launch"),o.push(d.threads.map(function(e){return e.intensity+"x"+e.worksize}).join(",")),d.threads.filter(function(e){return!1!==e.affine_to_cpu}).length&&(o.push("--opencl-affinity"),o.push(d.threads.map(function(e){return!1===e.affine_to_cpu?-1:e.affine_to_cpu}).join(","))),o.push("--opencl-strided-index"),o.push(d.threads.map(function(e){return e.strided_index||("NVIDIA"===d.platform?0:2)}).join(",")),o.push("--opencl-mem-chunk"),o.push(d.threads.map(function(e){return e.mem_chunk||2}).join(",")),o.push("--opencl-unroll"),o.push(d.threads.map(function(e){return c()(e.unroll)?8:e.unroll}).join(",")))),d.mode===l.j&&"AMD"!==d.platform&&o.push("--opencl-platform "+d.platform)}if(e===l.f){var h=t.cudaThreads;h.mode===l.j?(64!==h.max&&o.push("--cuda-max-threads "+h.max),h.optimize&&(h.bfactor!==(t.os===l.n?6:0)&&o.push("--cuda-bfactor "+h.bfactor),h.bsleep!==(t.os===l.n?25:0)&&o.push("--cuda-bsleep "+h.bsleep))):h.mode===l.k&&h.threads&&h.length&&(o.push("--cuda-devices"),o.push(h.threads.map(function(e){return e.index}).join(",")),o.push("--cuda-launch"),o.push(h.threads.map(function(e){return e.threads+"x"+e.blocks}).join(",")),o.push("--cuda-bfactor"),o.push(h.threads.map(function(e){return e.bfactor}).join(",")),o.push("--cuda-bsleep"),o.push(h.threads.map(function(e){return e.bsleep}).join(",")),h.threads.filter(function(e){return!1!==e.affine_to_cpu}).length&&(o.push("--cuda-affinity"),o.push(h.threads.map(function(e){return!1===e.affine_to_cpu?-1:e.affine_to_cpu}).join(","))))}var E=t.pools,v=Array.isArray(E),M=0;for(E=v?E:E[Symbol.iterator]();;){var O;if(v){if(M>=E.length)break;O=E[M++]}else{if((M=E.next()).done)break;O=M.value}var P=O;o.push("-o "+P.url),o.push("-u "+(P.user?P.user:"x")),o.push("-p "+(P.pass?P.pass:"x")),-1!==P.variant&&null!=P.variant&&o.push("--variant "+P.variant),P.keepalive&&o.push("-k"),P.tls&&o.push("--tls"),n||P.nicehash&&o.push("--nicehash")}return o.join(" ")},b=function(e,t){var r,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],o={},a=e===l.g;if(o.algo=Object(l.p)(t.algo,t.version),o.background=!!t.background,o.colors=!!t.colors,o.retries=+t.retries,o["retry-pause"]=+t.retryPause,o["donate-level"]=+t.donate,o.syslog=!!t.syslog,o["log-file"]=t.logFile?t.logFile:null,t.printTime&&(o["print-time"]=+t.printTime),t.hasOwnProperty("accessLog")&&(o["access-log-file"]=t.accessLog?t.accessLog:null),t.hasOwnProperty("verbose")&&(o.verbose=!!t.verbose),e===l.h){var i=t.cpuThreads;o.av=i.av,o["max-cpu-usage"]=i.max,o["cpu-priority"]=2===i.priority?null:i.priority,o["huge-pages"]=0===i.noPages,o["hw-aes"]=-1===i.aes?null:!!i.aes,i.mode===l.j?(o.safe=i.av>0,o.threads=null,o["cpu-affinity"]=null):i.mode===l.k?(o.safe=!!i.safe,o.threads=i.count,o["cpu-affinity"]=i.affinity?i.affinity:null):i.mode===l.i&&(o.safe=!1,o["cpu-affinity"]=null,o.threads=i.threads.map(function(e){return{low_power_mode:h[e.low_power_mode-1],affine_to_cpu:e.affine_to_cpu,asm:E[e.asm]}}))}if(e===l.e){var _=t.oclThreads;o["opencl-platform"]=_.platform,o.threads=_.mode===l.k?_.threads:null}if(e===l.f){var c=t.cudaThreads;if(c.mode===l.j){var u=t.os===l.n?6:0,s=t.os===l.n?25:0;if(o["cuda-max-threads"]=64===c.max?void 0:c.max,c.optimize){var f=c.bfactor===u?void 0:c.bfactor,p=c.bfactor===s?void 0:c.bsleep;o["cuda-bfactor"]=f,o["cuda-bsleep"]=p}o.threads=null}else c.mode===l.k&&(o.threads=c.threads)}return o.pools=a?t.pools.filter(function(e){return e.enabled}).map(function(e){return{url:e.url,user:e.user,pass:e.pass||"x",keepalive:!!e.keepalive,variant:e.variant,tls:!!e.tls,"tls-fingerprint":null}}):t.pools.filter(function(e){return e.enabled}).map(function(e){return{url:e.url,user:e.user,pass:e.pass||"x",keepalive:!!e.keepalive,nicehash:!!e.nicehash,variant:e.variant,tls:!!e.tls,"tls-fingerprint":null}}),a&&(o.bind=t.bind.split("\n").filter(function(e){return!!e}),o.mode=1===t.mode?"simple":"nicehash",o.workers=v[t.workers],t.diff>=100&&(o["custom-diff"]=t.diff)),o.api=((r={port:+t.apiPort})["access-token"]=t.apiToken?t.apiToken:null,r["worker-id"]=t.apiId?t.apiId:null,r.ipv6=!!t.apiIPv6,r.restricted=!t.apiFull,r),!0===n?JSON.stringify(Object(d.a)(o),null,4):o},C=function(e,t){var r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],o=p.a.toArray(e,t,r);return!0===r?i.a.encode(n.from(JSON.stringify(o))):o},D=function(e){var t=void 0;try{t=JSON.parse(i.a.decode(e))}catch(e){return{}}return s()(t)&&1===t[0]?p.a.fromArray(t):{}};O=r(1).default,P=r(1).leaveModule,O&&(O.register(h,"CPU_LOW_POWER_MODE","C:/monero/xmrig-config/src/lib/config.js"),O.register(E,"CPU_ASM","C:/monero/xmrig-config/src/lib/config.js"),O.register(m,"PROXY_WORKERS_CMD","C:/monero/xmrig-config/src/lib/config.js"),O.register(v,"PROXY_WORKERS","C:/monero/xmrig-config/src/lib/config.js"),O.register(M,"escape","C:/monero/xmrig-config/src/lib/config.js"),O.register(g,"strOption","C:/monero/xmrig-config/src/lib/config.js"),O.register(y,"getCommandLine","C:/monero/xmrig-config/src/lib/config.js"),O.register(b,"getJSON","C:/monero/xmrig-config/src/lib/config.js"),O.register(C,"serialize","C:/monero/xmrig-config/src/lib/config.js"),O.register(D,"deserialize","C:/monero/xmrig-config/src/lib/config.js"),P(e))}).call(this,r(5)(e),r(211).Buffer)},function(e,t,r){var n=r(18)("unscopables"),o=Array.prototype;void 0==o[n]&&r(35)(o,n,{}),e.exports=function(e){o[n][e]=!0}},function(e,t,r){var n=r(82)("meta"),o=r(16),a=r(39),i=r(25).f,_=0,c=Object.isExtensible||function(){return!0},u=!r(15)(function(){return c(Object.preventExtensions({}))}),s=function(e){i(e,n,{value:{i:"O"+ ++_,w:{}}})},l=e.exports={KEY:n,NEED:!1,fastKey:function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,n)){if(!c(e))return"F";if(!t)return"E";s(e)}return e[n].i},getWeak:function(e,t){if(!a(e,n)){if(!c(e))return!0;if(!t)return!1;s(e)}return e[n].w},onFreeze:function(e){return u&&l.NEED&&c(e)&&!a(e,n)&&s(e),e}}},function(e,t){e.exports=!1},function(e,t,r){"use strict";(function(e){var n,o=r(0),a=r.n(o),i=r(8),_=r(61);(n=r(1).enterModule)&&n(e);var c,u,s=function(e){var t=e.type,r=e.config;return a.a.createElement(i.b,{to:"/"+t+"/result/"+Object(_.d)(t,r)})},l=s;t.a=l,c=r(1).default,u=r(1).leaveModule,c&&(c.register(s,"ResultRedirectContainer","C:/monero/xmrig-config/src/components/ResultRedirect.js"),c.register(l,"default","C:/monero/xmrig-config/src/components/ResultRedirect.js"),u(e))}).call(this,r(5)(e))},function(module,__webpack_exports__,__webpack_require__){"use strict";(function(module){var react__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),react__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__),react_clipboard_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(107),react_clipboard_js__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(react_clipboard_js__WEBPACK_IMPORTED_MODULE_1__),_fortawesome_react_fontawesome__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(6),file_saver__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(339),file_saver__WEBPACK_IMPORTED_MODULE_3___default=__webpack_require__.n(file_saver__WEBPACK_IMPORTED_MODULE_3__),_Navbar__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(27),_Tabs__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(40),_result_PresetForm__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(338),react_router_dom__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__(8),_actions_notification__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__(69),_lib_config__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__(61),_actions_presets__WEBPACK_IMPORTED_MODULE_10__=__webpack_require__(133),_modals_SharePresetModal__WEBPACK_IMPORTED_MODULE_11__=__webpack_require__(193),_constants_options__WEBPACK_IMPORTED_MODULE_12__=__webpack_require__(2),_Deprecated__WEBPACK_IMPORTED_MODULE_13__=__webpack_require__(52),_extends=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]?arguments[0]:{};return{type:o.f,subtype:a.d,data:e}},u=function(){return{type:o.e}};i=r(1).default,_=r(1).leaveModule,i&&(i.register(c,"showSuccess","C:/monero/xmrig-config/src/actions/notification.js"),i.register(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:o.f,subtype:a.b,data:e}},"showInfo","C:/monero/xmrig-config/src/actions/notification.js"),i.register(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:o.f,subtype:a.e,data:e}},"showWarning","C:/monero/xmrig-config/src/actions/notification.js"),i.register(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:o.f,subtype:a.a,data:e}},"showError","C:/monero/xmrig-config/src/actions/notification.js"),i.register(u,"dismiss","C:/monero/xmrig-config/src/actions/notification.js"),_(e))}).call(this,r(5)(e))},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,r){var n=r(89),o=r(494),a=r(493),i=n?n.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):a(e)}},function(e,t,r){var n=r(495),o=r(490);e.exports=function(e,t){var r=o(e,t);return n(r)?r:void 0}},function(e,t,r){var n=r(16);e.exports=function(e,t){if(!n(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},function(e,t,r){var n=r(34);e.exports=function(e,t,r){for(var o in t)n(e,o,t[o],r);return e}},function(e,t,r){var n=r(44),o=r(254),a=r(176),i=r(12),_=r(21),c=r(174),u={},s={};(t=e.exports=function(e,t,r,l,f){var p,d,h,E,m=f?function(){return e}:c(e),v=n(r,l,t?2:1),M=0;if("function"!=typeof m)throw TypeError(e+" is not iterable!");if(a(m)){for(p=_(e.length);p>M;M++)if((E=t?v(i(d=e[M])[0],d[1]):v(e[M]))===u||E===s)return E}else for(h=m.call(e);!(d=h.next()).done;)if((E=o(h,v,d.value,t))===u||E===s)return E}).BREAK=u,t.RETURN=s},function(e,t){e.exports=function(e,t,r,n){if(!(e instanceof t)||void 0!==n&&n in e)throw TypeError(r+": incorrect invocation!");return e}},function(e,t,r){"use strict";var n=r(13),o=r(25),a=r(24),i=r(18)("species");e.exports=function(e){var t=n[e];a&&t&&!t[i]&&o.f(t,i,{configurable:!0,get:function(){return this}})}},function(e,t,r){var n=r(267),o=r(188).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return n(e,o)}},function(e,t,r){var n=r(12),o=r(266),a=r(188),i=r(189)("IE_PROTO"),_=function(){},c=function(){var e,t=r(191)("iframe"),n=a.length;for(t.style.display="none",r(187).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" + + + diff --git a/miner/config/src/actions/config.js b/miner/config/src/actions/config.js new file mode 100644 index 0000000..9c3481a --- /dev/null +++ b/miner/config/src/actions/config.js @@ -0,0 +1,9 @@ +'use strict'; + +import { UPDATE, ADD_POOL, UPDATE_POOL, DELETE_POOL } from '../constants/ActionTypes'; + + +export const update = (kind, options) => ({ type: UPDATE, kind, options }); +export const addPool = (kind, pool) => ({ type: ADD_POOL, kind, pool }); +export const updatePool = (kind, pool) => ({ type: UPDATE_POOL, kind, pool }); +export const deletePool = (kind, pool) => ({ type: DELETE_POOL, kind, pool }); diff --git a/miner/config/src/actions/modals.js b/miner/config/src/actions/modals.js new file mode 100644 index 0000000..9e8c24e --- /dev/null +++ b/miner/config/src/actions/modals.js @@ -0,0 +1,20 @@ +'use strict'; + +import { MODAL_SHOW, MODAL_HIDE } from '../constants/ActionTypes'; + + +export const show = (type, data = {}) => ({ + type: MODAL_SHOW, + subtype: type, + data +}); + + +export const showAsync = (type, data, dispatch) => ( + new Promise((resolve, reject) => dispatch(show(type, {...data, resolve, reject}))) +); + + +export const dismiss = () => ({ + type: MODAL_HIDE +}); diff --git a/miner/config/src/actions/notification.js b/miner/config/src/actions/notification.js new file mode 100644 index 0000000..d70dbe3 --- /dev/null +++ b/miner/config/src/actions/notification.js @@ -0,0 +1,37 @@ +'use strict'; + +import { NOTIFICATION_SHOW, NOTIFICATION_HIDE } from '../constants/ActionTypes'; +import { NOTIFICATION_SUCCESS, NOTIFICATION_INFO, NOTIFICATION_WARNING, NOTIFICATION_ERROR } from '../constants/NotificationTypes'; + + +export const showSuccess = (data = {}) => ({ + type: NOTIFICATION_SHOW, + subtype: NOTIFICATION_SUCCESS, + data +}); + + +export const showInfo = (data = {}) => ({ + type: NOTIFICATION_SHOW, + subtype: NOTIFICATION_INFO, + data +}); + + +export const showWarning = (data = {}) => ({ + type: NOTIFICATION_SHOW, + subtype: NOTIFICATION_WARNING, + data +}); + + +export const showError = (data = {}) => ({ + type: NOTIFICATION_SHOW, + subtype: NOTIFICATION_ERROR, + data +}); + + +export const dismiss = () => ({ + type: NOTIFICATION_HIDE +}); diff --git a/miner/config/src/actions/presets.js b/miner/config/src/actions/presets.js new file mode 100644 index 0000000..16a248d --- /dev/null +++ b/miner/config/src/actions/presets.js @@ -0,0 +1,7 @@ +'use strict'; + +import {PRESET_ADD_OR_CHANGE, PRESET_DELETE} from '../constants/ActionTypes'; + + +export const addOrChangePreset = (kind, name, config) => ({ type: PRESET_ADD_OR_CHANGE, kind, name, config }); +export const deletePreset = (name) => ({ type: PRESET_DELETE, name }); diff --git a/miner/config/src/components/AMD.js b/miner/config/src/components/AMD.js new file mode 100644 index 0000000..d802f19 --- /dev/null +++ b/miner/config/src/components/AMD.js @@ -0,0 +1,29 @@ +'use strict'; + +import React from 'react'; +import { Route, Switch } from 'react-router-dom'; +import StartContainer from '../containers/amd/StartContainer'; +import NetworkContainer from '../containers/amd/NetworkContainer'; +import ThreadsContainer from '../containers/amd/ThreadsContainer'; +import MiscContainer from '../containers/amd/MiscContainer'; +import ResultContainer from '../containers/amd/ResultContainer'; +import NoMatch from "./NoMatch"; +import {KIND_AMD_LEGACY} from "../constants/options"; +import ResultRedirectContainer from "../containers/amd/ResultRedirectContainer"; + + +const routes = () => { + return ( + + + + + + + + + + ); +}; + +export default routes; diff --git a/miner/config/src/components/Deprecated.js b/miner/config/src/components/Deprecated.js new file mode 100644 index 0000000..5b0bd0c --- /dev/null +++ b/miner/config/src/components/Deprecated.js @@ -0,0 +1,14 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import Navbar from './Navbar'; + + +export default class Deprecated extends React.PureComponent { + render() { + return ( +
This config editor is deprecated and not support latest miner versions use xmrig.com/wizard instead.
+ ); + } +} diff --git a/miner/config/src/components/DismissibleAlert.js b/miner/config/src/components/DismissibleAlert.js new file mode 100644 index 0000000..1c80053 --- /dev/null +++ b/miner/config/src/components/DismissibleAlert.js @@ -0,0 +1,14 @@ +'use strict'; + +import React from 'react'; + + +const DismissibleAlert = ({ children, type, dismiss }) => ( +
+ + {children} +
+); + + +export default DismissibleAlert; diff --git a/miner/config/src/components/Form.js b/miner/config/src/components/Form.js new file mode 100644 index 0000000..a1be2bd --- /dev/null +++ b/miner/config/src/components/Form.js @@ -0,0 +1,20 @@ +'use strict'; + +import React from 'react'; + + +export default class Form extends React.PureComponent { + constructor(props) { + super(props); + } + + + handleInputChange = event => { + const target = event.target; + const value = target.type === 'checkbox' ? +target.checked : (target.type === 'number' ? +target.value : target.value); + + this.props.update({ + [target.name]: value + }); + }; +} diff --git a/miner/config/src/components/Index.js b/miner/config/src/components/Index.js new file mode 100644 index 0000000..937490d --- /dev/null +++ b/miner/config/src/components/Index.js @@ -0,0 +1,37 @@ +'use strict'; + +import React from 'react'; +import { Link } from 'react-router-dom'; +import Navbar from './Navbar'; +import products from '../constants/products'; +import {KIND_AMD_LEGACY, KIND_NVIDIA_LEGACY, KIND_PROXY, KIND_XMRIG} from "../constants/options"; + + +export default class Index extends React.PureComponent { + render() { + return ( +
+ + +
+
+

XMRig config generator & editor

+

+ {Index.renderProduct(KIND_XMRIG)}{' '} + {Index.renderProduct(KIND_AMD_LEGACY)}{' '} + {Index.renderProduct(KIND_NVIDIA_LEGACY)}{' '} + {Index.renderProduct(KIND_PROXY)} +

+
+
+
+ ); + } + + + static renderProduct(id) { + const product = products[id]; + + return {product.name}; + } +} diff --git a/miner/config/src/components/Misc.js b/miner/config/src/components/Misc.js new file mode 100644 index 0000000..cbfdfce --- /dev/null +++ b/miner/config/src/components/Misc.js @@ -0,0 +1,61 @@ +'use strict'; + +import React from 'react'; +import { Link } from 'react-router-dom'; +import Navbar from './Navbar'; +import Tabs from './Tabs'; +import LoggingForm from './misc/LoggingForm'; +import ConnectionForm from './misc/ConnectionForm'; +import OtherForm from './misc/OtherForm'; +import Deprecated from "./Deprecated"; + + +export default class Misc extends React.PureComponent { + render() { + const { type } = this.props; + + return ( +
+ +
+ {this.renderDeprecated()} + + + +

Console output & logging

+ + +

Connection recovery

+ + +

Other options

+ + +
+ + +
+
+ ); + } + + + renderDeprecated() { + const { type } = this.props; + + if (type === 'xmrig' || type === 'amd') { + return ; + } + } +} diff --git a/miner/config/src/components/NVIDIA.js b/miner/config/src/components/NVIDIA.js new file mode 100644 index 0000000..55e37ff --- /dev/null +++ b/miner/config/src/components/NVIDIA.js @@ -0,0 +1,29 @@ +'use strict'; + +import React from 'react'; +import { Route, Switch } from 'react-router-dom'; +import StartContainer from '../containers/nvidia/StartContainer'; +import NetworkContainer from '../containers/nvidia/NetworkContainer'; +import ThreadsContainer from '../containers/nvidia/ThreadsContainer'; +import MiscContainer from '../containers/nvidia/MiscContainer'; +import ResultContainer from '../containers/nvidia/ResultContainer'; +import NoMatch from "./NoMatch"; +import {KIND_NVIDIA_LEGACY} from "../constants/options"; +import ResultRedirectContainer from "../containers/nvidia/ResultRedirectContainer"; + + +const routes = () => { + return ( + + + + + + + + + + ); +}; + +export default routes; diff --git a/miner/config/src/components/Navbar.js b/miner/config/src/components/Navbar.js new file mode 100644 index 0000000..c07d6f2 --- /dev/null +++ b/miner/config/src/components/Navbar.js @@ -0,0 +1,74 @@ +'use strict'; + +import React from 'react'; +import cn from 'classnames'; +import { Link } from 'react-router-dom'; +import Icon from '@fortawesome/react-fontawesome'; +import products from '../constants/products'; +import {KIND_AMD_LEGACY, KIND_NVIDIA_LEGACY, KIND_PROXY, KIND_XMRIG} from "../constants/options"; + + +export default class Navbar extends React.PureComponent { + render() { + return ( + + ); + } + + + renderProduct(type) { + const getLink = (type, path) => { + switch (path) { + case '': + case '/network': + case '/misc': + case '/result': + return `/${type}${path}`; + + case '/threads': + return type === KIND_PROXY ? `/${type}` : `/${type}${path}`; + + default: + return `/${type}`; + } + }; + + return
  • {products[type].name}
  • ; + } +} diff --git a/miner/config/src/components/Network.js b/miner/config/src/components/Network.js new file mode 100644 index 0000000..4e693f6 --- /dev/null +++ b/miner/config/src/components/Network.js @@ -0,0 +1,100 @@ +'use strict'; + +import React from 'react'; +import { Link } from 'react-router-dom'; +import Icon from '@fortawesome/react-fontawesome'; +import Navbar from './Navbar'; +import Tabs from './Tabs'; +import ApiForm from './network/ApiForm'; +import PoolRow from './network/PoolRow'; +import {KIND_PROXY} from "../constants/options"; +import ProxyForm from "./network/ProxyForm"; +import Deprecated from "./Deprecated"; + + +export default class Network extends React.PureComponent { + render() { + const { type } = this.props; + + return ( +
    + +
    + {this.renderDeprecated()} + + + +

    Pools

    + {this.renderPools()} + {this.renderProxy()} + +

    HTTP API

    + + +
    + + +
    +
    + ); + } + + + renderPools() { + if (!this.props.pools.length) { + return

    No pools specified! Specify at least one valid pool.

    ; + } + + return ( +
      + {this.props.pools.map((pool, index) => )} +
    + ); + } + + + renderProxy() { + if (this.props.type !== KIND_PROXY) { + return; + } + + return ( +
    +

    Proxy

    + +
    + ); + } + + + renderDeprecated() { + const { type } = this.props; + + if (type === 'xmrig' || type === 'amd') { + return ; + } + } + + + add = () => { + this.props.add(this.props.algo); + } +} diff --git a/miner/config/src/components/NoMatch.js b/miner/config/src/components/NoMatch.js new file mode 100644 index 0000000..515b351 --- /dev/null +++ b/miner/config/src/components/NoMatch.js @@ -0,0 +1,21 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import Navbar from './Navbar'; + + +export default class NoMatch extends React.PureComponent { + render() { + return ( +
    + + +
    +

    +

    404 Not Found

    +
    +
    + ); + } +} diff --git a/miner/config/src/components/PresetRow.js b/miner/config/src/components/PresetRow.js new file mode 100644 index 0000000..a951842 --- /dev/null +++ b/miner/config/src/components/PresetRow.js @@ -0,0 +1,28 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import { Link } from 'react-router-dom'; + + +export default class PresetsRow extends React.PureComponent { + render() { + const { preset } = this.props; + + return ( +
  • +
    + +
    +
    + {preset[1]} {preset[0]} +
    +
  • + ); + } + + + remove = event => { + this.props.remove(this.props.preset[0]); + }; +} diff --git a/miner/config/src/components/Presets.js b/miner/config/src/components/Presets.js new file mode 100644 index 0000000..f781f32 --- /dev/null +++ b/miner/config/src/components/Presets.js @@ -0,0 +1,44 @@ +'use strict'; + +import React from 'react'; +import Navbar from './Navbar'; +import Icon from '@fortawesome/react-fontawesome'; +import PresetsRow from "./PresetRow"; +import DeletePresetModal from "./modals/DeletePresetModal"; + + +export default class Presets extends React.PureComponent { + render() { + const { type } = this.props; + + return ( +
    + +
    +

    Presets {this.props.presets.keys.length}

    + {this.renderPresets()} +
    +
    + ); + } + + + renderPresets() { + const { presets } = this.props; + + if (presets.keys.length === 0) { + return

    No presets found! Setup and save at least one preset.

    ; + } + + return ( +
      + {presets.keys.map(name => )} +
    + ); + } + + + remove = name => { + DeletePresetModal.show(name, this.props.dispatch) + }; +} diff --git a/miner/config/src/components/Proxy.js b/miner/config/src/components/Proxy.js new file mode 100644 index 0000000..6e21306 --- /dev/null +++ b/miner/config/src/components/Proxy.js @@ -0,0 +1,26 @@ +'use strict'; + +import React from 'react'; +import { Route, Switch } from 'react-router-dom'; +import StartContainer from '../containers/proxy/StartContainer'; +import NetworkContainer from '../containers/proxy/NetworkContainer'; +import MiscContainer from '../containers/proxy/MiscContainer'; +import ResultContainer from '../containers/proxy/ResultContainer'; +import NoMatch from "./NoMatch"; +import ResultRedirectContainer from "../containers/proxy/ResultRedirectContainer"; + + +const routes = () => { + return ( + + + + + + + + + ); +}; + +export default routes; diff --git a/miner/config/src/components/ProxyMisc.js b/miner/config/src/components/ProxyMisc.js new file mode 100644 index 0000000..d9db81a --- /dev/null +++ b/miner/config/src/components/ProxyMisc.js @@ -0,0 +1,50 @@ +'use strict'; + +import React from 'react'; +import { Link } from 'react-router-dom'; +import Navbar from './Navbar'; +import Tabs from './Tabs'; +import ProxyLoggingForm from './misc/ProxyLoggingForm'; +import ConnectionForm from './misc/ConnectionForm'; +import OtherForm from './misc/OtherForm'; + + +export default class ProxyMisc extends React.PureComponent { + render() { + const { type } = this.props; + + return ( +
    + +
    + + +

    Console output & logging

    + + +

    Connection recovery

    + + +

    Other options

    + + +
    + + +
    +
    + ); + } +} diff --git a/miner/config/src/components/Result.js b/miner/config/src/components/Result.js new file mode 100644 index 0000000..0f620c0 --- /dev/null +++ b/miner/config/src/components/Result.js @@ -0,0 +1,143 @@ +'use strict'; + +import React from 'react'; +import ClipboardButton from 'react-clipboard.js'; +import Icon from '@fortawesome/react-fontawesome'; +import FileSaver from 'file-saver'; +import Navbar from './Navbar'; +import Tabs from './Tabs'; +import PresetForm from "./result/PresetForm"; + +import { Link } from 'react-router-dom'; +import { showSuccess, dismiss } from '../actions/notification'; +import { getCommandLine, getJSON, deserialize } from '../lib/config'; +import { serialize } from '../lib/config'; +import {addOrChangePreset} from "../actions/presets"; +import SharePresetModal from "./modals/SharePresetModal"; +import {KIND_XMRIG, MODE_ADVANCED} from "../constants/options"; +import Deprecated from "./Deprecated"; + + +export default class Result extends React.PureComponent { + render() { + const { type } = this.props; + + return ( +
    + +
    + {this.renderDeprecated()} + + + +

    Preset + +

    + +
    + + {this.renderCommandLine()} + {this.renderRAW()} + +

    OR

    + +

    + config.json{' '} +
    + {' '} + +
    +

    +
    {getJSON(type, this.props.config)}
    + +
    + + +
    +
    + ); + } + + + renderCommandLine() { + console.log(this.props.config); + const { kind, cpuThreads } = this.props.config; + + if (kind === KIND_XMRIG && cpuThreads.mode === MODE_ADVANCED) { + return ( +
    +

    Command line

    +
    Command line is not available for advanced CPU threads mode. This mode supported only via config file.
    +
    + ); + } + + return ( +
    +

    + Command line +

    +
    {getCommandLine(this.props.type, this.props.config)}
    +
    + ); + } + + + renderRAW() { + if (process.env.NODE_ENV !== 'production') { + return
    {JSON.stringify(serialize(this.props.type, this.props.config, false))}
    + } + } + + + renderDeprecated() { + const { type } = this.props; + + if (type === 'xmrig' || type === 'amd') { + return ; + } + } + + + componentDidMount() { + const config = deserialize(this.props.encodedConfig); + if (config.kind && config.kind === this.props.type) { + this.props.update(config); + } + } + + + onCopied = () => { + this.props.dispatch(showSuccess('Copied to clipboard')); + + setTimeout(() => this.props.dispatch(dismiss()), 2000); + }; + + + download = () => { + const blob = new Blob([getJSON(this.props.type, this.props.config)], {type: "text/plain;charset=utf-8"}); + FileSaver.saveAs(blob, "config.json", true); + }; + + + save = name => { + this.props.update({ name }); + + const encodedConfig = serialize(this.props.type, {...this.props.config, name}); + this.props.historyPush(`/${this.props.type}/result/${encodedConfig}`); + + this.props.dispatch(addOrChangePreset(this.props.type, name, encodedConfig)); + + this.props.dispatch(showSuccess('Preset successfully saved')); + setTimeout(() => this.props.dispatch(dismiss()), 2000); + }; + + + share = () => { + SharePresetModal.show(this.props.dispatch); + }; +} diff --git a/miner/config/src/components/ResultRedirect.js b/miner/config/src/components/ResultRedirect.js new file mode 100644 index 0000000..c08194d --- /dev/null +++ b/miner/config/src/components/ResultRedirect.js @@ -0,0 +1,13 @@ +'use strict'; + +import React from 'react'; +import { Redirect } from 'react-router-dom'; +import { serialize } from '../lib/config'; + + +const ResultRedirectContainer = ({type, config}) => ( + +); + + +export default ResultRedirectContainer; diff --git a/miner/config/src/components/Start.js b/miner/config/src/components/Start.js new file mode 100644 index 0000000..67886f4 --- /dev/null +++ b/miner/config/src/components/Start.js @@ -0,0 +1,101 @@ +'use strict'; + +import React from 'react'; +import cn from 'classnames'; +import Icon from '@fortawesome/react-fontawesome'; +import Navbar from './Navbar'; +import Tabs from './Tabs'; +import VersionForm from './start/VersionForm'; + +import { Link } from 'react-router-dom'; +import { + ALGO_CRYPTONIGHT, + ALGO_CRYPTONIGHT_LITE, + OS_WINDOWS, + OS_LINUX, + OS_X, + ALGO_CRYPTONIGHT_HEAVY, ALGO_CRYPTONIGHT_PICO +} from '../constants/options'; +import Deprecated from "./Deprecated"; + + +export default class Start extends React.PureComponent { + render() { + const { type } = this.props; + + return ( +
    + +
    + {this.renderDeprecated()} + + +

    Version

    + + +

    Algorithm

    +
    +
    + {this.renderAlgoBtn(ALGO_CRYPTONIGHT, 'CryptoNight')} + {this.renderAlgoBtn(ALGO_CRYPTONIGHT_LITE, 'CryptoNight-Lite')} + {this.renderAlgoBtn(ALGO_CRYPTONIGHT_HEAVY, 'CryptoNight-Heavy')} + {this.renderAlgoBtn(ALGO_CRYPTONIGHT_PICO, 'CryptoNight-Pico')} +
    +
    + Algorithm variant specified separately for each pool. +
    +
    + +

    OS

    +
    +
    + {this.renderOsBtn(OS_WINDOWS, 'windows', 'Windows')} + {this.renderOsBtn(OS_LINUX, 'linux', 'Linux')} + {this.renderOsBtn(OS_X, 'apple', 'macOS')} +
    +
    + +
    + + + +
    +
    + ); + } + + + renderAlgoBtn(algo, component) { + return ( + + ); + } + + + renderOsBtn(os, icon, name) { + return ( + + ); + } + + + renderDeprecated() { + const { type } = this.props; + + if (type === 'xmrig' || type === 'amd') { + return ; + } + } +} diff --git a/miner/config/src/components/Tabs.js b/miner/config/src/components/Tabs.js new file mode 100644 index 0000000..e6dba56 --- /dev/null +++ b/miner/config/src/components/Tabs.js @@ -0,0 +1,34 @@ +'use strict'; + +import React from 'react'; +import { Link } from 'react-router-dom'; +import Icon from '@fortawesome/react-fontawesome'; + + +export default class Tabs extends React.PureComponent { + render() { + return ( +
      + {this.renderTab('flag', '', 'Start')} + {this.renderTab('plug', '/network', 'Network')} + {this.renderThreads()} + {this.renderTab('cog', '/misc', 'Misc')} + {this.renderTab('flag-checkered', '/result', 'Result')} +
    + ); + } + + + renderTab(icon, path, text) { + return ( +
  • {text}
  • + ); + } + + + renderThreads() { + if (this.props.type !== 'proxy') { + return this.renderTab('microchip', '/threads', 'Threads'); + } + } +} diff --git a/miner/config/src/components/Threads.js b/miner/config/src/components/Threads.js new file mode 100644 index 0000000..2640148 --- /dev/null +++ b/miner/config/src/components/Threads.js @@ -0,0 +1,99 @@ +'use strict'; + +import React from 'react'; +import { Link } from 'react-router-dom'; +import Navbar from './Navbar'; +import Tabs from './Tabs'; +import OclThreads from "./threads/OclThreads"; +import {MODE_UNAVAILABLE} from "../constants/options"; +import CUDAThreads from "./threads/CUDAThreads"; +import CPUThreads from "./threads/CPUThreads"; +import Deprecated from "./Deprecated"; + + +export default class Threads extends React.PureComponent { + render() { + const { type } = this.props; + + return ( +
    + +
    + {this.renderDeprecated()} + + + + {this.renderCPU()} + {this.renderOCL()} + {this.renderCUDA()} +
    + + +
    +
    + ); + } + + + renderCPU() { + const { cpuThreads } = this.props; + + if (cpuThreads && cpuThreads.mode !== MODE_UNAVAILABLE) { + return + } + } + + + renderOCL() { + const { oclThreads } = this.props; + + if (oclThreads && oclThreads.mode !== MODE_UNAVAILABLE) { + return + } + } + + + renderCUDA() { + const { cudaThreads } = this.props; + + if (cudaThreads && cudaThreads.mode !== MODE_UNAVAILABLE) { + return + } + } + + + renderDeprecated() { + const { type } = this.props; + + if (type === 'xmrig' || type === 'amd') { + return ; + } + } +} diff --git a/miner/config/src/components/XMRig.js b/miner/config/src/components/XMRig.js new file mode 100644 index 0000000..c830ce5 --- /dev/null +++ b/miner/config/src/components/XMRig.js @@ -0,0 +1,28 @@ +'use strict'; + +import React from 'react'; +import { Route, Switch } from 'react-router-dom'; +import StartContainer from '../containers/xmrig/StartContainer'; +import NetworkContainer from '../containers/xmrig/NetworkContainer'; +import ThreadsContainer from '../containers/xmrig/ThreadsContainer'; +import MiscContainer from '../containers/xmrig/MiscContainer'; +import ResultContainer from '../containers/xmrig/ResultContainer'; +import NoMatch from "./NoMatch"; +import ResultRedirectContainer from "../containers/xmrig/ResultRedirectContainer"; + + +const routes = () => { + return ( + + + + + + + + + + ); +}; + +export default routes; diff --git a/miner/config/src/components/misc/ConnectionForm.js b/miner/config/src/components/misc/ConnectionForm.js new file mode 100644 index 0000000..5f1b624 --- /dev/null +++ b/miner/config/src/components/misc/ConnectionForm.js @@ -0,0 +1,48 @@ +'use strict'; + +import React from 'react'; +import Form from "../Form"; + + +export default class ConnectionForm extends Form { + render() { + return ( +
    +
    + + + + +
    + +
    + +
    + + + + Seconds +
    +
    + +
    + ); + } +} diff --git a/miner/config/src/components/misc/LoggingForm.js b/miner/config/src/components/misc/LoggingForm.js new file mode 100644 index 0000000..5512bf5 --- /dev/null +++ b/miner/config/src/components/misc/LoggingForm.js @@ -0,0 +1,71 @@ +'use strict'; + +import React from 'react'; +import { OS_WINDOWS } from '../../constants/options'; +import Form from "../Form"; + + +export default class LoggingForm extends Form { + render() { + return ( +
    +
    + + + + +
    +
    + +
    + + + + Seconds +
    +
    +
    + +
    +
    + +
    +
    + ); + } +} diff --git a/miner/config/src/components/misc/OtherForm.js b/miner/config/src/components/misc/OtherForm.js new file mode 100644 index 0000000..598af33 --- /dev/null +++ b/miner/config/src/components/misc/OtherForm.js @@ -0,0 +1,45 @@ +'use strict'; + +import React from 'react'; +import Form from "../Form"; + + +export default class OtherForm extends Form { + render() { + return ( +
    +
    + +
    + + + + % +
    +
    + +
    + +
    +
    + ); + } +} diff --git a/miner/config/src/components/misc/ProxyLoggingForm.js b/miner/config/src/components/misc/ProxyLoggingForm.js new file mode 100644 index 0000000..e059b31 --- /dev/null +++ b/miner/config/src/components/misc/ProxyLoggingForm.js @@ -0,0 +1,79 @@ +'use strict'; + +import React from 'react'; +import { OS_WINDOWS } from '../../constants/options'; +import Form from "../Form"; + + +export default class ProxyLoggingForm extends Form { + render() { + return ( +
    +
    + + + + +
    +
    + + + +
    +
    + +
    +
    + +
    +
    + +
    +
    + ); + } +} diff --git a/miner/config/src/components/modals/AddCUDAThreadModal.js b/miner/config/src/components/modals/AddCUDAThreadModal.js new file mode 100644 index 0000000..dcb1e75 --- /dev/null +++ b/miner/config/src/components/modals/AddCUDAThreadModal.js @@ -0,0 +1,78 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import AsyncModal from './AsyncModal'; +import { Modal, Header, Title, Body, Footer, Cancel } from './Modal'; +import {MODAL_ADD_CUDA_THREAD} from "../../constants/ModalTypes"; +import {showAsync} from "../../actions/modals"; +import CUDAThreadForm from "../threads/CUDAThreadForm"; +import {OS_WINDOWS} from "../../constants/options"; + + +export default class AddCUDAThreadModal extends AsyncModal { + static show(os, dispatch) { + return showAsync(MODAL_ADD_CUDA_THREAD, { os }, dispatch) + } + + constructor(props) { + super(props); + + this.state = { + index: 0, + threads: 0, + blocks: 0, + bfactor: props.os === OS_WINDOWS ? 6 : 0, + bsleep: props.os === OS_WINDOWS ? 25 : 0, + affine_to_cpu: false, + }; + } + + + render() { + return ( + +
    + <Icon icon="plus" /> Add new CUDA thread +
    + + + +
    + + +
    +
    + ); + } + + + isReady() { + return this.state.threads > 0 && this.state.blocks > 0; + } + + + submit = event => { + event.preventDefault(); + + if (!this.isReady()) { + return; + } + + this.resolve(this.state); + }; + + + update = state => { + this.setState(state); + }; +} diff --git a/miner/config/src/components/modals/AddCpuThreadModal.js b/miner/config/src/components/modals/AddCpuThreadModal.js new file mode 100644 index 0000000..016b4b9 --- /dev/null +++ b/miner/config/src/components/modals/AddCpuThreadModal.js @@ -0,0 +1,63 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import AsyncModal from './AsyncModal'; +import { Modal, Header, Title, Body, Footer, Cancel } from './Modal'; +import {MODAL_ADD_CPU_THREAD} from "../../constants/ModalTypes"; +import {showAsync} from "../../actions/modals"; +import CpuThreadForm from '../threads/CpuThreadForm'; +import OclThreadForm from "../threads/OclThreadForm"; + + +export default class AddCpuThreadModal extends AsyncModal { + static show(props, dispatch) { + return showAsync(MODAL_ADD_CPU_THREAD, props, dispatch) + } + + constructor(props) { + super(props); + + this.state = { + low_power_mode: 1, + affine_to_cpu: false, + asm: 1 + }; + } + + + render() { + return ( + +
    + <Icon icon="plus" /> Add new CPU thread +
    + + + +
    + + +
    +
    + ); + } + + + submit = event => { + event.preventDefault(); + + this.resolve(this.state); + }; + + + update = state => { + this.setState(state); + }; +} diff --git a/miner/config/src/components/modals/AddOclThreadModal.js b/miner/config/src/components/modals/AddOclThreadModal.js new file mode 100644 index 0000000..a671c7f --- /dev/null +++ b/miner/config/src/components/modals/AddOclThreadModal.js @@ -0,0 +1,74 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import AsyncModal from './AsyncModal'; +import { Modal, Header, Title, Body, Footer, Cancel } from './Modal'; +import {MODAL_ADD_OCL_THREAD} from "../../constants/ModalTypes"; +import {showAsync} from "../../actions/modals"; +import OclThreadForm from "../threads/OclThreadForm"; + + +export default class AddOclThreadModal extends AsyncModal { + static show(props, dispatch) { + return showAsync(MODAL_ADD_OCL_THREAD, props, dispatch) + } + + constructor(props) { + super(props); + + this.state = { + index: 0, + intensity: 1000, + worksize: 8, + affine_to_cpu: false, + strided_index: props.platform === 'NVIDIA' ? 0 : 2, + mem_chunk: 2, + unroll: 8 + }; + } + + + render() { + return ( + +
    + <Icon icon="plus" /> Add new OpenCL thread +
    + + + +
    + + +
    +
    + ); + } + + + submit = event => { + event.preventDefault(); + + this.resolve(this.state); + }; + + + update = state => { + this.setState(state); + }; + + + +} diff --git a/miner/config/src/components/modals/AddPoolModal.js b/miner/config/src/components/modals/AddPoolModal.js new file mode 100644 index 0000000..0c6af1c --- /dev/null +++ b/miner/config/src/components/modals/AddPoolModal.js @@ -0,0 +1,101 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import AsyncModal from './AsyncModal'; +import PoolForm from '../network/PoolForm'; +import { Modal, Header, Title, Body, Footer, Cancel } from './Modal'; +import {MODAL_ADD_POOL} from "../../constants/ModalTypes"; +import {showAsync} from "../../actions/modals"; +import {addPool} from "../../actions/config"; +import {ALGO_CRYPTONIGHT_LITE} from "../../constants/options"; + + +export default class AddPoolModal extends AsyncModal { + static show(type, algo, proxy, dispatch) { + showAsync(MODAL_ADD_POOL, { type, algo, proxy }, dispatch) + .then(data => { + dispatch(addPool(type, data)); + }) + .catch(err => null); + } + + constructor(props) { + super(props); + + this.state = { + url: '', + user: '', + pass: '', + proxy: props.proxy, + enabled: 1, + keepalive: 1, + nicehash: 0, + tls: 0, + ssl: 0, + pool: 'hv', + coin: 'XMR', + algo: props.algo, + variant: -1 + }; + } + + + render() { + return ( + +
    + + <Icon icon="plus" /> Add new pool + +
    + + + +
    + + +
    +
    + ); + } + + + isReady() { + return !!this.state.url && this.state.user; + } + + + submit = event => { + event.preventDefault(); + + if (!this.isReady()) { + return; + } + + this.resolve(this.state); + }; + + + update = state => { + this.setState(state); + }; + + + +} diff --git a/miner/config/src/components/modals/AsyncModal.js b/miner/config/src/components/modals/AsyncModal.js new file mode 100644 index 0000000..5692c84 --- /dev/null +++ b/miner/config/src/components/modals/AsyncModal.js @@ -0,0 +1,26 @@ +'use strict'; + +import React from 'react'; + + +export default class AsyncModal extends React.PureComponent { + constructor(props) { + super(props); + + this.success = false; + } + + + componentWillUnmount() { + if (!this.success) { + this.props.reject(new Error('dismiss')); + } + } + + + resolve(result) { + this.success = true; + this.props.resolve(result); + this.props.dismiss(); + } +} diff --git a/miner/config/src/components/modals/DeletePoolModal.js b/miner/config/src/components/modals/DeletePoolModal.js new file mode 100644 index 0000000..5b53f36 --- /dev/null +++ b/miner/config/src/components/modals/DeletePoolModal.js @@ -0,0 +1,42 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import AsyncModal from './AsyncModal'; +import { Modal, Header, Title, Footer, Cancel } from './Modal'; +import {deletePool} from "../../actions/config"; +import {MODAL_DELETE_POOL} from "../../constants/ModalTypes"; +import {showAsync} from "../../actions/modals"; + + +export default class DeletePoolModal extends AsyncModal { + static show(type, pool, dispatch) { + showAsync(MODAL_DELETE_POOL, { type, pool }, dispatch) + .then(() => { + dispatch(deletePool(type, pool.id)); + }) + .catch(err => null); + } + + + render() { + return ( + +
    + {this.props.pool.url} +
    +
    Are you sure you want to delete this pool?
    +
    + + +
    +
    + ); + } + + + submit = event => { + event.preventDefault(); + this.resolve(null); + } +} diff --git a/miner/config/src/components/modals/DeletePresetModal.js b/miner/config/src/components/modals/DeletePresetModal.js new file mode 100644 index 0000000..0c6a0a0 --- /dev/null +++ b/miner/config/src/components/modals/DeletePresetModal.js @@ -0,0 +1,42 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import AsyncModal from './AsyncModal'; +import { Modal, Header, Title, Footer, Cancel } from './Modal'; +import {MODAL_DELETE_PRESET} from "../../constants/ModalTypes"; +import {showAsync} from "../../actions/modals"; +import {deletePreset} from "../../actions/presets"; + + +export default class DeletePresetModal extends AsyncModal { + static show(name, dispatch) { + showAsync(MODAL_DELETE_PRESET, { name }, dispatch) + .then(() => { + dispatch(deletePreset(name)); + }) + .catch(err => null); + } + + + render() { + return ( + +
    + {this.props.name} +
    +
    Are you sure you want to delete this preset?
    +
    + + +
    +
    + ); + } + + + submit = event => { + event.preventDefault(); + this.resolve(null); + } +} diff --git a/miner/config/src/components/modals/DeleteThreadModal.js b/miner/config/src/components/modals/DeleteThreadModal.js new file mode 100644 index 0000000..0f038a8 --- /dev/null +++ b/miner/config/src/components/modals/DeleteThreadModal.js @@ -0,0 +1,37 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import AsyncModal from './AsyncModal'; +import { Modal, Header, Title, Footer, Cancel } from './Modal'; +import {MODAL_DELETE_THREAD} from "../../constants/ModalTypes"; +import {showAsync} from "../../actions/modals"; + + +export default class DeleteThreadModal extends AsyncModal { + static show(index, dispatch) { + return showAsync(MODAL_DELETE_THREAD, { index }, dispatch) + } + + + render() { + return ( + +
    + Delete thread +
    +
    Are you sure you want to delete this thread?
    +
    + + +
    +
    + ); + } + + + submit = event => { + event.preventDefault(); + this.resolve(this.props.index); + } +} diff --git a/miner/config/src/components/modals/EditCUDAThreadModal.js b/miner/config/src/components/modals/EditCUDAThreadModal.js new file mode 100644 index 0000000..3a6acd1 --- /dev/null +++ b/miner/config/src/components/modals/EditCUDAThreadModal.js @@ -0,0 +1,64 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import AsyncModal from './AsyncModal'; +import { Modal, Header, Title, Body, Footer, Cancel } from './Modal'; +import {MODAL_EDIT_CUDA_THREAD} from "../../constants/ModalTypes"; +import {showAsync} from "../../actions/modals"; +import CUDAThreadForm from "../threads/CUDAThreadForm"; + + +export default class EditCUDAThreadModal extends AsyncModal { + static show(index, thread, dispatch) { + return showAsync(MODAL_EDIT_CUDA_THREAD, { index, thread }, dispatch) + } + + constructor(props) { + super(props); + + this.state = {...props.thread}; + } + + + render() { + return ( + +
    + <Icon icon="pencil-alt" /> Edit CUDA thread +
    + + + +
    + + +
    +
    + ); + } + + + submit = event => { + event.preventDefault(); + + this.resolve({thread: this.state, index: this.props.index}); + }; + + + update = state => { + this.setState(state); + }; + + + +} diff --git a/miner/config/src/components/modals/EditCpuThreadModal.js b/miner/config/src/components/modals/EditCpuThreadModal.js new file mode 100644 index 0000000..55ca3fa --- /dev/null +++ b/miner/config/src/components/modals/EditCpuThreadModal.js @@ -0,0 +1,61 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import AsyncModal from './AsyncModal'; +import { Modal, Header, Title, Body, Footer, Cancel } from './Modal'; +import {MODAL_EDIT_CPU_THREAD} from "../../constants/ModalTypes"; +import {showAsync} from "../../actions/modals"; +import CpuThreadForm from "../threads/CpuThreadForm"; + + +export default class EditCpuThreadModal extends AsyncModal { + static show(props, dispatch) { + return showAsync(MODAL_EDIT_CPU_THREAD, props, dispatch) + } + + constructor(props) { + super(props); + + this.state = {...props.thread}; + } + + + render() { + return ( + +
    + <Icon icon="pencil-alt" /> Edit CPU thread +
    + + + +
    + + +
    +
    + ); + } + + + submit = event => { + event.preventDefault(); + + this.resolve({thread: this.state, index: this.props.index}); + }; + + + update = state => { + this.setState(state); + }; + + + +} diff --git a/miner/config/src/components/modals/EditOclThreadModal.js b/miner/config/src/components/modals/EditOclThreadModal.js new file mode 100644 index 0000000..e66e5f1 --- /dev/null +++ b/miner/config/src/components/modals/EditOclThreadModal.js @@ -0,0 +1,76 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import isUndefined from 'lodash/isUndefined'; +import AsyncModal from './AsyncModal'; +import { Modal, Header, Title, Body, Footer, Cancel } from './Modal'; +import {MODAL_EDIT_OCL_THREAD} from "../../constants/ModalTypes"; +import {showAsync} from "../../actions/modals"; +import OclThreadForm from "../threads/OclThreadForm"; + + +export default class EditOclThreadModal extends AsyncModal { + static show(props, dispatch) { + return showAsync(MODAL_EDIT_OCL_THREAD, props, dispatch) + } + + constructor(props) { + super(props); + + this.state = {...props.thread}; + this.state.mem_chunk = this.state.mem_chunk || 2; + + if (isUndefined(this.state.strided_index)) { + this.state.strided_index = props.platform === 'NVIDIA' ? 0 : 2 + } + + if (isUndefined(this.state.unroll)) { + this.state.unroll = 8; + } + } + + + render() { + return ( + +
    + <Icon icon="pencil-alt" /> Edit OpenCL thread +
    + + + +
    + + +
    +
    + ); + } + + + submit = event => { + event.preventDefault(); + + this.resolve({thread: this.state, index: this.props.index}); + }; + + + update = state => { + this.setState(state); + }; + + + +} diff --git a/miner/config/src/components/modals/EditPoolModal.js b/miner/config/src/components/modals/EditPoolModal.js new file mode 100644 index 0000000..b2084db --- /dev/null +++ b/miner/config/src/components/modals/EditPoolModal.js @@ -0,0 +1,102 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import AsyncModal from './AsyncModal'; +import PoolForm from '../network/PoolForm'; +import { Modal, Header, Title, Body, Footer, Cancel } from './Modal'; +import {MODAL_EDIT_POOL} from "../../constants/ModalTypes"; +import {showAsync} from "../../actions/modals"; +import {updatePool} from "../../actions/config"; + + +export default class EditPoolModal extends AsyncModal { + static show(type, pool, dispatch) { + showAsync(MODAL_EDIT_POOL, { type, pool }, dispatch) + .then(data => { + dispatch(updatePool(type, data)); + }) + .catch(err => null); + } + + + constructor(props) { + super(props); + + const { pool } = props; + + this.state = { + id: pool.id, + url: pool.url, + user: pool.user, + pass: pool.pass, + proxy: pool.proxy, + enabled: pool.enabled, + keepalive: pool.keepalive, + nicehash: pool.nicehash, + tls: pool.tls, + ssl: pool.ssl, + pool: pool.pool, + coin: pool.coin, + algo: pool.algo, + variant: pool.variant + } + } + + + render() { + return ( + +
    + <Icon icon="pencil-alt" /> Edit pool +
    + + + +
    + + +
    +
    + ); + } + + + isReady() { + return !!this.state.url; + } + + + submit = event => { + event.preventDefault(); + + if (!this.isReady()) { + return; + } + + this.resolve(this.state); + }; + + + update = state => { + this.setState(state); + }; + + + +} diff --git a/miner/config/src/components/modals/Modal.js b/miner/config/src/components/modals/Modal.js new file mode 100644 index 0000000..33251d2 --- /dev/null +++ b/miner/config/src/components/modals/Modal.js @@ -0,0 +1,56 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; + + +export const Modal = ({ children }) => ( +
    +
    + {children} +
    +
    +); + + +export const Header = ({ children, dismiss }) => ( +
    + + {children} +
    +); + + +export const Title = ({ children }) => ( +

    + {children} +

    +); + + +export const Body = ({ children }) => ( +
    + {children} +
    +); + + +export const Footer = ({ children }) => ( +
    + {children} +
    +); + + +export const Cancel = ({ dismiss }) => ( + +); + + +export const Spinner = ({ enabled }) => { + if (!enabled) { + return null; + } + + return ; +}; diff --git a/miner/config/src/components/modals/SharePresetModal.js b/miner/config/src/components/modals/SharePresetModal.js new file mode 100644 index 0000000..e4e2fca --- /dev/null +++ b/miner/config/src/components/modals/SharePresetModal.js @@ -0,0 +1,42 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; +import ClipboardButton from 'react-clipboard.js'; +import AsyncModal from './AsyncModal'; +import { Modal, Header, Title, Body, Footer, Cancel } from './Modal'; +import {MODAL_SHARE_PRESET} from "../../constants/ModalTypes"; +import {showAsync} from "../../actions/modals"; +import {dismiss, showSuccess} from "../../actions/notification"; + + +export default class SharePresetModal extends AsyncModal { + static show(dispatch) { + showAsync(MODAL_SHARE_PRESET, {}, dispatch) + .then(data => {}) + .catch(err => null); + } + + + render() { + return ( + +
    + <Icon icon="share-alt" /> Share preset url +
    + +
    {window.location.href}
    + +
    + Copy & Close + +
    +
    + ); + } + + + onCopied = () => { + this.resolve(); + }; +} diff --git a/miner/config/src/components/network/ApiForm.js b/miner/config/src/components/network/ApiForm.js new file mode 100644 index 0000000..9ae2e48 --- /dev/null +++ b/miner/config/src/components/network/ApiForm.js @@ -0,0 +1,111 @@ +'use strict'; + +import React from 'react'; +import Form from "../Form"; + + +export default class ApiForm extends Form { + render() { + return ( +
    +
    + + + + +
    + + {this.renderOptions()} + {this.renderExtra()} + +
    + ); + } + + + renderOptions() { + if (this.props.apiPort === 0) { + return; + } + + return ( +
    +
    + + + + +
    + +
    + + + + +
    +
    + ); + } + + + renderExtra() { + if (this.props.apiPort === 0) { + return; + } + + return ( +
    +
    + +
    + +
    + +
    +
    + ); + } +} diff --git a/miner/config/src/components/network/PoolForm.js b/miner/config/src/components/network/PoolForm.js new file mode 100644 index 0000000..bb3e88b --- /dev/null +++ b/miner/config/src/components/network/PoolForm.js @@ -0,0 +1,47 @@ +'use strict'; + +import React from 'react'; +import Form from "../Form"; +import PoolSelectForm from "./PoolSelectForm"; +import {getPool} from "../../lib/pools"; + + +const EDITORS = { + 'nodejs-pool': require('./pools/NodeJsPool').default, + 'custom': require('./pools/CustomPool').default +}; + + +export default class PoolForm extends Form { + render() { + return ( +
    + + +
    + {this.renderBody()} +
    + ); + } + + + renderBody() { + const pool = getPool(this.props.algo, this.props.pool); + const Component = EDITORS[(pool && pool.editor && EDITORS.hasOwnProperty(pool.editor)) ? pool.editor : 'custom']; + + return + } +} diff --git a/miner/config/src/components/network/PoolRow.js b/miner/config/src/components/network/PoolRow.js new file mode 100644 index 0000000..0db4263 --- /dev/null +++ b/miner/config/src/components/network/PoolRow.js @@ -0,0 +1,38 @@ +'use strict'; + +import React from 'react'; +import Icon from '@fortawesome/react-fontawesome'; + + +export default class PoolRow extends React.PureComponent { + render() { + const { pool } = this.props; + + return ( +
  • +
    + + +
    + {/*
    */} + {/**/} + {/*
    */} +
    + {pool.url} {pool.user} +
    +
  • + ); + } + + + edit = event => { + event.preventDefault(); + + this.props.edit(this.props.pool); + }; + + + remove = event => { + this.props.remove(this.props.pool); + }; +} diff --git a/miner/config/src/components/network/PoolSelectForm.js b/miner/config/src/components/network/PoolSelectForm.js new file mode 100644 index 0000000..9c10a9c --- /dev/null +++ b/miner/config/src/components/network/PoolSelectForm.js @@ -0,0 +1,53 @@ +'use strict'; + +import React from 'react'; +import Form from "../Form"; + +import {getPool, getPools} from "../../lib/pools"; + + +export default class PoolSelectForm extends Form { + render() { + const pools = getPools(this.props.algo); + + return ( +
    +
    + {' '} + +
    {' '} + {this.renderCoins()} +
    + ); + } + + + renderCoins() { + const pool = getPool(this.props.algo, this.props.pool); + if (!pool || !pool.coins) { + return; + } + + if (this.props.coin === 'AEON') { + return ( +
    + {' '} + +
    + ); + } + + return ( +
    + {' '} + +
    + ); + } +} diff --git a/miner/config/src/components/network/ProxyForm.js b/miner/config/src/components/network/ProxyForm.js new file mode 100644 index 0000000..e7ce4b6 --- /dev/null +++ b/miner/config/src/components/network/ProxyForm.js @@ -0,0 +1,46 @@ +'use strict'; + +import React from 'react'; +import Textarea from 'react-autosize-textarea'; +import Form from "../Form"; +import Icon from "@fortawesome/react-fontawesome"; + + +export default class ProxyForm extends Form { + render() { + return ( +
    +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + ",m.noCloneChecked=!!le.cloneNode(!0).lastChild.defaultValue,le.innerHTML="",m.option=!!le.lastChild;var he={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ge(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&S(e,t)?E.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var ye=/<|&#?\w+;/;function me(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),d=[],p=0,h=e.length;p\s*$/g;function ke(e,t){return S(e,"table")&&S(11!==t.nodeType?t:t.firstChild,"tr")&&E(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Le(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function je(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n
    ",2===lt.childNodes.length),E.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(m.createHTMLDocument?((r=(t=w.implementation.createHTMLDocument("")).createElement("base")).href=w.location.href,t.head.appendChild(r)):t=w),o=!n&&[],(i=k.exec(e))?[t.createElement(i[1])]:(i=me([e],t,o),o&&o.length&&E(o).remove(),E.merge([],i.childNodes)));var r,i,o},E.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=E.css(e,"position"),c=E(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=E.css(e,"top"),u=E.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),b(t)&&(t=t.call(e,n,E.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},E.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){E.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===E.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===E.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=E(e).offset()).top+=E.css(e,"borderTopWidth",!0),i.left+=E.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-E.css(r,"marginTop",!0),left:t.left-i.left-E.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===E.css(e,"position"))e=e.offsetParent;return e||re})}}),E.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;E.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),E.each(["top","left"],function(e,n){E.cssHooks[n]=Me(m.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?E(e).position()[n]+"px":t})}),E.each({Height:"height",Width:"width"},function(a,s){E.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){E.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?E.css(e,t,i):E.style(e,t,n,i)},s,n?e:void 0,n)}})}),E.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),E.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){E.fn[n]=function(e,t){return 0XMRig
    \ No newline at end of file diff --git a/miner/workers/src/actions/modals.js b/miner/workers/src/actions/modals.js new file mode 100644 index 0000000..9e8c24e --- /dev/null +++ b/miner/workers/src/actions/modals.js @@ -0,0 +1,20 @@ +'use strict'; + +import { MODAL_SHOW, MODAL_HIDE } from '../constants/ActionTypes'; + + +export const show = (type, data = {}) => ({ + type: MODAL_SHOW, + subtype: type, + data +}); + + +export const showAsync = (type, data, dispatch) => ( + new Promise((resolve, reject) => dispatch(show(type, {...data, resolve, reject}))) +); + + +export const dismiss = () => ({ + type: MODAL_HIDE +}); diff --git a/miner/workers/src/actions/notification.js b/miner/workers/src/actions/notification.js new file mode 100644 index 0000000..c8d3183 --- /dev/null +++ b/miner/workers/src/actions/notification.js @@ -0,0 +1,24 @@ +'use strict'; + +import React from 'react'; +import cogoToast from 'cogo-toast'; + + +export function showSuccess(text, timeout = 5000) { + cogoToast.success(text, { hideAfter: timeout / 1000 }); +} + + +export function showInfo(text, timeout = 5000) { + cogoToast.info(text, { hideAfter: timeout / 1000 }); +} + + +export function showWarning(text, timeout = 5000) { + cogoToast.warn(text, { hideAfter: timeout / 1000 }); +} + + +export function showError(text, timeout = 5000) { + cogoToast.error(text, { hideAfter: timeout / 1000 }); +} diff --git a/miner/workers/src/app/Net.js b/miner/workers/src/app/Net.js new file mode 100644 index 0000000..80e4922 --- /dev/null +++ b/miner/workers/src/app/Net.js @@ -0,0 +1,31 @@ +'use strict'; + + +import fetch from './fetchWithTimeout'; + + +class Net { + static get(url, token) { + const headers = {}; + if (token) { + headers.Authorization = `Bearer ${token}`; + } + + return fetch(url, { headers }); + } + + + static query(method, url, token, body) { + return fetch(url, { + method, + body, + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + } +} + + +export default Net; diff --git a/miner/workers/src/app/Workers.js b/miner/workers/src/app/Workers.js new file mode 100644 index 0000000..d8b4eb2 --- /dev/null +++ b/miner/workers/src/app/Workers.js @@ -0,0 +1,134 @@ +'use strict'; + + +import remove from "lodash/remove"; +import mapValues from "lodash/mapValues"; +import Net from "./Net"; +import {store} from "../index"; +import {SETTINGS_CHANGED, WORKER_ADDED, WORKER_CHANGED, WORKER_REMOVED} from "../constants/ActionTypes"; +import Worker from "./models/Worker"; +import events from './events'; + + +const EMPTY_STATE = { keys: [], values: {} }; +export const STORAGE_KEY = 'xmrig.workers'; + + +class Workers { + static state = EMPTY_STATE; + + + static get(url, token) { + return Net.get(url + '/1/summary', token) + .then(response => { + if (response.status === 200) { + return response.json(); + } + + throw new Error(response.statusText); + }); + } + + + static add(url, token) { + return Workers.get(url, token) + .then(summary => Workers.set(url, token, summary)); + } + + + static update(url, token, oldUrl) { + return Workers.get(url, token) + .then(summary => { + if (url !== oldUrl) { + Workers.remove(oldUrl); + } + + return Workers.set(url, token, summary); + }); + } + + + static remove(url) { + const worker = Workers.getSync(url); + + if (worker) { + remove(Workers.state.keys, n => n === url); + delete Workers.state.values[url]; + + worker.destroy(); + Workers.save(); + } + + store.dispatch({ type: WORKER_REMOVED, url }); + } + + + static load() { + Workers.state = { ...EMPTY_STATE }; + + try { + const items = JSON.parse(localStorage.getItem(STORAGE_KEY)); + + for (let item of items) { + Workers.state.keys.push(item[0]); + Workers.state.values[item[0]] = Worker.fromArray(item); + } + } + catch (e) { + } + + return { keys: [...Workers.state.keys], values: mapValues(Workers.state.values, worker => worker.toPlainObject())}; + } + + + static save() { + const workers = Workers.state.keys.map(url => Workers.state.values[url].toArray()); + + localStorage.setItem(STORAGE_KEY, JSON.stringify(workers)); + } + + + static set(url, token, summary) { + const old = Workers.getSync(url); + + if (!old) { + const worker = Worker.fromSummary(url, token, summary); + + Workers.state.keys.push(worker.url); + Workers.state.values[worker.url] = worker; + Workers.save(); + + store.dispatch({ type: WORKER_ADDED, worker: worker.toPlainObject() }); + + return worker; + } + + old.setSummary(summary); + old.token = token; + + Workers.save(); + + store.dispatch({ type: WORKER_CHANGED, worker: old.toPlainObject() }); + + return old; + } + + + static getSync(url) { + return Workers.state.values[url]; + } +} + + +events.on(SETTINGS_CHANGED, () => { + const { values } = Workers.state; + + for (const url in values) { + if (values.hasOwnProperty(url)) { + values[url].refresh(); + } + } +}); + + +export default Workers; diff --git a/miner/workers/src/app/events.js b/miner/workers/src/app/events.js new file mode 100644 index 0000000..bdea6b0 --- /dev/null +++ b/miner/workers/src/app/events.js @@ -0,0 +1,7 @@ +'use strict'; + +import EventEmitter from 'events'; + +const events = new EventEmitter(); + +export default events; diff --git a/miner/workers/src/app/fetchWithTimeout.js b/miner/workers/src/app/fetchWithTimeout.js new file mode 100644 index 0000000..c80b5a5 --- /dev/null +++ b/miner/workers/src/app/fetchWithTimeout.js @@ -0,0 +1,11 @@ +'use strict'; + + +export default function (url, options, timeout = 10000) { + return Promise.race([ + fetch(url, options), + new Promise((_, reject) => + setTimeout(() => reject(new Error('timeout')), timeout) + ) + ]); +} diff --git a/miner/workers/src/app/fontawesome.js b/miner/workers/src/app/fontawesome.js new file mode 100644 index 0000000..d350d03 --- /dev/null +++ b/miner/workers/src/app/fontawesome.js @@ -0,0 +1,14 @@ +import { library } from '@fortawesome/fontawesome-svg-core' +import { faGithub, faWindows, faLinux, faTwitter, faReddit, faTelegram } from '@fortawesome/free-brands-svg-icons'; + +import { + faCheckCircle, faMicrochip, faTrashAlt, faPaperPlane, faSpinner, faFlask, faInfoCircle, faPen, faTools, faCheck, + faPlus, faCog, faExclamationTriangle, faQuestionCircle, faSyncAlt, faInfinity, faDownload, faCopy, faPlug, faTimesCircle +} from '@fortawesome/free-solid-svg-icons'; + + +export default function () { + library.add(faGithub, faWindows, faLinux, faTwitter, faReddit, faTelegram, faCheckCircle, faMicrochip, faTrashAlt, + faPaperPlane, faSpinner, faFlask, faInfoCircle, faPen, faTools, faCheck, faPlus, faCog, faExclamationTriangle, + faQuestionCircle, faSyncAlt, faInfinity, faDownload, faCopy, faPlug, faTimesCircle); +} diff --git a/miner/workers/src/app/modals.js b/miner/workers/src/app/modals.js new file mode 100644 index 0000000..5374d02 --- /dev/null +++ b/miner/workers/src/app/modals.js @@ -0,0 +1,8 @@ +'use strict'; + + +import {showAsync} from "../actions/modals"; +import { store } from "../index"; + + +export const showModal = (type, data) => showAsync(type, data, store.dispatch); diff --git a/miner/workers/src/app/models/Worker.js b/miner/workers/src/app/models/Worker.js new file mode 100644 index 0000000..43bad59 --- /dev/null +++ b/miner/workers/src/app/models/Worker.js @@ -0,0 +1,112 @@ +'use strict'; + + +import Net from "../Net"; +import {getSettings} from "../settings"; +import {store} from "../../index"; +import {WORKER_CHANGED} from "../../constants/ActionTypes"; + + +export default class Worker { + static fromArray(array) { + const worker = new Worker(); + + worker.url = array[0]; + worker.token = array[1]; + worker.name = array[2]; + worker.version = array[3]; + worker.ts = array[4]; + + worker.refresh(); + + return worker; + } + + + static fromSummary(url, token, summary) { + const worker = new Worker(); + + worker.url = url; + worker.token = token; + + worker.setSummary(summary); + worker.schedule(); + + return worker; + } + + + constructor() { + this.url = ''; + this.token = ''; + this.name = ''; + this.version = ''; + this.ts = 0; + this.summary = null; + this.timeout = null; + } + + + setSummary(summary) { + this.name = summary.worker_id; + this.version = summary.version; + this.ts = +new Date(); + this.summary = {...summary, status: 200}; + } + + + toArray() { + return [ this.url, this.token, this.name, this.version, this.ts ]; + } + + + toPlainObject() { + return { + url: this.url, + token: this.token, + name: this.name, + version: this.version, + ts: this.ts, + }; + } + + + getSummary() { + return Net.get(this.url + '/1/summary', this.token) + .then(response => { + if (response.status === 200) { + return response.json() + .then(summary => this.setSummary(summary)); + } + + this.ts = +new Date(); + this.summary = { status: response.status }; + }) + .catch(err => { + this.ts = +new Date(); + this.summary = { status: 500 }; + }) + } + + + refresh() { + clearTimeout(this.timeout); + + return this.getSummary() + .then(() => { + store.dispatch({ type: WORKER_CHANGED, worker: this.toPlainObject() }); + + this.schedule() + }); + } + + + schedule() { + this.timeout = setTimeout(this.refresh.bind(this), getSettings().interval * 1000); + } + + + destroy() { + clearTimeout(this.timeout); + } +} diff --git a/miner/workers/src/app/serialization/v1.js b/miner/workers/src/app/serialization/v1.js new file mode 100644 index 0000000..6c286d5 --- /dev/null +++ b/miner/workers/src/app/serialization/v1.js @@ -0,0 +1,45 @@ +'use strict'; + +import bs58 from 'bs58'; +import {getSettings} from "../settings"; +import {STORAGE_KEY} from "../Workers"; +import { Buffer } from 'buffer'; + + +function serialize(str = true) { + const settings = getSettings(); + const workers = (JSON.parse(localStorage.getItem(STORAGE_KEY)) || []).map(worker => ([ + worker[0].replace('http://', ''), + worker[1], + worker[2], + worker[3] + ])); + + const array = [1, [ settings.interval ], workers]; + + if (str === true) { + return bs58.encode(Buffer.from(JSON.stringify(array))); + } + + return array; +} + + +function deserialize(data) { + const settings = { interval: data[1][0] }; + const workers = data[2].map(worker => ([ + worker[0].indexOf('https://') === 0 ? worker[0] : ('http://' + worker[0]), + worker[1], + worker[2], + worker[3], + 0 + ])); + + return { settings, workers } +} + + +export default { + serialize, + deserialize +} diff --git a/miner/workers/src/app/settings.js b/miner/workers/src/app/settings.js new file mode 100644 index 0000000..188786a --- /dev/null +++ b/miner/workers/src/app/settings.js @@ -0,0 +1,39 @@ +'use strict'; + +import events from './events'; +import {SETTINGS_CHANGED} from "../constants/ActionTypes"; +import { store } from '../index'; + + +let SETTINGS = null; + +const KEY = SETTINGS_CHANGED; +export const SETTINGS_KEY = 'xmrig.settings'; + + +export const getSettings = () => { + if (!SETTINGS) { + try { + SETTINGS = JSON.parse(localStorage.getItem(SETTINGS_KEY)); + } + catch (e) { + console.error(e); + } + } + + if (!SETTINGS) { + SETTINGS = { interval: 10, oclPage: 0, cudaPage: 0 }; + } + + return SETTINGS; +}; + + +export const saveSettings = settings => { + SETTINGS = settings; + + localStorage.setItem(SETTINGS_KEY, JSON.stringify(SETTINGS)); + events.emit(KEY, SETTINGS); + + store.dispatch({ type: KEY, settings }); +}; diff --git a/miner/workers/src/components/DismissibleAlert.js b/miner/workers/src/components/DismissibleAlert.js new file mode 100644 index 0000000..1c80053 --- /dev/null +++ b/miner/workers/src/components/DismissibleAlert.js @@ -0,0 +1,14 @@ +'use strict'; + +import React from 'react'; + + +const DismissibleAlert = ({ children, type, dismiss }) => ( +
    + + {children} +
    +); + + +export default DismissibleAlert; diff --git a/miner/workers/src/components/Import.js b/miner/workers/src/components/Import.js new file mode 100644 index 0000000..bae91c5 --- /dev/null +++ b/miner/workers/src/components/Import.js @@ -0,0 +1,68 @@ +'use strict'; + +import React from 'react'; +import bs58 from 'bs58'; +import isArray from 'lodash/isArray'; +import v1 from '../app/serialization/v1'; +import {FontAwesomeIcon as Icon} from "@fortawesome/react-fontawesome"; +import {SETTINGS_KEY} from "../app/settings"; +import {STORAGE_KEY} from "../app/Workers"; + + +export default class Import extends React.PureComponent { + constructor(props) { + super(props); + + this.data = Import.deserialize(props.import_data); + + console.log(this.data); + } + + + render() { + return ( +
    +
    + All your settings and workers will be replaced. +
    + + +
    + ); + } + + + isValid() { + return this.data && this.data.settings && this.data.workers && this.data.workers.length; + } + + + apply = () => { + localStorage.setItem(SETTINGS_KEY, JSON.stringify(this.data.settings)); + localStorage.setItem(STORAGE_KEY, JSON.stringify(this.data.workers)); + + window.location.pathname = '/'; + }; + + + static deserialize(input) { + let array; + try { + array = JSON.parse(bs58.decode(input)); + } + catch (e) { + console.error(e); + return {} + } + + if (!isArray(array)) { + return {} + } + + if (array[0] === 1) { + return v1.deserialize(array); + } + + return null; + } +} diff --git a/miner/workers/src/components/Navbar.js b/miner/workers/src/components/Navbar.js new file mode 100644 index 0000000..d814dd4 --- /dev/null +++ b/miner/workers/src/components/Navbar.js @@ -0,0 +1,58 @@ +'use strict'; + +import React from 'react'; +import cn from 'classnames'; +import { Link } from 'react-router-dom'; +import { FontAwesomeIcon as Icon } from '@fortawesome/react-fontawesome'; +import AddWorkerModal from './modals/AddWorkerModal'; + + +export default class Navbar extends React.PureComponent { + render() { + return ( + + ); + } + + + add = () => { + AddWorkerModal.show() + .catch(err => null); + } +} diff --git a/miner/workers/src/components/NoMatch.js b/miner/workers/src/components/NoMatch.js new file mode 100644 index 0000000..49b5797 --- /dev/null +++ b/miner/workers/src/components/NoMatch.js @@ -0,0 +1,18 @@ +'use strict'; + +import React from 'react'; +import { FontAwesomeIcon as Icon } from '@fortawesome/react-fontawesome'; + + +export default class NoMatch extends React.PureComponent { + render() { + return ( +
    +
    +

    +

    404 Not Found

    +
    +
    + ); + } +} diff --git a/miner/workers/src/components/Settings.js b/miner/workers/src/components/Settings.js new file mode 100644 index 0000000..4bd90d2 --- /dev/null +++ b/miner/workers/src/components/Settings.js @@ -0,0 +1,56 @@ +'use strict'; + +import React from 'react'; +import SettingsForm from "./forms/SettingsForm"; +import {saveSettings} from "../app/settings"; +import ExportModal from "./modals/ExportModal"; + + +export default class Settings extends React.PureComponent { + constructor(props) { + super(props); + + this.state = { + interval: props.settings.interval + } + } + + + render() { + return ( +
    +

    + Settings +

    +
    +
    + +
    +
    +
    + ); + } + + + update = state => { + this.setState(state, () => saveSettings(this.state)); + }; + + + save = event => { + event.preventDefault(); + + saveSettings(this.state); + }; + + + export = event => { + event.preventDefault(); + + ExportModal.show(); + }; +} diff --git a/miner/workers/src/components/Workers.js b/miner/workers/src/components/Workers.js new file mode 100644 index 0000000..73eb396 --- /dev/null +++ b/miner/workers/src/components/Workers.js @@ -0,0 +1,70 @@ +'use strict'; + +import React from 'react'; +import WorkerRow from "./worker/WorkerRow"; +import {FontAwesomeIcon as Icon} from "@fortawesome/react-fontawesome"; +import AddWorkerModal from "./modals/AddWorkerModal"; + + +export default class Workers extends React.PureComponent { + render() { + return ( +
    + {this.renderBody()} +
    + ); + } + + + renderBody() { + if (this.props.workers.keys.length === 0) { + return this.renderAlert(); + } + + return this.renderWorkers(); + } + + + renderAlert() { + return ( +
    + No workers found, add at least one. +
    + ); + } + + + renderWorkers() { + const { workers } = this.props; + + return ( +
    +
    + + + + + + + + + + + {workers.keys.map(url => (< WorkerRow + key={url} + worker={workers.values[url]} + /> + ))} + +
    Workers {workers.keys.length}HashrateResultsPool
    +
    +
    + ); + } + + + add = () => { + AddWorkerModal.show() + .catch(err => null); + } +} diff --git a/miner/workers/src/components/forms/SettingsForm.js b/miner/workers/src/components/forms/SettingsForm.js new file mode 100644 index 0000000..ecada3b --- /dev/null +++ b/miner/workers/src/components/forms/SettingsForm.js @@ -0,0 +1,35 @@ +'use strict'; + +import React from 'react'; + + +export default class SettingsForm extends React.PureComponent { + render() { + return ( +
    + +
    + +
    +
    + { this.props.update({ interval: +event.target.value }) }} + /> +
    + Seconds +
    +
    +
    +
    + + + +
    + ); + } +} diff --git a/miner/workers/src/components/modals/AddWorkerModal.js b/miner/workers/src/components/modals/AddWorkerModal.js new file mode 100644 index 0000000..94af85a --- /dev/null +++ b/miner/workers/src/components/modals/AddWorkerModal.js @@ -0,0 +1,139 @@ +'use strict'; + +import React from 'react'; +import URL from 'url'; +import { FontAwesomeIcon as Icon } from '@fortawesome/react-fontawesome'; +import AsyncModal from './AsyncModal'; +import { LargeModal, Header, Title, Body, Footer, Cancel } from './Modal'; +import { MODAL_ADD_WORKER } from '../../constants/ModalTypes'; +import {showModal} from "../../app/modals"; +import Workers from "../../app/Workers"; +import history from "../../store/history"; + + +const STATE_IDLE = 1; +const STATE_WAIT = 2; +const STATE_ERR = 3; + + +export default class AddWorkerModal extends AsyncModal { + static show(url = '', token = '') { + return showModal(MODAL_ADD_WORKER, { url, token }) + .then(worker => { + history.push('/worker?url=' + encodeURIComponent(worker.url)); + }); + } + + + constructor(props) { + super(props); + + this.state = { + state: STATE_IDLE, + error: '', + url: props.url || '', + token: props.token || '' + }; + } + + + render() { + return ( + +
    + Add new worker +
    + + +
    +
    + + +
    + +
    + + +
    + + +
    + + +
    + {this.renderError()} + {this.renderSpinner()} + + +
    +
    + ); + } + + + isReady() { + if (this.state.state === STATE_WAIT) { + return false; + } + + const { protocol, host } = URL.parse(this.state.url); + + return (protocol === 'http:' || protocol === 'https:') && host; + } + + + renderSpinner() { + if (this.state.state === STATE_WAIT) { + return ; + } + } + + + renderError() { + if (this.state.state === STATE_ERR && this.state.error) { + return {this.state.error} + } + } + + + submit = event => { + event.preventDefault(); + + if (!this.isReady()) { + return false; + } + + this.setState({ state: STATE_WAIT }); + + Workers.add(this.state.url, this.state.token) + .then(worker => { + this.resolve(worker); + }) + .catch(err => { + this.setState({ state: STATE_ERR, error: err.message}); + }); + }; + + + handleChange = event => { + this.setState({ state: STATE_IDLE, [event.target.name]: event.target.value }); + }; +} diff --git a/miner/workers/src/components/modals/AsyncModal.js b/miner/workers/src/components/modals/AsyncModal.js new file mode 100644 index 0000000..5692c84 --- /dev/null +++ b/miner/workers/src/components/modals/AsyncModal.js @@ -0,0 +1,26 @@ +'use strict'; + +import React from 'react'; + + +export default class AsyncModal extends React.PureComponent { + constructor(props) { + super(props); + + this.success = false; + } + + + componentWillUnmount() { + if (!this.success) { + this.props.reject(new Error('dismiss')); + } + } + + + resolve(result) { + this.success = true; + this.props.resolve(result); + this.props.dismiss(); + } +} diff --git a/miner/workers/src/components/modals/CpuModal.js b/miner/workers/src/components/modals/CpuModal.js new file mode 100644 index 0000000..45dcb4f --- /dev/null +++ b/miner/workers/src/components/modals/CpuModal.js @@ -0,0 +1,79 @@ +'use strict'; + +import React from 'react'; +import AsyncModal from './AsyncModal'; +import {Header, Footer, Cancel, Title, Modal} from './Modal'; +import {showModal} from "../../app/modals"; +import {MODAL_CPU} from "../../constants/ModalTypes"; + + +export default class CpuModal extends AsyncModal { + static show(cpu) { + return showModal(MODAL_CPU, cpu); + } + + + render() { + return ( + +
    + {this.props.brand} +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    features + {CpuModal.renderFeature(this.props.x64, 'x64')}{' '} + {CpuModal.renderFeature(this.props.aes, 'AES')}{' '} + {CpuModal.renderFeature(this.props.avx2, 'AVX2')} +
    cache + L2 {(this.props.l2 / 1048576).toFixed(1)} MB{' '} + L3 {(this.props.l3 / 1048576).toFixed(1)} MB +
    cores{this.props.cores}threads{this.props.threads}
    packages{this.props.packages}NUMA nodes{CpuModal.renderNuma(this.props.nodes)}
    backend{this.props.backend}
    +
    +
    + +
    +
    + ); + } + + + static renderNuma(nodes) { + if (nodes === 0) { + return n/a + } + + return {nodes} + } + + + static renderFeature(enabled, label) { + return {label} + } +} diff --git a/miner/workers/src/components/modals/DeleteWorkerModal.js b/miner/workers/src/components/modals/DeleteWorkerModal.js new file mode 100644 index 0000000..e26ebb7 --- /dev/null +++ b/miner/workers/src/components/modals/DeleteWorkerModal.js @@ -0,0 +1,39 @@ +'use strict'; + +import React from 'react'; +import { FontAwesomeIcon as Icon } from '@fortawesome/react-fontawesome'; +import AsyncModal from './AsyncModal'; +import {Header, Footer, Cancel, Title, LargeModal} from './Modal'; +import {showModal} from "../../app/modals"; +import {MODAL_DEL_WORKER} from "../../constants/ModalTypes"; + + +export default class DeleteWorkerModal extends AsyncModal { + static show(name) { + return showModal(MODAL_DEL_WORKER, { name }) + } + + + render() { + return ( + +
    + Delete worker +
    +
    + Are you sure you want to delete worker {this.props.name}? +
    +
    + + +
    +
    + ); + } + + + handleDelete = event => { + event.preventDefault(); + this.resolve(); + } +} diff --git a/miner/workers/src/components/modals/ExportModal.js b/miner/workers/src/components/modals/ExportModal.js new file mode 100644 index 0000000..9dc3fb3 --- /dev/null +++ b/miner/workers/src/components/modals/ExportModal.js @@ -0,0 +1,43 @@ +'use strict'; + +import React from 'react'; +import { FontAwesomeIcon as Icon } from '@fortawesome/react-fontawesome'; +import ClipboardButton from 'react-clipboard.js'; +import AsyncModal from './AsyncModal'; +import {Header, Footer, Cancel, Title, Body, LargeModal} from './Modal'; +import {showModal} from "../../app/modals"; +import {MODAL_EXPORT} from "../../constants/ModalTypes"; +import v1 from '../../app/serialization/v1'; + + +export default class ExportModal extends AsyncModal { + static show() { + return showModal(MODAL_EXPORT, {}); + } + + + render() { + return ( + +
    + Export settings and workers +
    +
    + Copy url below and open it on another browser to import. +
    + +
    {window.location.origin}/import/{v1.serialize()}
    + +
    + Copy & Close + +
    +
    + ); + } + + + onCopied = () => { + this.resolve(null); + }; +} diff --git a/miner/workers/src/components/modals/FeatureModal.js b/miner/workers/src/components/modals/FeatureModal.js new file mode 100644 index 0000000..3696984 --- /dev/null +++ b/miner/workers/src/components/modals/FeatureModal.js @@ -0,0 +1,32 @@ +'use strict'; + +import React from 'react'; +import { FontAwesomeIcon as Icon } from '@fortawesome/react-fontawesome'; +import AsyncModal from './AsyncModal'; +import {Header, Footer, Cancel, Title, LargeModal} from './Modal'; +import {showModal} from "../../app/modals"; +import {MODAL_FEATURE} from "../../constants/ModalTypes"; + + +export default class FeatureModal extends AsyncModal { + static show() { + return showModal(MODAL_FEATURE, {}) + } + + + render() { + return ( + +
    + Missing feature +
    +
    + Update your miner to recent version to get this feature. +
    +
    + +
    +
    + ); + } +} diff --git a/miner/workers/src/components/modals/Modal.js b/miner/workers/src/components/modals/Modal.js new file mode 100644 index 0000000..b636942 --- /dev/null +++ b/miner/workers/src/components/modals/Modal.js @@ -0,0 +1,66 @@ +'use strict'; + +import React from 'react'; + + +export const Modal = ({ children }) => ( +
    +
    + {children} +
    +
    +); + + +export const LargeModal = ({ children }) => ( +
    +
    + {children} +
    +
    +); + + +export const Header = ({ children, dismiss }) => ( +
    + {children} + +
    +); + + +export const Title = ({ children }) => ( +
    + {children} +
    +); + + +export const Body = ({ children }) => ( +
    + {children} +
    +); + + +export const Footer = ({ children }) => ( +
    + {children} +
    +); + + +export const Cancel = ({ dismiss }) => ( + +); + + +export const Spinner = ({ enabled }) => { + if (!enabled) { + return null; + } + + return ; +}; diff --git a/miner/workers/src/components/modals/OclPlatformModal.js b/miner/workers/src/components/modals/OclPlatformModal.js new file mode 100644 index 0000000..4004069 --- /dev/null +++ b/miner/workers/src/components/modals/OclPlatformModal.js @@ -0,0 +1,54 @@ +'use strict'; + +import React from 'react'; +import AsyncModal from './AsyncModal'; +import {Header, Footer, Cancel, Title, Modal} from './Modal'; +import {showModal} from "../../app/modals"; +import {MODAL_OCL_PLATFORM} from "../../constants/ModalTypes"; + + +export default class OclPlatformModal extends AsyncModal { + static show(platform) { + return showModal(MODAL_OCL_PLATFORM, platform); + } + + + render() { + return ( + +
    + OpenCL platform +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    index{this.props.index}
    name{this.props.name}
    version{this.props.version}
    vendor{this.props.vendor}
    extensions{this.props.extensions}
    +
    +
    + +
    +
    + ); + } +} diff --git a/miner/workers/src/components/worker/Backends.js b/miner/workers/src/components/worker/Backends.js new file mode 100644 index 0000000..ca6c872 --- /dev/null +++ b/miner/workers/src/components/worker/Backends.js @@ -0,0 +1,107 @@ +'use strict'; + +import React from 'react'; +import find from 'lodash/find'; +import { FontAwesomeIcon as Icon } from '@fortawesome/react-fontawesome'; +import Net from "../../app/Net"; +import {getSettings} from "../../app/settings"; +import CpuBackend from "./CpuBackend"; +import OclBackend from "./OclBackend"; +import CudaBackend from "./CudaBackend"; + + +export default class Backends extends React.PureComponent { + constructor(props) { + super(props); + + this.state = { + error: false, + progress: true, + backends: null + }; + + this.getData(); + } + + + render() { + return this.renderBody(); + } + + + componentDidMount() { + this.interval = setInterval(this.getData, getSettings().interval * 1000); + } + + + componentWillUnmount() { + clearInterval(this.interval); + } + + + renderBody() { + if (this.state.error) { + return (
    Backends information is not available.
    ); + } + + if (this.state.progress) { + return (
    ); + } + + return ( +
    + {this.renderCPU()} + {this.renderOCL()} + {this.renderCUDA()} +
    + ); + } + + + renderCPU() { + const cpu = find(this.state.backends, { type: 'cpu' }); + if (!cpu || !cpu.enabled) { + return; + } + + return ; + } + + + renderOCL() { + const ocl = find(this.state.backends, { type: 'opencl' }); + if (!ocl || !ocl.enabled) { + return; + } + + return ; + } + + + renderCUDA() { + const cuda = find(this.state.backends, { type: 'cuda' }); + if (!cuda || !cuda.enabled) { + return; + } + + return ; + } + + + getData = () => { + const { url, token } = this.props; + + return Net.get(url + '/2/backends', token) + .then(res => { + if (res.status !== 200) { + throw new Error(res.statusText); + } + + return res.json(); + }) + .then(backends => { + this.setState({ backends, progress: false, error: false }); + }) + .catch(e => this.setState({ progress: false, error: true })); + }; +} diff --git a/miner/workers/src/components/worker/Config.js b/miner/workers/src/components/worker/Config.js new file mode 100644 index 0000000..8c56815 --- /dev/null +++ b/miner/workers/src/components/worker/Config.js @@ -0,0 +1,150 @@ +'use strict'; + +import React from 'react'; +import { FontAwesomeIcon as Icon } from '@fortawesome/react-fontawesome'; +import cn from "classnames"; +import attempt from 'lodash/attempt'; +import isError from 'lodash/isError'; +import FileSaver from 'file-saver'; +import Net from "../../app/Net"; +import {showError, showSuccess} from "../../actions/notification"; + + +export default class Config extends React.PureComponent { + constructor(props) { + super(props); + + this.state = { + error: !props.token, + progress: true, + config: null + }; + + this.getData(); + } + + + render() { + const isValid = this.isValid(); + const { progress } = this.state; + const error = this.state.error || !isValid; + + return ( +
    +
    +
    + JSON configuration + + +
    + {this.renderBody(isValid)} +
    +
    + ); + } + + + renderBody(isValid) { + if (this.state.error) { + return Config.renderError(); + } + + if (this.state.progress) { + return Config.renderSpinner(); + } + + return this.renderConfig(isValid); + } + + + renderConfig(isValid) { + return ( +
    +
    +
    +