├── .gitignore ├── Gruntfile.js ├── README.md ├── _config.yml ├── package.json ├── public ├── app │ ├── app.js │ ├── controllers │ │ └── main.js │ ├── filters │ │ └── main.js │ └── services │ │ ├── data │ │ ├── instruments │ │ │ └── kit-1.json │ │ └── sequences │ │ │ └── seq-1.json │ │ ├── drum_machine.js │ │ ├── models │ │ ├── beat.js │ │ ├── instrument.js │ │ └── row.js │ │ └── timer_queue.js ├── assets │ ├── audio │ │ ├── CYCdh_AcouKick-01.mp3 │ │ ├── CYCdh_LudFlamA-01.mp3 │ │ ├── KHats Clsd-08.mp3 │ │ └── KHats Open-04.mp3 │ ├── bower.json │ ├── css │ │ ├── main.css │ │ └── main.css.map │ ├── images │ │ └── ready-to-groove.png │ └── js │ │ ├── angular_drums.min.js │ │ ├── angular_drums.min.map │ │ └── application.js ├── index.html └── sass │ ├── _settings.scss │ └── main.scss ├── screenshot.png └── test ├── karma.conf.js └── unit └── app ├── controllers └── main.spec.js └── services ├── drum_machine.spec.js ├── models ├── beat.spec.js ├── instrument.spec.js └── row.spec.js └── timer_queue.spec.js /.gitignore: -------------------------------------------------------------------------------- 1 | .sass-cache 2 | .DS_Store 3 | .tern-port 4 | node_modules/ 5 | bower_components/ 6 | css/main.css.map 7 | public/assets/js/angular_drums.min.js.map 8 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | // Project configuration. 3 | grunt.initConfig({ 4 | 5 | //Read the package.json (optional) 6 | pkg: grunt.file.readJSON('package.json'), 7 | 8 | // Metadata. 9 | meta: { 10 | basePath: './', 11 | srcPath: './public/sass/', 12 | deployPath: './public/assets/css/', 13 | bowerPath: './public/assets/bower_components/' 14 | }, 15 | 16 | banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + 17 | '<%= grunt.template.today("yyyy-mm-dd") %>\n' + 18 | '* Copyright (c) <%= grunt.template.today("yyyy") %> ', 19 | 20 | // Task configuration. 21 | connect: { 22 | server: { 23 | options: { 24 | port: 8080, 25 | base: './public' 26 | } 27 | } 28 | }, 29 | 30 | karma: { 31 | unit: { 32 | configFile: 'test/karma.conf.js', 33 | autoWatch: false, 34 | background: true 35 | } 36 | }, 37 | 38 | sass: { 39 | dist: { 40 | options: { 41 | style: 'compressed', 42 | loadPath: ['<%= meta.bowerPath %>foundation/scss/', '<%= meta.bowerPath %>foundation/scss/foundation/components/'] 43 | }, 44 | files: { 45 | '<%= meta.deployPath %>main.css': '<%= meta.srcPath %>main.scss' 46 | } 47 | } 48 | }, 49 | 50 | uglify: { 51 | options: { 52 | mangle: false 53 | }, 54 | my_target: { 55 | files: { 56 | 'public/assets/js/angular_drums.min.js': ['public/assets/bower_components/angular-route/angular-route.min.js', 'public/assets/bower_components/howler/howler.min.js', 'public/app/**/*.js'] 57 | } 58 | } 59 | }, 60 | 61 | watch: { 62 | sasstocss: { 63 | files: ['<%= meta.srcPath %>/**/*.scss'], 64 | tasks: ['sass'] 65 | }, 66 | 67 | /* watch and see if our javascript files change, or new packages are installed */ 68 | js: { 69 | files: ['public/app/**/*.js'], 70 | tasks: ['uglify'] 71 | }, 72 | 73 | karma: { 74 | files: ['public/app/**/*.js', 'test/**/*.js'], 75 | tasks: ['karma:unit:run'] 76 | } 77 | } 78 | 79 | }); 80 | 81 | // These plugins provide necessary tasks. 82 | grunt.loadNpmTasks('grunt-contrib-connect'); 83 | grunt.loadNpmTasks('grunt-contrib-sass'); 84 | grunt.loadNpmTasks('grunt-contrib-uglify'); 85 | grunt.loadNpmTasks('grunt-contrib-watch'); 86 | grunt.loadNpmTasks('grunt-karma'); 87 | 88 | // Default task. 89 | grunt.registerTask('default', ['sass', 'uglify', 'connect', 'watch']); 90 | grunt.registerTask('test', ['sass', 'uglify', 'karma:unit:start', 'connect', 'watch']); 91 | }; 92 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Angular Drum Machine 2 | -------------------- 3 | 4 | Just a little experiment with [AngularJS](https://github.com/angular/angular.js 5 | "AngularJS") and HTML5 Audio (via [howler.js](https://github.com/goldfire/howler.js "howler.js")). Currently using Angular 1.2. 6 | 7 | At one point, there were plans to upgrade this to later versions of Angular and even to port it to React. But, as this was only ever a fun proof-of-concept project, I never found time for those upgrades. I'll still review/accept any PRs if someone wants to take a crack at it. 8 | 9 | DEMO: [http://drums.dojosto.com](http://drums.dojosto.com) 10 | 11 | ![Drum Machine Screenshot](https://raw.github.com/dougjohnston/angular-drum-machine/master/screenshot.png) 12 | 13 | Installation 14 | ============ 15 | 16 | Run `npm install` to install Bower, Grunt and other local dependencies. 17 | From `public/assets`, run `bower install` to install runtime dependencies. 18 | 19 | Run `grunt` to fire up a server at http://localhost:8080. 20 | 21 | Testing 22 | ======= 23 | 24 | Run `grunt test` to fire up Karma and watch for changes. 25 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-minimal -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Angular-Drum-Machine", 3 | "version": "0.0.1", 4 | "description": "Angular Drum Machine", 5 | "main": "index.html", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/dougjohnston/angular-drum-machine.git" 12 | }, 13 | "devDependencies": { 14 | "bower": "latest", 15 | "grunt": "latest", 16 | "grunt-contrib-sass": "latest", 17 | "grunt-contrib-watch": "latest", 18 | "grunt-contrib-connect": "latest", 19 | "grunt-contrib-uglify": "latest", 20 | "grunt-karma": "latest", 21 | "karma": "latest", 22 | "karma-script-launcher": "latest", 23 | "karma-firefox-launcher": "latest", 24 | "karma-chrome-launcher": "latest", 25 | "karma-html2js-preprocessor": "latest", 26 | "karma-jasmine": "latest", 27 | "karma-requirejs": "latest", 28 | "karma-phantomjs-launcher": "~0.2", 29 | "karma-spec-reporter": "latest", 30 | "jasmine-core": "latest", 31 | "phantomjs-prebuilt": "latest", 32 | "requirejs": "latest" 33 | }, 34 | "author": "Doug Johnston", 35 | "license": "BSD-2-Clause", 36 | "bugs": { 37 | "url": "https://github.com/dougjohnston/angular-drum-machine/issues" 38 | }, 39 | "homepage": "https://github.com/dougjohnston/angular-drum-machine" 40 | } 41 | -------------------------------------------------------------------------------- /public/app/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //var app = angular.module('AngularDrumMachine', ['ngRoute']); 4 | var app = angular.module('AngularDrumMachine', []); 5 | 6 | app.run(['drumMachine', '$q', '$rootScope', '$timeout', function(drumMachine, $q, $rootScope, $timeout) { 7 | $rootScope.loading = true; 8 | 9 | drumMachine.loadInstruments().then(function(result) { 10 | drumMachine.loadSequence().then(function(result) { 11 | $rootScope.machine = drumMachine; 12 | $rootScope.tempo = drumMachine.tempo.call(this); 13 | $rootScope.loading = false; 14 | }) 15 | }); 16 | }]); 17 | -------------------------------------------------------------------------------- /public/app/controllers/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | // Drum Controller 4 | app.controller('DrumMachineCtrl', function($scope) { 5 | //variable to prevent multiple playloops 6 | $scope.lock = false; 7 | 8 | // Start playback 9 | $scope.playLoop = function () { 10 | if (!$scope.lock) { 11 | $scope.machine.play(); 12 | $scope.fade_msg_play = true; 13 | console.log('Playing'); 14 | $scope.lock = true; 15 | } 16 | 17 | }; 18 | 19 | // Halt playback 20 | $scope.stopLoop = function () { 21 | $scope.lock = false; 22 | $scope.machine.stop(); 23 | 24 | }; 25 | 26 | // Reset the machine to its original state 27 | $scope.resetLoop = function() { 28 | $scope.machine.reset(); 29 | }; 30 | 31 | // Update the tempo 32 | $scope.updateTempo = function() { 33 | $scope.machine.setTempo($scope.tempo); 34 | 35 | }; 36 | 37 | $scope.EditBPM = function() { 38 | var bpmEdit = document.getElementById('bpmEdit'); 39 | var bpm = document.getElementById('bpm'); 40 | bpm.style.display = 'none'; 41 | bpmEdit.style.display = 'inline-block'; 42 | } 43 | $scope.CloseEdit = function() { 44 | bpm.style.display = 'inline-block'; 45 | bpmEdit.style.display = 'none'; 46 | } 47 | }); 48 | -------------------------------------------------------------------------------- /public/app/filters/main.js: -------------------------------------------------------------------------------- 1 | app.filter('range', function() { 2 | return function(input, total) { 3 | total = parseInt(total); 4 | for (var i=0; i= _gridLength) { 97 | _currentBeat = 0; 98 | } 99 | 100 | for (var i = 0; i < _rows.length; i++) { 101 | _rows[i].playSound(_currentBeat); 102 | } 103 | _currentBeat += 1; 104 | _timers.add(playBeat(), _delay); 105 | }; 106 | } 107 | 108 | function resetAllRows() { 109 | for(var i = 0; i < _rows.length; i++) { 110 | _rows[i].reset(); 111 | } 112 | } 113 | 114 | function beatDelay() { 115 | return (1000 / (_tempo * 2) * 60); 116 | } 117 | 118 | // Return public functions 119 | return { 120 | loadInstruments: loadInstruments, 121 | loadSequence: loadSequence, 122 | gridLength: gridLength, 123 | currentBeat: currentBeat, 124 | rows: rows, 125 | tempo: tempo, 126 | setTempo: setTempo, 127 | play: play, 128 | stop: stop, 129 | reset: reset 130 | } 131 | }); 132 | -------------------------------------------------------------------------------- /public/app/services/models/beat.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Beat = function() { 4 | var active = false; 5 | 6 | function isActive() { 7 | return active; 8 | } 9 | 10 | function activate() { 11 | active = true; 12 | } 13 | 14 | function deactivate() { 15 | active = false; 16 | } 17 | 18 | function toggle() { 19 | active = (active ? false : true); 20 | } 21 | 22 | // Return public functions 23 | return { 24 | isActive: isActive, 25 | activate: activate, 26 | deactivate: deactivate, 27 | toggle: toggle 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /public/app/services/models/instrument.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Instrument = function(player, inst) { 4 | var audioPlayer = player; 5 | var name = inst.name; 6 | var description = inst.description; 7 | 8 | function getName() { 9 | return name; 10 | } 11 | 12 | function getDescription() { 13 | return description; 14 | } 15 | 16 | function play() { 17 | try { 18 | audioPlayer.play(); 19 | return true; 20 | } catch(e) { 21 | console.log("Unable to play sound", e); 22 | return false; 23 | } 24 | }; 25 | 26 | // Return public functions 27 | return { 28 | getName: getName, 29 | getDescription: getDescription, 30 | play: play 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /public/app/services/models/row.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Row = function(instrument, initialBeats) { 4 | var instrument = instrument; 5 | var beats = []; 6 | 7 | // Add initial beats 8 | addBeats(initialBeats); 9 | 10 | function getInstrument() { 11 | return instrument; 12 | } 13 | 14 | function getBeats() { 15 | return beats; 16 | } 17 | 18 | function addBeats(num) { 19 | for(var i = 0; i < num; i++) { 20 | beats.push(new Beat()); 21 | } 22 | } 23 | 24 | function reset() { 25 | for(var i = 0; i < beats.length; i++) { 26 | beats[i].deactivate(); 27 | } 28 | } 29 | 30 | function playSound(index) { 31 | if (beats[index].isActive()) { 32 | return instrument.play(); 33 | } 34 | return false; 35 | } 36 | 37 | // Return public functions 38 | return { 39 | getInstrument: getInstrument, 40 | getBeats: getBeats, 41 | addBeats: addBeats, 42 | reset: reset, 43 | playSound: playSound 44 | } 45 | }; 46 | -------------------------------------------------------------------------------- /public/app/services/timer_queue.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | // Timer Queue Model 4 | app.factory('timerQueue', function($timeout) { 5 | var _queue = new Array(); 6 | 7 | function queue() { 8 | return _queue; 9 | } 10 | 11 | function add(fn, delay) { 12 | _queue.push($timeout(fn, delay)); 13 | } 14 | 15 | function clear() { 16 | for (var i = 0; i < _queue.length; i++) { 17 | $timeout.cancel(_queue[i]); 18 | } 19 | _queue = []; 20 | } 21 | 22 | return { 23 | queue: queue, 24 | add: add, 25 | clear: clear 26 | }; 27 | }); 28 | 29 | -------------------------------------------------------------------------------- /public/assets/audio/CYCdh_AcouKick-01.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dougjohnston/angular-drum-machine/f338766bfde8d81445c9737300d72b0fb97bc591/public/assets/audio/CYCdh_AcouKick-01.mp3 -------------------------------------------------------------------------------- /public/assets/audio/CYCdh_LudFlamA-01.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dougjohnston/angular-drum-machine/f338766bfde8d81445c9737300d72b0fb97bc591/public/assets/audio/CYCdh_LudFlamA-01.mp3 -------------------------------------------------------------------------------- /public/assets/audio/KHats Clsd-08.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dougjohnston/angular-drum-machine/f338766bfde8d81445c9737300d72b0fb97bc591/public/assets/audio/KHats Clsd-08.mp3 -------------------------------------------------------------------------------- /public/assets/audio/KHats Open-04.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dougjohnston/angular-drum-machine/f338766bfde8d81445c9737300d72b0fb97bc591/public/assets/audio/KHats Open-04.mp3 -------------------------------------------------------------------------------- /public/assets/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "drum_machine", 3 | "version": "0.1.0", 4 | "authors": [ 5 | "Doug Johnston " 6 | ], 7 | "description": "Components for the Angular Drum Machine", 8 | "license": "MIT", 9 | "private": true, 10 | "ignore": [ 11 | "**/.*", 12 | "node_modules", 13 | "bower_components", 14 | "test", 15 | "tests" 16 | ], 17 | "dependencies": { 18 | "angular": "~1.2.0", 19 | "angular-route": "~1.2.0", 20 | "foundation": "~5.5", 21 | "howler": "~1.1.0" 22 | }, 23 | "devDependencies": { 24 | "angular-mocks": "~1.2.0", 25 | "jasmine": "~2.0.0" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /public/assets/css/main.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-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:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}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{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{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-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}meta.foundation-version{font-family:"/5.5.3/"}meta.foundation-mq-small{font-family:"/only screen/";width:0}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 40em)/";width:0}meta.foundation-mq-medium{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:40.0625em) and (max-width:64em)/";width:40.0625em}meta.foundation-mq-large{font-family:"/only screen and (min-width:64.0625em)/";width:64.0625em}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:64.0625em) and (max-width:90em)/";width:64.0625em}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:90.0625em)/";width:90.0625em}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:90.0625em) and (max-width:120em)/";width:90.0625em}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:120.0625em)/";width:120.0625em}meta.foundation-data-attribute-namespace{font-family:false}html,body{height:100%}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{font-size:100%}body{background:#fff;color:#222;cursor:auto;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:normal;line-height:1.5;margin:0;padding:0;position:relative}a:hover{cursor:pointer}img{max-width:100%;height:auto}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object,.mqa-display img,.mqa-display embed,.mqa-display object{max-width:none !important}.left{float:left !important}.right{float:right !important}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.hide{display:none}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}.row{margin:0 auto;max-width:62.5rem;width:100%}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-left:0;padding-right:0}.row.collapse .row{margin-left:0;margin-right:0}.row .row{margin:0 -.9375rem;max-width:none;width:auto}.row .row:before,.row .row:after{content:" ";display:table}.row .row:after{clear:both}.row .row.collapse{margin:0;max-width:none;width:auto}.row .row.collapse:before,.row .row.collapse:after{content:" ";display:table}.row .row.collapse:after{clear:both}.column,.columns{padding-left:.9375rem;padding-right:.9375rem;width:100%;float:left}.column+.column:last-child,.columns+.column:last-child,.column+.columns:last-child,.columns+.columns:last-child{float:right}.column+.column.end,.columns+.column.end,.column+.columns.end,.columns+.columns.end{float:left}@media only screen{.small-push-0{position:relative;left:0;right:auto}.small-pull-0{position:relative;right:0;left:auto}.small-push-1{position:relative;left:8.33333%;right:auto}.small-pull-1{position:relative;right:8.33333%;left:auto}.small-push-2{position:relative;left:16.66667%;right:auto}.small-pull-2{position:relative;right:16.66667%;left:auto}.small-push-3{position:relative;left:25%;right:auto}.small-pull-3{position:relative;right:25%;left:auto}.small-push-4{position:relative;left:33.33333%;right:auto}.small-pull-4{position:relative;right:33.33333%;left:auto}.small-push-5{position:relative;left:41.66667%;right:auto}.small-pull-5{position:relative;right:41.66667%;left:auto}.small-push-6{position:relative;left:50%;right:auto}.small-pull-6{position:relative;right:50%;left:auto}.small-push-7{position:relative;left:58.33333%;right:auto}.small-pull-7{position:relative;right:58.33333%;left:auto}.small-push-8{position:relative;left:66.66667%;right:auto}.small-pull-8{position:relative;right:66.66667%;left:auto}.small-push-9{position:relative;left:75%;right:auto}.small-pull-9{position:relative;right:75%;left:auto}.small-push-10{position:relative;left:83.33333%;right:auto}.small-pull-10{position:relative;right:83.33333%;left:auto}.small-push-11{position:relative;left:91.66667%;right:auto}.small-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.small-1{width:8.33333%}.small-2{width:16.66667%}.small-3{width:25%}.small-4{width:33.33333%}.small-5{width:41.66667%}.small-6{width:50%}.small-7{width:58.33333%}.small-8{width:66.66667%}.small-9{width:75%}.small-10{width:83.33333%}.small-11{width:91.66667%}.small-12{width:100%}.small-offset-0{margin-left:0 !important}.small-offset-1{margin-left:8.33333% !important}.small-offset-2{margin-left:16.66667% !important}.small-offset-3{margin-left:25% !important}.small-offset-4{margin-left:33.33333% !important}.small-offset-5{margin-left:41.66667% !important}.small-offset-6{margin-left:50% !important}.small-offset-7{margin-left:58.33333% !important}.small-offset-8{margin-left:66.66667% !important}.small-offset-9{margin-left:75% !important}.small-offset-10{margin-left:83.33333% !important}.small-offset-11{margin-left:91.66667% !important}.small-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.small-centered,.columns.small-centered{margin-left:auto;margin-right:auto;float:none}.column.small-uncentered,.columns.small-uncentered{float:left;margin-left:0;margin-right:0}.column.small-centered:last-child,.columns.small-centered:last-child{float:none}.column.small-uncentered:last-child,.columns.small-uncentered:last-child{float:left}.column.small-uncentered.opposite,.columns.small-uncentered.opposite{float:right}.row.small-collapse>.column,.row.small-collapse>.columns{padding-left:0;padding-right:0}.row.small-collapse .row{margin-left:0;margin-right:0}.row.small-uncollapse>.column,.row.small-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}}@media only screen and (min-width: 40.0625em){.medium-push-0{position:relative;left:0;right:auto}.medium-pull-0{position:relative;right:0;left:auto}.medium-push-1{position:relative;left:8.33333%;right:auto}.medium-pull-1{position:relative;right:8.33333%;left:auto}.medium-push-2{position:relative;left:16.66667%;right:auto}.medium-pull-2{position:relative;right:16.66667%;left:auto}.medium-push-3{position:relative;left:25%;right:auto}.medium-pull-3{position:relative;right:25%;left:auto}.medium-push-4{position:relative;left:33.33333%;right:auto}.medium-pull-4{position:relative;right:33.33333%;left:auto}.medium-push-5{position:relative;left:41.66667%;right:auto}.medium-pull-5{position:relative;right:41.66667%;left:auto}.medium-push-6{position:relative;left:50%;right:auto}.medium-pull-6{position:relative;right:50%;left:auto}.medium-push-7{position:relative;left:58.33333%;right:auto}.medium-pull-7{position:relative;right:58.33333%;left:auto}.medium-push-8{position:relative;left:66.66667%;right:auto}.medium-pull-8{position:relative;right:66.66667%;left:auto}.medium-push-9{position:relative;left:75%;right:auto}.medium-pull-9{position:relative;right:75%;left:auto}.medium-push-10{position:relative;left:83.33333%;right:auto}.medium-pull-10{position:relative;right:83.33333%;left:auto}.medium-push-11{position:relative;left:91.66667%;right:auto}.medium-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.medium-1{width:8.33333%}.medium-2{width:16.66667%}.medium-3{width:25%}.medium-4{width:33.33333%}.medium-5{width:41.66667%}.medium-6{width:50%}.medium-7{width:58.33333%}.medium-8{width:66.66667%}.medium-9{width:75%}.medium-10{width:83.33333%}.medium-11{width:91.66667%}.medium-12{width:100%}.medium-offset-0{margin-left:0 !important}.medium-offset-1{margin-left:8.33333% !important}.medium-offset-2{margin-left:16.66667% !important}.medium-offset-3{margin-left:25% !important}.medium-offset-4{margin-left:33.33333% !important}.medium-offset-5{margin-left:41.66667% !important}.medium-offset-6{margin-left:50% !important}.medium-offset-7{margin-left:58.33333% !important}.medium-offset-8{margin-left:66.66667% !important}.medium-offset-9{margin-left:75% !important}.medium-offset-10{margin-left:83.33333% !important}.medium-offset-11{margin-left:91.66667% !important}.medium-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.medium-centered,.columns.medium-centered{margin-left:auto;margin-right:auto;float:none}.column.medium-uncentered,.columns.medium-uncentered{float:left;margin-left:0;margin-right:0}.column.medium-centered:last-child,.columns.medium-centered:last-child{float:none}.column.medium-uncentered:last-child,.columns.medium-uncentered:last-child{float:left}.column.medium-uncentered.opposite,.columns.medium-uncentered.opposite{float:right}.row.medium-collapse>.column,.row.medium-collapse>.columns{padding-left:0;padding-right:0}.row.medium-collapse .row{margin-left:0;margin-right:0}.row.medium-uncollapse>.column,.row.medium-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}@media only screen and (min-width: 64.0625em){.large-push-0{position:relative;left:0;right:auto}.large-pull-0{position:relative;right:0;left:auto}.large-push-1{position:relative;left:8.33333%;right:auto}.large-pull-1{position:relative;right:8.33333%;left:auto}.large-push-2{position:relative;left:16.66667%;right:auto}.large-pull-2{position:relative;right:16.66667%;left:auto}.large-push-3{position:relative;left:25%;right:auto}.large-pull-3{position:relative;right:25%;left:auto}.large-push-4{position:relative;left:33.33333%;right:auto}.large-pull-4{position:relative;right:33.33333%;left:auto}.large-push-5{position:relative;left:41.66667%;right:auto}.large-pull-5{position:relative;right:41.66667%;left:auto}.large-push-6{position:relative;left:50%;right:auto}.large-pull-6{position:relative;right:50%;left:auto}.large-push-7{position:relative;left:58.33333%;right:auto}.large-pull-7{position:relative;right:58.33333%;left:auto}.large-push-8{position:relative;left:66.66667%;right:auto}.large-pull-8{position:relative;right:66.66667%;left:auto}.large-push-9{position:relative;left:75%;right:auto}.large-pull-9{position:relative;right:75%;left:auto}.large-push-10{position:relative;left:83.33333%;right:auto}.large-pull-10{position:relative;right:83.33333%;left:auto}.large-push-11{position:relative;left:91.66667%;right:auto}.large-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.large-1{width:8.33333%}.large-2{width:16.66667%}.large-3{width:25%}.large-4{width:33.33333%}.large-5{width:41.66667%}.large-6{width:50%}.large-7{width:58.33333%}.large-8{width:66.66667%}.large-9{width:75%}.large-10{width:83.33333%}.large-11{width:91.66667%}.large-12{width:100%}.large-offset-0{margin-left:0 !important}.large-offset-1{margin-left:8.33333% !important}.large-offset-2{margin-left:16.66667% !important}.large-offset-3{margin-left:25% !important}.large-offset-4{margin-left:33.33333% !important}.large-offset-5{margin-left:41.66667% !important}.large-offset-6{margin-left:50% !important}.large-offset-7{margin-left:58.33333% !important}.large-offset-8{margin-left:66.66667% !important}.large-offset-9{margin-left:75% !important}.large-offset-10{margin-left:83.33333% !important}.large-offset-11{margin-left:91.66667% !important}.large-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.large-centered,.columns.large-centered{margin-left:auto;margin-right:auto;float:none}.column.large-uncentered,.columns.large-uncentered{float:left;margin-left:0;margin-right:0}.column.large-centered:last-child,.columns.large-centered:last-child{float:none}.column.large-uncentered:last-child,.columns.large-uncentered:last-child{float:left}.column.large-uncentered.opposite,.columns.large-uncentered.opposite{float:right}.row.large-collapse>.column,.row.large-collapse>.columns{padding-left:0;padding-right:0}.row.large-collapse .row{margin-left:0;margin-right:0}.row.large-uncollapse>.column,.row.large-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}button,.button{-webkit-appearance:none;-moz-appearance:none;border-radius:0;border-style:solid;border-width:0;cursor:pointer;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;line-height:normal;margin:0 0 1.25rem;position:relative;text-align:center;text-decoration:none;display:inline-block;padding:1rem 2rem 1.0625rem 2rem;font-size:1rem;background-color:#008CBA;border-color:#007095;color:#fff;transition:background-color 300ms ease-out}button:hover,button:focus,.button:hover,.button:focus{background-color:#007095}button:hover,button:focus,.button:hover,.button:focus{color:#fff}button.secondary,.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{background-color:#b9b9b9}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{color:#333}button.success,.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{background-color:#368a55}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{color:#fff}button.alert,.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{background-color:#cf2a0e}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{color:#fff}button.warning,.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{background-color:#cf6e0e}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{color:#fff}button.info,.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{background-color:#61b6d9}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{color:#fff}button.large,.button.large{padding:1.125rem 2.25rem 1.1875rem 2.25rem;font-size:1.25rem}button.small,.button.small{padding:.875rem 1.75rem .9375rem 1.75rem;font-size:.8125rem}button.tiny,.button.tiny{padding:.625rem 1.25rem .6875rem 1.25rem;font-size:.6875rem}button.expand,.button.expand{padding:1rem 2rem 1.0625rem 2rem;font-size:1rem;padding-bottom:1.0625rem;padding-top:1rem;padding-left:1rem;padding-right:1rem;width:100%}button.left-align,.button.left-align{text-align:left;text-indent:.75rem}button.right-align,.button.right-align{text-align:right;padding-right:.75rem}button.radius,.button.radius{border-radius:3px}button.round,.button.round{border-radius:1000px}button.disabled,button[disabled],.button.disabled,.button[disabled]{background-color:#008CBA;border-color:#007095;color:#fff;box-shadow:none;cursor:default;opacity:.7}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#007095}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{color:#fff}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#008CBA}button.disabled.secondary,button[disabled].secondary,.button.disabled.secondary,.button[disabled].secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333;box-shadow:none;cursor:default;opacity:.7}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#b9b9b9}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{color:#333}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#e7e7e7}button.disabled.success,button[disabled].success,.button.disabled.success,.button[disabled].success{background-color:#43AC6A;border-color:#368a55;color:#fff;box-shadow:none;cursor:default;opacity:.7}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#368a55}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{color:#fff}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#43AC6A}button.disabled.alert,button[disabled].alert,.button.disabled.alert,.button[disabled].alert{background-color:#f04124;border-color:#cf2a0e;color:#fff;box-shadow:none;cursor:default;opacity:.7}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#cf2a0e}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{color:#fff}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#f04124}button.disabled.warning,button[disabled].warning,.button.disabled.warning,.button[disabled].warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff;box-shadow:none;cursor:default;opacity:.7}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#cf6e0e}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{color:#fff}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#f08a24}button.disabled.info,button[disabled].info,.button.disabled.info,.button[disabled].info{background-color:#a0d3e8;border-color:#61b6d9;color:#333;box-shadow:none;cursor:default;opacity:.7}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#61b6d9}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{color:#fff}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#a0d3e8}button::-moz-focus-inner{border:0;padding:0}@media only screen and (min-width: 40.0625em){button,.button{display:inline-block}}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}@media only screen and (max-width: 40em){.small-only-text-left{text-align:left !important}.small-only-text-right{text-align:right !important}.small-only-text-center{text-align:center !important}.small-only-text-justify{text-align:justify !important}}@media only screen{.small-text-left{text-align:left !important}.small-text-right{text-align:right !important}.small-text-center{text-align:center !important}.small-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em) and (max-width: 64em){.medium-only-text-left{text-align:left !important}.medium-only-text-right{text-align:right !important}.medium-only-text-center{text-align:center !important}.medium-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em){.medium-text-left{text-align:left !important}.medium-text-right{text-align:right !important}.medium-text-center{text-align:center !important}.medium-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em) and (max-width: 90em){.large-only-text-left{text-align:left !important}.large-only-text-right{text-align:right !important}.large-only-text-center{text-align:center !important}.large-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em){.large-text-left{text-align:left !important}.large-text-right{text-align:right !important}.large-text-center{text-align:center !important}.large-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em) and (max-width: 120em){.xlarge-only-text-left{text-align:left !important}.xlarge-only-text-right{text-align:right !important}.xlarge-only-text-center{text-align:center !important}.xlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em){.xlarge-text-left{text-align:left !important}.xlarge-text-right{text-align:right !important}.xlarge-text-center{text-align:center !important}.xlarge-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em) and (max-width: 6249999.9375em){.xxlarge-only-text-left{text-align:left !important}.xxlarge-only-text-right{text-align:right !important}.xxlarge-only-text-center{text-align:center !important}.xxlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em){.xxlarge-text-left{text-align:left !important}.xxlarge-text-right{text-align:right !important}.xxlarge-text-center{text-align:center !important}.xxlarge-text-justify{text-align:justify !important}}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}a{color:#008CBA;line-height:inherit;text-decoration:none}a:hover,a:focus{color:#0078a0}a img{border:none}p{font-family:inherit;font-size:1rem;font-weight:normal;line-height:1.6;margin-bottom:1.25rem;text-rendering:optimizeLegibility}p.lead{font-size:1.21875rem;line-height:1.6}p aside{font-size:.875rem;font-style:italic;line-height:1.35}h1,h2,h3,h4,h5,h6{color:#222;font-family:"Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:normal;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem;text-rendering:optimizeLegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#6f6f6f;font-size:60%;line-height:0}h1{font-size:2.125rem}h2{font-size:1.6875rem}h3{font-size:1.375rem}h4{font-size:1.125rem}h5{font-size:1.125rem}h6{font-size:1rem}.subheader{line-height:1.4;color:#6f6f6f;font-weight:normal;margin-top:.2rem;margin-bottom:.5rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;height:0;margin:1.25rem 0 1.1875rem}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:bold;line-height:inherit}small{font-size:60%;line-height:inherit}code{background-color:#f8f8f8;border-color:#dfdfdf;border-style:solid;border-width:1px;color:#333;font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:normal;padding:.125rem .3125rem .0625rem}ul,ol,dl{font-family:inherit;font-size:1rem;line-height:1.6;list-style-position:outside;margin-bottom:1.25rem}ul{margin-left:1.1rem}ul li ul,ul li ol{margin-left:1.25rem;margin-bottom:0}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square;margin-left:1.1rem}ul.circle{list-style-type:circle;margin-left:1.1rem}ul.disc{list-style-type:disc;margin-left:1.1rem}ol{margin-left:1.4rem}ol li ul,ol li ol{margin-left:1.25rem;margin-bottom:0}.no-bullet{list-style-type:none;margin-left:0}.no-bullet li ul,.no-bullet li ol{margin-left:1.25rem;margin-bottom:0;list-style:none}dl dt{margin-bottom:.3rem;font-weight:bold}dl dd{margin-bottom:.75rem}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;cursor:help}abbr{text-transform:none}abbr[title]{border-bottom:1px dotted #ddd}blockquote{margin:0 0 1.25rem;padding:.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #ddd}blockquote cite{display:block;font-size:.8125rem;color:#555}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#555}blockquote,blockquote p{line-height:1.6;color:#6f6f6f}.vcard{display:inline-block;margin:0 0 1.25rem 0;border:1px solid #ddd;padding:.625rem .75rem}.vcard li{margin:0;display:block}.vcard .fn{font-weight:bold;font-size:.9375rem}.vevent .summary{font-weight:bold}.vevent abbr{cursor:default;text-decoration:none;font-weight:bold;border:none;padding:0 .0625rem}@media only screen and (min-width: 40.0625em){h1,h2,h3,h4,h5,h6{line-height:1.4}h1{font-size:2.75rem}h2{font-size:2.3125rem}h3{font-size:1.6875rem}h4{font-size:1.4375rem}h5{font-size:1.125rem}h6{font-size:1rem}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.34in}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}@media only screen{.show-for-small-only,.show-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.hide-for-small-only,.hide-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.visible-for-small-only,.visible-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.hidden-for-small-only,.hidden-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.show-for-small-only,table.show-for-small-up,table.show-for-small,table.show-for-small-down,table.hide-for-medium-only,table.hide-for-medium-up,table.hide-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.show-for-small-only,thead.show-for-small-up,thead.show-for-small,thead.show-for-small-down,thead.hide-for-medium-only,thead.hide-for-medium-up,thead.hide-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.show-for-small-only,tbody.show-for-small-up,tbody.show-for-small,tbody.show-for-small-down,tbody.hide-for-medium-only,tbody.hide-for-medium-up,tbody.hide-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.show-for-small-only,tr.show-for-small-up,tr.show-for-small,tr.show-for-small-down,tr.hide-for-medium-only,tr.hide-for-medium-up,tr.hide-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.show-for-small-only,td.show-for-small-only,th.show-for-small-up,td.show-for-small-up,th.show-for-small,td.show-for-small,th.show-for-small-down,td.show-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.hide-for-medium-up,td.hide-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 40.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.show-for-medium-only,table.show-for-medium-up,table.show-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.show-for-medium-only,thead.show-for-medium-up,thead.show-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.show-for-medium-only,tbody.show-for-medium-up,tbody.show-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.show-for-medium-only,tr.show-for-medium-up,tr.show-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.show-for-medium-only,td.show-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.show-for-medium,td.show-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 64.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.show-for-large-only,table.show-for-large-up,table.show-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.show-for-large-only,thead.show-for-large-up,thead.show-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.show-for-large-only,tbody.show-for-large-up,tbody.show-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.show-for-large-only,tr.show-for-large-up,tr.show-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.show-for-large-only,td.show-for-large-only,th.show-for-large-up,td.show-for-large-up,th.show-for-large,td.show-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 90.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.show-for-xlarge-only,table.show-for-xlarge-up,table.show-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.show-for-xlarge-only,thead.show-for-xlarge-up,thead.show-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.show-for-xlarge-only,tbody.show-for-xlarge-up,tbody.show-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.show-for-xlarge-only,tr.show-for-xlarge-up,tr.show-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.show-for-xlarge-only,td.show-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.show-for-xlarge,td.show-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 120.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.hide-for-xlarge-only,.show-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.show-for-xlarge-only,.hide-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.hidden-for-xlarge-only,.visible-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.visible-for-xlarge-only,.hidden-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.hidden-for-xxlarge-down{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.hide-for-xlarge-only,table.show-for-xlarge-up,table.hide-for-xlarge,table.hide-for-xlarge-down,table.show-for-xxlarge-only,table.show-for-xxlarge-up,table.show-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.hide-for-xlarge-only,thead.show-for-xlarge-up,thead.hide-for-xlarge,thead.hide-for-xlarge-down,thead.show-for-xxlarge-only,thead.show-for-xxlarge-up,thead.show-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.hide-for-xlarge-only,tbody.show-for-xlarge-up,tbody.hide-for-xlarge,tbody.hide-for-xlarge-down,tbody.show-for-xxlarge-only,tbody.show-for-xxlarge-up,tbody.show-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.hide-for-xlarge-only,tr.show-for-xlarge-up,tr.hide-for-xlarge,tr.hide-for-xlarge-down,tr.show-for-xxlarge-only,tr.show-for-xxlarge-up,tr.show-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.hide-for-xlarge-down,td.hide-for-xlarge-down,th.show-for-xxlarge-only,td.show-for-xxlarge-only,th.show-for-xxlarge-up,td.show-for-xxlarge-up,th.show-for-xxlarge,td.show-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.hide-for-landscape,table.show-for-portrait{display:table !important}thead.hide-for-landscape,thead.show-for-portrait{display:table-header-group !important}tbody.hide-for-landscape,tbody.show-for-portrait{display:table-row-group !important}tr.hide-for-landscape,tr.show-for-portrait{display:table-row !important}td.hide-for-landscape,td.show-for-portrait,th.hide-for-landscape,th.show-for-portrait{display:table-cell !important}@media only screen and (orientation: landscape){.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.show-for-landscape,table.hide-for-portrait{display:table !important}thead.show-for-landscape,thead.hide-for-portrait{display:table-header-group !important}tbody.show-for-landscape,tbody.hide-for-portrait{display:table-row-group !important}tr.show-for-landscape,tr.hide-for-portrait{display:table-row !important}td.show-for-landscape,td.hide-for-portrait,th.show-for-landscape,th.hide-for-portrait{display:table-cell !important}}@media only screen and (orientation: portrait){.show-for-portrait,.hide-for-landscape{display:inherit !important}.hide-for-portrait,.show-for-landscape{display:none !important}table.show-for-portrait,table.hide-for-landscape{display:table !important}thead.show-for-portrait,thead.hide-for-landscape{display:table-header-group !important}tbody.show-for-portrait,tbody.hide-for-landscape{display:table-row-group !important}tr.show-for-portrait,tr.hide-for-landscape{display:table-row !important}td.show-for-portrait,td.hide-for-landscape,th.show-for-portrait,th.hide-for-landscape{display:table-cell !important}}.show-for-touch{display:none !important}.hide-for-touch{display:inherit !important}.touch .show-for-touch{display:inherit !important}.touch .hide-for-touch{display:none !important}table.hide-for-touch{display:table !important}.touch table.show-for-touch{display:table !important}thead.hide-for-touch{display:table-header-group !important}.touch thead.show-for-touch{display:table-header-group !important}tbody.hide-for-touch{display:table-row-group !important}.touch tbody.show-for-touch{display:table-row-group !important}tr.hide-for-touch{display:table-row !important}.touch tr.show-for-touch{display:table-row !important}td.hide-for-touch{display:table-cell !important}.touch td.show-for-touch{display:table-cell !important}th.hide-for-touch{display:table-cell !important}.touch th.show-for-touch{display:table-cell !important}.show-for-sr{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}.show-on-focus{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}.show-on-focus:focus,.show-on-focus:active{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.print-only,.show-for-print{display:none !important}@media print{.print-only,.show-for-print{display:block !important}.hide-on-print,.hide-for-print{display:none !important}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}}body{padding:0.7rem;background-color:#373737;color:#efeae4;font-family:'Ubuntu Mono', Arial, sans-serif;line-height:1.2}h1{padding:0 0.2rem;color:#efeae4;font-family:'Oleo Script Swash Caps', cursive;font-size:3.5rem;line-height:3.8rem}a{color:#3699b9}ul,ul li ul{padding:0;margin-left:0}button:focus,input:focus{outline:1px dashed #575757}.loading{box-sizing:border-box;position:relative;display:inline-block;padding:.5em;vertical-align:middle;text-align:center;background-color:transparent;border:5px solid transparent;border-radius:50%}.loading-outer{-webkit-animation:spin 1s infinite;-moz-animation:spin 1s infinite;-ms-animation:spin 1s infinite;-o-animation:spin 1s infinite;animation:spin 1s infinite;border-top-color:#3699b9;border-bottom-color:#3699b9}.loading-inner{-webkit-animation:spin 1s infinite;-moz-animation:spin 1s infinite;-ms-animation:spin 1s infinite;-o-animation:spin 1s infinite;animation:spin 1s infinite;border-top-color:#24caff;border-bottom-color:#24caff}@-webkit-keyframes spin{0%{-webkit-transform:rotateZ(0deg);-moz-transform:rotateZ(0deg);-ms-transform:rotateZ(0deg);-o-transform:rotateZ(0deg);transform:rotateZ(0deg)}100%{-webkit-transform:rotateZ(360deg);-moz-transform:rotateZ(360deg);-ms-transform:rotateZ(360deg);-o-transform:rotateZ(360deg);transform:rotateZ(360deg)}}#loading-wrap{box-sizing:border-box;display:table-cell;vertical-align:middle}#loading-wrap h3{display:inline-block;font-size:1.3rem;font-weight:normal;font-family:'Ubuntu Mono', Arial, sans-serif;color:#bfbab4}#container{margin:0 auto}#controls{margin-bottom:0.5rem}#controls button{height:2.4rem;line-height:2.4rem;padding:0 1rem;margin:0 0 0.3rem;font-family:'Ubuntu Mono', Arial, sans-serif;font-size:1rem}#controls #reset{background-color:#3699b9;border-color:#167999}#controls #readout{display:inline-block;width:200px;height:2.4rem;line-height:2.4rem;background:#222;padding:0 1rem;-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;color:#3699b9}#controls #readout #tempo{position:relative}#controls #readout #tempo input[type="range"]{-webkit-appearance:none;position:relative;top:-5px;background-color:#3699b9;width:60%;height:2px}#controls #readout #tempo ::-moz-range-track{position:relative;top:-5px;background-color:#3699b9;width:60%;height:2px;border:0}#controls #readout #tempo ::-webkit-slider-thumb{-webkit-appearance:none;width:11px;height:11px;cursor:pointer;-webkit-border-radius:6px;-moz-border-radius:6px;-ms-border-radius:6px;-o-border-radius:6px;border-radius:6px;background-color:#3699b9}#controls #readout #tempo ::-moz-range-thumb{width:11px;height:11px;cursor:pointer;background:#3699b9;border:0;-webkit-border-radius:6px;-moz-border-radius:6px;-ms-border-radius:6px;-o-border-radius:6px;border-radius:6px}#dm-grid{list-style:none;margin-bottom:0.5rem}#dm-grid ul{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;list-style:none}#dm-grid .dm-header .beat-num{margin-top:0.5%;margin-bottom:0.2%;font-size:12px}#dm-grid .dm-header .beat-num .current-beat{width:60%;margin:0 auto;background:#43AC6A;-webkit-border-radius:6px;-moz-border-radius:6px;-ms-border-radius:6px;-o-border-radius:6px;border-radius:6px}#dm-grid .dm-row{background:#575757;margin-bottom:0.2rem;border:1px solid #222;-webkit-border-radius:6px;-moz-border-radius:6px;-ms-border-radius:6px;-o-border-radius:6px;border-radius:6px}#dm-grid .dm-row .instrument{margin:1.2% 0}#dm-grid .dm-row .instrument button{width:100%;height:35px;margin:0;padding:0;border:1px solid #444;vertical-align:middle;-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;background:#777;-webkit-box-shadow:inset 2px -1px 0px 0px rgba(50,50,50,0.4);box-shadow:inset 2px -1px 0px 0px rgba(50,50,50,0.4)}#dm-grid .dm-row .instrument button div{width:70%;height:4px;margin:15px auto 0;background:#444;border:1px solid #888;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}#dm-grid .dm-row .instrument button.btn-on{background:#95dff7;border:1px solid #444;border:1px solid #3699b9;-webkit-box-shadow:0px 0px 6px 0px rgba(30,120,150,0.7);box-shadow:0px 0px 6px 0px rgba(30,120,150,0.7)}#dm-grid .dm-row .instrument button.btn-on div{-webkit-box-shadow:0px 0px 5px #3df;box-shadow:0px 0px 5px #3df;background:#24caff;border:1px solid #3699b9}#dm-grid ul li{flex-grow:1;display:inline-block;margin-right:1.4%;width:30px;text-align:center;vertical-align:middle}#dm-grid .instrument-name{flex-basis:4rem;flex-shrink:2;align-self:center;font-size:16px;line-height:16px;text-align:right;margin-right:0.6rem}#dm-grid .instrument-name span{font-size:12px;color:#bfbab4}.msg-play{position:absolute;top:80px;left:-185px;background:transparent url(../images/ready-to-groove.png) no-repeat;width:183px;height:134px}.faded{opacity:0.2} 2 | /*# sourceMappingURL=main.css.map */ 3 | -------------------------------------------------------------------------------- /public/assets/css/main.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "AAAA,4EAA4E,AAQ5E,IAAK,CACH,WAAW,CAAE,UAAU,CACvB,oBAAoB,CAAE,IAAI,CAC1B,wBAAwB,CAAE,IAAI,CAOhC,IAAK,CACH,MAAM,CAAE,CAAC,CAaX,0FAYQ,CACN,OAAO,CAAE,KAAK,CAQhB,2BAGM,CACJ,OAAO,CAAE,YAAY,CACrB,cAAc,CAAE,QAAQ,CAQ1B,qBAAsB,CACpB,OAAO,CAAE,IAAI,CACb,MAAM,CAAE,CAAC,CAQX,iBACS,CACP,OAAO,CAAE,IAAI,CAUf,CAAE,CACA,gBAAgB,CAAE,WAAW,CAQ/B,gBACQ,CACN,OAAO,CAAE,CAAC,CAUZ,WAAY,CACV,aAAa,CAAE,UAAU,CAO3B,QACO,CACL,WAAW,CAAE,IAAI,CAOnB,GAAI,CACF,UAAU,CAAE,MAAM,CAQpB,EAAG,CACD,SAAS,CAAE,GAAG,CACd,MAAM,CAAE,QAAQ,CAOlB,IAAK,CACH,UAAU,CAAE,IAAI,CAChB,KAAK,CAAE,IAAI,CAOb,KAAM,CACJ,SAAS,CAAE,GAAG,CAOhB,OACI,CACF,SAAS,CAAE,GAAG,CACd,WAAW,CAAE,CAAC,CACd,QAAQ,CAAE,QAAQ,CAClB,cAAc,CAAE,QAAQ,CAG1B,GAAI,CACF,GAAG,CAAE,MAAM,CAGb,GAAI,CACF,MAAM,CAAE,OAAO,CAUjB,GAAI,CACF,MAAM,CAAE,CAAC,CAOX,cAAe,CACb,QAAQ,CAAE,MAAM,CAUlB,MAAO,CACL,MAAM,CAAE,QAAQ,CAOlB,EAAG,CACD,UAAU,CAAE,WAAW,CACvB,MAAM,CAAE,CAAC,CAOX,GAAI,CACF,QAAQ,CAAE,IAAI,CAOhB,iBAGK,CACH,WAAW,CAAE,oBAAoB,CACjC,SAAS,CAAE,GAAG,CAkBhB,qCAIS,CACP,KAAK,CAAE,OAAO,CACd,IAAI,CAAE,OAAO,CACb,MAAM,CAAE,CAAC,CAOX,MAAO,CACL,QAAQ,CAAE,OAAO,CAUnB,aACO,CACL,cAAc,CAAE,IAAI,CAWtB,yEAGqB,CACnB,kBAAkB,CAAE,MAAM,CAC1B,MAAM,CAAE,OAAO,CAOjB,qCACqB,CACnB,MAAM,CAAE,OAAO,CAOjB,gDACwB,CACtB,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CAQZ,KAAM,CACJ,WAAW,CAAE,MAAM,CAWrB,0CACoB,CAClB,UAAU,CAAE,UAAU,CACtB,OAAO,CAAE,CAAC,CASZ,+FACgD,CAC9C,MAAM,CAAE,IAAI,CAQd,oBAAqB,CACnB,kBAAkB,CAAE,SAAS,CAC7B,UAAU,CAAE,WAAW,CASzB,kGACgD,CAC9C,kBAAkB,CAAE,IAAI,CAO1B,QAAS,CACP,MAAM,CAAE,iBAAiB,CACzB,MAAM,CAAE,KAAK,CACb,OAAO,CAAE,qBAAqB,CAQhC,MAAO,CACL,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CAOZ,QAAS,CACP,QAAQ,CAAE,IAAI,CAQhB,QAAS,CACP,WAAW,CAAE,IAAI,CAUnB,KAAM,CACJ,eAAe,CAAE,QAAQ,CACzB,cAAc,CAAE,CAAC,CAGnB,KACG,CACD,OAAO,CAAE,CAAC,CCQR,uBAAwB,CACtB,WAAW,CAAE,SAAS,CAGxB,wBAAyB,CACvB,WAAW,CAAE,eAA8B,CAC3C,KAAK,CAjEM,CAAC,CAoEd,6BAA8B,CAC5B,WAAW,CAAE,qCAAgC,CAC7C,KAAK,CAtEM,CAAC,CAyEd,yBAA0B,CACxB,WAAW,CAAE,yCAA+B,CAC5C,KAAK,CAAE,SAA0B,CAGnC,8BAA+B,CAC7B,WAAW,CAAE,8DAAiC,CAC9C,KAAK,CAAE,SAA0B,CAGnC,wBAAyB,CACvB,WAAW,CAAE,yCAA8B,CAC3C,KAAK,CAAE,SAAyB,CAGlC,6BAA8B,CAC5B,WAAW,CAAE,8DAAgC,CAC7C,KAAK,CAAE,SAAyB,CAGlC,yBAA0B,CACxB,WAAW,CAAE,yCAA+B,CAC5C,KAAK,CAAE,SAA0B,CAGnC,8BAA+B,CAC7B,WAAW,CAAE,+DAAiC,CAC9C,KAAK,CAAE,SAA0B,CAGnC,0BAA2B,CACzB,WAAW,CAAE,0CAAgC,CAC7C,KAAK,CAAE,UAA2B,CAGpC,wCAAyC,CACvC,WAAW,CAAE,KAAa,CAQ5B,SAAW,CAAE,MAAM,CAAE,IAAI,CAGzB,kBAEQ,CAzVV,kBAAkB,CA0VM,UAAU,CAzV/B,eAAe,CAyVM,UAAU,CAxV1B,UAAU,CAwVM,UAAU,CAGhC,SACK,CAAE,SAAS,CA/dH,IAAI,CAkejB,IAAK,CACH,UAAU,CA/KN,IAAI,CAgLR,KAAK,CA/KO,IAAI,CAgLhB,MAAM,CA3FQ,IAAI,CA4FlB,WAAW,CAhLE,kDAAuB,CAiLpC,UAAU,CA/KE,MAAM,CAgLlB,WAAW,CAjLE,MAAmB,CAkLhC,WAAW,CAteE,GAAG,CAuehB,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CACV,QAAQ,CAAE,QAAQ,CAGtB,OAAQ,CAAE,MAAM,CAjGK,OAAO,CAoG1B,GAAI,CAAE,SAAS,CAAE,IAAI,CAAE,MAAM,CAAE,IAAI,CAEnC,GAAI,CAAE,sBAAsB,CAAE,OAAO,CAKnC,iKAEO,CAAE,SAAS,CAAE,eAAe,CAKrC,KAAM,CAAE,KAAK,CAAE,eAAe,CAC9B,MAAO,CAAE,KAAK,CAAE,gBAAgB,CAtSlC,gCAAkB,CAAE,OAAO,CAAE,GAAG,CAAE,OAAO,CAAE,KAAK,CAChD,eAAQ,CAAE,KAAK,CAAE,IAAI,CAySnB,KAAM,CACJ,OAAO,CAAE,IAAI,CAIf,UAAW,CAAE,UAAU,CAAE,MAAM,CAM/B,YAAa,CAAE,sBAAsB,CAAE,WAAW,CAAE,uBAAuB,CAAE,SAAS,CAGtF,GAAI,CACF,OAAO,CAAE,YAAY,CACrB,cAAc,CAAE,MAAM,CAQxB,QAAS,CAAE,MAAM,CAAE,IAAI,CAAE,UAAU,CAAE,IAAI,CAGzC,MAAO,CAAE,KAAK,CAAE,IAAI,CChVpB,IAAK,CA9JL,MAAM,CAAE,MAAM,CACd,SAAS,CA1DD,OAAc,CA2DtB,KAAK,CAAE,IAAI,CDuKb,sBAAkB,CAAE,OAAO,CAAE,GAAG,CAAE,OAAO,CAAE,KAAK,CAChD,UAAQ,CAAE,KAAK,CAAE,IAAI,CCRd,4CACW,CA7HhB,YAAY,CAAE,CAAC,CACf,aAAa,CAAE,CAAC,CA8HZ,kBAAK,CAAC,WAAW,CAAC,CAAC,CAAE,YAAY,CAAC,CAAC,CAGrC,SAAK,CA7LP,MAAM,CAAE,WAAuB,CAC/B,SAAS,CAAE,IAAI,CACf,KAAK,CAAE,IAAI,CD4Lb,gCAAkB,CAAE,OAAO,CAAE,GAAG,CAAE,OAAO,CAAE,KAAK,CAChD,eAAQ,CAAE,KAAK,CAAE,IAAI,CCDf,kBAAW,CAhLf,MAAM,CAAE,CAAC,CACT,SAAS,CAAE,IAAI,CACf,KAAK,CAAE,IAAI,CD8Kb,kDAAkB,CAAE,OAAO,CAAE,GAAG,CAAE,OAAO,CAAE,KAAK,CAChD,wBAAQ,CAAE,KAAK,CAAE,IAAI,CCGnB,gBACS,CAjIT,YAAY,CAAE,QAAoB,CAClC,aAAa,CAAE,QAAoB,CAKnC,KAAK,CAzFE,IAAwC,CAoGR,KAAK,CDkN9B,IAAI,CC9FhB,+GAAiB,CACf,KAAK,CAzOM,KAAmB,CA2OhC,mFAAU,CACR,KAAK,CD0FK,IAAI,CCtFlB,kBAAoB,CArGpB,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CA/FA,CAAC,CA+FmC,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAhGL,CAAC,CAgGwC,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,QAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,QAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAkC7F,gBACS,CA7DP,QAAQ,CAAE,QAAQ,CAYlB,YAAY,CAAE,QAAoB,CAClC,aAAa,CAAE,QAAoB,CAgBI,KAAK,CDkN9B,IAAI,CC9KlB,QAAgB,CA/ChB,KAAK,CAzFE,QAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,GAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,GAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,GAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,IAAwC,CA4I/C,eAAuB,CA3BX,WAAwB,CAAE,YAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,mBAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,cAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,cAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,cAA6C,CA2BnF,gBAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,gBAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA8BrF,kBAAsB,CACpB,KAAK,CDsKS,IAAI,CCrKlB,IAAI,CAAE,IAAI,CACV,WAAwB,CAAE,CAAC,CAC3B,YAA6B,CAAE,CAAC,CAChC,KAAK,CAAE,IAAI,CAGb,8CAC2B,CA7CzB,WAAwB,CAAE,IAAI,CAC9B,YAA6B,CAAE,IAAI,CACnC,KAAK,CAAE,IAAI,CA6Cb,kDAC6B,CAC3B,KAAK,CD0JS,IAAI,CCzJlB,WAAwB,CAAE,CAAC,CAC3B,YAA6B,CAAE,CAAC,CAIlC,oEACqC,CACnC,KAAK,CAAE,IAAI,CAIb,wEACwC,CACtC,KAAK,CD4IS,IAAI,CCzIpB,oEACsC,CACpC,KAAK,CA/LU,KAAmB,CAoMhC,wDACW,CAzGb,YAAY,CAAE,CAAC,CACf,aAAa,CAAE,CAAC,CA0Gd,wBAAK,CAAC,WAAW,CAAC,CAAC,CAAE,YAAY,CAAC,CAAC,CAGnC,4DACW,CAxGb,YAAY,CAAE,QAAoB,CAClC,aAAa,CAAE,QAAoB,CAgBI,KAAK,CDkN9B,IAAI,EClFlB,6CAAqB,CAzGrB,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CA/FA,CAAC,CA+FmC,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAhGL,CAAC,CAgGwC,IAAiB,CAAE,IAAI,CA0B3F,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,QAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,QAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,eAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,eAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,eAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,eAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAkC7F,gBACS,CA7DP,QAAQ,CAAE,QAAQ,CAYlB,YAAY,CAAE,QAAoB,CAClC,aAAa,CAAE,QAAoB,CAgBI,KAAK,CDkN9B,IAAI,CC9KlB,SAAgB,CA/ChB,KAAK,CAzFE,QAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,GAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,GAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,GAAwC,CAwI/C,UAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,UAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,UAAgB,CA/ChB,KAAK,CAzFE,IAAwC,CA4I/C,gBAAuB,CA3BX,WAAwB,CAAE,YAA6C,CA2BnF,gBAAuB,CA3BX,WAAwB,CAAE,mBAA6C,CA2BnF,gBAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,gBAAuB,CA3BX,WAAwB,CAAE,cAA6C,CA2BnF,gBAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,gBAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,gBAAuB,CA3BX,WAAwB,CAAE,cAA6C,CA2BnF,gBAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,gBAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,gBAAuB,CA3BX,WAAwB,CAAE,cAA6C,CA2BnF,iBAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,iBAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA8BrF,mBAAsB,CACpB,KAAK,CDsKS,IAAI,CCrKlB,IAAI,CAAE,IAAI,CACV,WAAwB,CAAE,CAAC,CAC3B,YAA6B,CAAE,CAAC,CAChC,KAAK,CAAE,IAAI,CAGb,gDAC2B,CA7CzB,WAAwB,CAAE,IAAI,CAC9B,YAA6B,CAAE,IAAI,CACnC,KAAK,CAAE,IAAI,CA6Cb,oDAC6B,CAC3B,KAAK,CD0JS,IAAI,CCzJlB,WAAwB,CAAE,CAAC,CAC3B,YAA6B,CAAE,CAAC,CAIlC,sEACqC,CACnC,KAAK,CAAE,IAAI,CAIb,0EACwC,CACtC,KAAK,CD4IS,IAAI,CCzIpB,sEACsC,CACpC,KAAK,CA/LU,KAAmB,CAoMhC,0DACW,CAzGb,YAAY,CAAE,CAAC,CACf,aAAa,CAAE,CAAC,CA0Gd,yBAAK,CAAC,WAAW,CAAC,CAAC,CAAE,YAAY,CAAC,CAAC,CAGnC,8DACW,CAxGb,YAAY,CAAE,QAAoB,CAClC,aAAa,CAAE,QAAoB,CAgBI,KAAK,CDkN9B,IAAI,CC9Ed,OAAY,CAjKhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CA/FA,CAAC,CA+FmC,KAAsB,CAAE,IAAI,CA2IvF,OAAY,CApKhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAhGL,CAAC,CAgGwC,IAAiB,CAAE,IAAI,CAuIvF,OAAY,CAjKhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,QAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA2IvF,OAAY,CApKhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,QAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAuIvF,OAAY,CAjKhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA2IvF,OAAY,CApKhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAuIvF,OAAY,CAjKhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA2IvF,OAAY,CApKhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAuIvF,OAAY,CAjKhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA2IvF,OAAY,CApKhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAuIvF,OAAY,CAjKhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA2IvF,OAAY,CApKhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAuIvF,OAAY,CAjKhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA2IvF,OAAY,CApKhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAuIvF,OAAY,CAjKhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA2IvF,OAAY,CApKhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAuIvF,OAAY,CAjKhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA2IvF,OAAY,CApKhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAuIvF,OAAY,CAjKhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA2IvF,OAAY,CApKhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAuIvF,QAAY,CAjKhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA2IvF,QAAY,CApKhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAuIvF,QAAY,CAjKhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA2IvF,QAAY,CApKhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,EA+I3F,6CAAoB,CArHpB,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CA/FA,CAAC,CA+FmC,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAhGL,CAAC,CAgGwC,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,QAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,QAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,aAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,aAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CA0B3F,cAAqB,CApDrB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CA8B3F,cAAqB,CAvDrB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAkC7F,gBACS,CA7DP,QAAQ,CAAE,QAAQ,CAYlB,YAAY,CAAE,QAAoB,CAClC,aAAa,CAAE,QAAoB,CAgBI,KAAK,CDkN9B,IAAI,CC9KlB,QAAgB,CA/ChB,KAAK,CAzFE,QAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,GAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,GAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,QAAgB,CA/ChB,KAAK,CAzFE,GAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,SAAwC,CAwI/C,SAAgB,CA/ChB,KAAK,CAzFE,IAAwC,CA4I/C,eAAuB,CA3BX,WAAwB,CAAE,YAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,mBAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,cAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,cAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,eAAuB,CA3BX,WAAwB,CAAE,cAA6C,CA2BnF,gBAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA2BnF,gBAAuB,CA3BX,WAAwB,CAAE,oBAA6C,CA8BrF,kBAAsB,CACpB,KAAK,CDsKS,IAAI,CCrKlB,IAAI,CAAE,IAAI,CACV,WAAwB,CAAE,CAAC,CAC3B,YAA6B,CAAE,CAAC,CAChC,KAAK,CAAE,IAAI,CAGb,8CAC2B,CA7CzB,WAAwB,CAAE,IAAI,CAC9B,YAA6B,CAAE,IAAI,CACnC,KAAK,CAAE,IAAI,CA6Cb,kDAC6B,CAC3B,KAAK,CD0JS,IAAI,CCzJlB,WAAwB,CAAE,CAAC,CAC3B,YAA6B,CAAE,CAAC,CAIlC,oEACqC,CACnC,KAAK,CAAE,IAAI,CAIb,wEACwC,CACtC,KAAK,CD4IS,IAAI,CCzIpB,oEACsC,CACpC,KAAK,CA/LU,KAAmB,CAoMhC,wDACW,CAzGb,YAAY,CAAE,CAAC,CACf,aAAa,CAAE,CAAC,CA0Gd,wBAAK,CAAC,WAAW,CAAC,CAAC,CAAE,YAAY,CAAC,CAAC,CAGnC,4DACW,CAxGb,YAAY,CAAE,QAAoB,CAClC,aAAa,CAAE,QAAoB,CAgBI,KAAK,CDkN9B,IAAI,CCnEd,OAAY,CA5KhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CA/FA,CAAC,CA+FmC,KAAsB,CAAE,IAAI,CAsJvF,OAAY,CA/KhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAhGL,CAAC,CAgGwC,IAAiB,CAAE,IAAI,CAkJvF,OAAY,CA5KhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,QAAwC,CAgGgB,KAAsB,CAAE,IAAI,CAsJvF,OAAY,CA/KhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,QAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAkJvF,OAAY,CA5KhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CAsJvF,OAAY,CA/KhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAkJvF,OAAY,CA5KhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CAsJvF,OAAY,CA/KhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAkJvF,OAAY,CA5KhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CAsJvF,OAAY,CA/KhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAkJvF,OAAY,CA5KhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CAsJvF,OAAY,CA/KhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAkJvF,OAAY,CA5KhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CAsJvF,OAAY,CA/KhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAkJvF,OAAY,CA5KhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CAsJvF,OAAY,CA/KhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAkJvF,OAAY,CA5KhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CAsJvF,OAAY,CA/KhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAkJvF,OAAY,CA5KhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,GAAwC,CAgGgB,KAAsB,CAAE,IAAI,CAsJvF,OAAY,CA/KhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,GAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAkJvF,QAAY,CA5KhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CAsJvF,QAAY,CA/KhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,CAkJvF,QAAY,CA5KhB,QAAQ,CAAE,QAAQ,CAyBR,IAAiB,CAhGpB,SAAwC,CAgGgB,KAAsB,CAAE,IAAI,CAsJvF,QAAY,CA/KhB,QAAQ,CAAE,QAAQ,CA0BR,KAAsB,CAjGzB,SAAwC,CAiGqB,IAAiB,CAAE,IAAI,ECyF3F,cAAgB,CA7IhB,kBAAkB,CAAE,IAAI,CACxB,eAAe,CAAE,IAAI,CACrB,aAAa,CAAC,CAAC,CACf,YAAY,CA1CM,KAAK,CA2CvB,YAAY,CA5CM,CAAC,CA6CnB,MAAM,CFgVa,OAAO,CE/U1B,WAAW,CA5DM,kDAAiB,CA6DlC,WAAW,CAtDM,MAAmB,CAuDpC,WAAW,CAAE,MAAM,CACnB,MAAM,CAAE,WAAyB,CACjC,QAAQ,CAAE,QAAQ,CAClB,UAAU,CAzDM,MAAM,CA0DtB,eAAe,CAAE,IAAI,CAER,OAAO,CAxEP,YAAY,CAuFzB,OAAO,CAAE,wBAA+D,CAErC,SAAS,CAhF9B,IAAY,CAqI1B,gBAAgB,CA1HF,OAAc,CA2H5B,YAAY,CARK,OAAwG,CAazH,KAAK,CA/IW,IAAM,CFsHxB,UAAU,CAPS,+BAAyB,CE4B1C,qDACQ,CAAE,gBAAgB,CAVT,OAAwG,CAezH,qDACQ,CACN,KAAK,CAnJS,IAAM,CAyMpB,kCAAY,CAhEd,gBAAgB,CAvHQ,OAAgB,CAwHxC,YAAY,CAtHgB,OAA0B,CA2HtD,KAAK,CA9Ie,IAAI,CA0IxB,6FACQ,CAAE,gBAAgB,CAxHE,OAA0B,CA6HtD,6FACQ,CACN,KAAK,CAlJa,IAAI,CAyMtB,8BAAY,CAjEd,gBAAgB,CApHM,OAAc,CAqHpC,YAAY,CAnHc,OAAwB,CAwHlD,KAAK,CA/IW,IAAM,CA2ItB,qFACQ,CAAE,gBAAgB,CArHA,OAAwB,CA0HlD,qFACQ,CACN,KAAK,CAnJS,IAAM,CA2MpB,0BAAY,CAlEd,gBAAgB,CAjHI,OAAY,CAkHhC,YAAY,CAhHY,OAAsB,CAqH9C,KAAK,CA/IW,IAAM,CA2ItB,6EACQ,CAAE,gBAAgB,CAlHF,OAAsB,CAuH9C,6EACQ,CACN,KAAK,CAnJS,IAAM,CA4MpB,8BAAY,CAnEd,gBAAgB,CA9GM,OAAc,CA+GpC,YAAY,CA7Gc,OAAwB,CAkHlD,KAAK,CA/IW,IAAM,CA2ItB,qFACQ,CAAE,gBAAgB,CA/GA,OAAwB,CAoHlD,qFACQ,CACN,KAAK,CAnJS,IAAM,CA6MpB,wBAAY,CApEd,gBAAgB,CA3GG,OAAW,CA4G9B,YAAY,CA1GW,OAAqB,CA+G5C,KAAK,CA9Ie,IAAI,CA0IxB,yEACQ,CAAE,gBAAgB,CA5GH,OAAqB,CAiH5C,yEACQ,CACN,KAAK,CAnJS,IAAM,CA+MpB,0BAAS,CA7HX,OAAO,CAAE,kCAA+D,CAKrC,SAAS,CAlF9B,OAAY,CA2MxB,0BAAS,CA9HX,OAAO,CAAE,gCAA+D,CAIrC,SAAS,CAnF9B,QAAY,CA8MxB,wBAAS,CA/HX,OAAO,CAAE,gCAA+D,CAGrC,SAAS,CAnF9B,QAAY,CAgNxB,4BAAS,CAhIX,OAAO,CAAE,wBAA+D,CAErC,SAAS,CAhF9B,IAAY,CA0FxB,cAAc,CAAE,SAAsB,CACtC,WAAW,CAxGJ,IAAY,CA6GrB,YAAY,CA7GH,IAAY,CA8GrB,aAAa,CA9GJ,IAAY,CA+GrB,KAAK,CAAE,IAAI,CA8GT,oCAAc,CAAE,UAAU,CAAE,IAAI,CAAE,WAAW,CC/IzC,MAAmD,CDgJvD,sCAAc,CAAE,UAAU,CAAE,KAAK,CAAE,aAAa,CChJ5C,MAAmD,CDkJvD,4BAAS,CF5MX,aAAa,CEwBD,GAAc,CAqLxB,0BAAS,CF7MX,aAAa,CEyBF,MAAe,CAsLxB,mEAAwB,CAjF1B,gBAAgB,CA1HF,OAAc,CA2H5B,YAAY,CARK,OAAwG,CAazH,KAAK,CA/IW,IAAM,CAyJtB,UAAU,CAAE,IAAI,CAChB,MAAM,CAlHe,OAAqB,CAmH1C,OAAO,CApHe,EAAE,CAoGxB,uLACQ,CAAE,gBAAgB,CAVT,OAAwG,CAezH,uLACQ,CACN,KAAK,CAnJS,IAAM,CA4JtB,uLACQ,CAAE,gBAAgB,CA9IZ,OAAc,CA4MxB,2GAAY,CAlFhB,gBAAgB,CAvHQ,OAAgB,CAwHxC,YAAY,CAtHgB,OAA0B,CA2HtD,KAAK,CA9Ie,IAAI,CAwJxB,UAAU,CAAE,IAAI,CAChB,MAAM,CAlHe,OAAqB,CAmH1C,OAAO,CApHe,EAAE,CAoGxB,uQACQ,CAAE,gBAAgB,CAxHE,OAA0B,CA6HtD,uQACQ,CACN,KAAK,CAlJa,IAAI,CA2JxB,uQACQ,CAAE,gBAAgB,CA3IF,OAAgB,CA0MpC,mGAAU,CAnFd,gBAAgB,CApHM,OAAc,CAqHpC,YAAY,CAnHc,OAAwB,CAwHlD,KAAK,CA/IW,IAAM,CAyJtB,UAAU,CAAE,IAAI,CAChB,MAAM,CAlHe,OAAqB,CAmH1C,OAAO,CApHe,EAAE,CAoGxB,uPACQ,CAAE,gBAAgB,CArHA,OAAwB,CA0HlD,uPACQ,CACN,KAAK,CAnJS,IAAM,CA4JtB,uPACQ,CAAE,gBAAgB,CAxIJ,OAAc,CAwMhC,2FAAQ,CApFZ,gBAAgB,CAjHI,OAAY,CAkHhC,YAAY,CAhHY,OAAsB,CAqH9C,KAAK,CA/IW,IAAM,CAyJtB,UAAU,CAAE,IAAI,CAChB,MAAM,CAlHe,OAAqB,CAmH1C,OAAO,CApHe,EAAE,CAoGxB,uOACQ,CAAE,gBAAgB,CAlHF,OAAsB,CAuH9C,uOACQ,CACN,KAAK,CAnJS,IAAM,CA4JtB,uOACQ,CAAE,gBAAgB,CArIN,OAAY,CAsM5B,mGAAU,CArFd,gBAAgB,CA9GM,OAAc,CA+GpC,YAAY,CA7Gc,OAAwB,CAkHlD,KAAK,CA/IW,IAAM,CAyJtB,UAAU,CAAE,IAAI,CAChB,MAAM,CAlHe,OAAqB,CAmH1C,OAAO,CApHe,EAAE,CAoGxB,uPACQ,CAAE,gBAAgB,CA/GA,OAAwB,CAoHlD,uPACQ,CACN,KAAK,CAnJS,IAAM,CA4JtB,uPACQ,CAAE,gBAAgB,CAlIJ,OAAc,CAoMhC,uFAAO,CAtFX,gBAAgB,CA3GG,OAAW,CA4G9B,YAAY,CA1GW,OAAqB,CA+G5C,KAAK,CA9Ie,IAAI,CAwJxB,UAAU,CAAE,IAAI,CAChB,MAAM,CAlHe,OAAqB,CAmH1C,OAAO,CApHe,EAAE,CAoGxB,+NACQ,CAAE,gBAAgB,CA5GH,OAAqB,CAiH5C,+NACQ,CACN,KAAK,CAnJS,IAAM,CA4JtB,+NACQ,CAAE,gBAAgB,CA/HP,OAAW,CAsM9B,wBAAyB,CAAC,MAAM,CAAC,CAAC,CAAE,OAAO,CAAC,CAAC,CAE7C,6CAAqB,CACnB,cAAgB,CApKL,OAAO,CAqK4B,YAAY,EElG9D,UAAc,CAAE,UAAU,CAAE,eAAe,CAC3C,WAAc,CAAE,UAAU,CAAE,gBAAgB,CAC5C,YAAc,CAAE,UAAU,CAAE,iBAAiB,CAC7C,aAAc,CAAE,UAAU,CAAE,kBAAkB,CAG5C,wCAA8C,CAC5C,qBAA4C,CAAE,UAAU,CAAE,eAAe,CACzE,sBAA+C,CAAE,UAAU,CAAE,gBAAgB,CAC7E,uBAA+C,CAAE,UAAU,CAAE,iBAAiB,CAC9E,wBAA+C,CAAE,UAAU,CAAE,kBAAkB,EAJjF,kBAA8C,CAC5C,gBAA4C,CAAE,UAAU,CAAE,eAAe,CACzE,iBAA+C,CAAE,UAAU,CAAE,gBAAgB,CAC7E,kBAA+C,CAAE,UAAU,CAAE,iBAAiB,CAC9E,mBAA+C,CAAE,UAAU,CAAE,kBAAkB,EAJjF,mEAA8C,CAC5C,sBAA4C,CAAE,UAAU,CAAE,eAAe,CACzE,uBAA+C,CAAE,UAAU,CAAE,gBAAgB,CAC7E,wBAA+C,CAAE,UAAU,CAAE,iBAAiB,CAC9E,yBAA+C,CAAE,UAAU,CAAE,kBAAkB,EAJjF,6CAA8C,CAC5C,iBAA4C,CAAE,UAAU,CAAE,eAAe,CACzE,kBAA+C,CAAE,UAAU,CAAE,gBAAgB,CAC7E,mBAA+C,CAAE,UAAU,CAAE,iBAAiB,CAC9E,oBAA+C,CAAE,UAAU,CAAE,kBAAkB,EAJjF,mEAA8C,CAC5C,qBAA4C,CAAE,UAAU,CAAE,eAAe,CACzE,sBAA+C,CAAE,UAAU,CAAE,gBAAgB,CAC7E,uBAA+C,CAAE,UAAU,CAAE,iBAAiB,CAC9E,wBAA+C,CAAE,UAAU,CAAE,kBAAkB,EAJjF,6CAA8C,CAC5C,gBAA4C,CAAE,UAAU,CAAE,eAAe,CACzE,iBAA+C,CAAE,UAAU,CAAE,gBAAgB,CAC7E,kBAA+C,CAAE,UAAU,CAAE,iBAAiB,CAC9E,mBAA+C,CAAE,UAAU,CAAE,kBAAkB,EAJjF,oEAA8C,CAC5C,sBAA4C,CAAE,UAAU,CAAE,eAAe,CACzE,uBAA+C,CAAE,UAAU,CAAE,gBAAgB,CAC7E,wBAA+C,CAAE,UAAU,CAAE,iBAAiB,CAC9E,yBAA+C,CAAE,UAAU,CAAE,kBAAkB,EAJjF,6CAA8C,CAC5C,iBAA4C,CAAE,UAAU,CAAE,eAAe,CACzE,kBAA+C,CAAE,UAAU,CAAE,gBAAgB,CAC7E,mBAA+C,CAAE,UAAU,CAAE,iBAAiB,CAC9E,oBAA+C,CAAE,UAAU,CAAE,kBAAkB,EAJjF,8EAA8C,CAC5C,uBAA4C,CAAE,UAAU,CAAE,eAAe,CACzE,wBAA+C,CAAE,UAAU,CAAE,gBAAgB,CAC7E,yBAA+C,CAAE,UAAU,CAAE,iBAAiB,CAC9E,0BAA+C,CAAE,UAAU,CAAE,kBAAkB,EAJjF,8CAA8C,CAC5C,kBAA4C,CAAE,UAAU,CAAE,eAAe,CACzE,mBAA+C,CAAE,UAAU,CAAE,gBAAgB,CAC7E,oBAA+C,CAAE,UAAU,CAAE,iBAAiB,CAC9E,qBAA+C,CAAE,UAAU,CAAE,kBAAkB,EA4BjF,mEAkBG,CACD,MAAM,CAAC,CAAC,CACR,OAAO,CAAC,CAAC,CAIX,CAAE,CACA,KAAK,CAvJS,OAAc,CAwJ5B,WAAW,CAAE,OAAO,CACpB,eAAe,CA3JI,IAAI,CA6JvB,eACQ,CACN,KAAK,CA5Ja,OAAiD,CAkKrE,KAAI,CAAE,MAAM,CAAC,IAAI,CAInB,CAAE,CACA,WAAW,CA9JE,OAAsB,CA+JnC,SAAS,CA9LO,IAAI,CA+LpB,WAAW,CApLE,MAAmB,CAqLhC,WAAW,CA/LO,GAAG,CAgMrB,aAAa,CA/JE,OAAwB,CAgKvC,cAAc,CA5LO,kBAAkB,CA8LvC,MAAO,CAlEX,SAAS,CAAE,UAAoC,CAC/C,WAAW,CAAE,GAAG,CAmEZ,OAAQ,CACN,SAAS,CApMW,OAAY,CAqMhC,UAAU,CAnMW,MAAM,CAoM3B,WAAW,CArMW,IAAI,CA0M9B,iBAAuB,CACrB,KAAK,CAnPS,IAAI,CAoPlB,WAAW,CAvPI,kDAAiB,CAwPhC,UAAU,CAtPI,MAAM,CAuPpB,WAAW,CAvME,MAAmB,CAwMhC,WAAW,CAtPI,GAAG,CAuPlB,aAAa,CArPI,KAAK,CAsPtB,UAAU,CAvPI,KAAK,CAwPnB,cAAc,CAtPI,kBAAkB,CAwPpC,qDAAM,CACJ,KAAK,CA9NM,OAAgD,CA+N3D,SAAS,CAhOC,GAAG,CAiOb,WAAW,CAAE,CAAC,CAIlB,EAAG,CAAE,SAAS,CAAE,QAAkC,CAClD,EAAG,CAAE,SAAS,CAAE,SAAkC,CAClD,EAAG,CAAE,SAAS,CAAE,QAAkC,CAClD,EAAG,CAAE,SAAS,CAAE,QAAkC,CAClD,EAAG,CAAE,SAAS,CAAE,QAAkC,CAClD,EAAG,CAAE,SAAS,CAAE,IAAkC,CAElD,UAAW,CA/Fb,WAAW,CApJW,GAAG,CAqJzB,KAAK,CApJgB,OAAgD,CAqJrE,WAAW,CA9HM,MAAmB,CA+HpC,UAAU,CApJW,KAAK,CAqJ1B,aAAa,CApJW,KAAK,CAiP3B,EAAG,CACD,MAAM,CAAE,UAAiC,CACzC,YAAY,CAAE,OAAoB,CAClC,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,CAAC,CACT,MAAM,CAAE,mBAAsD,CAIhE,IACE,CACA,UAAU,CAAE,MAAM,CAClB,WAAW,CAAE,OAAO,CAGtB,QACE,CACA,WAAW,CA9Kc,IAAiB,CA+K1C,WAAW,CAAE,OAAO,CAGtB,KAAM,CACJ,SAAS,CApQG,GAAG,CAqQf,WAAW,CAAE,OAAO,CAGtB,IAAK,CACH,gBAAgB,CAvPE,OAA8C,CAwPhE,YAAY,CArPE,OAAqD,CAsPnE,YAAY,CAvPE,KAAK,CAwPnB,YAAY,CAzPC,GAAG,CA0PhB,KAAK,CA9PE,IAAI,CA+PX,WAAW,CA9PE,4CAAsB,CA+PnC,WAAW,CA9PE,MAAmB,CA+PhC,OAAO,CA1PE,yBAAoC,CA8P/C,QAEG,CACD,WAAW,CAlPE,OAAsB,CAmPnC,SAAS,CAlPE,IAAoB,CAmP/B,WAAW,CAlPE,GAAsB,CAmPnC,mBAAmB,CAjPH,OAAO,CAkPvB,aAAa,CAnPE,OAAwB,CAsPzC,EAAG,CACD,WAAwB,CArPX,MAAM,CA2PjB,iBACG,CACD,WAAwB,CA1Pb,OAAY,CA2PvB,aAAa,CAAE,CAAC,CAMlB,6CAAM,CAAE,UAAU,CAAE,OAAO,CAG7B,SAAS,CAAE,eAAe,CAAE,MAAM,CAAE,WAAwB,CAvQ/C,MAAM,CAwQnB,SAAS,CAAE,eAAe,CAAE,MAAM,CAAE,WAAwB,CAxQ/C,MAAM,CAyQnB,OAAO,CAAE,eAAe,CAAE,IAAI,CAAE,WAAwB,CAzQ3C,MAAM,CA6QrB,EAAG,CACD,WAAwB,CA7QH,MAAM,CA+QzB,iBACG,CACD,WAAwB,CA/Qb,OAAY,CAgRvB,aAAa,CAAE,CAAC,CAMtB,UAAW,CACT,eAAe,CAAE,IAAI,CACrB,WAAwB,CAzRD,CAAC,CA4RtB,iCACG,CACD,WAAwB,CA7Rb,OAAY,CA8RvB,aAAa,CAAE,CAAC,CAChB,UAAU,CAAE,IAAI,CAOpB,KAAG,CACD,aAAa,CArSkB,KAAK,CAsSpC,WAAW,CApQY,IAAiB,CAsQ1C,KAAG,CAAE,aAAa,CAvSQ,MAAY,CA2SxC,YACQ,CACN,cAAc,CAAE,SAAS,CACzB,SAAS,CAAE,GAAG,CACd,KAAK,CJjEO,IAAI,CIkEhB,MAAM,CJwBQ,IAAI,CItBpB,IAAK,CACH,cAAc,CAAE,IAAI,CACpB,WAAS,CACP,aAAa,CA1SD,eAAsB,CA+StC,UAAW,CACT,MAAM,CAAE,WAA4B,CACpC,OAAO,CAxTQ,4BAAmB,CAyTlC,WAAwB,CAxTV,cAAqB,CA0TnC,eAAK,CACH,OAAO,CAAE,KAAK,CACd,SAAS,CA3TW,QAAY,CA4ThC,KAAK,CA1TgB,IAA2B,CA2ThD,sBAAS,CACP,OAAO,CAAE,aAAa,CAGxB,2CACU,CACR,KAAK,CAjUc,IAA2B,CAqUpD,uBACa,CACX,WAAW,CAxXO,GAAG,CAyXrB,KAAK,CA7Ua,OAAgD,CAiVpE,MAAO,CACL,OAAO,CAAE,YAAY,CACrB,MAAM,CAvUS,aAAkB,CAwUjC,MAAM,CAAE,cAA6E,CACrF,OAAO,CA1US,cAAe,CA4U/B,SAAG,CACD,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,KAAK,CAEhB,UAAI,CACF,WAAW,CA9TY,IAAiB,CA+TxC,SAAS,CAxUgB,QAAY,CA6UvC,gBAAS,CAAE,WAAW,CApUG,IAAiB,CAsU1C,YAAK,CACH,MAAM,CFnYW,OAAqB,CEoYtC,eAAe,CAvUY,IAAI,CAwU/B,WAAW,CAzUY,IAAiB,CA0UxC,MAAM,CAAE,IAAI,CACZ,OAAO,CA9UY,UAAa,CAmVpC,6CAAqB,CACnB,iBAAuB,CAAE,WAAW,CA/brB,GAAG,CAgclB,EAAG,CAAE,SAAS,CA1bL,OAAY,CA2brB,EAAG,CAAE,SAAS,CA1bL,SAAY,CA2brB,EAAG,CAAE,SAAS,CA1bL,SAAY,CA2brB,EAAG,CAAE,SAAS,CA1bL,SAAY,CA2brB,EAAG,CAAE,SAAS,CA1bL,QAAY,CA2brB,EAAG,CAAE,SAAS,CA1bL,IAAI,EAqcb,YAAa,CACX,CAAE,CACA,UAAU,CAAE,sBAAsB,CAClC,KAAK,CAAE,eAAiB,CACxB,UAAU,CAAE,eAAe,CAC3B,WAAW,CAAE,eAAe,CAG9B,WACU,CAAE,eAAe,CAAE,SAAS,CACtC,aAAc,CAAE,OAAO,CAAE,mBAAmB,CAE5C,iBAAkB,CAAE,OAAO,CAAE,oBAAoB,CAGjD,2DAEmB,CAAE,OAAO,CAAE,EAAE,CAEhC,cACW,CACT,MAAM,CAAE,cAAmB,CAC3B,iBAAiB,CAAE,KAAK,CAG1B,KAAM,CAAE,OAAO,CAAE,kBAAkB,CAEnC,MACI,CAAE,iBAAiB,CAAE,KAAK,CAE9B,GAAI,CAAE,SAAS,CAAE,eAAe,CAEhC,KAAgC,CAAxB,MAAM,CA9XP,KAAM,CAgYb,OAEG,CACD,OAAO,CAAE,CAAC,CACV,MAAM,CAAE,CAAC,CAGX,KACG,CAAE,gBAAgB,CAAE,KAAK,ECrRhC,kBAAmH,CACjH,gZAA4B,CAC1B,OAAO,CAAE,kBAAkB,CAE7B,gZAAyB,CACvB,OAAO,CAAE,eAAe,CAGxB,gcAA4B,CLgClC,QAAQ,CAAE,iBAAiB,CAC3B,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,QAAQ,CAAE,OAAO,CACjB,IAAI,CAAE,IAAI,CKjCJ,ocAA2B,CLkBjC,IAAI,CAAE,wBAAwB,CAC9B,MAAM,CAAE,GAAG,CACX,QAAQ,CAAE,MAAM,CAChB,QAAQ,CAAE,mBAAmB,CAC7B,KAAK,CAAE,GAAG,CKjBJ,ofAA0B,CACxB,OAAO,CAAE,gBAAgB,CAE3B,ofAAuC,CACrC,OAAO,CAAE,6BAA6B,CAExC,ofAAoC,CAClC,OAAO,CAAE,0BAA0B,CAErC,wbAA8B,CAC5B,OAAO,CAAE,SAAS,CAEpB,i3BAA+B,CAC7B,OAAO,CAAE,qBAAqB,EA7BpC,6CAAmH,CACjH,gZAA4B,CAC1B,OAAO,CAAE,kBAAkB,CAE7B,gZAAyB,CACvB,OAAO,CAAE,eAAe,CAGxB,gcAA4B,CLgClC,QAAQ,CAAE,iBAAiB,CAC3B,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,QAAQ,CAAE,OAAO,CACjB,IAAI,CAAE,IAAI,CKjCJ,ocAA2B,CLkBjC,IAAI,CAAE,wBAAwB,CAC9B,MAAM,CAAE,GAAG,CACX,QAAQ,CAAE,MAAM,CAChB,QAAQ,CAAE,mBAAmB,CAC7B,KAAK,CAAE,GAAG,CKjBJ,ofAA0B,CACxB,OAAO,CAAE,gBAAgB,CAE3B,ofAAuC,CACrC,OAAO,CAAE,6BAA6B,CAExC,ofAAoC,CAClC,OAAO,CAAE,0BAA0B,CAErC,wbAA8B,CAC5B,OAAO,CAAE,SAAS,CAEpB,i3BAA+B,CAC7B,OAAO,CAAE,qBAAqB,EA7BpC,6CAAmH,CACjH,gZAA4B,CAC1B,OAAO,CAAE,kBAAkB,CAE7B,gZAAyB,CACvB,OAAO,CAAE,eAAe,CAGxB,gcAA4B,CLgClC,QAAQ,CAAE,iBAAiB,CAC3B,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,QAAQ,CAAE,OAAO,CACjB,IAAI,CAAE,IAAI,CKjCJ,ocAA2B,CLkBjC,IAAI,CAAE,wBAAwB,CAC9B,MAAM,CAAE,GAAG,CACX,QAAQ,CAAE,MAAM,CAChB,QAAQ,CAAE,mBAAmB,CAC7B,KAAK,CAAE,GAAG,CKjBJ,ofAA0B,CACxB,OAAO,CAAE,gBAAgB,CAE3B,ofAAuC,CACrC,OAAO,CAAE,6BAA6B,CAExC,ofAAoC,CAClC,OAAO,CAAE,0BAA0B,CAErC,wbAA8B,CAC5B,OAAO,CAAE,SAAS,CAEpB,i3BAA+B,CAC7B,OAAO,CAAE,qBAAqB,EA7BpC,6CAAmH,CACjH,gZAA4B,CAC1B,OAAO,CAAE,kBAAkB,CAE7B,gZAAyB,CACvB,OAAO,CAAE,eAAe,CAGxB,gcAA4B,CLgClC,QAAQ,CAAE,iBAAiB,CAC3B,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,QAAQ,CAAE,OAAO,CACjB,IAAI,CAAE,IAAI,CKjCJ,ocAA2B,CLkBjC,IAAI,CAAE,wBAAwB,CAC9B,MAAM,CAAE,GAAG,CACX,QAAQ,CAAE,MAAM,CAChB,QAAQ,CAAE,mBAAmB,CAC7B,KAAK,CAAE,GAAG,CKjBJ,ofAA0B,CACxB,OAAO,CAAE,gBAAgB,CAE3B,ofAAuC,CACrC,OAAO,CAAE,6BAA6B,CAExC,ofAAoC,CAClC,OAAO,CAAE,0BAA0B,CAErC,wbAA8B,CAC5B,OAAO,CAAE,SAAS,CAEpB,i3BAA+B,CAC7B,OAAO,CAAE,qBAAqB,EA7BpC,8CAAmH,CACjH,gZAA4B,CAC1B,OAAO,CAAE,kBAAkB,CAE7B,gZAAyB,CACvB,OAAO,CAAE,eAAe,CAGxB,gcAA4B,CLgClC,QAAQ,CAAE,iBAAiB,CAC3B,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,QAAQ,CAAE,OAAO,CACjB,IAAI,CAAE,IAAI,CKjCJ,ocAA2B,CLkBjC,IAAI,CAAE,wBAAwB,CAC9B,MAAM,CAAE,GAAG,CACX,QAAQ,CAAE,MAAM,CAChB,QAAQ,CAAE,mBAAmB,CAC7B,KAAK,CAAE,GAAG,CKjBJ,ofAA0B,CACxB,OAAO,CAAE,gBAAgB,CAE3B,ofAAuC,CACrC,OAAO,CAAE,6BAA6B,CAExC,ofAAoC,CAClC,OAAO,CAAE,0BAA0B,CAErC,wbAA8B,CAC5B,OAAO,CAAE,SAAS,CAEpB,i3BAA+B,CAC7B,OAAO,CAAE,qBAAqB,EAatC,sCACmB,CAAE,OAAO,CAAE,kBAAkB,CAChD,sCACmB,CAAE,OAAO,CAAE,eAAe,CAI3C,gDACoB,CAAE,OAAO,CAAE,gBAAgB,CAG/C,gDACoB,CAAE,OAAO,CAAE,6BAA6B,CAG5D,gDACoB,CAAE,OAAO,CAAE,0BAA0B,CAGzD,0CACoB,CAAE,OAAO,CAAE,oBAAoB,CAInD,qFACoB,CAAE,OAAO,CAAE,qBAAqB,CAGtD,+CAAqB,CACnB,sCACmB,CAAE,OAAO,CAAE,kBAAkB,CAChD,sCACmB,CAAE,OAAO,CAAE,eAAe,CAI3C,gDACoB,CAAE,OAAO,CAAE,gBAAgB,CAG/C,gDACoB,CAAE,OAAO,CAAE,6BAA6B,CAG5D,gDACoB,CAAE,OAAO,CAAE,0BAA0B,CAGzD,0CACoB,CAAE,OAAO,CAAE,oBAAoB,CAInD,qFACoB,CAAE,OAAO,CAAE,qBAAqB,EAIxD,8CAAoB,CAClB,sCACoB,CAAE,OAAO,CAAE,kBAAkB,CACjD,sCACoB,CAAE,OAAO,CAAE,eAAe,CAI5C,gDACqB,CAAE,OAAO,CAAE,gBAAgB,CAGhD,gDACqB,CAAE,OAAO,CAAE,6BAA6B,CAG7D,gDACqB,CAAE,OAAO,CAAE,0BAA0B,CAG1D,0CACqB,CAAE,OAAO,CAAE,oBAAoB,CAIpD,qFACqB,CAAE,OAAO,CAAE,qBAAqB,EAKzD,eAAgB,CAAE,OAAO,CAAE,eAAe,CAC1C,eAAgB,CAAE,OAAO,CAAE,kBAAkB,CAC7C,sBAAuB,CAAE,OAAO,CAAE,kBAAkB,CACpD,sBAAuB,CAAE,OAAO,CAAE,eAAe,CAGjD,oBAAqB,CAAE,OAAO,CAAE,gBAAgB,CAChD,2BAA4B,CAAE,OAAO,CAAE,gBAAgB,CACvD,oBAAqB,CAAE,OAAO,CAAE,6BAA6B,CAC7D,2BAA4B,CAAE,OAAO,CAAE,6BAA6B,CACpE,oBAAqB,CAAE,OAAO,CAAE,0BAA0B,CAC1D,2BAA4B,CAAE,OAAO,CAAE,0BAA0B,CACjE,iBAAkB,CAAE,OAAO,CAAE,oBAAoB,CACjD,wBAAyB,CAAE,OAAO,CAAE,oBAAoB,CACxD,iBAAkB,CAAE,OAAO,CAAE,qBAAqB,CAClD,wBAAyB,CAAE,OAAO,CAAE,qBAAqB,CACzD,iBAAkB,CAAE,OAAO,CAAE,qBAAqB,CAClD,wBAAyB,CAAE,OAAO,CAAE,qBAAqB,CAGzD,YAAa,CL1Hb,IAAI,CAAE,wBAAwB,CAC9B,MAAM,CAAE,GAAG,CACX,QAAQ,CAAE,MAAM,CAChB,QAAQ,CAAE,mBAAmB,CAC7B,KAAK,CAAE,GAAG,CKyHV,cAAe,CL7Hf,IAAI,CAAE,wBAAwB,CAC9B,MAAM,CAAE,GAAG,CACX,QAAQ,CAAE,MAAM,CAChB,QAAQ,CAAE,mBAAmB,CAC7B,KAAK,CAAE,GAAG,CK4HR,0CACS,CLtHX,QAAQ,CAAE,iBAAiB,CAC3B,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,QAAQ,CAAE,OAAO,CACjB,IAAI,CAAE,IAAI,CKyHR,2BACgB,CAAE,OAAO,CAAE,eAAe,CAC1C,YAAa,CACX,2BACgB,CAAE,OAAO,CAAE,gBAAgB,CAC3C,8BACgB,CAAE,OAAO,CAAE,eAAe,CAE1C,oBAAqB,CAAE,OAAO,CAAE,gBAAgB,CAChD,oBAAqB,CAAE,OAAO,CAAE,6BAA6B,CAC7D,oBAAqB,CAAE,OAAO,CAAE,0BAA0B,CAC1D,iBAAkB,CAAE,OAAO,CAAE,oBAAoB,CACjD,iBAAkB,CAAE,OAAO,CAAE,qBAAqB,CAClD,iBAAkB,CAAE,OAAO,CAAE,qBAAqB,EC3ZxD,IAAK,CACH,OAAO,CAAE,MAAM,CACf,gBAAgB,CCVR,OAAO,CDWf,KAAK,CCNG,OAAO,CDOf,WAAW,CAAE,gCAAgC,CAC7C,WAAW,CAAE,GAAG,CAGlB,EAAG,CACD,OAAO,CAAE,QAAQ,CACjB,KAAK,CCbG,OAAO,CDcf,WAAW,CAAE,iCAAiC,CAC9C,SAAS,CAAE,MAAM,CACjB,WAAW,CAAE,MAAM,CAGrB,CAAE,CACA,KAAK,CClBE,OAAO,CDqBhB,WAAa,CACX,OAAO,CAAE,CAAC,CACV,WAAW,CAAE,CAAC,CAGhB,wBAA0B,CACxB,OAAO,CAAE,kBAAmB,CAO9B,QAAS,CACP,UAAU,CAAE,UAAU,CACtB,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,YAAY,CACrB,OAAO,CANK,IAAK,CAOjB,cAAc,CAAE,MAAM,CACtB,UAAU,CAAE,MAAM,CAClB,gBAAgB,CAAE,WAAW,CAC7B,MAAM,CAAE,qBAAqB,CAC7B,aAAa,CAAE,GAAG,CAGpB,cAAe,CACb,iBAAiB,CAAE,gBAAgB,CAChC,cAAc,CAAE,gBAAgB,CAC/B,aAAa,CAAE,gBAAgB,CAC9B,YAAY,CAAE,gBAAgB,CAC3B,SAAS,CAAE,gBAAgB,CACnC,gBAAgB,CCxCI,OAAO,CDyC3B,mBAAmB,CCzCC,OAAO,CD4C7B,cAAe,CACb,iBAAiB,CAAE,gBAAgB,CAChC,cAAc,CAAE,gBAAgB,CAC/B,aAAa,CAAE,gBAAgB,CAC9B,YAAY,CAAE,gBAAgB,CAC3B,SAAS,CAAE,gBAAgB,CACnC,gBAAgB,CCnDH,OAAO,CDoDpB,mBAAmB,CCpDN,OAAO,CDuDtB,uBAeC,CAdC,EAAG,CACD,iBAAiB,CAAE,aAAa,CAChC,cAAc,CAAE,aAAa,CAC7B,aAAa,CAAE,aAAa,CAC5B,YAAY,CAAE,aAAa,CAC3B,SAAS,CAAE,aAAa,CAE1B,IAAK,CACH,iBAAiB,CAAE,eAAe,CAClC,cAAc,CAAE,eAAe,CAC/B,aAAa,CAAE,eAAe,CAC9B,YAAY,CAAE,eAAe,CAC7B,SAAS,CAAE,eAAe,EAI9B,aAAc,CACZ,UAAU,CAAE,UAAU,CACtB,OAAO,CAAE,UAAU,CACnB,cAAc,CAAE,MAAM,CAEtB,gBAAG,CACD,OAAO,CAAE,YAAY,CACrB,SAAS,CAAE,MAAM,CACjB,WAAW,CAAE,MAAM,CACnB,WAAW,CAAE,gCAAgC,CAC7C,KAAK,CC9FG,OAAO,CDoGnB,UAAW,CACT,MAAM,CAAE,MAAM,CAGhB,SAAU,CACR,aAAa,CAAE,MAAM,CAErB,gBAAO,CACL,MAAM,CAAE,MAAM,CACd,WAAW,CAAE,MAAM,CACnB,OAAO,CAAE,MAAM,CACf,MAAM,CAAE,UAAU,CAClB,WAAW,CAAE,gCAAgC,CAC7C,SAAS,CAAE,IAAI,CAGjB,gBAAO,CACL,gBAAgB,CAAE,OAAO,CACzB,YAAY,CAAE,OAAO,CAGvB,kBAAS,CACP,OAAO,CAAE,YAAY,CACrB,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,MAAM,CACd,WAAW,CAAE,MAAM,CACnB,UAAU,CCnIF,IAAI,CDoIZ,OAAO,CAAE,MAAM,CC9GjB,qBAAqB,CD+GI,GAAG,CC9GzB,kBAAkB,CD8GI,GAAG,CC7GxB,iBAAiB,CD6GI,GAAG,CC5GvB,gBAAgB,CD4GI,GAAG,CC3GpB,aAAa,CD2GI,GAAG,CAC1B,KAAK,CChIA,OAAO,CDkIZ,yBAAO,CACL,QAAQ,CAAE,QAAQ,CAGlB,6CAAoB,CAClB,kBAAkB,CAAE,IAAI,CACxB,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,IAAI,CACT,gBAAgB,CC1If,OAAO,CD2IR,KAAK,CAAE,GAAG,CACV,MAAM,CAAE,GAAG,CAGb,4CAAmB,CACjB,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,IAAI,CACT,gBAAgB,CClJf,OAAO,CDmJR,KAAK,CAAE,GAAG,CACV,MAAM,CAAE,GAAG,CACX,MAAM,CAAE,CAAC,CAGX,gDAAuB,CACrB,kBAAkB,CAAE,IAAI,CACxB,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,MAAM,CAAE,OAAO,CC5IrB,qBAAqB,CD6IQ,GAAG,CC5I7B,kBAAkB,CD4IQ,GAAG,CC3I5B,iBAAiB,CD2IQ,GAAG,CC1I3B,gBAAgB,CD0IQ,GAAG,CCzIxB,aAAa,CDyIQ,GAAG,CAC1B,gBAAgB,CC9Jf,OAAO,CDiKV,4CAAmB,CACjB,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,MAAM,CAAE,OAAO,CACf,UAAU,CCrKT,OAAO,CDsKR,MAAM,CAAE,CAAC,CCtJf,qBAAqB,CDuJQ,GAAG,CCtJ7B,kBAAkB,CDsJQ,GAAG,CCrJ5B,iBAAiB,CDqJQ,GAAG,CCpJ3B,gBAAgB,CDoJQ,GAAG,CCnJxB,aAAa,CDmJQ,GAAG,CAMlC,QAAS,CACP,UAAU,CAAE,IAAI,CAChB,aAAa,CAAE,MAAM,CAErB,WAAG,CACD,OAAO,CAAE,WAAW,CACpB,OAAO,CAAE,QAAQ,CACjB,OAAO,CAAE,WAAW,CACpB,OAAO,CAAE,YAAY,CACrB,OAAO,CAAE,IAAI,CACb,UAAU,CAAE,IAAI,CAKhB,6BAAU,CACR,UAAU,CAAE,IAAI,CAChB,aAAa,CAAE,IAAI,CACnB,SAAS,CAAE,IAAI,CACf,2CAAc,CACZ,KAAK,CAAE,GAAG,CACV,MAAM,CAAE,MAAM,CAEd,UAAU,CAAE,OAAO,CCpLzB,qBAAqB,CDqLQ,GAAG,CCpL7B,kBAAkB,CDoLQ,GAAG,CCnL5B,iBAAiB,CDmLQ,GAAG,CClL3B,gBAAgB,CDkLQ,GAAG,CCjLxB,aAAa,CDiLQ,GAAG,CAMhC,gBAAQ,CACN,UAAU,CChNJ,OAAO,CDiNb,aAAa,CAAE,MAAM,CACrB,MAAM,CAAE,cAAoB,CC9L9B,qBAAqB,CD+LI,GAAG,CC9LzB,kBAAkB,CD8LI,GAAG,CC7LxB,iBAAiB,CD6LI,GAAG,CC5LvB,gBAAgB,CD4LI,GAAG,CC3LpB,aAAa,CD2LI,GAAG,CAE1B,4BAAY,CACV,MAAM,CAAE,MAAM,CAEd,mCAAO,CACL,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CACV,MAAM,CAAE,cAAqB,CAC7B,cAAc,CAAE,MAAM,CC1M5B,qBAAqB,CD2MQ,GAAG,CC1M7B,kBAAkB,CD0MQ,GAAG,CCzM5B,iBAAiB,CDyMQ,GAAG,CCxM3B,gBAAgB,CDwMQ,GAAG,CCvMxB,aAAa,CDuMQ,GAAG,CAC1B,UAAU,CCpNF,IAAI,CAqBlB,kBAAkB,CAAE,yCAA4C,CACxD,UAAU,CAAE,yCAA4C,CDgM1D,uCAAI,CACF,KAAK,CAAE,GAAG,CACV,MAAM,CAAE,GAAG,CACX,MAAM,CAAE,WAAW,CACnB,UAAU,CCvOP,IAAI,CDwOP,MAAM,CAAE,cAAc,CCnN9B,qBAAqB,CDoNU,GAAG,CCnN/B,kBAAkB,CDmNU,GAAG,CClN9B,iBAAiB,CDkNU,GAAG,CCjN7B,gBAAgB,CDiNU,GAAG,CChN1B,aAAa,CDgNU,GAAG,CAG9B,0CAAc,CACZ,UAAU,CC/NH,OAAO,CDgOd,MAAM,CAAE,cAAqB,CAC7B,MAAM,CAAE,iBAA8B,CCxM5C,kBAAkB,CAAE,oCAAuC,CACnD,UAAU,CAAE,oCAAuC,CDyMrD,8CAAI,CCpNV,kBAAkB,CAAE,gBAA6B,CACzC,UAAU,CAAE,gBAA6B,CDqNzC,UAAU,CCnOL,OAAO,CDoOZ,MAAM,CAAE,iBAA8B,CAM9C,cAAM,CACJ,SAAS,CAAE,CAAC,CACZ,OAAO,CAAE,YAAY,CACrB,YAAY,CAAE,IAAI,CAClB,KAAK,CAAE,IAAI,CACX,UAAU,CAAE,MAAM,CAClB,cAAc,CAAE,MAAM,CAGxB,yBAAiB,CAEf,UAAU,CAAE,IAAI,CAChB,WAAW,CAAE,CAAC,CACd,UAAU,CAAE,MAAM,CAClB,SAAS,CAAE,IAAI,CACf,WAAW,CAAE,IAAI,CACjB,UAAU,CAAE,KAAK,CACjB,YAAY,CAAE,MAAM,CACpB,8BAAK,CACH,SAAS,CAAE,IAAI,CACf,KAAK,CC1QC,OAAO,CDgRnB,SAAU,CACR,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,IAAI,CACT,IAAI,CAAE,MAAM,CACZ,UAAU,CAAE,wDAAwD,CACpE,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CAGf,MAAO,CACL,OAAO,CAAE,GAAG", 4 | "sources": ["../bower_components/foundation/scss/normalize.scss","../bower_components/foundation/scss/foundation/components/_global.scss","../bower_components/foundation/scss/foundation/components/_grid.scss","../bower_components/foundation/scss/foundation/components/_buttons.scss","../bower_components/foundation/scss/foundation/_functions.scss","../bower_components/foundation/scss/foundation/components/_type.scss","../bower_components/foundation/scss/foundation/components/_visibility.scss","../../sass/main.scss","../../sass/_settings.scss"], 5 | "names": [], 6 | "file": "main.css" 7 | } 8 | -------------------------------------------------------------------------------- /public/assets/images/ready-to-groove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dougjohnston/angular-drum-machine/f338766bfde8d81445c9737300d72b0fb97bc591/public/assets/images/ready-to-groove.png -------------------------------------------------------------------------------- /public/assets/js/angular_drums.min.js: -------------------------------------------------------------------------------- 1 | "use strict";!function(n,e,A){function x(s,g,h){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,c,b,f,w){function y(){p&&(p.remove(),p=null),k&&(k.$destroy(),k=null),l&&(h.leave(l,function(){p=null}),p=l,l=null)}function v(){var b=s.current&&s.current.locals;if(e.isDefined(b&&b.$template)){var b=a.$new(),d=s.current;l=w(b,function(d){h.enter(d,null,l||c,function(){!e.isDefined(t)||t&&!a.$eval(t)||g()}),y()}),k=d.scope=b,k.$emit("$viewContentLoaded"),k.$eval(u)}else y()}var k,l,p,t=b.autoscroll,u=b.onload||"";a.$on("$routeChangeSuccess",v),v()}}}function z(e,g,h){return{restrict:"ECA",priority:-400,link:function(a,c){var b=h.current,f=b.locals;c.html(f.$template);var w=e(c.contents());b.controller&&(f.$scope=a,f=g(b.controller,f),b.controllerAs&&(a[b.controllerAs]=f),c.data("$ngControllerController",f),c.children().data("$ngControllerController",f)),w(a)}}}n=e.module("ngRoute",["ng"]).provider("$route",function(){function s(a,c){return e.extend(new(e.extend(function(){},{prototype:a})),c)}function g(a,e){var b=e.caseInsensitiveMatch,f={originalPath:a,regexp:a},h=f.keys=[];return a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,e,b,c){return a="?"===c?c:null,c="*"===c?c:null,h.push({name:b,optional:!!a}),e=e||"",""+(a?"":e)+"(?:"+(a?e:"")+(c&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1"),f.regexp=RegExp("^"+a+"$",b?"i":""),f}var h={};this.when=function(a,c){if(h[a]=e.extend({reloadOnSearch:!0},c,a&&g(a,c)),a){var b="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";h[b]=e.extend({redirectTo:a},g(b,c))}return this},this.otherwise=function(a){return this.when(null,a),this},this.$get=["$rootScope","$location","$routeParams","$q","$injector","$http","$templateCache","$sce",function(a,c,b,f,g,n,v,k){function l(){var d=p(),m=r.current;d&&m&&d.$$route===m.$$route&&e.equals(d.pathParams,m.pathParams)&&!d.reloadOnSearch&&!u?(m.params=d.params,e.copy(m.params,b),a.$broadcast("$routeUpdate",m)):(d||m)&&(u=!1,a.$broadcast("$routeChangeStart",d,m),(r.current=d)&&d.redirectTo&&(e.isString(d.redirectTo)?c.path(t(d.redirectTo,d.params)).search(d.params).replace():c.url(d.redirectTo(d.pathParams,c.path(),c.search())).replace()),f.when(d).then(function(){if(d){var c,b,a=e.extend({},d.resolve);return e.forEach(a,function(d,c){a[c]=e.isString(d)?g.get(d):g.invoke(d)}),e.isDefined(c=d.template)?e.isFunction(c)&&(c=c(d.params)):e.isDefined(b=d.templateUrl)&&(e.isFunction(b)&&(b=b(d.params)),b=k.getTrustedResourceUrl(b),e.isDefined(b)&&(d.loadedTemplateUrl=b,c=n.get(b,{cache:v}).then(function(a){return a.data}))),e.isDefined(c)&&(a.$template=c),f.all(a)}}).then(function(c){d==r.current&&(d&&(d.locals=c,e.copy(d.params,b)),a.$broadcast("$routeChangeSuccess",d,m))},function(c){d==r.current&&a.$broadcast("$routeChangeError",d,m,c)}))}function p(){var a,b;return e.forEach(h,function(f,h){var q;if(q=!b){var g=c.path();q=f.keys;var l={};if(f.regexp)if(g=f.regexp.exec(g)){for(var k=1,p=g.length;p>k;++k){var n=q[k-1],r=g[k];n&&r&&(l[n.name]=r)}q=l}else q=null;else q=null;q=a=q}q&&(b=s(f,{params:e.extend({},c.search(),a),pathParams:a}),b.$$route=f)}),b||h[null]&&s(h[null],{params:{},pathParams:{}})}function t(a,c){var b=[];return e.forEach((a||"").split(":"),function(a,d){if(0===d)b.push(a);else{var e=a.match(/(\w+)(?:[?*])?(.*)/),f=e[1];b.push(c[f]),b.push(e[2]||""),delete c[f]}}),b.join("")}var u=!1,r={routes:h,reload:function(){u=!0,a.$evalAsync(l)}};return a.$on("$locationChangeSuccess",l),r}]}),n.provider("$routeParams",function(){this.$get=function(){return{}}}),n.directive("ngView",x),n.directive("ngView",z),x.$inject=["$route","$anchorScroll","$animate"],z.$inject=["$compile","$controller","$route"]}(window,window.angular),!function(){var e={},o=null,n=!0,r=!1;try{"undefined"!=typeof AudioContext?o=new AudioContext:"undefined"!=typeof webkitAudioContext?o=new webkitAudioContext:n=!1}catch(t){n=!1}if(!n)if("undefined"!=typeof Audio)try{new Audio}catch(t){r=!0}else r=!0;if(n){var a="undefined"==typeof o.createGain?o.createGainNode():o.createGain();a.gain.value=1,a.connect(o.destination)}var i=function(e){this._volume=1,this._muted=!1,this.usingWebAudio=n,this.ctx=o,this.noAudio=r,this._howls=[],this._codecs=e,this.iOSAutoEnable=!0};i.prototype={volume:function(e){var o=this;if(e=parseFloat(e),e>=0&&1>=e){o._volume=e,n&&(a.gain.value=e);for(var r in o._howls)if(o._howls.hasOwnProperty(r)&&o._howls[r]._webAudio===!1)for(var t=0;t0?t._pos:r._sprite[e][0]/1e3,i=0;r._webAudio?(i=r._sprite[e][1]/1e3-t._pos,t._pos>0&&(a=r._sprite[e][0]/1e3+a)):i=r._sprite[e][1]/1e3-(a-r._sprite[e][0]/1e3);var u,d=!(!r._loop&&!r._sprite[e][2]),f="string"==typeof n?n:Math.round(Date.now()*Math.random())+"";if(function(){var o={id:f,sprite:e,loop:d};u=setTimeout(function(){!r._webAudio&&d&&r.stop(o.id).play(e,o.id),r._webAudio&&!d&&(r._nodeById(o.id).paused=!0,r._nodeById(o.id)._pos=0,r._clearEndTimer(o.id)),r._webAudio||d||r.stop(o.id),r.on("end",f)},i/r._rate*1e3),r._onendTimer.push({timer:u,id:o.id})}(),r._webAudio){var s=r._sprite[e][0]/1e3,_=r._sprite[e][1]/1e3;t.id=f,t.paused=!1,p(r,[d,s,_],f),r._playStart=o.currentTime,t.gain.value=r._volume,"undefined"==typeof t.bufferSource.start?d?t.bufferSource.noteGrainOn(0,a,86400):t.bufferSource.noteGrainOn(0,a,i):d?t.bufferSource.start(0,a,86400):t.bufferSource.start(0,a,i)}else{if(4!==t.readyState&&(t.readyState||!navigator.isCocoonJS))return r._clearEndTimer(f),function(){var o=r,a=e,i=n,u=t,d=function(){o.play(a,i),u.removeEventListener("canplaythrough",d,!1)};u.addEventListener("canplaythrough",d,!1)}(),r;t.readyState=4,t.id=f,t.currentTime=a,t.muted=l._muted||t.muted,t.volume=r._volume*l.volume(),setTimeout(function(){t.play()},0)}return r.on("play"),"function"==typeof n&&n(f),r}),r):("function"==typeof n&&n(),r):(r.on("load",function(){r.play(e,n)}),r)},pause:function(e){var o=this;if(!o._loaded)return o.on("play",function(){o.pause(e)}),o;o._clearEndTimer(e);var n=e?o._nodeById(e):o._activeNode();if(n)if(n._pos=o.pos(null,e),o._webAudio){if(!n.bufferSource||n.paused)return o;n.paused=!0,"undefined"==typeof n.bufferSource.stop?n.bufferSource.noteOff(0):n.bufferSource.stop(0)}else n.pause();return o.on("pause"),o},stop:function(e){var o=this;if(!o._loaded)return o.on("play",function(){o.stop(e)}),o;o._clearEndTimer(e);var n=e?o._nodeById(e):o._activeNode();if(n)if(n._pos=0,o._webAudio){if(!n.bufferSource||n.paused)return o;n.paused=!0,"undefined"==typeof n.bufferSource.stop?n.bufferSource.noteOff(0):n.bufferSource.stop(0)}else isNaN(n.duration)||(n.pause(),n.currentTime=0);return o},mute:function(e){var o=this;if(!o._loaded)return o.on("play",function(){o.mute(e)}),o;var n=e?o._nodeById(e):o._activeNode();return n&&(o._webAudio?n.gain.value=0:n.muted=!0),o},unmute:function(e){var o=this;if(!o._loaded)return o.on("play",function(){o.unmute(e)}),o;var n=e?o._nodeById(e):o._activeNode();return n&&(o._webAudio?n.gain.value=o._volume:n.muted=!1),o},volume:function(e,o){var n=this;if(e=parseFloat(e),e>=0&&1>=e){if(n._volume=e,!n._loaded)return n.on("play",function(){n.volume(e,o)}),n;var r=o?n._nodeById(o):n._activeNode();return r&&(n._webAudio?r.gain.value=e:r.volume=e*l.volume()),n}return n._volume},loop:function(e){var o=this;return"boolean"==typeof e?(o._loop=e,o):o._loop},sprite:function(e){var o=this;return"object"==typeof e?(o._sprite=e,o):o._sprite},pos:function(e,n){var r=this;if(!r._loaded)return r.on("load",function(){r.pos(e)}),"number"==typeof e?r:r._pos||0;e=parseFloat(e);var t=n?r._nodeById(n):r._activeNode();if(t)return e>=0?(r.pause(n),t._pos=e,r.play(t._sprite,n),r):r._webAudio?t._pos+(o.currentTime-r._playStart):t.currentTime;if(e>=0)return r;for(var a=0;a=0||0>e))return t._pos3d;if(t._webAudio){var a=r?t._nodeById(r):t._activeNode();a&&(t._pos3d=[e,o,n],a.panner.setPosition(e,o,n),a.panner.panningModel=t._model||"HRTF")}return t},fade:function(e,o,n,r,t){var a=this,i=Math.abs(e-o),u=e>o?"down":"up",d=i/.01,l=n/d;if(!a._loaded)return a.on("load",function(){a.fade(e,o,n,r,t)}),a;a.volume(e,t);for(var f=1;d>=f;f++)!function(){var e=a._volume+("up"===u?.01:-.01)*f,n=Math.round(1e3*e)/1e3,i=o;setTimeout(function(){a.volume(n,t),n===i&&r&&r()},l*f)}()},fadeIn:function(e,o,n){return this.volume(0).play().fade(0,e,o,n)},fadeOut:function(e,o,n,r){var t=this;return t.fade(t._volume,e,o,function(){n&&n(),t.pause(r),t.on("end")},r)},_nodeById:function(e){for(var o=this,n=o._audioNode[0],r=0;r=0&&!(5>=n);e--)o._audioNode[e].paused&&(o._webAudio&&o._audioNode[e].disconnect(0),n--,o._audioNode.splice(e,1))},_clearEndTimer:function(e){for(var o=this,n=-1,r=0;r=0&&l._howls.splice(t,1),delete e[o._src],o=null}},n)var s=function(o,n){if(n in e)return o._duration=e[n].duration,void c(o);if(/^data:[^;]+;base64,/.test(n)){for(var r=atob(n.split(",")[1]),t=new Uint8Array(r.length),a=0;ai;i++)input.push(i);return input}}),app.factory("drumMachine",function($http,$q,timerQueue){function loadInstruments(instrumentFile){var item,player,instrument,file=instrumentFile||"/app/services/data/instruments/kit-1.json";return $http.get(file).then(function(response){for(var i=0;4>i;i++)item=response.data.instruments[i],player=new Howl({urls:["assets/audio/"+item.file]}),instrument=new Instrument(player,item),_rows.push(new Row(instrument,_gridLength));return"Instruments Loaded"})}function loadSequence(sequenceFile){var file=sequenceFile||"/app/services/data/sequences/seq-1.json";return reset(),$http.get(file).then(function(response){_gridLength=response.data.gridLength,setTempo(response.data.tempo);for(var i=0;4>i;i++)for(var j=0;_gridLength>j;j++)"1"===response.data.rows[i][j]?_rows[i].getBeats()[j].activate():_rows[i].getBeats()[j].deactivate();return"Sequence Loaded"})}function rows(){return _rows}function tempo(){return _tempo}function gridLength(){return _gridLength}function currentBeat(){return _currentBeat}function setTempo(newTempo){_tempo=newTempo,_delay=beatDelay()}function play(){_playing=!0,_timers.add(playBeat(),beatDelay())}function stop(){_playing=!1,_timers.clear()}function reset(){stop(),_currentBeat=0,resetAllRows()}function playBeat(){return function(){_currentBeat>=_gridLength&&(_currentBeat=0);for(var i=0;i<_rows.length;i++)_rows[i].playSound(_currentBeat);_currentBeat+=1,_timers.add(playBeat(),_delay)}}function resetAllRows(){for(var i=0;i<_rows.length;i++)_rows[i].reset()}function beatDelay(){return 1e3/(2*_tempo)*60}var _playing=!1,_currentBeat=0,_delay=100,_gridLength=16,_tempo=120,_timers=timerQueue,_rows=[];return{loadInstruments:loadInstruments,loadSequence:loadSequence,gridLength:gridLength,currentBeat:currentBeat,rows:rows,tempo:tempo,setTempo:setTempo,play:play,stop:stop,reset:reset}});var Beat=function(){function isActive(){return active}function activate(){active=!0}function deactivate(){active=!1}function toggle(){active=!active}var active=!1;return{isActive:isActive,activate:activate,deactivate:deactivate,toggle:toggle}},Instrument=function(player,inst){function getName(){return name}function getDescription(){return description}function play(){try{return audioPlayer.play(),!0}catch(e){return console.log("Unable to play sound",e),!1}}var audioPlayer=player,name=inst.name,description=inst.description;return{getName:getName,getDescription:getDescription,play:play}},Row=function(instrument,initialBeats){function getInstrument(){return instrument}function getBeats(){return beats}function addBeats(num){for(var i=0;num>i;i++)beats.push(new Beat)}function reset(){for(var i=0;i 2 | 3 | 4 | 5 | Angular Drum Machine - Built with AngularJS 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 23 | 24 | 25 | 26 | Fork me on GitHub 27 | 28 |
29 |
30 |
31 |

Angular Drum Machine

32 |
33 |
34 |
35 |
36 |

loading...

37 |
38 |
39 | 40 |
41 | 42 | 43 | 44 |
45 | 46 | 47 | 48 | {{tempo}} bpm 49 | 50 |
51 |
52 | 53 |
    54 |
  • 55 |
      56 |
    • 57 |
    • 58 |
      {{$index + 1}}
      59 |
    • 60 |
    61 |
  • 62 |
  • 63 |
      64 |
    • 65 | {{row.getInstrument().getName()}}
      66 | {{row.getInstrument().getDescription()}} 67 |
    • 68 |
    • 69 | 73 |
    • 74 |
    75 |
  • 76 |
77 | 78 | 82 | 83 | 84 |
85 |
86 | 87 | 88 | -------------------------------------------------------------------------------- /public/sass/_settings.scss: -------------------------------------------------------------------------------- 1 | // Custom Colors 2 | $bg-main: #373737; 3 | $bg-darker: #222; 4 | $bg-lighter: #444; 5 | $bg-inst: #575757; 6 | 7 | $fg-main: #efeae4; 8 | $fg-darker: #bfbab4; 9 | $fg-alt: #3699b9; 10 | 11 | $button-bg-off: #777; 12 | $button-bg-on: #eca599; 13 | $button-bg-shadow: #fcc6bd; 14 | $button-light: #f04124; 15 | $button-light-border: #cf280e; 16 | 17 | $button-bg-off: #777; 18 | $button-bg-on: #95dff7; 19 | $button-bg-shadow: #3df; 20 | $button-light: #24caff; 21 | $button-light-border: #3699b9; 22 | 23 | // Mixins 24 | @mixin border-radius($radius) { 25 | -webkit-border-radius: $radius; 26 | -moz-border-radius: $radius; 27 | -ms-border-radius: $radius; 28 | -o-border-radius: $radius; 29 | border-radius: $radius; 30 | } 31 | 32 | @mixin box-shadow() { 33 | -webkit-box-shadow: 0px 0px 5px $button-bg-shadow; 34 | box-shadow: 0px 0px 5px $button-bg-shadow; 35 | } 36 | 37 | @mixin box-shadow-inset() { 38 | -webkit-box-shadow: inset 2px -1px 0px 0px rgba(50, 50, 50, 0.4); 39 | box-shadow: inset 2px -1px 0px 0px rgba(50, 50, 50, 0.4); 40 | } 41 | 42 | @mixin box-shadow-on() { 43 | -webkit-box-shadow: 0px 0px 6px 0px rgba(30, 120, 150, 0.7); 44 | box-shadow: 0px 0px 6px 0px rgba(30, 120, 150, 0.7); 45 | } 46 | -------------------------------------------------------------------------------- /public/sass/main.scss: -------------------------------------------------------------------------------- 1 | @import 'settings'; 2 | 3 | /* Import Foundation */ 4 | @import 'normalize'; 5 | @import 'grid'; 6 | @import 'buttons'; 7 | @import "type"; 8 | @import 'visibility'; 9 | 10 | body { 11 | padding: 0.7rem; 12 | background-color: $bg-main; 13 | color: $fg-main; 14 | font-family: 'Ubuntu Mono', Arial, sans-serif; 15 | line-height: 1.2; 16 | } 17 | 18 | h1 { 19 | padding: 0 0.2rem; 20 | color: $fg-main; 21 | font-family: 'Oleo Script Swash Caps', cursive; 22 | font-size: 3.5rem; 23 | line-height: 3.8rem; 24 | } 25 | 26 | a { 27 | color: $fg-alt; 28 | } 29 | 30 | ul, ul li ul { 31 | padding: 0; 32 | margin-left: 0; 33 | } 34 | 35 | button:focus, input:focus { 36 | outline: 1px dashed $bg-inst; 37 | } 38 | 39 | /* Start Loading Animation */ 40 | /* By Adonis K., http://codepen.io/adonisk/pen/IAzbo */ 41 | $loader-size: 0.5em; 42 | 43 | .loading { 44 | box-sizing: border-box; 45 | position: relative; 46 | display: inline-block; 47 | padding: $loader-size; 48 | vertical-align: middle; 49 | text-align: center; 50 | background-color: transparent; 51 | border: 5px solid transparent; 52 | border-radius: 50%; 53 | } 54 | 55 | .loading-outer { 56 | -webkit-animation: spin 1s infinite; 57 | -moz-animation: spin 1s infinite; 58 | -ms-animation: spin 1s infinite; 59 | -o-animation: spin 1s infinite; 60 | animation: spin 1s infinite; 61 | border-top-color: $button-light-border; 62 | border-bottom-color: $button-light-border; 63 | } 64 | 65 | .loading-inner { 66 | -webkit-animation: spin 1s infinite; 67 | -moz-animation: spin 1s infinite; 68 | -ms-animation: spin 1s infinite; 69 | -o-animation: spin 1s infinite; 70 | animation: spin 1s infinite; 71 | border-top-color: $button-light; 72 | border-bottom-color: $button-light; 73 | } 74 | 75 | @-webkit-keyframes spin { 76 | 0% { 77 | -webkit-transform: rotateZ(0deg); 78 | -moz-transform: rotateZ(0deg); 79 | -ms-transform: rotateZ(0deg); 80 | -o-transform: rotateZ(0deg); 81 | transform: rotateZ(0deg); 82 | } 83 | 100% { 84 | -webkit-transform: rotateZ(360deg); 85 | -moz-transform: rotateZ(360deg); 86 | -ms-transform: rotateZ(360deg); 87 | -o-transform: rotateZ(360deg); 88 | transform: rotateZ(360deg); 89 | } 90 | } 91 | 92 | #loading-wrap { 93 | box-sizing: border-box; 94 | display: table-cell; 95 | vertical-align: middle; 96 | 97 | h3 { 98 | display: inline-block; 99 | font-size: 1.3rem; 100 | font-weight: normal; 101 | font-family: 'Ubuntu Mono', Arial, sans-serif; 102 | color: $fg-darker; 103 | } 104 | } 105 | 106 | /* End Loading Animation */ 107 | 108 | #container { 109 | margin: 0 auto; 110 | } 111 | 112 | #controls { 113 | margin-bottom: 0.5rem; 114 | 115 | button { 116 | height: 2.4rem; 117 | line-height: 2.4rem; 118 | padding: 0 1rem; 119 | margin: 0 0 0.3rem; 120 | font-family: 'Ubuntu Mono', Arial, sans-serif; 121 | font-size: 1rem; 122 | } 123 | 124 | #reset { 125 | background-color: #3699b9; 126 | border-color: #167999; 127 | } 128 | 129 | #readout { 130 | display: inline-block; 131 | width: 200px; 132 | height: 2.4rem; 133 | line-height: 2.4rem; 134 | background: $bg-darker; 135 | padding: 0 1rem; 136 | @include border-radius(3px); 137 | color: $fg-alt; 138 | 139 | #tempo { 140 | position: relative; 141 | 142 | /* Range Styles */ 143 | input[type="range"] { 144 | -webkit-appearance: none; 145 | position: relative; 146 | top: -5px; 147 | background-color: $fg-alt; 148 | width: 60%; 149 | height: 2px; 150 | } 151 | 152 | ::-moz-range-track { 153 | position: relative; 154 | top: -5px; 155 | background-color: $fg-alt; 156 | width: 60%; 157 | height: 2px; 158 | border: 0; 159 | } 160 | 161 | ::-webkit-slider-thumb { 162 | -webkit-appearance: none; 163 | width: 11px; 164 | height: 11px; 165 | cursor: pointer; 166 | @include border-radius(6px); 167 | background-color: $fg-alt; 168 | } 169 | 170 | ::-moz-range-thumb { 171 | width: 11px; 172 | height: 11px; 173 | cursor: pointer; 174 | background: $fg-alt; 175 | border: 0; 176 | @include border-radius(6px); 177 | } 178 | } 179 | } 180 | } 181 | 182 | #dm-grid { 183 | list-style: none; 184 | margin-bottom: 0.5rem; 185 | 186 | ul { 187 | display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */ 188 | display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */ 189 | display: -ms-flexbox; /* TWEENER - IE 10 */ 190 | display: -webkit-flex; /* NEW - Chrome */ 191 | display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */ 192 | list-style: none; 193 | } 194 | 195 | /* Header Row */ 196 | .dm-header { 197 | .beat-num { 198 | margin-top: 0.5%; 199 | margin-bottom: 0.2%; 200 | font-size: 12px; 201 | .current-beat { 202 | width: 60%; 203 | margin: 0 auto; 204 | /*transition: background-color 0.05s ease;*/ 205 | background: #43AC6A; 206 | @include border-radius(6px); 207 | } 208 | } 209 | } 210 | 211 | /* Instrument Row */ 212 | .dm-row { 213 | background: $bg-inst; 214 | margin-bottom: 0.2rem; 215 | border: 1px solid $bg-darker; 216 | @include border-radius(6px); 217 | 218 | .instrument { 219 | margin: 1.2% 0; 220 | 221 | button { 222 | width: 100%; 223 | height: 35px; 224 | margin: 0; 225 | padding: 0; 226 | border: 1px solid $bg-lighter; 227 | vertical-align: middle; 228 | @include border-radius(3px); 229 | background: $button-bg-off; 230 | @include box-shadow-inset(); 231 | div { 232 | width: 70%; 233 | height: 4px; 234 | margin: 15px auto 0; 235 | background: $bg-lighter; 236 | border: 1px solid #888; 237 | @include border-radius(2px); 238 | } 239 | } 240 | button.btn-on { 241 | background: $button-bg-on; 242 | border: 1px solid $bg-lighter; 243 | border: 1px solid $button-light-border; 244 | @include box-shadow-on(); 245 | div { 246 | @include box-shadow(); 247 | background: $button-light; 248 | border: 1px solid $button-light-border; 249 | } 250 | } 251 | } 252 | } 253 | 254 | ul li { 255 | flex-grow: 1; 256 | display: inline-block; 257 | margin-right: 1.4%; 258 | width: 30px; 259 | text-align: center; 260 | vertical-align: middle; 261 | } 262 | 263 | .instrument-name { 264 | /*width: 6rem;*/ 265 | flex-basis: 4rem; 266 | flex-shrink: 2; 267 | align-self: center; 268 | font-size: 16px; 269 | line-height: 16px; 270 | text-align: right; 271 | margin-right: 0.6rem; 272 | span { 273 | font-size: 12px; 274 | color: $fg-darker; 275 | } 276 | } 277 | } 278 | 279 | /* Messages */ 280 | .msg-play { 281 | position: absolute; 282 | top: 80px; 283 | left: -185px; 284 | background: transparent url(../images/ready-to-groove.png) no-repeat; 285 | width: 183px; 286 | height: 134px; 287 | } 288 | 289 | .faded { 290 | opacity: 0.2; 291 | } 292 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dougjohnston/angular-drum-machine/f338766bfde8d81445c9737300d72b0fb97bc591/screenshot.png -------------------------------------------------------------------------------- /test/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration 2 | // Generated on Thu Jan 02 2014 09:01:12 GMT-0500 (ECT) 3 | 4 | module.exports = function(config) { 5 | config.set({ 6 | 7 | // base path, that will be used to resolve files and exclude 8 | basePath: '', 9 | 10 | 11 | // frameworks to use 12 | frameworks: ['jasmine'], 13 | 14 | 15 | // list of files / patterns to load in the browser 16 | files: [ 17 | '../public/assets/bower_components/angular/angular.min.js', 18 | '../public/assets/bower_components/angular-mocks/angular-mocks.js', 19 | '../public/assets/bower_components/howler/howler.min.js', 20 | '../public/app/**/*.js', 21 | './unit/**/*.spec.js' 22 | ], 23 | 24 | 25 | // list of files to exclude 26 | exclude: [ 27 | 28 | ], 29 | 30 | 31 | // test results reporter to use 32 | // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage' 33 | reporters: ['spec'], 34 | 35 | 36 | // web server port 37 | port: 9876, 38 | 39 | 40 | // enable / disable colors in the output (reporters and logs) 41 | colors: true, 42 | 43 | 44 | // level of logging 45 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 46 | logLevel: config.LOG_INFO, 47 | 48 | 49 | // enable / disable watching file and executing tests whenever any file changes 50 | autoWatch: true, 51 | 52 | 53 | // Start these browsers, currently available: 54 | // - Chrome 55 | // - ChromeCanary 56 | // - Firefox 57 | // - Opera (has to be installed with `npm install karma-opera-launcher`) 58 | // - Safari (only Mac; has to be installed with `npm install karma-safari-launcher`) 59 | // - PhantomJS 60 | // - IE (only Windows; has to be installed with `npm install karma-ie-launcher`) 61 | browsers: ['ChromeCanary'], 62 | 63 | 64 | // If browser does not capture in given timeout [ms], kill it 65 | captureTimeout: 60000, 66 | 67 | 68 | // Continuous Integration mode 69 | // if true, it capture browsers, run tests and exit 70 | singleRun: false 71 | }); 72 | }; 73 | -------------------------------------------------------------------------------- /test/unit/app/controllers/main.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('DrumMachineCtrl', function() { 4 | var scope, ctrl, drumMachine; 5 | 6 | beforeEach(function() { 7 | module('AngularDrumMachine'); 8 | 9 | inject(function($rootScope, $injector, $controller) { 10 | scope = $rootScope.$new(); 11 | ctrl = $controller('DrumMachineCtrl', {$scope: scope}); 12 | }); 13 | 14 | inject(function(_drumMachine_) { 15 | drumMachine = _drumMachine_; 16 | scope.machine = drumMachine; 17 | }); 18 | }); 19 | 20 | it('should set up a drum machine service', function() { 21 | expect(drumMachine).toEqual(jasmine.any(Object)); 22 | expect(scope.machine).toEqual(jasmine.any(Object)); 23 | }); 24 | 25 | describe('method playLoop', function() { 26 | beforeEach(function() { 27 | spyOn(scope.machine, 'play'); 28 | }); 29 | 30 | it('should tell the machine to start playing', function() { 31 | scope.playLoop(); 32 | expect(scope.machine.play).toHaveBeenCalled(); 33 | }); 34 | }); 35 | 36 | describe('method stopLoop', function() { 37 | beforeEach(function() { 38 | spyOn(scope.machine, 'stop'); 39 | }); 40 | 41 | it('should tell the machine to stop', function() { 42 | scope.stopLoop(); 43 | expect(scope.machine.stop).toHaveBeenCalled(); 44 | }); 45 | }); 46 | 47 | describe('method resetLoop', function() { 48 | beforeEach(function() { 49 | spyOn(scope.machine, 'reset'); 50 | }); 51 | 52 | it('should tell the machine to reset itself', function() { 53 | scope.resetLoop(); 54 | expect(scope.machine.reset).toHaveBeenCalled(); 55 | }); 56 | }); 57 | 58 | describe('method updateTempo', function() { 59 | beforeEach(function() { 60 | spyOn(scope.machine, 'setTempo'); 61 | }); 62 | 63 | it('should tell the machine to update the tempo', function() { 64 | scope.tempo = 120; 65 | scope.updateTempo(); 66 | expect(scope.machine.setTempo).toHaveBeenCalledWith(120); 67 | }); 68 | }); 69 | }); 70 | -------------------------------------------------------------------------------- /test/unit/app/services/drum_machine.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('drumMachine', function() { 4 | var machine; 5 | 6 | beforeEach(module('AngularDrumMachine')); 7 | 8 | beforeEach(inject(function(_drumMachine_) { 9 | machine = _drumMachine_; 10 | })); 11 | 12 | it('should have zero rows', function() { 13 | expect(machine.rows().length).toEqual(0); 14 | }); 15 | 16 | //it('should set up a beats array', function() { 17 | //expect(machine.beats).toEqual(jasmine.any(Object)); 18 | //}); 19 | 20 | //describe('method reset()', function() { 21 | //it('should set the current measure to zero', function() { 22 | //machine.currentMeasure = 50; 23 | //machine.reset(); 24 | //expect(machine.currentMeasure).toEqual(0); 25 | //}); 26 | 27 | //it('should set the current beat to zero', function() { 28 | //machine.currentBeat = 8; 29 | //machine.reset(); 30 | //expect(machine.currentBeat).toEqual(0); 31 | //}); 32 | 33 | //xit('should clear the beats array', function() { 34 | //pending(); 35 | ////machine.beats = [[true,true,true,true,true]]; 36 | ////machine.reset(); 37 | ////expect(machine.beats).toEqual(0); 38 | //}); 39 | //}); 40 | }); 41 | -------------------------------------------------------------------------------- /test/unit/app/services/models/beat.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Beat', function() { 4 | var beat; 5 | 6 | beforeEach(function() { 7 | beat = new Beat(); 8 | }); 9 | 10 | it('should be defined', function() { 11 | expect(beat).toBeDefined(); 12 | }); 13 | 14 | describe('isActive()', function() { 15 | it('should tell if the beat is active', function() { 16 | expect(beat.isActive()).toBe(false); 17 | beat.toggle(); 18 | expect(beat.isActive()).toBe(true); 19 | }); 20 | }); 21 | 22 | describe('activate()', function() { 23 | it('should activate an inactive beat', function() { 24 | expect(beat.isActive()).toBe(false); 25 | beat.activate(); 26 | expect(beat.isActive()).toBe(true); 27 | }); 28 | }); 29 | 30 | describe('deactivate()', function() { 31 | it('should deactivate an active beat', function() { 32 | beat.activate(); 33 | expect(beat.isActive()).toBe(true); 34 | beat.deactivate(); 35 | expect(beat.isActive()).toBe(false); 36 | }); 37 | }); 38 | 39 | describe('toggle function', function() { 40 | it('should activate an inactive beat', function() { 41 | expect(beat.isActive()).toBe(false); 42 | beat.toggle(); 43 | expect(beat.isActive()).toBe(true); 44 | }); 45 | 46 | it('should deactivate an active beat', function() { 47 | beat.activate(); 48 | expect(beat.isActive()).toBe(true); 49 | beat.toggle(); 50 | expect(beat.isActive()).toBe(false); 51 | }); 52 | }); 53 | }); 54 | -------------------------------------------------------------------------------- /test/unit/app/services/models/instrument.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Instrument', function() { 4 | var instrument; 5 | 6 | beforeEach(function() { 7 | var inst = { 'file': 'test.mp3', 'name': 'Fat Kick', 'description': 'It is fat.' }; 8 | var howler = { play: function() {}, urls: [] }; 9 | //spyOn(howler, 'play'); 10 | 11 | instrument = new Instrument(howler, inst); 12 | }); 13 | 14 | it('should be defined', function() { 15 | expect(instrument).toBeDefined(); 16 | }); 17 | 18 | describe('getName()', function() { 19 | it('should return the name', function() { 20 | expect(instrument.getName()).toEqual('Fat Kick'); 21 | }); 22 | }); 23 | 24 | describe('getDescription()', function() { 25 | it('should return the description', function() { 26 | expect(instrument.getDescription()).toEqual('It is fat.'); 27 | }); 28 | }); 29 | 30 | describe('play()', function() { 31 | it('should attempt to play the sound', function() { 32 | expect(instrument.play()).toBe(true); 33 | }); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /test/unit/app/services/models/row.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('Row', function() { 4 | var row; 5 | 6 | beforeEach(function() { 7 | var instrument = { getName: function() { return "Crash" }, play: function() { return true; } }; 8 | row = new Row(instrument, 8); 9 | }); 10 | 11 | it('should be defined', function() { 12 | expect(row).toBeDefined(); 13 | }); 14 | 15 | describe('getInstrument()', function() { 16 | it('should return an instrument with a name', function() { 17 | // TODO: It would be better if this worked, but how do we mock an Instrument and have it return the proper type 18 | //expect(row.getInstrument()).toEqual(jasmine.any(Instrument)); 19 | expect(row.getInstrument().getName()).toEqual("Crash"); 20 | }); 21 | }); 22 | 23 | describe('getBeats()', function() { 24 | it('should return an array', function() { 25 | expect(row.getBeats()).toEqual(jasmine.any(Array)); 26 | }); 27 | 28 | it('should default to 8 beats', function() { 29 | expect(row.getBeats().length).toEqual(8); 30 | }); 31 | }); 32 | 33 | describe('addBeats()', function() { 34 | it('should add a single beat', function() { 35 | expect(row.getBeats().length).toEqual(8); 36 | row.addBeats(1); 37 | expect(row.getBeats().length).toEqual(9); 38 | }); 39 | 40 | it('should add multiple beats', function() { 41 | expect(row.getBeats().length).toEqual(8); 42 | row.addBeats(8); 43 | expect(row.getBeats().length).toEqual(16); 44 | }); 45 | }); 46 | 47 | describe('reset()', function() { 48 | it('should deactivate all beats', function() { 49 | row.getBeats()[0].activate(); 50 | expect(row.getBeats()[0].isActive()).toBe(true); 51 | row.getBeats()[6].activate(); 52 | expect(row.getBeats()[6].isActive()).toBe(true); 53 | 54 | row.reset(); 55 | expect(row.getBeats()[0].isActive()).toBe(false); 56 | expect(row.getBeats()[0].isActive()).toBe(false); 57 | }); 58 | }); 59 | 60 | describe('playSound()', function() { 61 | it('should play the sound if the beat is active', function() { 62 | row.getBeats()[0].activate(); 63 | expect(row.getBeats()[0].isActive()).toBe(true); 64 | expect(row.playSound(0)).toBe(true); 65 | }); 66 | 67 | it('should do nothing if beat is inactive', function() { 68 | expect(row.getBeats()[0].isActive()).toBe(false); 69 | expect(row.playSound(0)).toBe(false); 70 | }); 71 | }); 72 | }); 73 | 74 | -------------------------------------------------------------------------------- /test/unit/app/services/timer_queue.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | describe('timerQueue', function() { 4 | var timerQueue, queue; 5 | 6 | beforeEach(module('AngularDrumMachine')); 7 | 8 | beforeEach(inject(function(_timerQueue_) { 9 | timerQueue = _timerQueue_; 10 | queue = timerQueue.queue.call(timerQueue); 11 | })); 12 | 13 | it('should start with an empty queue', function() { 14 | expect(queue.length).toEqual(0); 15 | }); 16 | 17 | describe('method add()', function() { 18 | it('should add a new item to the queue', function() { 19 | timerQueue.add(function() {}, 5000); 20 | expect(queue.length).toEqual(1); 21 | }); 22 | 23 | it('should add multiple items to the queue', function() { 24 | timerQueue.add(function() {}, 5000); 25 | timerQueue.add(function() {}, 5000); 26 | timerQueue.add(function() {}, 5000); 27 | expect(queue.length).toEqual(3); 28 | }); 29 | }); 30 | 31 | describe('method clear()', function() { 32 | it('should not fail if the queue is empty', function() { 33 | expect(queue.length).toEqual(0); 34 | expect(timerQueue.clear).not.toThrow(); 35 | }); 36 | 37 | it('should clear a single item from the queue', function() { 38 | timerQueue.add(function() {}, 5000); 39 | timerQueue.clear(); 40 | expect(timerQueue.queue().length).toEqual(0); 41 | }); 42 | }); 43 | }); 44 | --------------------------------------------------------------------------------