less-rails-semantic_ui 2.0.6.0 → 2.0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/assets/javascripts/semantic_ui/definitions/behaviors/api.js +61 -33
- data/assets/javascripts/semantic_ui/definitions/modules/dropdown.js +3 -2
- data/assets/javascripts/semantic_ui/definitions/modules/popup.js +8 -7
- data/assets/stylesheets/semantic_ui/definitions/collections/breadcrumb.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/collections/form.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/collections/grid.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/collections/menu.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/collections/message.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/collections/table.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/elements/button.less +6 -3
- data/assets/stylesheets/semantic_ui/definitions/elements/divider.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/elements/flag.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/elements/header.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/elements/icon.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/elements/image.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/elements/input.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/elements/label.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/elements/list.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/elements/loader.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/elements/rail.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/elements/reveal.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/elements/segment.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/elements/step.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/globals/reset.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/globals/site.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/accordion.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/checkbox.less +1 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/dimmer.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/dropdown.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/modal.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/nag.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/popup.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/progress.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/rating.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/search.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/shape.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/sidebar.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/sticky.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/tab.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/modules/transition.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/views/card.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/views/comment.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/views/feed.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/views/item.less +0 -0
- data/assets/stylesheets/semantic_ui/definitions/views/statistic.less +0 -0
- data/lib/generators/semantic_ui/install/templates/config/collections/breadcrumb.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/collections/breadcrumb.variables +0 -0
- data/lib/generators/semantic_ui/install/templates/config/collections/form.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/collections/grid.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/collections/menu.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/collections/table.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/elements/button.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/elements/divider.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/elements/flag.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/elements/header.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/elements/icon.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/elements/image.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/elements/input.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/elements/label.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/elements/loader.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/elements/rail.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/elements/reveal.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/elements/segment.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/elements/step.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/globals/reset.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/globals/site.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/checkbox.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/modal.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/modal.variables +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/progress.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/rating.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/rating.variables +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/search.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/search.variables +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/sidebar.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/sidebar.variables +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/sticky.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/sticky.variables +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/transition.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/config/modules/video.overrides +0 -0
- data/lib/generators/semantic_ui/install/templates/theme.config +0 -0
- data/lib/less/rails/semantic_ui/version.rb +1 -1
- data/tasks/update.rake +9 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8d24723db4d5cb6e18e7274de27abf0bbf82cee
|
4
|
+
data.tar.gz: a63d17ebed38233ed9977c912d94cadd1fb03513
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be0f79c5614e0ec2d5ea5617edb619dabaeddbbe3a50320625e3a43e503b51d4ea0e35ab08967b357f5e402eddfcce2ef8c38a825e2c532a5ed07d612eba37e6
|
7
|
+
data.tar.gz: 3e34a365b0063f9decea360b5210189433e7f7ca55f564d5d9fdae4fbd246bddf046e78005b308aaa734d8fd8af192e28bbcf11ae914149a86f191ddd8edd435
|
@@ -115,6 +115,20 @@ $.api = $.fn.api = function(parameters) {
|
|
115
115
|
}
|
116
116
|
},
|
117
117
|
|
118
|
+
decode: {
|
119
|
+
json: function(response) {
|
120
|
+
if(response !== undefined && typeof response == 'string') {
|
121
|
+
try {
|
122
|
+
response = JSON.parse(response);
|
123
|
+
}
|
124
|
+
catch(e) {
|
125
|
+
// isnt json string
|
126
|
+
}
|
127
|
+
}
|
128
|
+
return response;
|
129
|
+
}
|
130
|
+
},
|
131
|
+
|
118
132
|
read: {
|
119
133
|
cachedResponse: function(url) {
|
120
134
|
var
|
@@ -126,15 +140,7 @@ $.api = $.fn.api = function(parameters) {
|
|
126
140
|
}
|
127
141
|
response = sessionStorage.getItem(url);
|
128
142
|
module.debug('Using cached response', url, response);
|
129
|
-
|
130
|
-
try {
|
131
|
-
response = JSON.parse(response);
|
132
|
-
}
|
133
|
-
catch(e) {
|
134
|
-
// didnt store object
|
135
|
-
}
|
136
|
-
return response;
|
137
|
-
}
|
143
|
+
response = module.decode.json(response);
|
138
144
|
return false;
|
139
145
|
}
|
140
146
|
},
|
@@ -287,7 +293,7 @@ $.api = $.fn.api = function(parameters) {
|
|
287
293
|
}
|
288
294
|
},
|
289
295
|
validResponse: function(response) {
|
290
|
-
if( settings.dataType !== 'json' || !$.isFunction(settings.successTest) ) {
|
296
|
+
if( (settings.dataType !== 'json' && settings.dataType !== 'jsonp') || !$.isFunction(settings.successTest) ) {
|
291
297
|
module.verbose('Response is not JSON, skipping validation', settings.successTest, response);
|
292
298
|
return true;
|
293
299
|
}
|
@@ -445,13 +451,13 @@ $.api = $.fn.api = function(parameters) {
|
|
445
451
|
},
|
446
452
|
xhr: {
|
447
453
|
always: function() {
|
448
|
-
//
|
454
|
+
// nothing special
|
449
455
|
},
|
450
456
|
done: function(response, textStatus, xhr) {
|
451
457
|
var
|
452
|
-
context
|
453
|
-
elapsedTime
|
454
|
-
timeLeft
|
458
|
+
context = this,
|
459
|
+
elapsedTime = (new Date().getTime() - requestStartTime),
|
460
|
+
timeLeft = (settings.loadingDuration - elapsedTime),
|
455
461
|
translatedResponse = ( $.isFunction(settings.onResponse) )
|
456
462
|
? settings.onResponse.call(context, $.extend(true, {}, response))
|
457
463
|
: false
|
@@ -469,7 +475,7 @@ $.api = $.fn.api = function(parameters) {
|
|
469
475
|
}
|
470
476
|
setTimeout(function() {
|
471
477
|
if( module.is.validResponse(response) ) {
|
472
|
-
module.request.resolveWith(context, [response]);
|
478
|
+
module.request.resolveWith(context, [response, xhr]);
|
473
479
|
}
|
474
480
|
else {
|
475
481
|
module.request.rejectWith(context, [xhr, 'invalid']);
|
@@ -500,46 +506,52 @@ $.api = $.fn.api = function(parameters) {
|
|
500
506
|
}
|
501
507
|
},
|
502
508
|
request: {
|
503
|
-
|
504
|
-
module.remove.loading();
|
505
|
-
settings.onComplete.call(context, response, $module);
|
506
|
-
},
|
507
|
-
done: function(response) {
|
509
|
+
done: function(response, xhr) {
|
508
510
|
module.debug('Successful API Response', response);
|
509
511
|
if(settings.cache === 'local' && url) {
|
510
512
|
module.write.cachedResponse(url, response);
|
511
513
|
module.debug('Saving server response locally', module.cache);
|
512
514
|
}
|
513
|
-
settings.onSuccess.call(context, response, $module);
|
515
|
+
settings.onSuccess.call(context, response, $module, xhr);
|
516
|
+
},
|
517
|
+
complete: function(firstParameter, secondParameter) {
|
518
|
+
var
|
519
|
+
xhr,
|
520
|
+
response
|
521
|
+
;
|
522
|
+
// have to guess callback parameters based on request success
|
523
|
+
if( module.was.succesful() ) {
|
524
|
+
response = firstParameter;
|
525
|
+
xhr = secondParameter;
|
526
|
+
}
|
527
|
+
else {
|
528
|
+
xhr = firstParameter;
|
529
|
+
response = module.get.responseFromXHR(xhr);
|
530
|
+
}
|
531
|
+
module.remove.loading();
|
532
|
+
settings.onComplete.call(context, response, $module, xhr);
|
514
533
|
},
|
515
534
|
fail: function(xhr, status, httpMessage) {
|
516
535
|
var
|
517
536
|
// pull response from xhr if available
|
518
|
-
response
|
519
|
-
|
520
|
-
: false,
|
521
|
-
errorMessage = ($.isPlainObject(response) && response.error !== undefined)
|
522
|
-
? response.error // use json error message
|
523
|
-
: (settings.error[status] !== undefined) // use server error message
|
524
|
-
? settings.error[status]
|
525
|
-
: httpMessage
|
537
|
+
response = module.get.responseFromXHR(xhr),
|
538
|
+
errorMessage = module.get.errorFromRequest(response, status, httpMessage)
|
526
539
|
;
|
527
540
|
if(status == 'aborted') {
|
528
541
|
module.debug('XHR Aborted (Most likely caused by page navigation or CORS Policy)', status, httpMessage);
|
529
|
-
settings.onAbort.call(context, status, $module);
|
542
|
+
settings.onAbort.call(context, status, $module, xhr);
|
530
543
|
}
|
531
544
|
else if(status == 'invalid') {
|
532
545
|
module.debug('JSON did not pass success test. A server-side error has most likely occurred', response);
|
533
546
|
}
|
534
547
|
else if(status == 'error') {
|
535
|
-
|
536
548
|
if(xhr !== undefined) {
|
537
549
|
module.debug('XHR produced a server error', status, httpMessage);
|
538
550
|
// make sure we have an error to display to console
|
539
551
|
if( xhr.status != 200 && httpMessage !== undefined && httpMessage !== '') {
|
540
552
|
module.error(error.statusMessage + httpMessage, ajaxSettings.url);
|
541
553
|
}
|
542
|
-
settings.onError.call(context, errorMessage, $module);
|
554
|
+
settings.onError.call(context, errorMessage, $module, xhr);
|
543
555
|
}
|
544
556
|
}
|
545
557
|
|
@@ -549,7 +561,7 @@ $.api = $.fn.api = function(parameters) {
|
|
549
561
|
setTimeout(module.remove.error, settings.errorDuration);
|
550
562
|
}
|
551
563
|
module.debug('API Request failed', errorMessage, xhr);
|
552
|
-
settings.onFailure.call(context, response, $module);
|
564
|
+
settings.onFailure.call(context, response, $module, xhr);
|
553
565
|
}
|
554
566
|
}
|
555
567
|
},
|
@@ -650,6 +662,22 @@ $.api = $.fn.api = function(parameters) {
|
|
650
662
|
},
|
651
663
|
|
652
664
|
get: {
|
665
|
+
responseFromXHR: function(xhr) {
|
666
|
+
return $.isPlainObject(xhr)
|
667
|
+
? (settings.dataType == 'json' || settings.dataType == 'jsonp')
|
668
|
+
? module.decode.json(xhr.responseText)
|
669
|
+
: xhr.responseText
|
670
|
+
: false
|
671
|
+
;
|
672
|
+
},
|
673
|
+
errorFromRequest: function(response, status, httpMessage) {
|
674
|
+
return ($.isPlainObject(response) && response.error !== undefined)
|
675
|
+
? response.error // use json error message
|
676
|
+
: (settings.error[status] !== undefined) // use server error message
|
677
|
+
? settings.error[status]
|
678
|
+
: httpMessage
|
679
|
+
;
|
680
|
+
},
|
653
681
|
request: function() {
|
654
682
|
return module.request || false;
|
655
683
|
},
|
@@ -895,7 +895,7 @@ $.fn.dropdown = function(parameters) {
|
|
895
895
|
toggleBehavior = (module.is.multiple())
|
896
896
|
? module.show
|
897
897
|
: module.toggle
|
898
|
-
|
898
|
+
;
|
899
899
|
if( module.determine.eventOnElement(event, toggleBehavior) ) {
|
900
900
|
event.preventDefault();
|
901
901
|
}
|
@@ -1297,7 +1297,8 @@ $.fn.dropdown = function(parameters) {
|
|
1297
1297
|
eventOnElement: function(event, callback) {
|
1298
1298
|
var
|
1299
1299
|
$target = $(event.target),
|
1300
|
-
|
1300
|
+
$label = $target.closest(selector.siblingLabel),
|
1301
|
+
notOnLabel = ($module.find($label).length === 0),
|
1301
1302
|
notInMenu = ($target.closest($menu).length === 0)
|
1302
1303
|
;
|
1303
1304
|
callback = $.isFunction(callback)
|
@@ -22,7 +22,7 @@ $.fn.popup = function(parameters) {
|
|
22
22
|
|
23
23
|
moduleSelector = $allModules.selector || '',
|
24
24
|
|
25
|
-
hasTouch = (
|
25
|
+
hasTouch = (true),
|
26
26
|
time = new Date().getTime(),
|
27
27
|
performance = [],
|
28
28
|
|
@@ -156,7 +156,9 @@ $.fn.popup = function(parameters) {
|
|
156
156
|
: settings.delay
|
157
157
|
;
|
158
158
|
clearTimeout(module.hideTimer);
|
159
|
-
|
159
|
+
if(!openedWithTouch) {
|
160
|
+
module.showTimer = setTimeout(module.show, delay);
|
161
|
+
}
|
160
162
|
},
|
161
163
|
end: function() {
|
162
164
|
var
|
@@ -169,7 +171,7 @@ $.fn.popup = function(parameters) {
|
|
169
171
|
},
|
170
172
|
touchstart: function(event) {
|
171
173
|
openedWithTouch = true;
|
172
|
-
module.
|
174
|
+
module.show();
|
173
175
|
},
|
174
176
|
resize: function() {
|
175
177
|
if( module.is.visible() ) {
|
@@ -279,7 +281,6 @@ $.fn.popup = function(parameters) {
|
|
279
281
|
show: function(callback) {
|
280
282
|
callback = callback || function(){};
|
281
283
|
module.debug('Showing pop-up', settings.transition);
|
282
|
-
|
283
284
|
if(module.is.hidden() && !( module.is.active() && module.is.dropdown()) ) {
|
284
285
|
if( !module.exists() ) {
|
285
286
|
module.create();
|
@@ -398,8 +399,8 @@ $.fn.popup = function(parameters) {
|
|
398
399
|
hide: function(callback) {
|
399
400
|
callback = $.isFunction(callback) ? callback : function(){};
|
400
401
|
module.debug('Hiding pop-up');
|
401
|
-
if(settings.
|
402
|
-
module.debug('
|
402
|
+
if(settings.onHide.call($popup, element) === false) {
|
403
|
+
module.debug('onHide callback returned false, cancelling popup animation');
|
403
404
|
return;
|
404
405
|
}
|
405
406
|
if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
|
@@ -884,7 +885,7 @@ $.fn.popup = function(parameters) {
|
|
884
885
|
.on('touchstart' + eventNamespace, module.event.touchstart)
|
885
886
|
;
|
886
887
|
}
|
887
|
-
|
888
|
+
if( module.get.startEvent() ) {
|
888
889
|
$module
|
889
890
|
.on(module.get.startEvent() + eventNamespace, module.event.start)
|
890
891
|
.on(module.get.endEvent() + eventNamespace, module.event.end)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -777,13 +777,14 @@
|
|
777
777
|
position: absolute;
|
778
778
|
height: 100%;
|
779
779
|
line-height: 1;
|
780
|
+
border-radius: 0px;
|
781
|
+
border-top-left-radius: inherit;
|
782
|
+
border-bottom-left-radius: inherit;
|
780
783
|
|
781
784
|
width: @labeledIconWidth;
|
782
785
|
background-color: @labeledIconBackgroundColor;
|
783
786
|
text-align: center;
|
784
787
|
color: @labeledIconColor;
|
785
|
-
|
786
|
-
border-radius: @borderRadius 0px 0px @borderRadius;
|
787
788
|
box-shadow: @labeledIconLeftShadow;
|
788
789
|
}
|
789
790
|
|
@@ -802,7 +803,9 @@
|
|
802
803
|
.ui[class*="right labeled"].icon.button > .icon {
|
803
804
|
left: auto;
|
804
805
|
right: 0em;
|
805
|
-
border-radius:
|
806
|
+
border-radius: 0px;
|
807
|
+
border-top-right-radius: inherit;
|
808
|
+
border-bottom-right-radius: inherit;
|
806
809
|
box-shadow: @labeledIconRightShadow;
|
807
810
|
}
|
808
811
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/tasks/update.rake
CHANGED
@@ -15,6 +15,8 @@ namespace :update do
|
|
15
15
|
transform_sources
|
16
16
|
|
17
17
|
bump_gem_version(version)
|
18
|
+
|
19
|
+
mark_all_files_as_world_readable
|
18
20
|
end
|
19
21
|
|
20
22
|
def paths
|
@@ -191,6 +193,13 @@ namespace :update do
|
|
191
193
|
File.write(version_file, File.read(version_file).gsub(/\d+\.\d+\.\d+\.\d+/, "#{version}.0"))
|
192
194
|
end
|
193
195
|
|
196
|
+
def mark_all_files_as_world_readable
|
197
|
+
Dir[File.join(paths.root, '{assets,lib,spec,tasks}', '**/*')].each do |file|
|
198
|
+
mode = File.directory?(file) ? 0755 : 0644
|
199
|
+
File.chmod(mode, file)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
194
203
|
private
|
195
204
|
|
196
205
|
def copy_tree(src, src_dir, dest_dir)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: less-rails-semantic_ui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maxim Dobryakov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: less-rails
|