reqless 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +8 -0
- data/README.md +648 -0
- data/Rakefile +117 -0
- data/bin/docker-build-and-test +22 -0
- data/exe/reqless-web +11 -0
- data/lib/reqless/config.rb +31 -0
- data/lib/reqless/failure_formatter.rb +43 -0
- data/lib/reqless/job.rb +496 -0
- data/lib/reqless/job_reservers/ordered.rb +29 -0
- data/lib/reqless/job_reservers/round_robin.rb +46 -0
- data/lib/reqless/job_reservers/shuffled_round_robin.rb +21 -0
- data/lib/reqless/lua/reqless-lib.lua +2965 -0
- data/lib/reqless/lua/reqless.lua +2545 -0
- data/lib/reqless/lua_script.rb +90 -0
- data/lib/reqless/middleware/requeue_exceptions.rb +94 -0
- data/lib/reqless/middleware/retry_exceptions.rb +72 -0
- data/lib/reqless/middleware/sentry.rb +66 -0
- data/lib/reqless/middleware/timeout.rb +63 -0
- data/lib/reqless/queue.rb +189 -0
- data/lib/reqless/queue_priority_pattern.rb +16 -0
- data/lib/reqless/server/static/css/bootstrap-responsive.css +686 -0
- data/lib/reqless/server/static/css/bootstrap-responsive.min.css +12 -0
- data/lib/reqless/server/static/css/bootstrap.css +3991 -0
- data/lib/reqless/server/static/css/bootstrap.min.css +689 -0
- data/lib/reqless/server/static/css/codemirror.css +112 -0
- data/lib/reqless/server/static/css/docs.css +839 -0
- data/lib/reqless/server/static/css/jquery.noty.css +105 -0
- data/lib/reqless/server/static/css/noty_theme_twitter.css +137 -0
- data/lib/reqless/server/static/css/style.css +200 -0
- data/lib/reqless/server/static/favicon.ico +0 -0
- data/lib/reqless/server/static/img/glyphicons-halflings-white.png +0 -0
- data/lib/reqless/server/static/img/glyphicons-halflings.png +0 -0
- data/lib/reqless/server/static/js/bootstrap-alert.js +94 -0
- data/lib/reqless/server/static/js/bootstrap-scrollspy.js +125 -0
- data/lib/reqless/server/static/js/bootstrap-tab.js +130 -0
- data/lib/reqless/server/static/js/bootstrap-tooltip.js +270 -0
- data/lib/reqless/server/static/js/bootstrap-typeahead.js +285 -0
- data/lib/reqless/server/static/js/bootstrap.js +1726 -0
- data/lib/reqless/server/static/js/bootstrap.min.js +6 -0
- data/lib/reqless/server/static/js/codemirror.js +2972 -0
- data/lib/reqless/server/static/js/jquery.noty.js +220 -0
- data/lib/reqless/server/static/js/mode/javascript.js +360 -0
- data/lib/reqless/server/static/js/theme/cobalt.css +18 -0
- data/lib/reqless/server/static/js/theme/eclipse.css +25 -0
- data/lib/reqless/server/static/js/theme/elegant.css +10 -0
- data/lib/reqless/server/static/js/theme/lesser-dark.css +45 -0
- data/lib/reqless/server/static/js/theme/monokai.css +28 -0
- data/lib/reqless/server/static/js/theme/neat.css +9 -0
- data/lib/reqless/server/static/js/theme/night.css +21 -0
- data/lib/reqless/server/static/js/theme/rubyblue.css +21 -0
- data/lib/reqless/server/static/js/theme/xq-dark.css +46 -0
- data/lib/reqless/server/views/_job.erb +259 -0
- data/lib/reqless/server/views/_job_list.erb +8 -0
- data/lib/reqless/server/views/_pagination.erb +7 -0
- data/lib/reqless/server/views/about.erb +130 -0
- data/lib/reqless/server/views/completed.erb +11 -0
- data/lib/reqless/server/views/config.erb +14 -0
- data/lib/reqless/server/views/failed.erb +48 -0
- data/lib/reqless/server/views/failed_type.erb +18 -0
- data/lib/reqless/server/views/job.erb +17 -0
- data/lib/reqless/server/views/layout.erb +451 -0
- data/lib/reqless/server/views/overview.erb +137 -0
- data/lib/reqless/server/views/queue.erb +125 -0
- data/lib/reqless/server/views/queues.erb +45 -0
- data/lib/reqless/server/views/tag.erb +6 -0
- data/lib/reqless/server/views/throttles.erb +38 -0
- data/lib/reqless/server/views/track.erb +75 -0
- data/lib/reqless/server/views/worker.erb +34 -0
- data/lib/reqless/server/views/workers.erb +14 -0
- data/lib/reqless/server.rb +549 -0
- data/lib/reqless/subscriber.rb +74 -0
- data/lib/reqless/test_helpers/worker_helpers.rb +55 -0
- data/lib/reqless/throttle.rb +57 -0
- data/lib/reqless/version.rb +5 -0
- data/lib/reqless/worker/base.rb +237 -0
- data/lib/reqless/worker/forking.rb +215 -0
- data/lib/reqless/worker/serial.rb +41 -0
- data/lib/reqless/worker.rb +5 -0
- data/lib/reqless.rb +309 -0
- metadata +399 -0
| @@ -0,0 +1,105 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            /* CORE STYLES */
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            	/* noty bar */
         | 
| 5 | 
            +
            	.noty_bar {
         | 
| 6 | 
            +
            		position: fixed;
         | 
| 7 | 
            +
            		display: none;
         | 
| 8 | 
            +
            		z-index: 9999999;
         | 
| 9 | 
            +
            	}
         | 
| 10 | 
            +
            	
         | 
| 11 | 
            +
            	/* noty_message */
         | 
| 12 | 
            +
            	.noty_bar .noty_message {
         | 
| 13 | 
            +
            		text-align: center;
         | 
| 14 | 
            +
            	}
         | 
| 15 | 
            +
            	
         | 
| 16 | 
            +
            	/* noty close button */
         | 
| 17 | 
            +
            	.noty_bar .noty_close {
         | 
| 18 | 
            +
            		cursor: pointer;
         | 
| 19 | 
            +
            	}
         | 
| 20 | 
            +
            	
         | 
| 21 | 
            +
            	/* noty modal */
         | 
| 22 | 
            +
            	.noty_modal {
         | 
| 23 | 
            +
            		position: fixed;
         | 
| 24 | 
            +
            		width: 100%;
         | 
| 25 | 
            +
            		height: 100%;
         | 
| 26 | 
            +
            		background-color: #000;
         | 
| 27 | 
            +
            		z-index: 10000;
         | 
| 28 | 
            +
            		opacity: 0.6;
         | 
| 29 | 
            +
            		display: none;
         | 
| 30 | 
            +
            		left: 0;
         | 
| 31 | 
            +
            		top: 0;
         | 
| 32 | 
            +
            	}
         | 
| 33 | 
            +
            	
         | 
| 34 | 
            +
            	/* noty container for noty_layout_topLeft & noty_layout_topRight */
         | 
| 35 | 
            +
            	ul.noty_cont {
         | 
| 36 | 
            +
            		position: fixed;
         | 
| 37 | 
            +
            		z-index: 10000000;
         | 
| 38 | 
            +
            		margin: 0px;
         | 
| 39 | 
            +
            		padding: 0px;
         | 
| 40 | 
            +
            		list-style: none;
         | 
| 41 | 
            +
            		width: 300px;
         | 
| 42 | 
            +
            	}
         | 
| 43 | 
            +
            	ul.noty_cont li {
         | 
| 44 | 
            +
            		position: relative;
         | 
| 45 | 
            +
            		float: left;
         | 
| 46 | 
            +
            		clear: both;
         | 
| 47 | 
            +
            		list-style: none;
         | 
| 48 | 
            +
            		padding: 0px;
         | 
| 49 | 
            +
            		margin: 10px 0 0 0;
         | 
| 50 | 
            +
            		width: 300px; /* Fix for: http://bugs.jquery.com/ticket/2278 */
         | 
| 51 | 
            +
            	}
         | 
| 52 | 
            +
            	ul.noty_cont.noty_layout_topLeft {left:20px; top:20px;}
         | 
| 53 | 
            +
            	ul.noty_cont.noty_layout_topRight {right:40px; top:20px;}
         | 
| 54 | 
            +
            	ul.noty_cont.noty_layout_bottomLeft {left:20px; bottom:20px}
         | 
| 55 | 
            +
            	ul.noty_cont.noty_layout_bottomRight {right:40px; bottom:20px}
         | 
| 56 | 
            +
            	ul.noty_cont.noty_layout_topRight li {float:right}
         | 
| 57 | 
            +
             | 
| 58 | 
            +
            /* LAYOUTS */
         | 
| 59 | 
            +
             | 
| 60 | 
            +
            	/* noty_layout_top */
         | 
| 61 | 
            +
            	.noty_bar.noty_layout_top {
         | 
| 62 | 
            +
            		top: 0;
         | 
| 63 | 
            +
            		left: 0;
         | 
| 64 | 
            +
            		width: 100%;
         | 
| 65 | 
            +
            		-webkit-border-radius: 0px;
         | 
| 66 | 
            +
            		-moz-border-radius: 0px;
         | 
| 67 | 
            +
            		border-radius: 0px;
         | 
| 68 | 
            +
            	}
         | 
| 69 | 
            +
             | 
| 70 | 
            +
            	/* noty_layout_bottom */
         | 
| 71 | 
            +
            	.noty_bar.noty_layout_bottom {
         | 
| 72 | 
            +
            		bottom: 0;
         | 
| 73 | 
            +
            		left: 0;
         | 
| 74 | 
            +
            		width: 100%;
         | 
| 75 | 
            +
            		-webkit-border-radius: 0px;
         | 
| 76 | 
            +
            		-moz-border-radius: 0px;
         | 
| 77 | 
            +
            		border-radius: 0px;
         | 
| 78 | 
            +
            	}
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            	/* noty_layout_center */
         | 
| 81 | 
            +
            	.noty_bar.noty_layout_center {
         | 
| 82 | 
            +
            		top: 40%;
         | 
| 83 | 
            +
            	}
         | 
| 84 | 
            +
            	
         | 
| 85 | 
            +
            	/* noty_layout_topLeft & noty_layout_topRight */
         | 
| 86 | 
            +
            	.noty_bar.noty_layout_topLeft, 
         | 
| 87 | 
            +
            	.noty_bar.noty_layout_topRight,
         | 
| 88 | 
            +
            	.noty_bar.noty_layout_bottomLeft,
         | 
| 89 | 
            +
            	.noty_bar.noty_layout_bottomRight {
         | 
| 90 | 
            +
            		width: 100%;
         | 
| 91 | 
            +
            		clear: both;
         | 
| 92 | 
            +
            		position: relative;
         | 
| 93 | 
            +
            	}
         | 
| 94 | 
            +
            	
         | 
| 95 | 
            +
            	.noty_bar.noty_layout_topLeft .noty_message, 
         | 
| 96 | 
            +
            	.noty_bar.noty_layout_topRight .noty_message,
         | 
| 97 | 
            +
            	.noty_bar.noty_layout_bottomLeft .noty_message,
         | 
| 98 | 
            +
            	.noty_bar.noty_layout_bottomRight .noty_message {
         | 
| 99 | 
            +
            		text-align: left;
         | 
| 100 | 
            +
            	}
         | 
| 101 | 
            +
            	
         | 
| 102 | 
            +
            	/* noty_layout_topCenter */
         | 
| 103 | 
            +
            	.noty_bar.noty_layout_topCenter {
         | 
| 104 | 
            +
            		top: 20px;
         | 
| 105 | 
            +
            	}
         | 
| @@ -0,0 +1,137 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            /* CORE STYLES*/
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            	/* noty bar */
         | 
| 5 | 
            +
            	.noty_bar.noty_theme_twitter {
         | 
| 6 | 
            +
                font-size: 13px;
         | 
| 7 | 
            +
                line-height: 18px;
         | 
| 8 | 
            +
                text-shadow: 0 1px 0 #fff;
         | 
| 9 | 
            +
                font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
         | 
| 10 | 
            +
            	}
         | 
| 11 | 
            +
            	
         | 
| 12 | 
            +
            	/* custom container */
         | 
| 13 | 
            +
            	.noty_custom_container.noty_theme_twitter.noty_layout_inline {
         | 
| 14 | 
            +
            		position: relative;
         | 
| 15 | 
            +
            	}
         | 
| 16 | 
            +
            	
         | 
| 17 | 
            +
            	/* custom growl container */
         | 
| 18 | 
            +
            	.noty_custom_container.noty_theme_twitter.noty_layout_inline .noty_cont.noty_layout_inline {
         | 
| 19 | 
            +
            		position: static;
         | 
| 20 | 
            +
            	}
         | 
| 21 | 
            +
            		/* custom noty bar */
         | 
| 22 | 
            +
            		.noty_custom_container.noty_theme_twitter.noty_layout_inline .noty_bar {
         | 
| 23 | 
            +
            			position: static;
         | 
| 24 | 
            +
            		}
         | 
| 25 | 
            +
            			.noty_custom_container.noty_theme_twitter.noty_layout_inline .noty_bar .noty_message {
         | 
| 26 | 
            +
            				font-size: 13px;
         | 
| 27 | 
            +
            				padding: 4px;
         | 
| 28 | 
            +
            			}
         | 
| 29 | 
            +
            				.noty_custom_container.noty_theme_twitter.noty_layout_inline .noty_bar .noty_message .noty_buttons {
         | 
| 30 | 
            +
            					margin-top: -1px;
         | 
| 31 | 
            +
            				}
         | 
| 32 | 
            +
            	
         | 
| 33 | 
            +
            	/* noty_message */
         | 
| 34 | 
            +
            	.noty_bar.noty_theme_twitter .noty_message {
         | 
| 35 | 
            +
            		padding: 8px 14px;
         | 
| 36 | 
            +
            	}
         | 
| 37 | 
            +
            	/* noty_has_close_button */
         | 
| 38 | 
            +
            	.noty_bar.noty_theme_twitter.noty_closable .noty_message {
         | 
| 39 | 
            +
            		padding: 8px 35px 8px 14px;
         | 
| 40 | 
            +
            	}
         | 
| 41 | 
            +
            	
         | 
| 42 | 
            +
            	/* noty_buttons */
         | 
| 43 | 
            +
            	.noty_bar.noty_theme_twitter .noty_message .noty_buttons {
         | 
| 44 | 
            +
            		float: right;
         | 
| 45 | 
            +
            		margin-top: -5px;
         | 
| 46 | 
            +
            		margin-left: 4px;
         | 
| 47 | 
            +
            	}
         | 
| 48 | 
            +
            	
         | 
| 49 | 
            +
            	/* noty_button */
         | 
| 50 | 
            +
            	.noty_bar.noty_theme_twitter .noty_message .noty_buttons button {
         | 
| 51 | 
            +
            		margin-left: 5px;
         | 
| 52 | 
            +
            	}
         | 
| 53 | 
            +
            	
         | 
| 54 | 
            +
            	/* noty close button */
         | 
| 55 | 
            +
            	.noty_bar.noty_theme_twitter .noty_close {
         | 
| 56 | 
            +
            		position: absolute;
         | 
| 57 | 
            +
            		top: 7px;
         | 
| 58 | 
            +
            		right: 16px;
         | 
| 59 | 
            +
            		font-size: 18px;
         | 
| 60 | 
            +
            		line-height: 18px;
         | 
| 61 | 
            +
            		font-weight: bold;
         | 
| 62 | 
            +
            		color: #000;
         | 
| 63 | 
            +
            		opacity: 0.2;
         | 
| 64 | 
            +
            		text-shadow: 0 1px 0 #fff;
         | 
| 65 | 
            +
            	}
         | 
| 66 | 
            +
            	
         | 
| 67 | 
            +
            	/* noty close button hover */
         | 
| 68 | 
            +
            	.noty_bar.noty_theme_twitter .noty_close:hover {
         | 
| 69 | 
            +
            		opacity: 0.4;
         | 
| 70 | 
            +
            	}
         | 
| 71 | 
            +
            	
         | 
| 72 | 
            +
            	.noty_bar.noty_theme_twitter .noty_close:after {
         | 
| 73 | 
            +
            		content: "x";
         | 
| 74 | 
            +
            	}
         | 
| 75 | 
            +
            	
         | 
| 76 | 
            +
            	/* noty modal */
         | 
| 77 | 
            +
            	.noty_modal.noty_theme_twitter {
         | 
| 78 | 
            +
            		opacity: 0.7;
         | 
| 79 | 
            +
            	}
         | 
| 80 | 
            +
            	
         | 
| 81 | 
            +
            /* LAYOUTS */
         | 
| 82 | 
            +
             | 
| 83 | 
            +
            	/* noty_layout_topLeft & noty_layout_topRight */
         | 
| 84 | 
            +
            	.noty_bar.noty_theme_twitter.noty_layout_center,
         | 
| 85 | 
            +
            	.noty_bar.noty_theme_twitter.noty_layout_topCenter,
         | 
| 86 | 
            +
            	.noty_bar.noty_theme_twitter.noty_layout_topLeft,
         | 
| 87 | 
            +
            	.noty_bar.noty_theme_twitter.noty_layout_topRight,
         | 
| 88 | 
            +
            	.noty_bar.noty_theme_twitter.noty_layout_bottomLeft,
         | 
| 89 | 
            +
            	.noty_bar.noty_theme_twitter.noty_layout_bottomRight {
         | 
| 90 | 
            +
            		-webkit-border-radius: 4px;
         | 
| 91 | 
            +
            		-moz-border-radius: 4px;
         | 
| 92 | 
            +
            		border-radius: 4px;
         | 
| 93 | 
            +
            	}
         | 
| 94 | 
            +
            	.noty_bar.noty_theme_twitter.noty_layout_topLeft .noty_message .noty_buttons,
         | 
| 95 | 
            +
            	.noty_bar.noty_theme_twitter.noty_layout_topRight .noty_message .noty_buttons,
         | 
| 96 | 
            +
            	.noty_bar.noty_theme_twitter.noty_layout_bottomLeft .noty_message .noty_buttons,
         | 
| 97 | 
            +
            	.noty_bar.noty_theme_twitter.noty_layout_bottomRight .noty_message .noty_buttons {
         | 
| 98 | 
            +
            		float: none;
         | 
| 99 | 
            +
            		border-top: 1px solid #FBEED5;
         | 
| 100 | 
            +
            	  margin-left: 0;
         | 
| 101 | 
            +
            	  margin-top: 10px;
         | 
| 102 | 
            +
            	  padding-top: 10px;
         | 
| 103 | 
            +
            	  text-align: right;
         | 
| 104 | 
            +
            	}
         | 
| 105 | 
            +
            	
         | 
| 106 | 
            +
            	.noty_bar.noty_theme_twitter.noty_layout_center .noty_message .noty_buttons,
         | 
| 107 | 
            +
            	.noty_bar.noty_theme_twitter.noty_layout_topCenter .noty_message .noty_buttons {
         | 
| 108 | 
            +
            		margin-left: 15px;
         | 
| 109 | 
            +
            		margin-top: -2px
         | 
| 110 | 
            +
            	}
         | 
| 111 | 
            +
            	
         | 
| 112 | 
            +
            /* NOTIFICATION TYPES */
         | 
| 113 | 
            +
             | 
| 114 | 
            +
            	/* noty_alert */
         | 
| 115 | 
            +
            	.noty_bar.noty_theme_twitter.noty_alert {
         | 
| 116 | 
            +
            		background-color: #FCF8E3;
         | 
| 117 | 
            +
            		border: 1px solid #FBEED5;
         | 
| 118 | 
            +
            		color: #C09853;
         | 
| 119 | 
            +
            	}
         | 
| 120 | 
            +
            	/* noty_error */
         | 
| 121 | 
            +
            	.noty_bar.noty_theme_twitter.noty_error {
         | 
| 122 | 
            +
            		background-color: #F2DEDE;
         | 
| 123 | 
            +
            		border: 1px solid #EED3D7;
         | 
| 124 | 
            +
            		color: #B94A48;
         | 
| 125 | 
            +
            	}
         | 
| 126 | 
            +
            	/* noty_success */
         | 
| 127 | 
            +
            	.noty_bar.noty_theme_twitter.noty_success {
         | 
| 128 | 
            +
            		background-color: #DFF0D8;
         | 
| 129 | 
            +
            		border: 1px solid #D6E9C6;
         | 
| 130 | 
            +
            		color: #468847;
         | 
| 131 | 
            +
            	}
         | 
| 132 | 
            +
            	/* noty_information */
         | 
| 133 | 
            +
            	.noty_bar.noty_theme_twitter.noty_information {
         | 
| 134 | 
            +
            		background-color: #D9EDF7;
         | 
| 135 | 
            +
            		border: 1px solid #BCE8F1;
         | 
| 136 | 
            +
            		color: #3A87AD;
         | 
| 137 | 
            +
            	}
         | 
| @@ -0,0 +1,200 @@ | |
| 1 | 
            +
            /* @override http://localhost:4567/css/style.css */
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            .queue-name {
         | 
| 4 | 
            +
            	font-size: 25px;
         | 
| 5 | 
            +
            	font-weight: bold;
         | 
| 6 | 
            +
            }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            .queue-summary {
         | 
| 9 | 
            +
            	font-size: 20px;
         | 
| 10 | 
            +
            }
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            .queue-summary-description {
         | 
| 13 | 
            +
            	font-size: 12px;
         | 
| 14 | 
            +
            	color: lightgrey;
         | 
| 15 | 
            +
            }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            .queue-stats {
         | 
| 18 | 
            +
            	margin-top: 10px;
         | 
| 19 | 
            +
            }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            .queue-stats-date {}
         | 
| 22 | 
            +
            .queue-stats-failures {}
         | 
| 23 | 
            +
            .queue-stats-time {}
         | 
| 24 | 
            +
            .queue-stats-wait {}
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            .queue-stats-time-title {
         | 
| 27 | 
            +
            	font-size: 20px;
         | 
| 28 | 
            +
            	width: 100%;
         | 
| 29 | 
            +
            	text-align: center;
         | 
| 30 | 
            +
            	margin-bottom: 10px;
         | 
| 31 | 
            +
            	margin-top: 10px;
         | 
| 32 | 
            +
            }
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            .queue-stats-time-summary {
         | 
| 35 | 
            +
            	text-align: center;
         | 
| 36 | 
            +
            }
         | 
| 37 | 
            +
             | 
| 38 | 
            +
            .queue-stats-time-histogram-wait {}
         | 
| 39 | 
            +
            .queue-stats-time-histogram-run {}
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            .job-id {
         | 
| 42 | 
            +
            	float: left;
         | 
| 43 | 
            +
            	font-size: 20px;
         | 
| 44 | 
            +
            	font-weight: bold;
         | 
| 45 | 
            +
            	padding-bottom: 10px;
         | 
| 46 | 
            +
            }
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            .job-priority {
         | 
| 49 | 
            +
            	font-size: 16px;
         | 
| 50 | 
            +
            	padding-left: 5px;
         | 
| 51 | 
            +
            }
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            .button {
         | 
| 54 | 
            +
            	background-color: darkgray;
         | 
| 55 | 
            +
            	float: left;
         | 
| 56 | 
            +
            	-webkit-border-radius: 5px;
         | 
| 57 | 
            +
            	-moz-border-radius: 5px;
         | 
| 58 | 
            +
            	border-radius: 5px;
         | 
| 59 | 
            +
            	color: white;
         | 
| 60 | 
            +
            	font-weight: bold;
         | 
| 61 | 
            +
            	padding-top: 2px;
         | 
| 62 | 
            +
            	padding-left: 7px;
         | 
| 63 | 
            +
            	padding-right: 7px;
         | 
| 64 | 
            +
            	padding-bottom: 3px;
         | 
| 65 | 
            +
            	margin-left: 5px;
         | 
| 66 | 
            +
             | 
| 67 | 
            +
            }
         | 
| 68 | 
            +
             | 
| 69 | 
            +
            .cancel-button {
         | 
| 70 | 
            +
            	background-color: red;
         | 
| 71 | 
            +
            }
         | 
| 72 | 
            +
             | 
| 73 | 
            +
            .job-tags {	
         | 
| 74 | 
            +
            	clear: both;
         | 
| 75 | 
            +
            	margin-left: 15px;
         | 
| 76 | 
            +
            }
         | 
| 77 | 
            +
             | 
| 78 | 
            +
            .job-tag {
         | 
| 79 | 
            +
            	border: none;
         | 
| 80 | 
            +
            	-webkit-border-radius: 15px;
         | 
| 81 | 
            +
            	-moz-border-radius: 15px;
         | 
| 82 | 
            +
            	border-radius: 15px;
         | 
| 83 | 
            +
            	padding-left: 10px;
         | 
| 84 | 
            +
            	padding-right: 10px;
         | 
| 85 | 
            +
            }
         | 
| 86 | 
            +
             | 
| 87 | 
            +
            .job-summary-container > .job-tags {
         | 
| 88 | 
            +
            	float: left;
         | 
| 89 | 
            +
            	clear: none;
         | 
| 90 | 
            +
            	margin-top: 1px;
         | 
| 91 | 
            +
            }
         | 
| 92 | 
            +
             | 
| 93 | 
            +
            .job-summary-container > .job-summary {
         | 
| 94 | 
            +
            	float: left;
         | 
| 95 | 
            +
            	clear: none;
         | 
| 96 | 
            +
            	margin-top: -7px;
         | 
| 97 | 
            +
            	padding-left: 12px;
         | 
| 98 | 
            +
            }
         | 
| 99 | 
            +
             | 
| 100 | 
            +
            .job-summary {
         | 
| 101 | 
            +
            	clear: both;
         | 
| 102 | 
            +
            	padding-top: 10px;
         | 
| 103 | 
            +
            	font-size: 16px;
         | 
| 104 | 
            +
            }
         | 
| 105 | 
            +
             | 
| 106 | 
            +
            .job-state, .job-queue, .job-worker {
         | 
| 107 | 
            +
            	font-weight: bold;
         | 
| 108 | 
            +
            }
         | 
| 109 | 
            +
             | 
| 110 | 
            +
            .job-data-container {
         | 
| 111 | 
            +
            	margin-top: 10px;
         | 
| 112 | 
            +
            	border: 2px solid black;
         | 
| 113 | 
            +
            }
         | 
| 114 | 
            +
             | 
| 115 | 
            +
            html { background:#efefef; font-family:Arial, Verdana, sans-serif; font-size:13px; }
         | 
| 116 | 
            +
            body { padding:0; margin:0; }
         | 
| 117 | 
            +
             | 
| 118 | 
            +
            .header { background:#000; padding:8px 5% 0 5%; border-bottom:1px solid #444;border-bottom:5px solid #4d87e2;}
         | 
| 119 | 
            +
            .header h1 { color:#333; font-size:90%; font-weight:bold; margin-bottom:6px;}
         | 
| 120 | 
            +
            .header ul li { display:inline;}
         | 
| 121 | 
            +
            .header ul li a { color:#fff; text-decoration:none; margin-right:10px; display:inline-block;  padding:8px; -webkit-border-top-right-radius:6px; -webkit-border-top-left-radius:6px; -moz-border-radius-topleft:6px; -moz-border-radius-topright:6px; }
         | 
| 122 | 
            +
            .header ul li a:hover { background:#333;}
         | 
| 123 | 
            +
            .header ul li.current a { background:#ce1212; font-weight:bold; color:#fff;}
         | 
| 124 | 
            +
             | 
| 125 | 
            +
            .header .namespace { position: absolute; right: 75px; top: 10px; color: #7A7A7A; }
         | 
| 126 | 
            +
             | 
| 127 | 
            +
            .subnav { padding:2px 5% 7px 5%; background:#ce1212; font-size:90%;}
         | 
| 128 | 
            +
            .subnav li { display:inline;}
         | 
| 129 | 
            +
            .subnav li a { color:#fff; text-decoration:none; margin-right:10px; display:inline-block; background:#dd5b5b; padding:5px; -webkit-border-radius:3px; -moz-border-radius:3px;}
         | 
| 130 | 
            +
            .subnav li.current a { background:#fff; font-weight:bold; color:#ce1212;}
         | 
| 131 | 
            +
            .subnav li a:active { background:#b00909;}
         | 
| 132 | 
            +
             | 
| 133 | 
            +
            #main { padding:10px 5%; background:#fff; overflow:hidden; }
         | 
| 134 | 
            +
            #main .logo { float:right; margin:10px;}
         | 
| 135 | 
            +
            #main span.hl { background:#efefef; padding:2px;}
         | 
| 136 | 
            +
            #main h1 { margin:10px 0; font-size:190%; font-weight:bold; color:#ce1212;}
         | 
| 137 | 
            +
            #main h2 { margin:10px 0; font-size:130%;}
         | 
| 138 | 
            +
            #main table { width:100%; margin:10px 0;}
         | 
| 139 | 
            +
            #main table tr td, #main table tr th { border:1px solid #ccc; padding:6px;}
         | 
| 140 | 
            +
            #main table tr th { background:#efefef; color:#888; font-size:80%; font-weight:bold;}
         | 
| 141 | 
            +
            #main table tr td.no-data { text-align:center; padding:40px 0; color:#999; font-style:italic; font-size:130%;}
         | 
| 142 | 
            +
            #main a { color:#111;}
         | 
| 143 | 
            +
            #main p { margin:5px 0;}
         | 
| 144 | 
            +
            #main p.intro { margin-bottom:15px; font-size:85%; color:#999; margin-top:0; line-height:1.3;}
         | 
| 145 | 
            +
            #main h1.wi { margin-bottom:5px;}
         | 
| 146 | 
            +
            #main p.sub { font-size:95%; color:#999;}
         | 
| 147 | 
            +
             | 
| 148 | 
            +
            #main table.queues { width:40%;}
         | 
| 149 | 
            +
            #main table.queues td.queue { font-weight:bold; width:50%;}
         | 
| 150 | 
            +
            #main table.queues tr.failed td { border-top:2px solid; font-size:90%; }
         | 
| 151 | 
            +
            #main table.queues tr.failure td { background:#ffecec; border-top:2px solid #d37474; font-size:90%; color:#d37474;}
         | 
| 152 | 
            +
            #main table.queues tr.failure td a{ color:#d37474;}
         | 
| 153 | 
            +
             | 
| 154 | 
            +
            #main table.jobs td.class { font-family:Monaco, "Courier New", monospace; font-size:90%; width:50%;}
         | 
| 155 | 
            +
            #main table.jobs td.args{ width:50%;}
         | 
| 156 | 
            +
             | 
| 157 | 
            +
            #main table.workers td.icon {width:1%; background:#efefef;text-align:center;}
         | 
| 158 | 
            +
            #main table.workers td.icon img { height: 16px; width: 16px; }
         | 
| 159 | 
            +
            #main table.workers td.where { width:25%;}
         | 
| 160 | 
            +
            #main table.workers td.queues { width:35%;}
         | 
| 161 | 
            +
            #main .queue-tag { background:#b1d2e9; padding:2px; margin:0 3px; font-size:80%; text-decoration:none; text-transform:uppercase; font-weight:bold; color:#3274a2; -webkit-border-radius:4px; -moz-border-radius:4px;}
         | 
| 162 | 
            +
            #main table.workers td.queues.queue { width:10%;}
         | 
| 163 | 
            +
            #main table.workers td.process { width:35%;}
         | 
| 164 | 
            +
            #main table.workers td.process span.waiting { color:#999; font-size:90%;}
         | 
| 165 | 
            +
            #main table.workers td.process small { font-size:80%; margin-left:5px;}
         | 
| 166 | 
            +
            #main table.workers td.process code { font-family:Monaco, "Courier New", monospace; font-size:90%;}
         | 
| 167 | 
            +
            #main table.workers td.process small a { color:#999;}
         | 
| 168 | 
            +
            #main.polling table.workers tr.working td { background:#f4ffe4; color:#7ac312;}
         | 
| 169 | 
            +
            #main.polling table.workers tr.working td.where a { color:#7ac312;}
         | 
| 170 | 
            +
            #main.polling table.workers tr.working td.process code { font-weight:bold;}
         | 
| 171 | 
            +
             | 
| 172 | 
            +
             | 
| 173 | 
            +
            #main table.stats th { font-size:100%; width:40%; color:#000;}
         | 
| 174 | 
            +
            #main hr { border:0; border-top:5px solid #efefef;  margin:15px 0;}
         | 
| 175 | 
            +
             | 
| 176 | 
            +
            #footer { padding:10px 5%; background:#efefef; color:#999; font-size:85%; line-height:1.5; border-top:5px solid #ccc; padding-top:10px;}
         | 
| 177 | 
            +
            #footer p a { color:#999;}
         | 
| 178 | 
            +
             | 
| 179 | 
            +
            #main p.poll { background:url(poll.png) no-repeat 0 2px; padding:3px 0; padding-left:23px; float:right; font-size:85%; }
         | 
| 180 | 
            +
             | 
| 181 | 
            +
            #main ul.failed {}
         | 
| 182 | 
            +
            #main ul.failed li {background:-webkit-gradient(linear, left top, left bottom, from(#efefef), to(#fff)) #efefef; margin-top:10px; padding:10px; overflow:hidden; -webkit-border-radius:5px; border:1px solid #ccc; }
         | 
| 183 | 
            +
            #main ul.failed li dl dt {font-size:80%; color:#999; width:60px; float:left; padding-top:1px; text-align:right;}
         | 
| 184 | 
            +
            #main ul.failed li dl dd {margin-bottom:10px; margin-left:70px;}
         | 
| 185 | 
            +
            #main ul.failed li dl dd .retried { float:right; text-align: right; }
         | 
| 186 | 
            +
            #main ul.failed li dl dd .retried .remove { display:none; margin-top: 8px; }
         | 
| 187 | 
            +
            #main ul.failed li.hover dl dd .retried .remove { display:block; }
         | 
| 188 | 
            +
            #main ul.failed li dl dd .controls { display:none; float:right; }
         | 
| 189 | 
            +
            #main ul.failed li.hover dl dd .controls { display:block; }
         | 
| 190 | 
            +
            #main ul.failed li dl dd code, #main ul.failed li dl dd pre { font-family:Monaco, "Courier New", monospace; font-size:90%; white-space: pre-wrap;}
         | 
| 191 | 
            +
            #main ul.failed li dl dd.error a {font-family:Monaco, "Courier New", monospace; font-size:90%; }
         | 
| 192 | 
            +
            #main ul.failed li dl dd.error pre { margin-top:3px; line-height:1.3;}
         | 
| 193 | 
            +
             | 
| 194 | 
            +
            #main p.pagination { background:#efefef; padding:10px; overflow:hidden;}
         | 
| 195 | 
            +
            #main p.pagination a.less { float:left;}
         | 
| 196 | 
            +
            #main p.pagination a.more { float:right;}
         | 
| 197 | 
            +
             | 
| 198 | 
            +
            #main form {float:right; margin-top:-10px;margin-left:10px;}
         | 
| 199 | 
            +
             | 
| 200 | 
            +
            #main .time a.toggle_format {text-decoration:none;}
         | 
| Binary file | 
| Binary file | 
| Binary file | 
| @@ -0,0 +1,94 @@ | |
| 1 | 
            +
            /* ==========================================================
         | 
| 2 | 
            +
             * bootstrap-alert.js v2.0.2
         | 
| 3 | 
            +
             * http://twitter.github.com/bootstrap/javascript.html#alerts
         | 
| 4 | 
            +
             * ==========================================================
         | 
| 5 | 
            +
             * Copyright 2012 Twitter, Inc.
         | 
| 6 | 
            +
             *
         | 
| 7 | 
            +
             * Licensed under the Apache License, Version 2.0 (the "License");
         | 
| 8 | 
            +
             * you may not use this file except in compliance with the License.
         | 
| 9 | 
            +
             * You may obtain a copy of the License at
         | 
| 10 | 
            +
             *
         | 
| 11 | 
            +
             * http://www.apache.org/licenses/LICENSE-2.0
         | 
| 12 | 
            +
             *
         | 
| 13 | 
            +
             * Unless required by applicable law or agreed to in writing, software
         | 
| 14 | 
            +
             * distributed under the License is distributed on an "AS IS" BASIS,
         | 
| 15 | 
            +
             * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         | 
| 16 | 
            +
             * See the License for the specific language governing permissions and
         | 
| 17 | 
            +
             * limitations under the License.
         | 
| 18 | 
            +
             * ========================================================== */
         | 
| 19 | 
            +
             | 
| 20 | 
            +
             | 
| 21 | 
            +
            !function( $ ){
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              "use strict"
         | 
| 24 | 
            +
             | 
| 25 | 
            +
             /* ALERT CLASS DEFINITION
         | 
| 26 | 
            +
              * ====================== */
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              var dismiss = '[data-dismiss="alert"]'
         | 
| 29 | 
            +
                , Alert = function ( el ) {
         | 
| 30 | 
            +
                    $(el).on('click', dismiss, this.close)
         | 
| 31 | 
            +
                  }
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              Alert.prototype = {
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                constructor: Alert
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              , close: function ( e ) {
         | 
| 38 | 
            +
                  var $this = $(this)
         | 
| 39 | 
            +
                    , selector = $this.attr('data-target')
         | 
| 40 | 
            +
                    , $parent
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  if (!selector) {
         | 
| 43 | 
            +
                    selector = $this.attr('href')
         | 
| 44 | 
            +
                    selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
         | 
| 45 | 
            +
                  }
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  $parent = $(selector)
         | 
| 48 | 
            +
                  $parent.trigger('close')
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  e && e.preventDefault()
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  $parent
         | 
| 55 | 
            +
                    .trigger('close')
         | 
| 56 | 
            +
                    .removeClass('in')
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  function removeElement() {
         | 
| 59 | 
            +
                    $parent
         | 
| 60 | 
            +
                      .trigger('closed')
         | 
| 61 | 
            +
                      .remove()
         | 
| 62 | 
            +
                  }
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  $.support.transition && $parent.hasClass('fade') ?
         | 
| 65 | 
            +
                    $parent.on($.support.transition.end, removeElement) :
         | 
| 66 | 
            +
                    removeElement()
         | 
| 67 | 
            +
                }
         | 
| 68 | 
            +
             | 
| 69 | 
            +
              }
         | 
| 70 | 
            +
             | 
| 71 | 
            +
             | 
| 72 | 
            +
             /* ALERT PLUGIN DEFINITION
         | 
| 73 | 
            +
              * ======================= */
         | 
| 74 | 
            +
             | 
| 75 | 
            +
              $.fn.alert = function ( option ) {
         | 
| 76 | 
            +
                return this.each(function () {
         | 
| 77 | 
            +
                  var $this = $(this)
         | 
| 78 | 
            +
                    , data = $this.data('alert')
         | 
| 79 | 
            +
                  if (!data) $this.data('alert', (data = new Alert(this)))
         | 
| 80 | 
            +
                  if (typeof option == 'string') data[option].call($this)
         | 
| 81 | 
            +
                })
         | 
| 82 | 
            +
              }
         | 
| 83 | 
            +
             | 
| 84 | 
            +
              $.fn.alert.Constructor = Alert
         | 
| 85 | 
            +
             | 
| 86 | 
            +
             | 
| 87 | 
            +
             /* ALERT DATA-API
         | 
| 88 | 
            +
              * ============== */
         | 
| 89 | 
            +
             | 
| 90 | 
            +
              $(function () {
         | 
| 91 | 
            +
                $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
         | 
| 92 | 
            +
              })
         | 
| 93 | 
            +
             | 
| 94 | 
            +
            }( window.jQuery );
         | 
| @@ -0,0 +1,125 @@ | |
| 1 | 
            +
            /* =============================================================
         | 
| 2 | 
            +
             * bootstrap-scrollspy.js v2.0.2
         | 
| 3 | 
            +
             * http://twitter.github.com/bootstrap/javascript.html#scrollspy
         | 
| 4 | 
            +
             * =============================================================
         | 
| 5 | 
            +
             * Copyright 2012 Twitter, Inc.
         | 
| 6 | 
            +
             *
         | 
| 7 | 
            +
             * Licensed under the Apache License, Version 2.0 (the "License");
         | 
| 8 | 
            +
             * you may not use this file except in compliance with the License.
         | 
| 9 | 
            +
             * You may obtain a copy of the License at
         | 
| 10 | 
            +
             *
         | 
| 11 | 
            +
             * http://www.apache.org/licenses/LICENSE-2.0
         | 
| 12 | 
            +
             *
         | 
| 13 | 
            +
             * Unless required by applicable law or agreed to in writing, software
         | 
| 14 | 
            +
             * distributed under the License is distributed on an "AS IS" BASIS,
         | 
| 15 | 
            +
             * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         | 
| 16 | 
            +
             * See the License for the specific language governing permissions and
         | 
| 17 | 
            +
             * limitations under the License.
         | 
| 18 | 
            +
             * ============================================================== */
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            !function ( $ ) {
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              "use strict"
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              /* SCROLLSPY CLASS DEFINITION
         | 
| 25 | 
            +
               * ========================== */
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              function ScrollSpy( element, options) {
         | 
| 28 | 
            +
                var process = $.proxy(this.process, this)
         | 
| 29 | 
            +
                  , $element = $(element).is('body') ? $(window) : $(element)
         | 
| 30 | 
            +
                  , href
         | 
| 31 | 
            +
                this.options = $.extend({}, $.fn.scrollspy.defaults, options)
         | 
| 32 | 
            +
                this.$scrollElement = $element.on('scroll.scroll.data-api', process)
         | 
| 33 | 
            +
                this.selector = (this.options.target
         | 
| 34 | 
            +
                  || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
         | 
| 35 | 
            +
                  || '') + ' .nav li > a'
         | 
| 36 | 
            +
                this.$body = $('body').on('click.scroll.data-api', this.selector, process)
         | 
| 37 | 
            +
                this.refresh()
         | 
| 38 | 
            +
                this.process()
         | 
| 39 | 
            +
              }
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              ScrollSpy.prototype = {
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  constructor: ScrollSpy
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                , refresh: function () {
         | 
| 46 | 
            +
                    this.targets = this.$body
         | 
| 47 | 
            +
                      .find(this.selector)
         | 
| 48 | 
            +
                      .map(function () {
         | 
| 49 | 
            +
                        var href = $(this).attr('href')
         | 
| 50 | 
            +
                        return /^#\w/.test(href) && $(href).length ? href : null
         | 
| 51 | 
            +
                      })
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    this.offsets = $.map(this.targets, function (id) {
         | 
| 54 | 
            +
                      return $(id).position().top
         | 
| 55 | 
            +
                    })
         | 
| 56 | 
            +
                  }
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                , process: function () {
         | 
| 59 | 
            +
                    var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
         | 
| 60 | 
            +
                      , offsets = this.offsets
         | 
| 61 | 
            +
                      , targets = this.targets
         | 
| 62 | 
            +
                      , activeTarget = this.activeTarget
         | 
| 63 | 
            +
                      , i
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                    for (i = offsets.length; i--;) {
         | 
| 66 | 
            +
                      activeTarget != targets[i]
         | 
| 67 | 
            +
                        && scrollTop >= offsets[i]
         | 
| 68 | 
            +
                        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
         | 
| 69 | 
            +
                        && this.activate( targets[i] )
         | 
| 70 | 
            +
                    }
         | 
| 71 | 
            +
                  }
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                , activate: function (target) {
         | 
| 74 | 
            +
                    var active
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                    this.activeTarget = target
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                    this.$body
         | 
| 79 | 
            +
                      .find(this.selector).parent('.active')
         | 
| 80 | 
            +
                      .removeClass('active')
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                    active = this.$body
         | 
| 83 | 
            +
                      .find(this.selector + '[href="' + target + '"]')
         | 
| 84 | 
            +
                      .parent('li')
         | 
| 85 | 
            +
                      .addClass('active')
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                    if ( active.parent('.dropdown-menu') )  {
         | 
| 88 | 
            +
                      active.closest('li.dropdown').addClass('active')
         | 
| 89 | 
            +
                    }
         | 
| 90 | 
            +
                  }
         | 
| 91 | 
            +
             | 
| 92 | 
            +
              }
         | 
| 93 | 
            +
             | 
| 94 | 
            +
             | 
| 95 | 
            +
             /* SCROLLSPY PLUGIN DEFINITION
         | 
| 96 | 
            +
              * =========================== */
         | 
| 97 | 
            +
             | 
| 98 | 
            +
              $.fn.scrollspy = function ( option ) {
         | 
| 99 | 
            +
                return this.each(function () {
         | 
| 100 | 
            +
                  var $this = $(this)
         | 
| 101 | 
            +
                    , data = $this.data('scrollspy')
         | 
| 102 | 
            +
                    , options = typeof option == 'object' && option
         | 
| 103 | 
            +
                  if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
         | 
| 104 | 
            +
                  if (typeof option == 'string') data[option]()
         | 
| 105 | 
            +
                })
         | 
| 106 | 
            +
              }
         | 
| 107 | 
            +
             | 
| 108 | 
            +
              $.fn.scrollspy.Constructor = ScrollSpy
         | 
| 109 | 
            +
             | 
| 110 | 
            +
              $.fn.scrollspy.defaults = {
         | 
| 111 | 
            +
                offset: 10
         | 
| 112 | 
            +
              }
         | 
| 113 | 
            +
             | 
| 114 | 
            +
             | 
| 115 | 
            +
             /* SCROLLSPY DATA-API
         | 
| 116 | 
            +
              * ================== */
         | 
| 117 | 
            +
             | 
| 118 | 
            +
              $(function () {
         | 
| 119 | 
            +
                $('[data-spy="scroll"]').each(function () {
         | 
| 120 | 
            +
                  var $spy = $(this)
         | 
| 121 | 
            +
                  $spy.scrollspy($spy.data())
         | 
| 122 | 
            +
                })
         | 
| 123 | 
            +
              })
         | 
| 124 | 
            +
             | 
| 125 | 
            +
            }( window.jQuery );
         |