Version Description
- Enhance: Security
- Fix: Fatal error on WordPress 4.x
- Fix: Compatibility issue with ReCaptcha and lazy loading
Download this release
Release Info
Developer | vanyukov |
Plugin | Smush Image Compression and Optimization |
Version | 3.4.2 |
Comparing to | |
See all releases |
Code changes from version 3.4.1 to 3.4.2
app/assets/js/smush-admin.min.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
!function(e){var t={};function n(i){if(t[i])return t[i].exports;var s=t[i]={i:i,l:!1,exports:{}};return e[i].call(s.exports,s,s.exports,n),s.l=!0,s.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)n.d(i,s,function(t){return e[t]}.bind(null,s));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=11)}([function(e,t,n){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function s(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}var r=function(){function e(t,n){var s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"media";!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.errors=[];var r=jQuery(".bulk-smush-wrapper .sui-progress-state-text");this.smushed=parseInt(r.find("span:first-child").html()),this.total=parseInt(r.find("span:last-child").html()),this.skip_resmush=!(void 0===t.data("smush")||!t.data("smush")),this.button=jQuery(t[0]),this.is_bulk=!!i(n)&&n,this.url=ajaxurl,this.log=jQuery(".smush-final-log"),this.deferred=jQuery.Deferred(),this.deferred.errors=[];var o=0<wp_smushit_data.resmush.length&&!this.skip_resmush?wp_smushit_data.unsmushed.length>0?wp_smushit_data.resmush.concat(wp_smushit_data.unsmushed):wp_smushit_data.resmush:wp_smushit_data.unsmushed;return"object"===i(o)?this.ids=o.filter((function(e,t,n){return t===n.indexOf(e)})):this.ids=o,this.is_bulk_resmush=0<wp_smushit_data.resmush.length&&!this.skip_resmush,this.status=this.button.parent().find(".smush-status"),this.smush_type=s,this.single_ajax_suffix="nextgen"===this.smush_type?"smush_manual_nextgen":"wp_smushit_manual",this.bulk_ajax_suffix="nextgen"===this.smush_type?"wp_smushit_nextgen_bulk":"wp_smushit_bulk",this.url=this.is_bulk?e.smushAddParams(this.url,{action:this.bulk_ajax_suffix}):e.smushAddParams(this.url,{action:this.single_ajax_suffix}),this.start(),this.run(),this.bindDeferredEvents(),this.cancelAjax(),this.deferred}var t,n,r;return t=e,r=[{key:"smushAddParams",value:function(e,t){return jQuery.isEmptyObject(t)||(e+=(e.indexOf("?")>=0?"&":"?")+jQuery.param(t)),e}},{key:"membershipValidity",value:function(e){var t=jQuery("#wp-smush-invalid-member");void 0!==e&&void 0!==e.show_warning&&t.length>0&&(e.show_warning?t.show():t.hide())}},{key:"ajax",value:function(e,t,n,i){var s=jQuery.param({is_bulk_resmush:e,attachment_id:t,_nonce:i});return jQuery.ajax({type:"GET",data:s,url:n,timeout:wp_smushit_data.timeout,dataType:"json"})}},{key:"progressBar",value:function(e,t,n){var i=e.parents().eq(1).find(".wp-smush-progress");"show"===n?i.html(t):i.html(window.wp_smush_msgs.all_done),i.toggleClass("visible")}},{key:"setProSavings",value:function(){var e=wp_smushit_data.savings_percent>0?wp_smushit_data.savings_percent:0,t=wp_smushit_data.savings_bytes>0?wp_smushit_data.savings_bytes:0,n=2.22058824;e>49&&(n=1.22054412),e>0&&(e*=n,t*=n),wp_smushit_data.pro_savings={percent:WP_Smush.helpers.precise_round(e,1),savings_bytes:WP_Smush.helpers.formatBytes(t,1)}}},{key:"updateStats",value:function(t){var n=void 0!==t&&"nextgen"===t,i=0;wp_smushit_data.savings_bytes=parseInt(wp_smushit_data.size_before)-parseInt(wp_smushit_data.size_after);var s=WP_Smush.helpers.formatBytes(wp_smushit_data.savings_bytes,1),r=jQuery(".wp-smush-savings .wp-smush-stats-human");n?r.html(s):(r.html(WP_Smush.helpers.getFormatFromString(s)),jQuery(".sui-summary-large.wp-smush-stats-human").html(WP_Smush.helpers.getSizeFromString(s))),wp_smushit_data.savings_percent=WP_Smush.helpers.precise_round(parseInt(wp_smushit_data.savings_bytes)/parseInt(wp_smushit_data.size_before)*100,1),isNaN(wp_smushit_data.savings_percent)||jQuery(".wp-smush-savings .wp-smush-stats-percent").html(wp_smushit_data.savings_percent),void 0!==wp_smushit_data.savings_bytes&&void 0!==wp_smushit_data.savings_resize&&(i=parseInt(wp_smushit_data.savings_bytes)-parseInt(wp_smushit_data.savings_resize))>0&&jQuery("li.super-smush-attachments span.smushed-savings").html(WP_Smush.helpers.formatBytes(i,1)),n?jQuery(".sui-summary-details span.wp-smush-total-optimised").html(wp_smushit_data.count_images):jQuery("span.smushed-items-count span.wp-smush-count-total span.wp-smush-total-optimised").html(wp_smushit_data.count_images),jQuery("span.smushed-items-count span.wp-smush-count-resize-total span.wp-smush-total-optimised").html(wp_smushit_data.count_resize);var o=jQuery("li.super-smush-attachments .smushed-count");o.length&&void 0!==wp_smushit_data.count_supersmushed&&o.html(wp_smushit_data.count_supersmushed);var a=jQuery(".smush-conversion-savings");if(a.length>0&&void 0!==wp_smushit_data.savings_conversion&&""!==wp_smushit_data.savings_conversion){var u=a.find(".wp-smush-stats");u.length>0&&u.html(WP_Smush.helpers.formatBytes(wp_smushit_data.savings_conversion,1))}var l=jQuery(".smush-resize-savings");if(l.length>0&&void 0!==wp_smushit_data.savings_resize&&""!==wp_smushit_data.savings_resize){var d=parseInt(wp_smushit_data.savings_resize),c=l.find(".wp-smush-stats"),h=l.find(".wp-smush-stats-label-message");d>0&&c.length>0&&(h.length>0&&h.hide(),c.html(WP_Smush.helpers.formatBytes(wp_smushit_data.savings_resize,1)))}if(e.setProSavings(),void 0!==wp_smushit_data.pro_savings){var p=jQuery(".smush-avg-pro-savings");if(p.length>0){var f=p.find(".wp-smush-stats-percent"),m=p.find(".wp-smush-stats-human");f.length>0&&void 0!==wp_smushit_data.pro_savings.percent&&""!==wp_smushit_data.pro_savings.percent&&f.html(wp_smushit_data.pro_savings.percent),m.length>0&&void 0!==wp_smushit_data.pro_savings.savings_bytes&&""!==wp_smushit_data.pro_savings.savings_bytes&&m.html(wp_smushit_data.pro_savings.savings_bytes)}}var g=jQuery(".smush-sidenav .wp-smush-remaining-count");if(g.length){var v=0;void 0!==wp_smushit_data.unsmushed&&wp_smushit_data.unsmushed.length>0&&(v+=wp_smushit_data.unsmushed.length),void 0!==wp_smushit_data.resmush&&wp_smushit_data.resmush.length>0&&(v+=wp_smushit_data.resmush.length),v>0?g.html(v):(jQuery(".sui-summary-smush .smush-stats-icon").addClass("sui-hidden"),g.removeClass("sui-tag sui-tag-warning").html(""))}}},{key:"updateImageStats",value:function(e){if(0!==e){var t=jQuery(".attachment-info .file-size");if(t.contents().filter((function(){return 3===this.nodeType})).text()!==" "+e){var n=t.contents().filter((function(){return 1===this.nodeType})).text();t.html("<strong>"+n+"</strong> "+e)}}}},{key:"updateLocalizedStats",value:function(e,t){void 0!==window.wp_smushit_data&&("media"===t?(wp_smushit_data.count_images=parseInt(wp_smushit_data.count_images)+parseInt(e.count),e.is_lossy&&(wp_smushit_data.count_supersmushed=parseInt(wp_smushit_data.count_supersmushed)+1),wp_smushit_data.savings_resize=void 0!==e.savings_resize.bytes?parseInt(wp_smushit_data.savings_resize)+parseInt(e.savings_resize.bytes):parseInt(wp_smushit_data.savings_resize),wp_smushit_data.count_resize=void 0!==e.savings_resize.bytes?parseInt(wp_smushit_data.count_resize)+1:wp_smushit_data.count_resize,wp_smushit_data.savings_conversion=void 0!==e.savings_conversion&&void 0!==e.savings_conversion.bytes?parseInt(wp_smushit_data.savings_conversion)+parseInt(e.savings_conversion.bytes):parseInt(wp_smushit_data.savings_conversion)):"directory_smush"===t?wp_smushit_data.count_images=parseInt(wp_smushit_data.count_images)+1:"nextgen"===t&&(wp_smushit_data.count_supersmushed=parseInt(wp_smushit_data.count_supersmushed)+1,wp_smushit_data.count_images=parseInt(wp_smushit_data.count_images)+parseInt(e.count)),e.size_before>e.size_after&&(wp_smushit_data.size_before=void 0!==e.size_before?parseInt(wp_smushit_data.size_before)+parseInt(e.size_before):parseInt(wp_smushit_data.size_before),wp_smushit_data.size_after=void 0!==e.size_after?parseInt(wp_smushit_data.size_after)+parseInt(e.size_after):parseInt(wp_smushit_data.size_after)),void 0!==e.savings_resize&&(wp_smushit_data.size_before=void 0!==e.savings_resize.size_before?parseInt(wp_smushit_data.size_before)+parseInt(e.savings_resize.size_before):parseInt(wp_smushit_data.size_before),wp_smushit_data.size_after=void 0!==e.savings_resize.size_after?parseInt(wp_smushit_data.size_after)+parseInt(e.savings_resize.size_after):parseInt(wp_smushit_data.size_after)),void 0!==e.savings_conversion&&(wp_smushit_data.size_before=void 0!==e.savings_conversion.size_before?parseInt(wp_smushit_data.size_before)+parseInt(e.savings_conversion.size_before):parseInt(wp_smushit_data.size_before),wp_smushit_data.size_after=void 0!==e.savings_conversion.size_after?parseInt(wp_smushit_data.size_after)+parseInt(e.savings_conversion.size_after):parseInt(wp_smushit_data.size_after)))}},{key:"prepareErrorRow",value:function(e,t,n,i,s){var r='<div class="smush-bulk-error-row"><div class="smush-bulk-image-data">'+(void 0===n?'<i class="sui-icon-photo-picture" aria-hidden="true"></i>':n)+'<span class="smush-image-name">'+("undefined"===t||void 0===t?"undefined":t)+'</span><span class="smush-image-error">'+e+"</span></div>";return"media"===s&&(r=r+'<div class="smush-bulk-image-actions"><button type="button" class="sui-button-icon sui-tooltip sui-tooltip-constrained sui-tooltip-top-right smush-ignore-image" data-tooltip="'+window.wp_smush_msgs.error_ignore+'" data-id="'+i+'"><i class="sui-icon-eye-hide" aria-hidden="true"></i></button></div>'),r+="</div>"}},{key:"updateSmushIds",value:function(e){if(void 0!==wp_smushit_data.unsmushed&&wp_smushit_data.unsmushed.length>0){var t=wp_smushit_data.unsmushed.indexOf(e);t>-1&&wp_smushit_data.unsmushed.splice(t,1)}if(void 0!==wp_smushit_data.resmush&&wp_smushit_data.resmush.length>0){var n=wp_smushit_data.resmush.indexOf(e);n>-1&&wp_smushit_data.resmush.splice(n,1)}}}],(n=[{key:"start",value:function(){this.button.attr("disabled","disabled"),this.button.addClass("wp-smush-started"),this.bulkStart(),this.singleStart()}},{key:"bulkStart",value:function(){this.is_bulk&&(jQuery(".wp-smush-bulk-wrapper").hide(),jQuery(".sui-notice-top").remove(),jQuery(".wp-smush-bulk-progress-bar-wrapper .sui-notice-warning:first-of-type").hide(),0>=jQuery("div.smush-final-log .smush-bulk-error-row").length&&jQuery("div.smush-final-log").hide(),jQuery(".bulk-smush-wrapper .wp-smush-bulk-progress-bar-wrapper").show())}},{key:"singleStart",value:function(){this.is_bulk||(e.progressBar(this.button,window.wp_smush_msgs.smushing,"show"),this.status.removeClass("error"))}},{key:"enableButton",value:function(){this.button.prop("disabled",!1),jQuery(".wp-smush-all").removeAttr("disabled"),jQuery("button.wp-smush-scan, a.wp-smush-lossy-enable, button.wp-smush-resize-enable, button#wp-smush-save-settings").removeAttr("disabled")}},{key:"singleDone",value:function(){if(!this.is_bulk){e.progressBar(this.button,window.wp_smush_msgs.smushing,"hide");var t=this;this.request.done((function(n){if(void 0!==n.data){var i=t.status.parent();n.data.status&&(i.find(".smush-status-links").remove(),i.find(".smush-ignore-image").remove(),t.status.replaceWith(n.data.status)),e.membershipValidity(n.data),n.success&&"Not processed"!==n.data?(t.status.removeClass("sui-hidden"),t.button.remove()):(t.status.addClass("error"),t.status.html(n.data.error_msg),t.status.show()),i.append(n.data.stats),e.updateImageStats(n.data.new_size)}t.enableButton()})).fail((function(e){t.status.html(e.data),t.status.addClass("error"),t.enableButton()}))}}},{key:"syncStats",value:function(){var t=jQuery("div.wp-smush-bulk-progress-bar-wrapper div.wp-smush-count.tc"),n=t.html();t.html(window.wp_smush_msgs.sync_stats),jQuery.ajax({type:"GET",url:this.url,data:{action:"get_stats"},success:function(t){t&&void 0!==t&&(t=t.data,jQuery.extend(wp_smushit_data,{count_images:t.count_images,count_smushed:t.count_smushed,count_total:t.count_total,count_resize:t.count_resize,count_supersmushed:t.count_supersmushed,savings_bytes:t.savings_bytes,savings_conversion:t.savings_conversion,savings_resize:t.savings_resize,size_before:t.size_before,size_after:t.size_after}),e.updateStats(this.smush_type))}}).always((function(){return t.html(n)}))}},{key:"bulkDone",value:function(){if(this.is_bulk){this.enableButton();var e=jQuery(".sui-summary-smush .smush-stats-icon");if(0===this.ids.length)e.addClass("sui-hidden"),jQuery(".bulk-smush-wrapper .wp-smush-all-done, .wp-smush-pagespeed-recommendation").show(),jQuery(".wp-smush-bulk-wrapper").hide(),jQuery(".wp-smush-bulk-progress-bar-wrapper").hide();else{e.removeClass("sui-icon-loader sui-loading sui-hidden").addClass("sui-icon-info sui-warning");var t=jQuery(".bulk-smush-wrapper .wp-smush-resmush-notice");t.length>0?t.show():jQuery(".bulk-smush-wrapper .wp-smush-remaining").show()}jQuery(".wp-resmush.wp-smush-action, .wp-smush-scan").removeAttr("disabled")}}},{key:"freeExceeded",value:function(){var e=jQuery(".wp-smush-bulk-progress-bar-wrapper");e.addClass("wp-smush-exceed-limit"),e.find(".sui-progress-block .wp-smush-cancel-bulk").addClass("sui-hidden"),e.find(".sui-progress-block .wp-smush-all").removeClass("sui-hidden"),e.find("i.sui-icon-loader").addClass("sui-icon-info").removeClass("sui-icon-loader").removeClass("sui-loading"),document.getElementById("bulk-smush-resume-button").classList.remove("sui-hidden")}},{key:"updateRemainingCount",value:function(){if(this.is_bulk_resmush){var e=jQuery(".wp-smush-resmush-notice .wp-smush-remaining-count");e.length&&void 0!==this.ids&&e.html(this.ids.length)}else{var t=jQuery(".bulk-smush-wrapper .wp-smush-remaining-count");t.length&&void 0!==this.ids&&t.html(this.ids.length)}var n=jQuery(".smush-sidenav .wp-smush-remaining-count");n.length&&void 0!==this.ids&&(this.ids.length>0?n.html(this.ids.length):(jQuery(".sui-summary-smush .smush-stats-icon").addClass("sui-hidden"),n.removeClass("sui-tag sui-tag-warning").html("")))}},{key:"updateProgress",value:function(t){if(this.is_bulk_resmush||this.is_bulk){var n=0;t&&void 0!==t.data&&void 0!==t.data.stats&&e.updateLocalizedStats(t.data.stats,this.smush_type),this.is_bulk_resmush?(t.success&&(wp_smushit_data.resmush.length>0?jQuery(".wp-smush-images-remaining").html(wp_smushit_data.resmush.length):0===wp_smushit_data.resmush.length&&0===this.ids.length&&(jQuery(".bulk-resmush-wrapper .wp-smush-all-done, .wp-smush-pagespeed-recommendation").removeClass("sui-hidden"),jQuery(".wp-smush-resmush-wrap, .wp-smush-bulk-progress-bar-wrapper").hide())),void 0!==this.ids&&void 0!==this.total&&this.total>0&&(n=(this.smushed+this.errors.length)/this.total*100)):n=(this.smushed+this.errors.length)/this.total*100,0===this.ids.length&&("nextgen"!==this.smush_type&&this.syncStats(),jQuery(".bulk-smush-wrapper .wp-smush-all-done, .wp-smush-pagespeed-recommendation").show(),jQuery(".wp-smush-bulk-wrapper").hide()),this.updateRemainingCount(),this._updateProgress(this.smushed+this.errors.length,WP_Smush.helpers.precise_round(n,1)),e.updateStats(this.smush_type)}}},{key:"_updateProgress",value:function(e,t){(this.is_bulk||this.is_bulk_resmush)&&(jQuery("span.wp-smush-images-percent").html(t+"%"),jQuery(".bulk-smush-wrapper .wp-smush-progress-inner").css("width",t+"%"),jQuery(".bulk-smush-wrapper .sui-progress-state-text").find("span:first-child").html(e).find("span:last-child").html(this.total))}},{key:"continue",value:function(){var e=this.button.attr("continue_smush");return void 0===e&&(e=!0),"false"!==e&&e||(e=!1),e&&this.ids.length>0&&this.is_bulk}},{key:"callAjax",value:function(){var t="";this.current_id=this.is_bulk?this.ids.shift():this.button.data("id"),e.updateSmushIds(this.current_id);var n=this.button.parent().find("#_wp_smush_nonce");n&&(t=n.val());var i=this;return this.request=e.ajax(this.is_bulk_resmush,this.current_id,this.url,t).done((function(t){if(void 0===t.success||void 0!==t.success&&!1===t.success&&void 0!==t.data&&"limit_exceeded"!==t.data.error){i.errors.push(i.current_id);var n=e.prepareErrorRow(t.data.error_message,t.data.file_name,t.data.thumbnail,i.current_id,i.smush_type);i.log.show(),i.errors.length>5?jQuery(".smush-bulk-errors-actions").removeClass("sui-hidden"):i.log.find(".smush-bulk-errors").append(n)}else void 0!==t.success&&t.success&&i.smushed++;e.membershipValidity(t.data),void 0!==t.data&&"limit_exceeded"===t.data.error&&"resolved"!==i.deferred.state()?(document.getElementById("bulk_smush_warning").classList.remove("sui-hidden"),i.button.attr("continue_smush",!1),wp_smushit_data.unsmushed.unshift(i.current_id),i.ids.unshift(i.current_id),i.freeExceeded()):i.is_bulk?i.updateProgress(t):0===i.ids.length&&i.syncStats(),i.singleDone()})).always((function(){i.continue()&&i.is_bulk?i.callAjax():i.deferred.resolve()})),this.deferred.errors=this.errors,this.deferred}},{key:"run",value:function(){this.is_bulk&&this.ids.length>0&&this.callAjax(),this.is_bulk||this.callAjax()}},{key:"bindDeferredEvents",value:function(){var e=this;this.deferred.done((function(){if(e.button.removeAttr("continue_smush"),e.errors.length){var t=window.wp_smush_msgs.error_in_bulk.replace("{{errors}}",e.errors.length).replace("{{total}}",e.total).replace("{{smushed}}",e.smushed);jQuery(".wp-smush-all-done").addClass("sui-notice-warning").removeClass("sui-notice-success").find("p").html(t)}e.bulkDone(),jQuery(".wp-smush-all:not(.wp-smush-finished), .wp-smush-scan").removeAttr("disabled")}))}},{key:"cancelAjax",value:function(){var t=this;jQuery(".wp-smush-cancel-bulk").on("click",(function(){t.button.attr("continue_smush",!1),t.syncStats(),e.updateStats(this.smush_type),t.request.abort(),t.enableButton(),t.button.removeClass("wp-smush-started"),wp_smushit_data.unsmushed.unshift(t.current_id),jQuery(".wp-smush-bulk-wrapper").show(),jQuery(".wp-smush-bulk-progress-bar-wrapper").hide()}))}}])&&s(t.prototype,n),r&&s(t,r),e}();t.a=r},function(e,t,n){var i;
|
2 |
/*!
|
3 |
* jQuery JavaScript Library v3.4.1
|
4 |
* https://jquery.com/
|
1 |
+
!function(e){var t={};function n(i){if(t[i])return t[i].exports;var s=t[i]={i:i,l:!1,exports:{}};return e[i].call(s.exports,s,s.exports,n),s.l=!0,s.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)n.d(i,s,function(t){return e[t]}.bind(null,s));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=11)}([function(e,t,n){"use strict";function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}var o=function(){function e(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"media";s(this,e),this.errors=[];var o=jQuery(".bulk-smush-wrapper .sui-progress-state-text");this.smushed=parseInt(o.find("span:first-child").html()),this.total=parseInt(o.find("span:last-child").html()),this.skip_resmush=!(void 0===t.data("smush")||!t.data("smush")),this.button=jQuery(t[0]),this.is_bulk=!!i(n)&&n,this.url=ajaxurl,this.log=jQuery(".smush-final-log"),this.deferred=jQuery.Deferred(),this.deferred.errors=[];var a=0<wp_smushit_data.resmush.length&&!this.skip_resmush?wp_smushit_data.unsmushed.length>0?wp_smushit_data.resmush.concat(wp_smushit_data.unsmushed):wp_smushit_data.resmush:wp_smushit_data.unsmushed;return"object"===i(a)?this.ids=a.filter((function(e,t,n){return t===n.indexOf(e)})):this.ids=a,this.is_bulk_resmush=0<wp_smushit_data.resmush.length&&!this.skip_resmush,this.status=this.button.parent().find(".smush-status"),this.smush_type=r,this.single_ajax_suffix="nextgen"===this.smush_type?"smush_manual_nextgen":"wp_smushit_manual",this.bulk_ajax_suffix="nextgen"===this.smush_type?"wp_smushit_nextgen_bulk":"wp_smushit_bulk",this.url=this.is_bulk?e.smushAddParams(this.url,{action:this.bulk_ajax_suffix}):e.smushAddParams(this.url,{action:this.single_ajax_suffix}),this.start(),this.run(),this.bindDeferredEvents(),this.cancelAjax(),this.deferred}var t,n,o;return t=e,o=[{key:"smushAddParams",value:function(e,t){return jQuery.isEmptyObject(t)||(e+=(e.indexOf("?")>=0?"&":"?")+jQuery.param(t)),e}},{key:"membershipValidity",value:function(e){var t=jQuery("#wp-smush-invalid-member");void 0!==e&&void 0!==e.show_warning&&t.length>0&&(e.show_warning?t.show():t.hide())}},{key:"ajax",value:function(e,t,n,i){var s=jQuery.param({is_bulk_resmush:e,attachment_id:t,_nonce:i});return jQuery.ajax({type:"GET",data:s,url:n,timeout:wp_smushit_data.timeout,dataType:"json"})}},{key:"progressBar",value:function(e,t,n){var i=e.parents().eq(1).find(".wp-smush-progress");"show"===n?i.html(t):i.html(window.wp_smush_msgs.all_done),i.toggleClass("visible")}},{key:"setProSavings",value:function(){var e=wp_smushit_data.savings_percent>0?wp_smushit_data.savings_percent:0,t=wp_smushit_data.savings_bytes>0?wp_smushit_data.savings_bytes:0,n=2.22058824;e>49&&(n=1.22054412),e>0&&(e*=n,t*=n),wp_smushit_data.pro_savings={percent:WP_Smush.helpers.precise_round(e,1),savings_bytes:WP_Smush.helpers.formatBytes(t,1)}}},{key:"updateStats",value:function(t){var n=void 0!==t&&"nextgen"===t,i=0;wp_smushit_data.savings_bytes=parseInt(wp_smushit_data.size_before)-parseInt(wp_smushit_data.size_after);var s=WP_Smush.helpers.formatBytes(wp_smushit_data.savings_bytes,1),r=jQuery(".wp-smush-savings .wp-smush-stats-human");n?r.html(s):(r.html(WP_Smush.helpers.getFormatFromString(s)),jQuery(".sui-summary-large.wp-smush-stats-human").html(WP_Smush.helpers.getSizeFromString(s))),wp_smushit_data.savings_percent=WP_Smush.helpers.precise_round(parseInt(wp_smushit_data.savings_bytes)/parseInt(wp_smushit_data.size_before)*100,1),isNaN(wp_smushit_data.savings_percent)||jQuery(".wp-smush-savings .wp-smush-stats-percent").html(wp_smushit_data.savings_percent),void 0!==wp_smushit_data.savings_bytes&&void 0!==wp_smushit_data.savings_resize&&(i=parseInt(wp_smushit_data.savings_bytes)-parseInt(wp_smushit_data.savings_resize))>0&&jQuery("li.super-smush-attachments span.smushed-savings").html(WP_Smush.helpers.formatBytes(i,1)),n?jQuery(".sui-summary-details span.wp-smush-total-optimised").html(wp_smushit_data.count_images):jQuery("span.smushed-items-count span.wp-smush-count-total span.wp-smush-total-optimised").html(wp_smushit_data.count_images),jQuery("span.smushed-items-count span.wp-smush-count-resize-total span.wp-smush-total-optimised").html(wp_smushit_data.count_resize);var o=jQuery("li.super-smush-attachments .smushed-count");o.length&&void 0!==wp_smushit_data.count_supersmushed&&o.html(wp_smushit_data.count_supersmushed);var a=jQuery(".smush-conversion-savings");if(a.length>0&&void 0!==wp_smushit_data.savings_conversion&&""!==wp_smushit_data.savings_conversion){var u=a.find(".wp-smush-stats");u.length>0&&u.html(WP_Smush.helpers.formatBytes(wp_smushit_data.savings_conversion,1))}var l=jQuery(".smush-resize-savings");if(l.length>0&&void 0!==wp_smushit_data.savings_resize&&""!==wp_smushit_data.savings_resize){var d=parseInt(wp_smushit_data.savings_resize),c=l.find(".wp-smush-stats"),h=l.find(".wp-smush-stats-label-message");d>0&&c.length>0&&(h.length>0&&h.hide(),c.html(WP_Smush.helpers.formatBytes(wp_smushit_data.savings_resize,1)))}if(e.setProSavings(),void 0!==wp_smushit_data.pro_savings){var p=jQuery(".smush-avg-pro-savings");if(p.length>0){var f=p.find(".wp-smush-stats-percent"),m=p.find(".wp-smush-stats-human");f.length>0&&void 0!==wp_smushit_data.pro_savings.percent&&""!==wp_smushit_data.pro_savings.percent&&f.html(wp_smushit_data.pro_savings.percent),m.length>0&&void 0!==wp_smushit_data.pro_savings.savings_bytes&&""!==wp_smushit_data.pro_savings.savings_bytes&&m.html(wp_smushit_data.pro_savings.savings_bytes)}}var g=jQuery(".smush-sidenav .wp-smush-remaining-count");if(g.length){var v=0;void 0!==wp_smushit_data.unsmushed&&wp_smushit_data.unsmushed.length>0&&(v+=wp_smushit_data.unsmushed.length),void 0!==wp_smushit_data.resmush&&wp_smushit_data.resmush.length>0&&(v+=wp_smushit_data.resmush.length),v>0?g.html(v):(jQuery(".sui-summary-smush .smush-stats-icon").addClass("sui-hidden"),g.removeClass("sui-tag sui-tag-warning").html(""))}}},{key:"updateImageStats",value:function(e){if(0!==e){var t=jQuery(".attachment-info .file-size");if(t.contents().filter((function(){return 3===this.nodeType})).text()!==" "+e){var n=t.contents().filter((function(){return 1===this.nodeType})).text();t.html("<strong>"+n+"</strong> "+e)}}}},{key:"updateLocalizedStats",value:function(e,t){void 0!==window.wp_smushit_data&&("media"===t?(wp_smushit_data.count_images=parseInt(wp_smushit_data.count_images)+parseInt(e.count),e.is_lossy&&(wp_smushit_data.count_supersmushed=parseInt(wp_smushit_data.count_supersmushed)+1),wp_smushit_data.savings_resize=void 0!==e.savings_resize.bytes?parseInt(wp_smushit_data.savings_resize)+parseInt(e.savings_resize.bytes):parseInt(wp_smushit_data.savings_resize),wp_smushit_data.count_resize=void 0!==e.savings_resize.bytes?parseInt(wp_smushit_data.count_resize)+1:wp_smushit_data.count_resize,wp_smushit_data.savings_conversion=void 0!==e.savings_conversion&&void 0!==e.savings_conversion.bytes?parseInt(wp_smushit_data.savings_conversion)+parseInt(e.savings_conversion.bytes):parseInt(wp_smushit_data.savings_conversion)):"directory_smush"===t?wp_smushit_data.count_images=parseInt(wp_smushit_data.count_images)+1:"nextgen"===t&&(wp_smushit_data.count_supersmushed=parseInt(wp_smushit_data.count_supersmushed)+1,wp_smushit_data.count_images=parseInt(wp_smushit_data.count_images)+parseInt(e.count)),e.size_before>e.size_after&&(wp_smushit_data.size_before=void 0!==e.size_before?parseInt(wp_smushit_data.size_before)+parseInt(e.size_before):parseInt(wp_smushit_data.size_before),wp_smushit_data.size_after=void 0!==e.size_after?parseInt(wp_smushit_data.size_after)+parseInt(e.size_after):parseInt(wp_smushit_data.size_after)),void 0!==e.savings_resize&&(wp_smushit_data.size_before=void 0!==e.savings_resize.size_before?parseInt(wp_smushit_data.size_before)+parseInt(e.savings_resize.size_before):parseInt(wp_smushit_data.size_before),wp_smushit_data.size_after=void 0!==e.savings_resize.size_after?parseInt(wp_smushit_data.size_after)+parseInt(e.savings_resize.size_after):parseInt(wp_smushit_data.size_after)),void 0!==e.savings_conversion&&(wp_smushit_data.size_before=void 0!==e.savings_conversion.size_before?parseInt(wp_smushit_data.size_before)+parseInt(e.savings_conversion.size_before):parseInt(wp_smushit_data.size_before),wp_smushit_data.size_after=void 0!==e.savings_conversion.size_after?parseInt(wp_smushit_data.size_after)+parseInt(e.savings_conversion.size_after):parseInt(wp_smushit_data.size_after)))}},{key:"prepareErrorRow",value:function(e,t,n,i,s){var r='<div class="smush-bulk-error-row"><div class="smush-bulk-image-data">'+(void 0===n?'<i class="sui-icon-photo-picture" aria-hidden="true"></i>':n)+'<span class="smush-image-name">'+("undefined"===t||void 0===t?"undefined":t)+'</span><span class="smush-image-error">'+e+"</span></div>";return"media"===s&&(r=r+'<div class="smush-bulk-image-actions"><button type="button" class="sui-button-icon sui-tooltip sui-tooltip-constrained sui-tooltip-top-right smush-ignore-image" data-tooltip="'+window.wp_smush_msgs.error_ignore+'" data-id="'+i+'"><i class="sui-icon-eye-hide" aria-hidden="true"></i></button></div>'),r+="</div>"}},{key:"updateSmushIds",value:function(e){if(void 0!==wp_smushit_data.unsmushed&&wp_smushit_data.unsmushed.length>0){var t=wp_smushit_data.unsmushed.indexOf(e);t>-1&&wp_smushit_data.unsmushed.splice(t,1)}if(void 0!==wp_smushit_data.resmush&&wp_smushit_data.resmush.length>0){var n=wp_smushit_data.resmush.indexOf(e);n>-1&&wp_smushit_data.resmush.splice(n,1)}}}],(n=[{key:"start",value:function(){this.button.attr("disabled","disabled"),this.button.addClass("wp-smush-started"),this.bulkStart(),this.singleStart()}},{key:"bulkStart",value:function(){this.is_bulk&&(jQuery(".wp-smush-bulk-wrapper").hide(),jQuery(".sui-notice-top").remove(),jQuery(".wp-smush-bulk-progress-bar-wrapper .sui-notice-warning:first-of-type").hide(),0>=jQuery("div.smush-final-log .smush-bulk-error-row").length&&jQuery("div.smush-final-log").hide(),jQuery(".bulk-smush-wrapper .wp-smush-bulk-progress-bar-wrapper").show())}},{key:"singleStart",value:function(){this.is_bulk||(e.progressBar(this.button,window.wp_smush_msgs.smushing,"show"),this.status.removeClass("error"))}},{key:"enableButton",value:function(){this.button.prop("disabled",!1),jQuery(".wp-smush-all").removeAttr("disabled"),jQuery("button.wp-smush-scan, a.wp-smush-lossy-enable, button.wp-smush-resize-enable, button#wp-smush-save-settings").removeAttr("disabled")}},{key:"singleDone",value:function(){if(!this.is_bulk){e.progressBar(this.button,window.wp_smush_msgs.smushing,"hide");var t=this;this.request.done((function(n){if(void 0!==n.data){var i=t.status.parent();n.data.status&&(i.find(".smush-status-links").remove(),i.find(".smush-ignore-image").remove(),t.status.replaceWith(n.data.status)),e.membershipValidity(n.data),n.success&&"Not processed"!==n.data?(t.status.removeClass("sui-hidden"),t.button.remove()):(t.status.addClass("error"),t.status.html(n.data.error_msg),t.status.show()),i.append(n.data.stats),e.updateImageStats(n.data.new_size)}t.enableButton()})).fail((function(e){t.status.html(e.data),t.status.addClass("error"),t.enableButton()}))}}},{key:"syncStats",value:function(){var t=jQuery("div.wp-smush-bulk-progress-bar-wrapper div.wp-smush-count.tc"),n=t.html();t.html(window.wp_smush_msgs.sync_stats),jQuery.ajax({type:"GET",url:this.url,data:{action:"get_stats"},success:function(t){t&&void 0!==t&&(t=t.data,jQuery.extend(wp_smushit_data,{count_images:t.count_images,count_smushed:t.count_smushed,count_total:t.count_total,count_resize:t.count_resize,count_supersmushed:t.count_supersmushed,savings_bytes:t.savings_bytes,savings_conversion:t.savings_conversion,savings_resize:t.savings_resize,size_before:t.size_before,size_after:t.size_after}),e.updateStats(this.smush_type))}}).always((function(){return t.html(n)}))}},{key:"bulkDone",value:function(){if(this.is_bulk){this.enableButton();var e=jQuery(".sui-summary-smush .smush-stats-icon");if(0===this.ids.length)e.addClass("sui-hidden"),jQuery(".bulk-smush-wrapper .wp-smush-all-done, .wp-smush-pagespeed-recommendation").show(),jQuery(".wp-smush-bulk-wrapper").hide(),jQuery(".wp-smush-bulk-progress-bar-wrapper").hide();else{e.removeClass("sui-icon-loader sui-loading sui-hidden").addClass("sui-icon-info sui-warning");var t=jQuery(".bulk-smush-wrapper .wp-smush-resmush-notice");t.length>0?t.show():jQuery(".bulk-smush-wrapper .wp-smush-remaining").show()}jQuery(".wp-resmush.wp-smush-action, .wp-smush-scan").removeAttr("disabled")}}},{key:"freeExceeded",value:function(){var e=jQuery(".wp-smush-bulk-progress-bar-wrapper");e.addClass("wp-smush-exceed-limit"),e.find(".sui-progress-block .wp-smush-cancel-bulk").addClass("sui-hidden"),e.find(".sui-progress-block .wp-smush-all").removeClass("sui-hidden"),e.find("i.sui-icon-loader").addClass("sui-icon-info").removeClass("sui-icon-loader").removeClass("sui-loading"),document.getElementById("bulk-smush-resume-button").classList.remove("sui-hidden")}},{key:"updateRemainingCount",value:function(){if(this.is_bulk_resmush){var e=jQuery(".wp-smush-resmush-notice .wp-smush-remaining-count");e.length&&void 0!==this.ids&&e.html(this.ids.length)}else{var t=jQuery(".bulk-smush-wrapper .wp-smush-remaining-count");t.length&&void 0!==this.ids&&t.html(this.ids.length)}var n=jQuery(".smush-sidenav .wp-smush-remaining-count");n.length&&void 0!==this.ids&&(this.ids.length>0?n.html(this.ids.length):(jQuery(".sui-summary-smush .smush-stats-icon").addClass("sui-hidden"),n.removeClass("sui-tag sui-tag-warning").html("")))}},{key:"updateProgress",value:function(t){if(this.is_bulk_resmush||this.is_bulk){var n=0;t&&void 0!==t.data&&void 0!==t.data.stats&&e.updateLocalizedStats(t.data.stats,this.smush_type),this.is_bulk_resmush?(t.success&&(wp_smushit_data.resmush.length>0?jQuery(".wp-smush-images-remaining").html(wp_smushit_data.resmush.length):0===wp_smushit_data.resmush.length&&0===this.ids.length&&(jQuery(".bulk-resmush-wrapper .wp-smush-all-done, .wp-smush-pagespeed-recommendation").removeClass("sui-hidden"),jQuery(".wp-smush-resmush-wrap, .wp-smush-bulk-progress-bar-wrapper").hide())),void 0!==this.ids&&void 0!==this.total&&this.total>0&&(n=(this.smushed+this.errors.length)/this.total*100)):n=(this.smushed+this.errors.length)/this.total*100,0===this.ids.length&&("nextgen"!==this.smush_type&&this.syncStats(),jQuery(".bulk-smush-wrapper .wp-smush-all-done, .wp-smush-pagespeed-recommendation").show(),jQuery(".wp-smush-bulk-wrapper").hide()),this.updateRemainingCount(),this._updateProgress(this.smushed+this.errors.length,WP_Smush.helpers.precise_round(n,1)),e.updateStats(this.smush_type)}}},{key:"_updateProgress",value:function(e,t){(this.is_bulk||this.is_bulk_resmush)&&(jQuery("span.wp-smush-images-percent").html(t+"%"),jQuery(".bulk-smush-wrapper .wp-smush-progress-inner").css("width",t+"%"),jQuery(".bulk-smush-wrapper .sui-progress-state-text").find("span:first-child").html(e).find("span:last-child").html(this.total))}},{key:"continue",value:function(){var e=this.button.attr("continue_smush");return void 0===e&&(e=!0),"false"!==e&&e||(e=!1),e&&this.ids.length>0&&this.is_bulk}},{key:"callAjax",value:function(){var t="";this.current_id=this.is_bulk?this.ids.shift():this.button.data("id"),e.updateSmushIds(this.current_id);var n=this.button.parent().find("#_wp_smush_nonce");n&&(t=n.val());var i=this;return this.request=e.ajax(this.is_bulk_resmush,this.current_id,this.url,t).done((function(t){if(void 0===t.success||void 0!==t.success&&!1===t.success&&void 0!==t.data&&"limit_exceeded"!==t.data.error){i.errors.push(i.current_id);var n=e.prepareErrorRow(t.data.error_message,t.data.file_name,t.data.thumbnail,i.current_id,i.smush_type);i.log.show(),i.errors.length>5?jQuery(".smush-bulk-errors-actions").removeClass("sui-hidden"):i.log.find(".smush-bulk-errors").append(n)}else void 0!==t.success&&t.success&&i.smushed++;e.membershipValidity(t.data),void 0!==t.data&&"limit_exceeded"===t.data.error&&"resolved"!==i.deferred.state()?(document.getElementById("bulk_smush_warning").classList.remove("sui-hidden"),i.button.attr("continue_smush",!1),wp_smushit_data.unsmushed.unshift(i.current_id),i.ids.unshift(i.current_id),i.freeExceeded()):i.is_bulk?i.updateProgress(t):0===i.ids.length&&i.syncStats(),i.singleDone()})).always((function(){i.continue()&&i.is_bulk?i.callAjax():i.deferred.resolve()})),this.deferred.errors=this.errors,this.deferred}},{key:"run",value:function(){this.is_bulk&&this.ids.length>0&&this.callAjax(),this.is_bulk||this.callAjax()}},{key:"bindDeferredEvents",value:function(){var e=this;this.deferred.done((function(){if(e.button.removeAttr("continue_smush"),e.errors.length){var t=window.wp_smush_msgs.error_in_bulk.replace("{{errors}}",e.errors.length).replace("{{total}}",e.total).replace("{{smushed}}",e.smushed);jQuery(".wp-smush-all-done").addClass("sui-notice-warning").removeClass("sui-notice-success").find("p").html(t)}e.bulkDone(),jQuery(".wp-smush-all:not(.wp-smush-finished), .wp-smush-scan").removeAttr("disabled")}))}},{key:"cancelAjax",value:function(){var t=this;jQuery(".wp-smush-cancel-bulk").on("click",(function(){t.button.attr("continue_smush",!1),t.syncStats(),e.updateStats(this.smush_type),t.request.abort(),t.enableButton(),t.button.removeClass("wp-smush-started"),wp_smushit_data.unsmushed.unshift(t.current_id),jQuery(".wp-smush-bulk-wrapper").show(),jQuery(".wp-smush-bulk-progress-bar-wrapper").hide()}))}}])&&r(t.prototype,n),o&&r(t,o),e}();t.a=o},function(e,t,n){var i;
|
2 |
/*!
|
3 |
* jQuery JavaScript Library v3.4.1
|
4 |
* https://jquery.com/
|
app/assets/js/smush-admin.min.js.map
CHANGED
@@ -1 +1 @@
|
|
1 |
-
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./_src/js/smush/smush.js","webpack:///./node_modules/jquery/dist/jquery.js","webpack:///./node_modules/jquery.fancytree/dist/modules/jquery.fancytree.js","webpack:///./_src/js/app.js","webpack:///./_src/js/modules/helpers.js","webpack:///./_src/js/modules/admin.js","webpack:///./_src/js/modules/bulk-smush.js","webpack:///./_src/js/modules/onboarding.js","webpack:///./node_modules/jquery.fancytree/dist/modules/jquery.fancytree.ui-deps.js","webpack:///./_src/js/smush/cdn.js","webpack:///./_src/js/smush/lazy-load.js","webpack:///./_src/js/modules/bulk-restore.js","webpack:///./_src/js/modules/notice.js","webpack:///./_src/js/modules/directory-smush.js","webpack:///./_src/js/smush/directory-scanner.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Smush","button","bulk","type","this","errors","progressBar","jQuery","smushed","parseInt","find","html","total","skip_resmush","data","is_bulk","url","ajaxurl","log","deferred","Deferred","ids","wp_smushit_data","resmush","length","unsmushed","concat","filter","itm","a","indexOf","is_bulk_resmush","status","parent","smush_type","single_ajax_suffix","bulk_ajax_suffix","smushAddParams","action","start","run","bindDeferredEvents","cancelAjax","isEmptyObject","param","memberValidityNotice","show_warning","show","hide","isBulkResmush","id","sendUrl","nonce","attachment_id","_nonce","ajax","timeout","dataType","curEle","txt","state","progressButton","parents","eq","window","wp_smush_msgs","all_done","toggleClass","savings","savings_percent","savingsBytes","savings_bytes","origDiff","pro_savings","percent","WP_Smush","helpers","precise_round","formatBytes","scanType","isNextgen","superSavings","size_before","size_after","formattedSize","statsHuman","getFormatFromString","getSizeFromString","isNaN","savings_resize","count_images","count_resize","smushedCountDiv","count_supersmushed","smushConversionSavings","savings_conversion","conversionSavings","smushResizeSavings","savingsValue","resizeSavings","resizeMessage","setProSavings","smushProSavings","proSavingsPercent","proSavingsBytes","sidenavCountDiv","count","addClass","removeClass","newSize","attachmentSize","contents","nodeType","text","sizeStrongEl","imageStats","is_lossy","bytes","errorMsg","fileName","thumbnail","tableDiv","error_ignore","currentId","uIndex","splice","index","attr","bulkStart","singleStart","remove","smushing","prop","removeAttr","self","request","done","response","replaceWith","membershipValidity","success","error_msg","append","stats","updateImageStats","new_size","enableButton","fail","messageHolder","progressMessage","sync_stats","extend","count_smushed","count_total","updateStats","always","statusIcon","notice","progress","document","getElementById","classList","resumeCountDiv","wrapperCountDiv","_res","updateLocalizedStats","syncStats","updateRemainingCount","_updateProgress","width","css","continueSmush","nonceValue","current_id","shift","updateSmushIds","nonceField","val","res","error","push","prepareErrorRow","error_message","file_name","unshift","freeExceeded","updateProgress","singleDone","continue","callAjax","resolve","msg","error_in_bulk","replace","bulkDone","on","abort","global","factory","w","Error","noGlobal","arr","getProto","getPrototypeOf","slice","class2type","toString","hasOwn","fnToString","ObjectFunctionString","support","isFunction","obj","isWindow","preservedScriptAttributes","src","noModule","DOMEval","code","node","doc","script","createElement","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","selector","context","fn","init","rtrim","isArrayLike","jquery","constructor","toArray","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","apply","arguments","first","last","len","j","end","sort","options","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","isReady","noop","proto","Ctor","globalEval","trim","makeArray","results","inArray","second","grep","invert","matches","callbackExpect","arg","guid","iterator","split","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","b","pop","push_native","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementsByTagName","getElementsByClassName","qsa","test","toSelector","join","testContext","querySelectorAll","qsaError","removeAttribute","keys","cache","cacheLength","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","attrId","getAttributeNode","tag","tmp","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","expr","elements","specified","escape","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","matcher","unmatched","lang","elemLang","hash","location","activeElement","hasFocus","href","tabIndex","checked","selected","selectedIndex","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","setMatchers","elementMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","matcherFromGroupMatchers","token","compiled","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","rneedsContext","needsContext","rsingleTag","winnow","qualifier","not","rootjQuery","root","parseHTML","ready","rparentsprev","guaranteedUnique","children","prev","sibling","has","targets","closest","prevAll","add","addBack","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","reject","noValue","method","promise","then","Callbacks","flag","createOptions","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","empty","disable","lock","fireWith","func","tuples","pipe","fns","newDefer","tuple","returned","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","catch","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","configurable","set","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","getData","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","swap","old","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","body","showHide","values","toggle","rcheckableType","rtagName","rscriptType","wrapMap","option","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","optgroup","tbody","tfoot","colgroup","caption","th","div","buildFragment","scripts","selection","ignored","wrap","attached","fragment","createDocumentFragment","nodes","htmlPrefilter","createTextNode","checkClone","cloneNode","noCloneChecked","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","focus","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rxhtmlTag","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","pdataOld","pdataCur","udataOld","udataCur","fixInput","domManip","collection","hasScripts","iNoClone","valueIsFunction","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","prepend","insertBefore","before","after","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","rboxStyle","curCSS","computed","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","swing","cos","PI","fxNow","inProgress","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","height","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","complete","timer","anim","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","clearTimeout","checkOn","optSelected","radioValue","boolHook","nType","attrHooks","bool","attrNames","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","classes","curValue","clazz","finalValue","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","responses","isSuccess","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","hover","fnOver","fnOut","unbind","delegate","undelegate","proxy","holdReady","hold","parseJSON","isNumeric","_jQuery","_$","$","noConflict","ui","fancytree","FT","TEST_IMG","REX_HTML","REX_TOOLTIP","ENTITY_MAP","IGNORE_KEYCODES","16","17","18","SPECIAL_KEYCODES","8","9","10","13","19","20","27","32","33","34","35","36","37","38","39","40","45","46","59","61","96","97","98","99","100","101","102","103","104","105","106","107","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","144","145","173","186","187","188","189","190","191","192","219","220","221","222","MODIFIERS","91","93","MOUSE_BUTTONS","1","2","3","CLASS_ATTRS","CLASS_ATTR_MAP","TREE_ATTRS","NODE_ATTRS","NODE_ATTR_MAP","NODE_ATTR_LOWERCASE_MAP","NONE_NODE_DATA_MAP","_assert","getTime","FancytreeNode","_findDirectChild","ptr","cl","_setChildren","tree","_callHook","addChildren","firstNode","origFirstChild","getFirstChild","origLastChild","getLastChild","nodeList","render","renderStatus","ul","selectMode","fixSelection3FromEndNodes","triggerModifyChild","addNode","getParent","getNextSibling","addPagingNode","title","strings","moreData","statusNodeType","icon","partload","appendSibling","applyCommand","cmd","applyPatch","patch","_getResolvedPromise","IGNORE_MAP","removeChildren","isVisible","renderTitle","setExpanded","collapseSiblings","copyTo","toDict","countChildren","debug","debugLevel","consoleApply","discard","resetLazy","discardMarkup","includeSelf","findAll","_makeNodeTitleMatcher","visit","findFirst","findRelatedNode","where","includeHidden","_changeSelectStatusAttrs","changed","unselectable","evalOption","unselectableStatus","partsel","fixSelection3AfterClick","callOpts","isSelected","radiogroup","_walk","child","allSelected","someSelected","unselState","lazy","visitParents","fromDict","dict","getChildren","hasChildren","getIndex","getIndexHier","separator","digits","getParentList","substr","getKeyPath","excludeSelf","sep","keyPathSeparator","getPath","getLevel","level","dtn","ac","includeRoot","part","path","isFunc","getPrevSibling","getSelectedNodes","stopOnParents","isStatusNode","extraClasses","focusNode","info","isActive","activeNode","isBelowOf","otherNode","isChildOf","isDescendantOf","isExpanded","isFirstSibling","isFolder","folder","isLastSibling","isLazy","isLoaded","isLoading","_isLoading","isRoot","isRootNode","isPartsel","isPartload","rootNode","isPagingNode","isTopLevel","isUndefined","hasFilter","enableFilter","subMatchCount","lazyLoad","forceReload","wasExpanded","_triggerNodeEvent","makeVisible","deferreds","dfd","effects","noAnimation","scroll","scrollIntoView","moveTo","targetNode","prevParent","targetParent","navigate","activate","KC","LEFT","RIGHT","setFocus","setActive","childNode","force","scheduleAction","ms","x","scrollOfs","scrollParent","topNode","$scrollParent","$container","topNodeY","nodeY","containerOffsetTop","nodeHeight","span","topOfs","bottomOfs","bottom","containerHeight","$animateTarget","isParentWindow","newScrollTop","innerHeight","clientHeight","setSelected","setStatus","details","setTitle","triggerModify","sortChildren","cmp","y","recursive","wasAdded","statusElem","statusClassPropName","curClasses","toggleExpanded","toggleSelected","operation","modifyChild","visitAndLoad","_recursion","loaders","visitSiblings","Fancytree","_makeHookContext","ctx","widget","typeInfo","contextObject","_extraArgs","_setExpiringValue","_tempCache","expire","_getExpiringValue","entry","_requireExtension","required","thisName","_local","extList","extensions","isBefore","isMissing","ext","badOrder","activateKey","getNodeByKey","opts_","refNode","getActiveNode","editCreateNode","editStart","patchList","p2","patchCount","deferredList","_makeResolveFunc","clear","enable","enableUpdate","_enableUpdate","expandAll","findNextNode","startNode","reMatch","_checkNode","visitRows","BACKSPACE","HOME","END","UP","DOWN","generateFormElements","selectedName","_id","activeName","$result","_appender","getFocusNode","getOption","optionName","searchRoot","idPrefix","ftnode","_hasFocus","_requestId","loadKeyPath","keyPathList","optsOrCallback","pathSegList","matchKey","charAt","_loadKeyPathImpl","nodeKey","remain","remainMap","tmpParent","segList","subDfd","__findChild","__lazyload","errMsg","reactivate","noFocus","reload","selectAll","setOption","_trigger","_triggerTreeEvent","_visitRowsUp","siblingOfs","skipFirstNode","checkFilter","nodeClick","targetType","focusOnSelect","clickFolderMode","nodeSetFocus","nodeCollapseSiblings","nodeDblclick","nodeKeydown","matchNode","stamp","specialModifiers","isAlnum","$target","handled","autoActivate","quicksearch","lastQuicksearchTime","lastQuicksearchTerm","eventToString","nodeSetExpanded","nodeToggleSelected","nodeSetActive","nodeLoadChildren","requestId","debugDelay","textStatus","errorObj","postProcess","enableAspx","errorThrown","reason","nodeSetStatus","ctxErr","metaData","noDataRes","nodata","nodeLoadKeyPath","nodeRemoveChild","subCtx","nodeRemoveChildren","nodeRemoveMarkup","nodeRemoveChildMarkup","li","nodeRenderStatus","nodeRender","collapsed","_recursive","childLI","childNode1","childNode2","aria","firstTime","successorLi","generateIds","nodeRenderTitle","createNode","renderNode","$div","nodeTitle","role","tooltip","iconTooltip","ares","minExpandLevel","iconClass","_escapeTooltip","imagePath","escapeHtml","titlesTabbable","escapeTitles","enhanceTitle","$title","$ariaElem","isLastSib","cn","_classNames","cnList","focused","Boolean","lastsib","loading","_error","statusNodePrefix","combinedExpanderPrefix","combinedIconPrefix","noEvents","_getRejectedPromise","activeVisible","_afterLoad","prevAC","autoCollapse","autoScroll","effect","toggleEffect","animating","ctx2","isInput","calledByNode","uniqueId","nodeSetSelected","_lastSelectIntent","lastSelectedNode","_setStatusNode","_clearStatusNode","loadError","noData","nodeToggleExpanded","treeClear","treeCreate","treeDestroy","$source","treeInit","checkboxAutoHide","rtl","treeLoad","$ul","element","rootCtx","parseHtml","_getElementDataAsDict","treeRegisterNode","treeSetFocus","_lastMousedownNode","treeSetOption","callDefault","callCreate","callRender","_super","Widget","_setOption","treeStructureChanged","keyboard","treeId","_create","extension","extName","_extensions","_simpleDeepMerge","_subclassObject","icons","tabbable","_init","_bind","destroy","_unbind","_ns","getNode","prevPhase","phase","et","getEventTarget","getTree","version","buildType","_nextId","_nextNodeKey","_FancytreeClass","_FancytreeNodeClass","jquerySupports","positionMyOfs","dottedVersion","major","minor","verParts","testParts","isVersionAtLeast","cond","createTree","debounce","invokeAsap","fixPositionOptions","my","at","myParts","atParts","dx","dy","tcn","getEventTargetType","orgEl","nodeObject","treeOptions","treeOpt","nodeOpt","setSpanIcon","baseClass","$span","keyEventToString","overrideMethod","instance","methodName","prevSuper","iPos","tmp2","$children","allData","lowerCaseAttr","$li","$liSpan","$liA","search","substring","registerExtension","definition","unescapeHtml","_makeVirtualFunction","prevFunc","baseFunc","_superApply","prevLocal","prevSuperApply","attrName","argArray","$el","uiFancytree","unselectableIgnore","hideCheckbox","defaultKey","lazyload","loaderror","removeNode","columns","systemFocusElement","viewport","ariaPropName","nodeContainerAttrName","fakeParent","class","includes","require","units","abs","u","toFixed","decimals","sign","pow","resetSettings","smush_url","smush_vars","get_smush_status","remove_element","process_smush_action","current_button","smush_action","c_element","disable_links","post","enable_links","run_re_check","process_settings","scan_type","notices","get_ui","wp_smush_options_nonce","resmush_ids","count_image","super_smush","enable_lossy","super_smush_stats","resmush_complete","resmush_check","reCheckMessage","goToByScroll","slide_symbol","ignore","not_processed","otherClass","setting_type","setting_input","checking","smush_percent","progress_bar","savings_dir_smush","orig_size","image_size","remainingCountDiv","scroll_and_enable_resize","scroll_and_enable_lossy","setting_hash","dataset","keypress","wrapper_div","width_only","height_only","resize_checkbox","width_input","width_error_note","height_input","height_error_note","width_error","height_error","resize_sizes","validate_resize_settings","settings_wrap","notice_wrap","warning_wrap","membership_valid","membership_invalid","wp_smush_run_re_check","dir_smush","ajax_error","stats_human","stats_percent","human","combined_stats","c_stats","total_count","update_cummulative_stats","keyup","modal","SUI","dialogs","bulkWarning","bulkShow","onboarding","membership","onboardingModal","scanFilesModal","slide","auto","lossy","strip_exif","lazy_load","usage","contentContainer","onboardingSlides","touchX","touchY","renderTemplate","skipButton","querySelector","skipSetup","openModal","handleTouchStart","firstTouch","handleTouchMove","xUp","yUp","xDiff","yDiff","directionClass","template","bindSubmit","submitButton","showScanDialog","stringify","whereTo","newIndex","goTo","closeModal","memoize","evaluate","interpolate","variable","templateSettings","uuid","widgetUuid","widgetSlice","existingConstructor","basePrototype","proxiedPrototype","fullName","_createWidget","_proto","_childConstructors","__super","__superApply","widgetEventPrefix","widgetName","widgetFullName","childPrototype","bridge","inputIndex","inputLength","isMethodCall","methodValue","defaultElement","eventNamespace","bindings","hoverable","focusable","classesElementLookup","_on","_getCreateOptions","_setOptionDisabled","_getCreateEventData","_destroy","_removeClass","curOption","_setOptions","_setOptionClasses","classKey","currentElements","_classes","_toggleClass","full","processClassString","checkOption","_untrackClassesElement","_addClass","suppressDisabledCheck","delegateElement","handlerProxy","eventName","_off","_delay","_hoverable","_focusable","focusout","defaultEffect","hasOptions","effectName","cachedScrollbarWidth","rhorizontal","rvertical","roffset","rposition","rpercent","_position","getOffsets","offsets","parseCss","getDimensions","outerWidth","outerHeight","scrollbarWidth","w1","w2","innerDiv","clientWidth","getScrollInfo","within","isDocument","hasOverflowX","scrollWidth","scrollHeight","getWithinInfo","withinElement","of","atOffset","targetWidth","targetHeight","targetOffset","basePosition","dimensions","scrollInfo","collision","horizontalOffset","verticalOffset","collisionPosition","elemWidth","elemHeight","marginTop","collisionWidth","collisionHeight","myOffset","feedback","horizontal","vertical","important","fit","newOverRight","withinOffset","collisionPosLeft","overLeft","overRight","newOverBottom","collisionPosTop","overTop","overBottom","flip","newOverLeft","offsetLeft","newOverTop","offsetTop","flipfit","COMMA","DELETE","ENTER","ESCAPE","PAGE_DOWN","PAGE_UP","PERIOD","SPACE","TAB","excludeStaticParent","overflowRegex","removeUniqueId","CDN","cdnEnableButton","cdnDisableButton","cdnStatsBox","loader","toggle_cdn","updateStatsBox","showNotice","toggleElements","spinner","Lazyload","lazyloadEnableButton","lazyloadDisableButton","toggle_lazy_load","removeSpinner","removeLoaderIcon","removePlaceholder","items","forEach","addLoaderIcon","frame","wp","media","multiple","attachment","toJSON","imageIcon","backgroundImage","removeDiv","filename","restore","currentStep","totalSteps","confirmButton","initScan","cancel","updateProgressBar","min","statusDiv","item","thumb","link","elNotice","btnAct","removeNotice","notifyWordpress","DirectoryScanner","cancelling","failedItems","scan","remainingSteps","getProgress","onFinishStep","progress_smushed","directory","onFinish","directory_url","limitReached","dialog","bulk_resume","resume","failed","progressDialog","currentScanStep","scanner","Scanner","initFileTree","selectedFolders","absPath","paths","smush_path","image_list_nonce","showProgressDialog","smushButton","list_nonce","Promise","add_dir","loadChildren"],"mappings":"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","file":"smush-admin.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 11);\n","/* global WP_Smush */\n/* global ajaxurl */\n/* global wp_smushit_data */\n\n/**\n * Smush class.\n *\n * @since 2.9.0 Moved from admin.js into a dedicated ES6 class.\n */\nclass Smush {\n\t/**\n\t * Class constructor.\n\t *\n\t * @param {Object} button Button object that made the call.\n\t * @param {boolean} bulk Bulk smush or not.\n\t * @param {string} type Accepts: 'nextgen', 'media'.\n\t */\n\tconstructor( button, bulk, type = 'media' ) {\n\t\t// TODO: errors will reset after bulk smush limit is reached and user clicks continue.\n\t\tthis.errors = [];\n\t\t// Smushed and total we take from the progress bar... I don't like this :-(\n\t\tconst progressBar = jQuery( '.bulk-smush-wrapper .sui-progress-state-text' );\n\t\tthis.smushed = parseInt( progressBar.find( 'span:first-child' ).html() );\n\t\tthis.total = parseInt( progressBar.find( 'span:last-child' ).html() );\n\n\t\t//If smush attribute is not defined, Need not skip re-Smush IDs.\n\t\tthis.skip_resmush = ! ( 'undefined' === typeof button.data( 'smush' ) || ! button.data( 'smush' ) );\n\t\tthis.button = jQuery( button[ 0 ] );\n\t\tthis.is_bulk = typeof bulk ? bulk : false;\n\t\tthis.url = ajaxurl;\n\t\tthis.log = jQuery( '.smush-final-log' );\n\t\tthis.deferred = jQuery.Deferred();\n\t\tthis.deferred.errors = [];\n\n\t\tconst ids = 0 < wp_smushit_data.resmush.length && ! this.skip_resmush ? ( wp_smushit_data.unsmushed.length > 0 ? wp_smushit_data.resmush.concat( wp_smushit_data.unsmushed ) : wp_smushit_data.resmush ) : wp_smushit_data.unsmushed;\n\t\tif ( 'object' === typeof ids ) {\n\t\t\t// If button has re-Smush class, and we do have ids that needs to re-Smushed, put them in the list.\n\t\t\tthis.ids = ids.filter( function( itm, i, a ) {\n\t\t\t\treturn i === a.indexOf( itm );\n\t\t\t} );\n\t\t} else {\n\t\t\tthis.ids = ids;\n\t\t}\n\n\t\tthis.is_bulk_resmush = 0 < wp_smushit_data.resmush.length && ! this.skip_resmush;\n\n\t\tthis.status = this.button.parent().find( '.smush-status' );\n\n\t\t// Added for NextGen support.\n\t\tthis.smush_type = type;\n\t\tthis.single_ajax_suffix = 'nextgen' === this.smush_type ? 'smush_manual_nextgen' : 'wp_smushit_manual';\n\t\tthis.bulk_ajax_suffix = 'nextgen' === this.smush_type ? 'wp_smushit_nextgen_bulk' : 'wp_smushit_bulk';\n\t\tthis.url = this.is_bulk ? Smush.smushAddParams( this.url, { action: this.bulk_ajax_suffix } ) : Smush.smushAddParams( this.url, { action: this.single_ajax_suffix } );\n\n\t\tthis.start();\n\t\tthis.run();\n\t\tthis.bindDeferredEvents();\n\n\t\t// Handle cancel ajax.\n\t\tthis.cancelAjax();\n\n\t\treturn this.deferred;\n\t}\n\n\t/**\n\t * Add params to the URL.\n\t *\n\t * @param {string} url URL to add the params to.\n\t * @param {Object} data Object with params.\n\t * @return {string} URL with params.\n\t */\n\tstatic smushAddParams( url, data ) {\n\t\tif ( ! jQuery.isEmptyObject( data ) ) {\n\t\t\turl += ( url.indexOf( '?' ) >= 0 ? '&' : '?' ) + jQuery.param( data );\n\t\t}\n\n\t\treturn url;\n\t}\n\n\t/**\n\t * Check membership validity.\n\t *\n\t * @param {Object} data\n\t * @param {number} data.show_warning\n\t */\n\tstatic membershipValidity( data ) {\n\t\tconst memberValidityNotice = jQuery( '#wp-smush-invalid-member' );\n\n\t\t// Check for membership warning.\n\t\tif ( 'undefined' !== typeof data && 'undefined' !== typeof data.show_warning && memberValidityNotice.length > 0 ) {\n\t\t\tif ( data.show_warning ) {\n\t\t\t\tmemberValidityNotice.show();\n\t\t\t} else {\n\t\t\t\tmemberValidityNotice.hide();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Send Ajax request for compressing the image.\n\t *\n\t * @param {boolean} isBulkResmush\n\t * @param {number} id\n\t * @param {string} sendUrl\n\t * @param {string} nonce\n\t * @return {*|jQuery.promise|void} Compression results.\n\t */\n\tstatic ajax( isBulkResmush, id, sendUrl, nonce ) {\n\t\tconst param = jQuery.param( {\n\t\t\tis_bulk_resmush: isBulkResmush,\n\t\t\tattachment_id: id,\n\t\t\t_nonce: nonce,\n\t\t} );\n\n\t\treturn jQuery.ajax( {\n\t\t\ttype: 'GET',\n\t\t\tdata: param,\n\t\t\turl: sendUrl,\n\t\t\t/** @param {Array} wp_smushit_data */\n\t\t\ttimeout: wp_smushit_data.timeout,\n\t\t\tdataType: 'json',\n\t\t} );\n\t}\n\n\t/**\n\t * Show loader in button for single and bulk Smush.\n\t */\n\tstart() {\n\t\tthis.button.attr( 'disabled', 'disabled' );\n\t\tthis.button.addClass( 'wp-smush-started' );\n\n\t\tthis.bulkStart();\n\t\tthis.singleStart();\n\t}\n\n\t/**\n\t * Start bulk Smush.\n\t */\n\tbulkStart() {\n\t\tif ( ! this.is_bulk ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Hide the bulk div.\n\t\tjQuery( '.wp-smush-bulk-wrapper' ).hide();\n\n\t\t// Remove any global notices if there.\n\t\tjQuery( '.sui-notice-top' ).remove();\n\n\t\t// Hide the bulk limit message.\n\t\tjQuery( '.wp-smush-bulk-progress-bar-wrapper .sui-notice-warning:first-of-type' ).hide();\n\n\t\t// Hide parent wrapper, if there are no other messages.\n\t\tif ( 0 >= jQuery( 'div.smush-final-log .smush-bulk-error-row' ).length ) {\n\t\t\tjQuery( 'div.smush-final-log' ).hide();\n\t\t}\n\n\t\t// Show the progress bar.\n\t\tjQuery( '.bulk-smush-wrapper .wp-smush-bulk-progress-bar-wrapper' ).show();\n\t}\n\n\t/**\n\t * Start single image Smush.\n\t */\n\tsingleStart() {\n\t\tif ( this.is_bulk ) {\n\t\t\treturn;\n\t\t}\n\t\tSmush.progressBar( this.button, window.wp_smush_msgs.smushing, 'show' );\n\t\tthis.status.removeClass( 'error' );\n\t}\n\n\t/**\n\t * Enable button.\n\t */\n\tenableButton() {\n\t\tthis.button.prop( 'disabled', false );\n\t\t// For bulk process, enable other buttons.\n\t\tjQuery( '.wp-smush-all' ).removeAttr( 'disabled' );\n\t\tjQuery( 'button.wp-smush-scan, a.wp-smush-lossy-enable, button.wp-smush-resize-enable, button#wp-smush-save-settings' ).removeAttr( 'disabled' );\n\t}\n\n\t/**\n\t * Show/hide the progress bar for Smushing/Restore/SuperSmush.\n\t *\n\t * @param {Object} curEle Current element.\n\t * @param {string} txt Message to be displayed.\n\t * @param {string} state Show/hide.\n\t */\n\tstatic progressBar( curEle, txt, state ) {\n\t\t// Update progress bar text and show it.\n\t\tconst progressButton = curEle.parents().eq( 1 ).find( '.wp-smush-progress' );\n\n\t\tif ( 'show' === state ) {\n\t\t\tprogressButton.html( txt );\n\t\t} else {\n\t\t\t/** @param {string} wp_smush_msgs.all_done */\n\t\t\tprogressButton.html( window.wp_smush_msgs.all_done );\n\t\t}\n\n\t\tprogressButton.toggleClass( 'visible' );\n\t}\n\n\t/**\n\t * Finish single image Smush.\n\t */\n\tsingleDone() {\n\t\tif ( this.is_bulk ) {\n\t\t\treturn;\n\t\t}\n\n\t\tSmush.progressBar( this.button, window.wp_smush_msgs.smushing, 'hide' );\n\n\t\tconst self = this;\n\n\t\tthis.request.done( function( response ) {\n\t\t\tif ( 'undefined' !== typeof response.data ) {\n\t\t\t\t// Check if stats div exists.\n\t\t\t\tconst parent = self.status.parent();\n\n\t\t\t\t// If we've updated status, replace the content.\n\t\t\t\tif ( response.data.status ) {\n\t\t\t\t\t//remove Links\n\t\t\t\t\tparent.find( '.smush-status-links' ).remove();\n\t\t\t\t\t// TODO: this should be removed\n\t\t\t\t\tparent.find( '.smush-ignore-image' ).remove();\n\t\t\t\t\tself.status.replaceWith( response.data.status );\n\t\t\t\t}\n\n\t\t\t\t// Check whether to show membership validity notice or not.\n\t\t\t\tSmush.membershipValidity( response.data );\n\n\t\t\t\tif ( response.success && 'Not processed' !== response.data ) {\n\t\t\t\t\tself.status.removeClass( 'sui-hidden' );\n\t\t\t\t\tself.button.remove();\n\t\t\t\t} else {\n\t\t\t\t\tself.status.addClass( 'error' );\n\t\t\t\t\t/** @param {string} response.data.error_msg */\n\t\t\t\t\tself.status.html( response.data.error_msg );\n\t\t\t\t\tself.status.show();\n\t\t\t\t}\n\n\t\t\t\tparent.append( response.data.stats );\n\n\t\t\t\t/**\n\t\t\t\t * Update image size in attachment info panel.\n\t\t\t\t *\n\t\t\t\t * @param {string|number} response.data.new_size\n\t\t\t\t */\n\t\t\t\tSmush.updateImageStats( response.data.new_size );\n\t\t\t}\n\t\t\tself.enableButton();\n\t\t} ).fail( function( response ) {\n\t\t\tself.status.html( response.data );\n\t\t\tself.status.addClass( 'error' );\n\t\t\tself.enableButton();\n\t\t} );\n\t}\n\n\t/**\n\t * Set pro savings stats if not premium user.\n\t *\n\t * For non-premium users, show expected average savings based\n\t * on the free version savings.\n\t */\n\tstatic setProSavings() {\n\t\t// Default values.\n\t\tlet savings = wp_smushit_data.savings_percent > 0 ? wp_smushit_data.savings_percent : 0,\n\t\t\tsavingsBytes = wp_smushit_data.savings_bytes > 0 ? wp_smushit_data.savings_bytes : 0,\n\t\t\torigDiff = 2.22058824;\n\n\t\tif ( savings > 49 ) {\n\t\t\torigDiff = 1.22054412;\n\t\t}\n\n\t\t// Calculate Pro savings.\n\t\tif ( savings > 0 ) {\n\t\t\tsavings = origDiff * savings;\n\t\t\tsavingsBytes = origDiff * savingsBytes;\n\t\t}\n\n\t\twp_smushit_data.pro_savings = {\n\t\t\tpercent: WP_Smush.helpers.precise_round( savings, 1 ),\n\t\t\tsavings_bytes: WP_Smush.helpers.formatBytes( savingsBytes, 1 ),\n\t\t};\n\t}\n\n\t/**\n\t * Update all stats sections based on the response.\n\t *\n\t * @param {string} scanType Current scan type.\n\t */\n\tstatic updateStats( scanType ) {\n\t\tconst isNextgen = 'undefined' !== typeof scanType && 'nextgen' === scanType;\n\t\tlet superSavings = 0;\n\n\t\t// Calculate updated savings in bytes.\n\t\twp_smushit_data.savings_bytes = parseInt( wp_smushit_data.size_before ) - parseInt( wp_smushit_data.size_after );\n\n\t\tconst formattedSize = WP_Smush.helpers.formatBytes( wp_smushit_data.savings_bytes, 1 );\n\t\tconst statsHuman = jQuery( '.wp-smush-savings .wp-smush-stats-human' );\n\n\t\tif ( isNextgen ) {\n\t\t\tstatsHuman.html( formattedSize );\n\t\t} else {\n\t\t\tstatsHuman.html( WP_Smush.helpers.getFormatFromString( formattedSize ) );\n\t\t\tjQuery( '.sui-summary-large.wp-smush-stats-human' ).html( WP_Smush.helpers.getSizeFromString( formattedSize ) );\n\t\t}\n\n\t\t// Update the savings percent.\n\t\twp_smushit_data.savings_percent = WP_Smush.helpers.precise_round( ( parseInt( wp_smushit_data.savings_bytes ) / parseInt( wp_smushit_data.size_before ) ) * 100, 1 );\n\t\tif ( ! isNaN( wp_smushit_data.savings_percent ) ) {\n\t\t\tjQuery( '.wp-smush-savings .wp-smush-stats-percent' ).html( wp_smushit_data.savings_percent );\n\t\t}\n\n\t\t// Super-Smush savings.\n\t\tif ( 'undefined' !== typeof wp_smushit_data.savings_bytes && 'undefined' !== typeof wp_smushit_data.savings_resize ) {\n\t\t\tsuperSavings = parseInt( wp_smushit_data.savings_bytes ) - parseInt( wp_smushit_data.savings_resize );\n\t\t\tif ( superSavings > 0 ) {\n\t\t\t\tjQuery( 'li.super-smush-attachments span.smushed-savings' ).html( WP_Smush.helpers.formatBytes( superSavings, 1 ) );\n\t\t\t}\n\t\t}\n\n\t\t// Update image count.\n\t\tif ( isNextgen ) {\n\t\t\tjQuery( '.sui-summary-details span.wp-smush-total-optimised' ).html( wp_smushit_data.count_images );\n\t\t} else {\n\t\t\tjQuery( 'span.smushed-items-count span.wp-smush-count-total span.wp-smush-total-optimised' ).html( wp_smushit_data.count_images );\n\t\t}\n\n\t\t// Update resize image count.\n\t\tjQuery( 'span.smushed-items-count span.wp-smush-count-resize-total span.wp-smush-total-optimised' ).html( wp_smushit_data.count_resize );\n\n\t\t// Update super-Smushed image count.\n\t\tconst smushedCountDiv = jQuery( 'li.super-smush-attachments .smushed-count' );\n\t\tif ( smushedCountDiv.length && 'undefined' !== typeof wp_smushit_data.count_supersmushed ) {\n\t\t\tsmushedCountDiv.html( wp_smushit_data.count_supersmushed );\n\t\t}\n\n\t\t// Update conversion savings.\n\t\tconst smushConversionSavings = jQuery( '.smush-conversion-savings' );\n\t\tif ( smushConversionSavings.length > 0 && 'undefined' !== typeof ( wp_smushit_data.savings_conversion ) && wp_smushit_data.savings_conversion !== '' ) {\n\t\t\tconst conversionSavings = smushConversionSavings.find( '.wp-smush-stats' );\n\t\t\tif ( conversionSavings.length > 0 ) {\n\t\t\t\tconversionSavings.html( WP_Smush.helpers.formatBytes( wp_smushit_data.savings_conversion, 1 ) );\n\t\t\t}\n\t\t}\n\n\t\t// Update resize savings.\n\t\tconst smushResizeSavings = jQuery( '.smush-resize-savings' );\n\t\tif ( smushResizeSavings.length > 0 && 'undefined' !== typeof ( wp_smushit_data.savings_resize ) && wp_smushit_data.savings_resize !== '' ) {\n\t\t\t// Get the resize savings in number.\n\t\t\tconst savingsValue = parseInt( wp_smushit_data.savings_resize );\n\t\t\tconst resizeSavings = smushResizeSavings.find( '.wp-smush-stats' );\n\t\t\tconst resizeMessage = smushResizeSavings.find( '.wp-smush-stats-label-message' );\n\t\t\t// Replace only if value is grater than 0.\n\t\t\tif ( savingsValue > 0 && resizeSavings.length > 0 ) {\n\t\t\t\t// Hide message.\n\t\t\t\tif ( resizeMessage.length > 0 ) {\n\t\t\t\t\tresizeMessage.hide();\n\t\t\t\t}\n\t\t\t\tresizeSavings.html( WP_Smush.helpers.formatBytes( wp_smushit_data.savings_resize, 1 ) );\n\t\t\t}\n\t\t}\n\n\t\t//Update pro Savings\n\t\tSmush.setProSavings();\n\n\t\t// Updating pro savings stats.\n\t\tif ( 'undefined' !== typeof wp_smushit_data.pro_savings ) {\n\t\t\t// Pro stats section.\n\t\t\tconst smushProSavings = jQuery( '.smush-avg-pro-savings' );\n\t\t\tif ( smushProSavings.length > 0 ) {\n\t\t\t\tconst proSavingsPercent = smushProSavings.find( '.wp-smush-stats-percent' );\n\t\t\t\tconst proSavingsBytes = smushProSavings.find( '.wp-smush-stats-human' );\n\t\t\t\tif ( proSavingsPercent.length > 0 && 'undefined' !== typeof wp_smushit_data.pro_savings.percent && wp_smushit_data.pro_savings.percent !== '' ) {\n\t\t\t\t\tproSavingsPercent.html( wp_smushit_data.pro_savings.percent );\n\t\t\t\t}\n\t\t\t\tif ( proSavingsBytes.length > 0 && 'undefined' !== typeof wp_smushit_data.pro_savings.savings_bytes && wp_smushit_data.pro_savings.savings_bytes !== '' ) {\n\t\t\t\t\tproSavingsBytes.html( wp_smushit_data.pro_savings.savings_bytes );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Update remaining count.\n\t\t// Update sidebar count.\n\t\tconst sidenavCountDiv = jQuery( '.smush-sidenav .wp-smush-remaining-count' );\n\t\tif ( sidenavCountDiv.length ) {\n\t\t\tlet count = 0;\n\n\t\t\t// Unsmushed\n\t\t\tif ( 'undefined' !== typeof wp_smushit_data.unsmushed && wp_smushit_data.unsmushed.length > 0 ) {\n\t\t\t\tcount += wp_smushit_data.unsmushed.length;\n\t\t\t}\n\n\t\t\t// Re-smush\n\t\t\tif ( 'undefined' !== typeof wp_smushit_data.resmush && wp_smushit_data.resmush.length > 0 ) {\n\t\t\t\tcount += wp_smushit_data.resmush.length;\n\t\t\t}\n\n\t\t\tif ( count > 0 ) {\n\t\t\t\tsidenavCountDiv.html( count );\n\t\t\t} else {\n\t\t\t\tjQuery( '.sui-summary-smush .smush-stats-icon' ).addClass( 'sui-hidden' );\n\t\t\t\tsidenavCountDiv.removeClass( 'sui-tag sui-tag-warning' ).html( '' );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Update image size in attachment info panel.\n\t *\n\t * @since 2.8\n\t *\n\t * @param {number} newSize\n\t */\n\tstatic updateImageStats( newSize ) {\n\t\tif ( 0 === newSize ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst attachmentSize = jQuery( '.attachment-info .file-size' );\n\t\tconst currentSize = attachmentSize.contents().filter( function() {\n\t\t\treturn this.nodeType === 3;\n\t\t} ).text();\n\n\t\t// There is a space before the size.\n\t\tif ( currentSize !== ( ' ' + newSize ) ) {\n\t\t\tconst sizeStrongEl = attachmentSize.contents().filter( function() {\n\t\t\t\treturn this.nodeType === 1;\n\t\t\t} ).text();\n\t\t\tattachmentSize.html( '<strong>' + sizeStrongEl + '</strong> ' + newSize );\n\t\t}\n\t}\n\n\t/**\n\t * Sync stats.\n\t */\n\tsyncStats() {\n\t\tconst messageHolder = jQuery( 'div.wp-smush-bulk-progress-bar-wrapper div.wp-smush-count.tc' );\n\t\t// Store the existing content in a variable.\n\t\tconst progressMessage = messageHolder.html();\n\t\t/** @param {string} wp_smush_msgs.sync_stats */\n\t\tmessageHolder.html( window.wp_smush_msgs.sync_stats );\n\n\t\t// Send ajax.\n\t\tjQuery.ajax( {\n\t\t\ttype: 'GET',\n\t\t\turl: this.url,\n\t\t\tdata: {\n\t\t\t\taction: 'get_stats',\n\t\t\t},\n\t\t\tsuccess( response ) {\n\t\t\t\tif ( response && 'undefined' !== typeof response ) {\n\t\t\t\t\tresponse = response.data;\n\t\t\t\t\tjQuery.extend( wp_smushit_data, {\n\t\t\t\t\t\tcount_images: response.count_images,\n\t\t\t\t\t\tcount_smushed: response.count_smushed,\n\t\t\t\t\t\tcount_total: response.count_total,\n\t\t\t\t\t\tcount_resize: response.count_resize,\n\t\t\t\t\t\tcount_supersmushed: response.count_supersmushed,\n\t\t\t\t\t\tsavings_bytes: response.savings_bytes,\n\t\t\t\t\t\tsavings_conversion: response.savings_conversion,\n\t\t\t\t\t\tsavings_resize: response.savings_resize,\n\t\t\t\t\t\tsize_before: response.size_before,\n\t\t\t\t\t\tsize_after: response.size_after,\n\t\t\t\t\t} );\n\t\t\t\t\t// Got the stats, update it.\n\t\t\t\t\tSmush.updateStats( this.smush_type );\n\t\t\t\t}\n\t\t\t},\n\t\t} ).always( () => messageHolder.html( progressMessage ) );\n\t}\n\n\t/**\n\t * After the bulk optimization has been finished.\n\t */\n\tbulkDone() {\n\t\tif ( ! this.is_bulk ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Enable the button.\n\t\tthis.enableButton();\n\n\t\tconst statusIcon = jQuery( '.sui-summary-smush .smush-stats-icon' );\n\n\t\t// Show notice.\n\t\tif ( 0 === this.ids.length ) {\n\t\t\tstatusIcon.addClass( 'sui-hidden' );\n\t\t\tjQuery( '.bulk-smush-wrapper .wp-smush-all-done, .wp-smush-pagespeed-recommendation' ).show();\n\t\t\tjQuery( '.wp-smush-bulk-wrapper' ).hide();\n\t\t\t// Hide the progress bar if scan is finished.\n\t\t\tjQuery( '.wp-smush-bulk-progress-bar-wrapper' ).hide();\n\t\t} else {\n\t\t\t// Show loader.\n\t\t\tstatusIcon.removeClass( 'sui-icon-loader sui-loading sui-hidden' ).addClass( 'sui-icon-info sui-warning' );\n\n\t\t\tconst notice = jQuery( '.bulk-smush-wrapper .wp-smush-resmush-notice' );\n\n\t\t\tif ( notice.length > 0 ) {\n\t\t\t\tnotice.show();\n\t\t\t} else {\n\t\t\t\tjQuery( '.bulk-smush-wrapper .wp-smush-remaining' ).show();\n\t\t\t}\n\t\t}\n\n\t\t// Enable re-Smush and scan button.\n\t\tjQuery( '.wp-resmush.wp-smush-action, .wp-smush-scan' ).removeAttr( 'disabled' );\n\t}\n\n\t/**\n\t * Free Smush limit exceeded.\n\t */\n\tfreeExceeded() {\n\t\tconst progress = jQuery( '.wp-smush-bulk-progress-bar-wrapper' );\n\t\tprogress.addClass( 'wp-smush-exceed-limit' );\n\t\tprogress.find( '.sui-progress-block .wp-smush-cancel-bulk' ).addClass( 'sui-hidden' );\n\t\tprogress.find( '.sui-progress-block .wp-smush-all' ).removeClass( 'sui-hidden' );\n\n\t\tprogress.find( 'i.sui-icon-loader' ).addClass( 'sui-icon-info' )\n\t\t\t.removeClass( 'sui-icon-loader' )\n\t\t\t.removeClass( 'sui-loading' );\n\n\t\tdocument.getElementById( 'bulk-smush-resume-button' ).classList.remove( 'sui-hidden' );\n\t}\n\n\t/**\n\t * Update remaining count.\n\t */\n\tupdateRemainingCount() {\n\t\tif ( this.is_bulk_resmush ) {\n\t\t\t// Re-Smush notice.\n\t\t\tconst resumeCountDiv = jQuery( '.wp-smush-resmush-notice .wp-smush-remaining-count' );\n\t\t\tif ( resumeCountDiv.length && 'undefined' !== typeof this.ids ) {\n\t\t\t\tresumeCountDiv.html( this.ids.length );\n\t\t\t}\n\t\t} else {\n\t\t\t// Smush notice.\n\t\t\tconst wrapperCountDiv = jQuery( '.bulk-smush-wrapper .wp-smush-remaining-count' );\n\t\t\tif ( wrapperCountDiv.length && 'undefined' !== typeof this.ids ) {\n\t\t\t\twrapperCountDiv.html( this.ids.length );\n\t\t\t}\n\t\t}\n\n\t\t// Update sidebar count.\n\t\tconst sidenavCountDiv = jQuery( '.smush-sidenav .wp-smush-remaining-count' );\n\t\tif ( sidenavCountDiv.length && 'undefined' !== typeof this.ids ) {\n\t\t\tif ( this.ids.length > 0 ) {\n\t\t\t\tsidenavCountDiv.html( this.ids.length );\n\t\t\t} else {\n\t\t\t\tjQuery( '.sui-summary-smush .smush-stats-icon' ).addClass( 'sui-hidden' );\n\t\t\t\tsidenavCountDiv.removeClass( 'sui-tag sui-tag-warning' ).html( '' );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Adds the stats for the current image to existing stats.\n\t *\n\t * @param {Array} imageStats\n\t * @param {string} imageStats.count\n\t * @param {boolean} imageStats.is_lossy\n\t * @param {Array} imageStats.savings_resize\n\t * @param {Array} imageStats.savings_conversion\n\t * @param {string} imageStats.size_before\n\t * @param {string} imageStats.size_after\n\t * @param {string} type\n\t */\n\tstatic updateLocalizedStats( imageStats, type ) {\n\t\t// Increase the Smush count.\n\t\tif ( 'undefined' === typeof window.wp_smushit_data ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// No need to increase attachment count, resize, conversion savings for directory Smush.\n\t\tif ( 'media' === type ) {\n\t\t\t// Increase Smushed image count.\n\t\t\twp_smushit_data.count_images = parseInt( wp_smushit_data.count_images ) + parseInt( imageStats.count );\n\n\t\t\t// Increase super Smush count, if applicable.\n\t\t\tif ( imageStats.is_lossy ) {\n\t\t\t\twp_smushit_data.count_supersmushed = parseInt( wp_smushit_data.count_supersmushed ) + 1;\n\t\t\t}\n\n\t\t\t// Add to resize savings.\n\t\t\twp_smushit_data.savings_resize = 'undefined' !== typeof imageStats.savings_resize.bytes ? parseInt( wp_smushit_data.savings_resize ) + parseInt( imageStats.savings_resize.bytes ) : parseInt( wp_smushit_data.savings_resize );\n\n\t\t\t// Update resize count.\n\t\t\twp_smushit_data.count_resize = 'undefined' !== typeof imageStats.savings_resize.bytes ? parseInt( wp_smushit_data.count_resize ) + 1 : wp_smushit_data.count_resize;\n\n\t\t\t// Add to conversion savings.\n\t\t\twp_smushit_data.savings_conversion = 'undefined' !== typeof imageStats.savings_conversion && 'undefined' !== typeof imageStats.savings_conversion.bytes ? parseInt( wp_smushit_data.savings_conversion ) + parseInt( imageStats.savings_conversion.bytes ) : parseInt( wp_smushit_data.savings_conversion );\n\t\t} else if ( 'directory_smush' === type ) {\n\t\t\t//Increase smushed image count\n\t\t\twp_smushit_data.count_images = parseInt( wp_smushit_data.count_images ) + 1;\n\t\t} else if ( 'nextgen' === type ) {\n\t\t\twp_smushit_data.count_supersmushed = parseInt( wp_smushit_data.count_supersmushed ) + 1;\n\n\t\t\t// Increase Smushed image count.\n\t\t\twp_smushit_data.count_images = parseInt( wp_smushit_data.count_images ) + parseInt( imageStats.count );\n\t\t}\n\n\t\t// If we have savings. Update savings.\n\t\tif ( imageStats.size_before > imageStats.size_after ) {\n\t\t\twp_smushit_data.size_before = 'undefined' !== typeof imageStats.size_before ? parseInt( wp_smushit_data.size_before ) + parseInt( imageStats.size_before ) : parseInt( wp_smushit_data.size_before );\n\t\t\twp_smushit_data.size_after = 'undefined' !== typeof imageStats.size_after ? parseInt( wp_smushit_data.size_after ) + parseInt( imageStats.size_after ) : parseInt( wp_smushit_data.size_after );\n\t\t}\n\n\t\t// Add stats for resizing. Update savings.\n\t\tif ( 'undefined' !== typeof imageStats.savings_resize ) {\n\t\t\twp_smushit_data.size_before = 'undefined' !== typeof imageStats.savings_resize.size_before ? parseInt( wp_smushit_data.size_before ) + parseInt( imageStats.savings_resize.size_before ) : parseInt( wp_smushit_data.size_before );\n\t\t\twp_smushit_data.size_after = 'undefined' !== typeof imageStats.savings_resize.size_after ? parseInt( wp_smushit_data.size_after ) + parseInt( imageStats.savings_resize.size_after ) : parseInt( wp_smushit_data.size_after );\n\t\t}\n\n\t\t// Add stats for conversion. Update savings.\n\t\tif ( 'undefined' !== typeof imageStats.savings_conversion ) {\n\t\t\twp_smushit_data.size_before = 'undefined' !== typeof imageStats.savings_conversion.size_before ? parseInt( wp_smushit_data.size_before ) + parseInt( imageStats.savings_conversion.size_before ) : parseInt( wp_smushit_data.size_before );\n\t\t\twp_smushit_data.size_after = 'undefined' !== typeof imageStats.savings_conversion.size_after ? parseInt( wp_smushit_data.size_after ) + parseInt( imageStats.savings_conversion.size_after ) : parseInt( wp_smushit_data.size_after );\n\t\t}\n\t}\n\n\t/**\n\t * Update progress.\n\t *\n\t * @param {Object} _res\n\t */\n\tupdateProgress( _res ) {\n\t\tif ( ! this.is_bulk_resmush && ! this.is_bulk ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet progress = 0;\n\n\t\t// Update localized stats.\n\t\tif ( _res && ( 'undefined' !== typeof _res.data && 'undefined' !== typeof _res.data.stats ) ) {\n\t\t\tSmush.updateLocalizedStats( _res.data.stats, this.smush_type );\n\t\t}\n\n\t\tif ( ! this.is_bulk_resmush ) {\n\t\t\t// Handle progress for normal bulk smush.\n\t\t\tprogress = ( ( this.smushed + this.errors.length ) / this.total ) * 100;\n\t\t} else {\n\t\t\t// If the request was successful, update the progress bar.\n\t\t\tif ( _res.success ) {\n\t\t\t\t// Handle progress for super Smush progress bar.\n\t\t\t\tif ( wp_smushit_data.resmush.length > 0 ) {\n\t\t\t\t\t// Update the count.\n\t\t\t\t\tjQuery( '.wp-smush-images-remaining' ).html( wp_smushit_data.resmush.length );\n\t\t\t\t} else if ( 0 === wp_smushit_data.resmush.length && 0 === this.ids.length ) {\n\t\t\t\t\t// If all images are re-Smushed, show the All Smushed message.\n\t\t\t\t\tjQuery( '.bulk-resmush-wrapper .wp-smush-all-done, .wp-smush-pagespeed-recommendation' ).removeClass( 'sui-hidden' );\n\n\t\t\t\t\t// Hide everything else.\n\t\t\t\t\tjQuery( '.wp-smush-resmush-wrap, .wp-smush-bulk-progress-bar-wrapper' ).hide();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Handle progress for normal bulk Smush. Set progress bar width.\n\t\t\tif ( 'undefined' !== typeof this.ids && 'undefined' !== typeof this.total && this.total > 0 ) {\n\t\t\t\tprogress = ( ( this.smushed + this.errors.length ) / this.total ) * 100;\n\t\t\t}\n\t\t}\n\n\t\t// No more images left. Show bulk wrapper and Smush notice.\n\t\tif ( 0 === this.ids.length ) {\n\t\t\t// Sync stats for bulk Smush media library ( skip for Nextgen ).\n\t\t\tif ( 'nextgen' !== this.smush_type ) {\n\t\t\t\tthis.syncStats();\n\t\t\t}\n\t\t\tjQuery( '.bulk-smush-wrapper .wp-smush-all-done, .wp-smush-pagespeed-recommendation' ).show();\n\t\t\tjQuery( '.wp-smush-bulk-wrapper' ).hide();\n\t\t}\n\n\t\t// Update remaining count.\n\t\tthis.updateRemainingCount();\n\n\t\t// Increase the progress bar and counter.\n\t\tthis._updateProgress( this.smushed + this.errors.length, WP_Smush.helpers.precise_round( progress, 1 ) );\n\n\t\t// Update stats and counts.\n\t\tSmush.updateStats( this.smush_type );\n\t}\n\n\t/**\n\t * Update progress.\n\t *\n\t * @param {number} count Number of images optimized.\n\t * @param {string} width Percentage complete.\n\t * @private\n\t */\n\t_updateProgress( count, width ) {\n\t\tif ( ! this.is_bulk && ! this.is_bulk_resmush ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Progress bar label.\n\t\tjQuery( 'span.wp-smush-images-percent' ).html( width + '%' );\n\t\t// Progress bar.\n\t\tjQuery( '.bulk-smush-wrapper .wp-smush-progress-inner' ).css( 'width', width + '%' );\n\n\t\t// Progress bar status.\n\t\tjQuery( '.bulk-smush-wrapper .sui-progress-state-text' )\n\t\t\t.find( 'span:first-child' ).html( count )\n\t\t\t.find( 'span:last-child' ).html( this.total );\n\t}\n\n\t/**\n\t * Whether to send the ajax requests further or not.\n\t *\n\t * @return {*|boolean} Should continue or not.\n\t */\n\tcontinue() {\n\t\tlet continueSmush = this.button.attr( 'continue_smush' );\n\n\t\tif ( 'undefined' === typeof continueSmush ) {\n\t\t\tcontinueSmush = true;\n\t\t}\n\n\t\tif ( 'false' === continueSmush || ! continueSmush ) {\n\t\t\tcontinueSmush = false;\n\t\t}\n\n\t\treturn continueSmush && this.ids.length > 0 && this.is_bulk;\n\t}\n\n\t/**\n\t * Send ajax request for optimizing single and bulk, call update_progress on ajax response.\n\t *\n\t * @return {*} Ajax call response.\n\t */\n\tcallAjax() {\n\t\tlet nonceValue = '';\n\t\t// Remove from array while processing so we can continue where left off.\n\t\tthis.current_id = this.is_bulk ? this.ids.shift() : this.button.data( 'id' );\n\n\t\t// Remove the ID from respective variable as well.\n\t\tSmush.updateSmushIds( this.current_id );\n\n\t\tconst nonceField = this.button.parent().find( '#_wp_smush_nonce' );\n\t\tif ( nonceField ) {\n\t\t\tnonceValue = nonceField.val();\n\t\t}\n\n\t\tconst self = this;\n\n\t\tthis.request = Smush.ajax( this.is_bulk_resmush, this.current_id, this.url, nonceValue )\n\t\t\t.done( function( res ) {\n\t\t\t\t// If no response or success is false, do not process further. Increase the error count except if bulk request limit exceeded.\n\t\t\t\tif ( 'undefined' === typeof res.success || ( 'undefined' !== typeof res.success && false === res.success && 'undefined' !== typeof res.data && 'limit_exceeded' !== res.data.error ) ) {\n\t\t\t\t\tself.errors.push( self.current_id );\n\n\t\t\t\t\t/** @param {string} res.data.file_name */\n\t\t\t\t\tconst errorMsg = Smush.prepareErrorRow( res.data.error_message, res.data.file_name, res.data.thumbnail, self.current_id, self.smush_type );\n\n\t\t\t\t\tself.log.show();\n\n\t\t\t\t\tif ( self.errors.length > 5 ) {\n\t\t\t\t\t\tjQuery( '.smush-bulk-errors-actions' ).removeClass( 'sui-hidden' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Print the error on screen.\n\t\t\t\t\t\tself.log.find( '.smush-bulk-errors' ).append( errorMsg );\n\t\t\t\t\t}\n\t\t\t\t} else if ( 'undefined' !== typeof res.success && res.success ) {\n\t\t\t\t\t// Increment the smushed count if image smushed without errors.\n\t\t\t\t\tself.smushed++;\n\t\t\t\t}\n\n\t\t\t\t// Check whether to show the warning notice or not.\n\t\t\t\tSmush.membershipValidity( res.data );\n\n\t\t\t\t/**\n\t\t\t\t * Bulk Smush limit exceeded: Stop ajax requests, remove progress bar, append the last image ID\n\t\t\t\t * back to Smush variable, and reset variables to allow the user to continue bulk Smush.\n\t\t\t\t */\n\t\t\t\tif ( 'undefined' !== typeof res.data && 'limit_exceeded' === res.data.error && 'resolved' !== self.deferred.state() ) {\n\t\t\t\t\t// Show error message.\n\t\t\t\t\tconst bulkWarning = document.getElementById( 'bulk_smush_warning' );\n\t\t\t\t\tbulkWarning.classList.remove( 'sui-hidden' );\n\n\t\t\t\t\t// Add a data attribute to the Smush button, to stop sending ajax.\n\t\t\t\t\tself.button.attr( 'continue_smush', false );\n\n\t\t\t\t\t// Reinsert the current ID.\n\t\t\t\t\twp_smushit_data.unsmushed.unshift( self.current_id );\n\t\t\t\t\tself.ids.unshift( self.current_id );\n\n\t\t\t\t\tself.freeExceeded();\n\t\t\t\t} else if ( self.is_bulk ) {\n\t\t\t\t\tself.updateProgress( res );\n\t\t\t\t} else if ( 0 === self.ids.length ) {\n\t\t\t\t\t// Sync stats anyway.\n\t\t\t\t\tself.syncStats();\n\t\t\t\t}\n\n\t\t\t\tself.singleDone();\n\t\t\t} )\n\t\t\t.always( function() {\n\t\t\t\tif ( ! self.continue() || ! self.is_bulk ) {\n\t\t\t\t\t// Calls deferred.done()\n\t\t\t\t\tself.deferred.resolve();\n\t\t\t\t} else {\n\t\t\t\t\tself.callAjax();\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.deferred.errors = this.errors;\n\t\treturn this.deferred;\n\t}\n\n\t/**\n\t * Prepare error row. Will only allow to hide errors for WP media attachments (not nextgen).\n\t *\n\t * @since 1.9.0\n\t *\n\t * @param {string} errorMsg Error message.\n\t * @param {string} fileName File name.\n\t * @param {string} thumbnail Thumbnail for image (if available).\n\t * @param {number} id Image ID.\n\t * @param {string} type Smush type: media or netxgen.\n\t *\n\t * @return {string} Row with error.\n\t */\n\tstatic prepareErrorRow( errorMsg, fileName, thumbnail, id, type ) {\n\t\tconst thumbDiv = ( 'undefined' === typeof thumbnail ) ? '<i class=\"sui-icon-photo-picture\" aria-hidden=\"true\"></i>' : thumbnail;\n\t\tconst fileLink = ( 'undefined' === fileName || 'undefined' === typeof fileName ) ? 'undefined' : fileName;\n\n\t\tlet tableDiv =\n\t\t\t'<div class=\"smush-bulk-error-row\">' +\n\t\t\t\t'<div class=\"smush-bulk-image-data\">' + thumbDiv +\n\t\t\t\t\t'<span class=\"smush-image-name\">' + fileLink + '</span>' +\n\t\t\t\t\t'<span class=\"smush-image-error\">' + errorMsg + '</span>' +\n\t\t\t\t'</div>';\n\n\t\tif ( 'media' === type ) {\n\t\t\ttableDiv = tableDiv +\n\t\t\t\t'<div class=\"smush-bulk-image-actions\">' +\n\t\t\t\t\t'<button type=\"button\" class=\"sui-button-icon sui-tooltip sui-tooltip-constrained sui-tooltip-top-right smush-ignore-image\" data-tooltip=\"' + window.wp_smush_msgs.error_ignore + '\" data-id=\"' + id + '\">' +\n\t\t\t\t\t\t'<i class=\"sui-icon-eye-hide\" aria-hidden=\"true\"></i>' +\n\t\t\t\t\t'</button>' +\n\t\t\t\t'</div>';\n\t\t}\n\n\t\ttableDiv = tableDiv + '</div>';\n\n\t\treturn tableDiv;\n\t}\n\n\t/**\n\t * Send ajax request for single and bulk Smushing.\n\t */\n\trun() {\n\t\t// If bulk and we have a definite number of IDs.\n\t\tif ( this.is_bulk && this.ids.length > 0 ) {\n\t\t\tthis.callAjax();\n\t\t}\n\n\t\tif ( ! this.is_bulk ) {\n\t\t\tthis.callAjax();\n\t\t}\n\t}\n\n\t/**\n\t * Show bulk Smush errors, and disable bulk Smush button on completion.\n\t */\n\tbindDeferredEvents() {\n\t\tconst self = this;\n\n\t\tthis.deferred.done( function() {\n\t\t\tself.button.removeAttr( 'continue_smush' );\n\n\t\t\tif ( self.errors.length ) {\n\t\t\t\t/** @param {string} wp_smush_msgs.error_in_bulk */\n\t\t\t\tconst msg = window.wp_smush_msgs.error_in_bulk\n\t\t\t\t\t.replace( '{{errors}}', self.errors.length )\n\t\t\t\t\t.replace( '{{total}}', self.total )\n\t\t\t\t\t.replace( '{{smushed}}', self.smushed );\n\n\t\t\t\tjQuery( '.wp-smush-all-done' )\n\t\t\t\t\t.addClass( 'sui-notice-warning' )\n\t\t\t\t\t.removeClass( 'sui-notice-success' )\n\t\t\t\t\t.find( 'p' ).html( msg );\n\t\t\t}\n\n\t\t\tself.bulkDone();\n\n\t\t\t// Re-enable the buttons.\n\t\t\tjQuery( '.wp-smush-all:not(.wp-smush-finished), .wp-smush-scan' ).removeAttr( 'disabled' );\n\t\t} );\n\t}\n\n\t/**\n\t * Handles the cancel button click.\n\t * Update the UI, and enable the bulk Smush button.\n\t */\n\tcancelAjax() {\n\t\tconst self = this;\n\n\t\tjQuery( '.wp-smush-cancel-bulk' ).on( 'click', function() {\n\t\t\t// Add a data attribute to the Smush button, to stop sending ajax.\n\t\t\tself.button.attr( 'continue_smush', false );\n\t\t\t// Sync and update stats.\n\t\t\tself.syncStats();\n\t\t\tSmush.updateStats( this.smush_type );\n\n\t\t\tself.request.abort();\n\t\t\tself.enableButton();\n\t\t\tself.button.removeClass( 'wp-smush-started' );\n\t\t\twp_smushit_data.unsmushed.unshift( self.current_id );\n\t\t\tjQuery( '.wp-smush-bulk-wrapper' ).show();\n\n\t\t\t// Hide the progress bar.\n\t\t\tjQuery( '.wp-smush-bulk-progress-bar-wrapper' ).hide();\n\t\t} );\n\t}\n\n\t/**\n\t * Remove the current ID from the unSmushed/re-Smush variable.\n\t *\n\t * @param {number} currentId\n\t */\n\tstatic updateSmushIds( currentId ) {\n\t\tif ( 'undefined' !== typeof wp_smushit_data.unsmushed && wp_smushit_data.unsmushed.length > 0 ) {\n\t\t\tconst uIndex = wp_smushit_data.unsmushed.indexOf( currentId );\n\t\t\tif ( uIndex > -1 ) {\n\t\t\t\twp_smushit_data.unsmushed.splice( uIndex, 1 );\n\t\t\t}\n\t\t}\n\n\t\t// Remove from the re-Smush list.\n\t\tif ( 'undefined' !== typeof wp_smushit_data.resmush && wp_smushit_data.resmush.length > 0 ) {\n\t\t\tconst index = wp_smushit_data.resmush.indexOf( currentId );\n\t\t\tif ( index > -1 ) {\n\t\t\t\twp_smushit_data.resmush.splice( index, 1 );\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport default Smush;\n","/*!\n * jQuery JavaScript Library v3.4.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2019-05-01T21:04Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n // Support: Chrome <=57, Firefox <=52\n // In some browsers, typeof returns \"function\" for HTML <object> elements\n // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n // We don't want to classify *any* DOM node as a function.\n return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.4.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code, options ) {\n\t\tDOMEval( code, { nonce: options && options.nonce } );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.4\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2019-04-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t(nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\") ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 && rdescend.test( selector ) ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement(\"fieldset\");\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem.namespaceURI,\n\t\tdocElem = (elem.ownerDocument || elem).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( (elem = elems[i++]) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( typeof elem.contentDocument !== \"undefined\" ) {\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, #12537)\n\t// .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t// This happens for inline elements with no explicit setting (gh-3571)\n\t// Support: Android <=4.1 - 4.3 only\n\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t// Support: IE 9-11 only\n\t// Also use offsetWidth/offsetHeight for when box sizing is unreliable\n\t// We use getClientRects() to check for hidden/disconnected.\n\t// In those cases, the computed value can be trusted to be border-box\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\t\tval === \"auto\" ||\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = Date.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url, options ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t// documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t}\n} );\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n","/*!\n * jquery.fancytree.js\n * Tree view control with support for lazy loading and much more.\n * https://github.com/mar10/fancytree/\n *\n * Copyright (c) 2008-2019, Martin Wendt (https://wwWendt.de)\n * Released under the MIT license\n * https://github.com/mar10/fancytree/wiki/LicenseInfo\n *\n * @version 2.32.0\n * @date 2019-09-10T07:42:12Z\n */\n\n/** Core Fancytree module.\n */\n\n// UMD wrapper for the Fancytree core module\n(function(factory) {\n\tif (typeof define === \"function\" && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([\"jquery\", \"./jquery.fancytree.ui-deps\"], factory);\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\t// Node/CommonJS\n\t\trequire(\"./jquery.fancytree.ui-deps\");\n\t\tmodule.exports = factory(require(\"jquery\"));\n\t} else {\n\t\t// Browser globals\n\t\tfactory(jQuery);\n\t}\n})(function($) {\n\t\"use strict\";\n\n\t// prevent duplicate loading\n\tif ($.ui && $.ui.fancytree) {\n\t\t$.ui.fancytree.warn(\"Fancytree: ignored duplicate include\");\n\t\treturn;\n\t}\n\n\t/******************************************************************************\n\t * Private functions and variables\n\t */\n\n\tvar i,\n\t\tattr,\n\t\tFT = null, // initialized below\n\t\tTEST_IMG = new RegExp(/\\.|\\//), // strings are considered image urls if they contain '.' or '/'\n\t\tREX_HTML = /[&<>\"'/]/g, // Escape those characters\n\t\tREX_TOOLTIP = /[<>\"'/]/g, // Don't escape `&` in tooltips\n\t\tRECURSIVE_REQUEST_ERROR = \"$recursive_request\",\n\t\t// CLIPBOARD = null,\n\t\tENTITY_MAP = {\n\t\t\t\"&\": \"&\",\n\t\t\t\"<\": \"<\",\n\t\t\t\">\": \">\",\n\t\t\t'\"': \""\",\n\t\t\t\"'\": \"'\",\n\t\t\t\"/\": \"/\",\n\t\t},\n\t\tIGNORE_KEYCODES = { 16: true, 17: true, 18: true },\n\t\tSPECIAL_KEYCODES = {\n\t\t\t8: \"backspace\",\n\t\t\t9: \"tab\",\n\t\t\t10: \"return\",\n\t\t\t13: \"return\",\n\t\t\t// 16: null, 17: null, 18: null, // ignore shift, ctrl, alt\n\t\t\t19: \"pause\",\n\t\t\t20: \"capslock\",\n\t\t\t27: \"esc\",\n\t\t\t32: \"space\",\n\t\t\t33: \"pageup\",\n\t\t\t34: \"pagedown\",\n\t\t\t35: \"end\",\n\t\t\t36: \"home\",\n\t\t\t37: \"left\",\n\t\t\t38: \"up\",\n\t\t\t39: \"right\",\n\t\t\t40: \"down\",\n\t\t\t45: \"insert\",\n\t\t\t46: \"del\",\n\t\t\t59: \";\",\n\t\t\t61: \"=\",\n\t\t\t// 91: null, 93: null, // ignore left and right meta\n\t\t\t96: \"0\",\n\t\t\t97: \"1\",\n\t\t\t98: \"2\",\n\t\t\t99: \"3\",\n\t\t\t100: \"4\",\n\t\t\t101: \"5\",\n\t\t\t102: \"6\",\n\t\t\t103: \"7\",\n\t\t\t104: \"8\",\n\t\t\t105: \"9\",\n\t\t\t106: \"*\",\n\t\t\t107: \"+\",\n\t\t\t109: \"-\",\n\t\t\t110: \".\",\n\t\t\t111: \"/\",\n\t\t\t112: \"f1\",\n\t\t\t113: \"f2\",\n\t\t\t114: \"f3\",\n\t\t\t115: \"f4\",\n\t\t\t116: \"f5\",\n\t\t\t117: \"f6\",\n\t\t\t118: \"f7\",\n\t\t\t119: \"f8\",\n\t\t\t120: \"f9\",\n\t\t\t121: \"f10\",\n\t\t\t122: \"f11\",\n\t\t\t123: \"f12\",\n\t\t\t144: \"numlock\",\n\t\t\t145: \"scroll\",\n\t\t\t173: \"-\",\n\t\t\t186: \";\",\n\t\t\t187: \"=\",\n\t\t\t188: \",\",\n\t\t\t189: \"-\",\n\t\t\t190: \".\",\n\t\t\t191: \"/\",\n\t\t\t192: \"`\",\n\t\t\t219: \"[\",\n\t\t\t220: \"\\\\\",\n\t\t\t221: \"]\",\n\t\t\t222: \"'\",\n\t\t},\n\t\tMODIFIERS = {\n\t\t\t16: \"shift\",\n\t\t\t17: \"ctrl\",\n\t\t\t18: \"alt\",\n\t\t\t91: \"meta\",\n\t\t\t93: \"meta\",\n\t\t},\n\t\tMOUSE_BUTTONS = { 0: \"\", 1: \"left\", 2: \"middle\", 3: \"right\" },\n\t\t// Boolean attributes that can be set with equivalent class names in the LI tags\n\t\t// Note: v2.23: checkbox and hideCheckbox are *not* in this list\n\t\tCLASS_ATTRS = \"active expanded focus folder lazy radiogroup selected unselectable unselectableIgnore\".split(\n\t\t\t\" \"\n\t\t),\n\t\tCLASS_ATTR_MAP = {},\n\t\t// Top-level Fancytree attributes, that can be set by dict\n\t\tTREE_ATTRS = \"columns types\".split(\" \"),\n\t\t// TREE_ATTR_MAP = {},\n\t\t// Top-level FancytreeNode attributes, that can be set by dict\n\t\tNODE_ATTRS = \"checkbox expanded extraClasses folder icon iconTooltip key lazy partsel radiogroup refKey selected statusNodeType title tooltip type unselectable unselectableIgnore unselectableStatus\".split(\n\t\t\t\" \"\n\t\t),\n\t\tNODE_ATTR_MAP = {},\n\t\t// Mapping of lowercase -> real name (because HTML5 data-... attribute only supports lowercase)\n\t\tNODE_ATTR_LOWERCASE_MAP = {},\n\t\t// Attribute names that should NOT be added to node.data\n\t\tNONE_NODE_DATA_MAP = {\n\t\t\tactive: true,\n\t\t\tchildren: true,\n\t\t\tdata: true,\n\t\t\tfocus: true,\n\t\t};\n\n\tfor (i = 0; i < CLASS_ATTRS.length; i++) {\n\t\tCLASS_ATTR_MAP[CLASS_ATTRS[i]] = true;\n\t}\n\tfor (i = 0; i < NODE_ATTRS.length; i++) {\n\t\tattr = NODE_ATTRS[i];\n\t\tNODE_ATTR_MAP[attr] = true;\n\t\tif (attr !== attr.toLowerCase()) {\n\t\t\tNODE_ATTR_LOWERCASE_MAP[attr.toLowerCase()] = attr;\n\t\t}\n\t}\n\t// for(i=0; i<TREE_ATTRS.length; i++) {\n\t// \tTREE_ATTR_MAP[TREE_ATTRS[i]] = true;\n\t// }\n\n\tfunction _assert(cond, msg) {\n\t\t// TODO: see qunit.js extractStacktrace()\n\t\tif (!cond) {\n\t\t\tmsg = msg ? \": \" + msg : \"\";\n\t\t\t// consoleApply(\"assert\", [!!cond, msg]);\n\t\t\t$.error(\"Fancytree assertion failed\" + msg);\n\t\t}\n\t}\n\n\t_assert($.ui, \"Fancytree requires jQuery UI (http://jqueryui.com)\");\n\n\tfunction consoleApply(method, args) {\n\t\tvar i,\n\t\t\ts,\n\t\t\tfn = window.console ? window.console[method] : null;\n\n\t\tif (fn) {\n\t\t\ttry {\n\t\t\t\tfn.apply(window.console, args);\n\t\t\t} catch (e) {\n\t\t\t\t// IE 8?\n\t\t\t\ts = \"\";\n\t\t\t\tfor (i = 0; i < args.length; i++) {\n\t\t\t\t\ts += args[i];\n\t\t\t\t}\n\t\t\t\tfn(s);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* support: IE8 Polyfil for Date.now() */\n\tif (!Date.now) {\n\t\tDate.now = function now() {\n\t\t\treturn new Date().getTime();\n\t\t};\n\t}\n\n\t/*Return true if x is a FancytreeNode.*/\n\tfunction _isNode(x) {\n\t\treturn !!(x.tree && x.statusNodeType !== undefined);\n\t}\n\n\t/** Return true if dotted version string is equal or higher than requested version.\n\t *\n\t * See http://jsfiddle.net/mar10/FjSAN/\n\t */\n\tfunction isVersionAtLeast(dottedVersion, major, minor, patch) {\n\t\tvar i,\n\t\t\tv,\n\t\t\tt,\n\t\t\tverParts = $.map($.trim(dottedVersion).split(\".\"), function(e) {\n\t\t\t\treturn parseInt(e, 10);\n\t\t\t}),\n\t\t\ttestParts = $.map(\n\t\t\t\tArray.prototype.slice.call(arguments, 1),\n\t\t\t\tfunction(e) {\n\t\t\t\t\treturn parseInt(e, 10);\n\t\t\t\t}\n\t\t\t);\n\n\t\tfor (i = 0; i < testParts.length; i++) {\n\t\t\tv = verParts[i] || 0;\n\t\t\tt = testParts[i] || 0;\n\t\t\tif (v !== t) {\n\t\t\t\treturn v > t;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Deep-merge a list of objects (but replace array-type options).\n\t *\n\t * jQuery's $.extend(true, ...) method does a deep merge, that also merges Arrays.\n\t * This variant is used to merge extension defaults with user options, and should\n\t * merge objects, but override arrays (for example the `triggerStart: [...]` option\n\t * of ext-edit). Also `null` values are copied over and not skipped.\n\t *\n\t * See issue #876\n\t *\n\t * Example:\n\t * _simpleDeepMerge({}, o1, o2);\n\t */\n\tfunction _simpleDeepMerge() {\n\t\tvar options,\n\t\t\tname,\n\t\t\tsrc,\n\t\t\tcopy,\n\t\t\tclone,\n\t\t\ttarget = arguments[0] || {},\n\t\t\ti = 1,\n\t\t\tlength = arguments.length;\n\n\t\t// Handle case when target is a string or something (possible in deep copy)\n\t\tif (typeof target !== \"object\" && !$.isFunction(target)) {\n\t\t\ttarget = {};\n\t\t}\n\t\tif (i === length) {\n\t\t\tthrow Error(\"need at least two args\");\n\t\t}\n\t\tfor (; i < length; i++) {\n\t\t\t// Only deal with non-null/undefined values\n\t\t\tif ((options = arguments[i]) != null) {\n\t\t\t\t// Extend the base object\n\t\t\t\tfor (name in options) {\n\t\t\t\t\tif (options.hasOwnProperty(name)) {\n\t\t\t\t\t\tsrc = target[name];\n\t\t\t\t\t\tcopy = options[name];\n\t\t\t\t\t\t// Prevent never-ending loop\n\t\t\t\t\t\tif (target === copy) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Recurse if we're merging plain objects\n\t\t\t\t\t\t// (NOTE: unlike $.extend, we don't merge arrays, but replace them)\n\t\t\t\t\t\tif (copy && $.isPlainObject(copy)) {\n\t\t\t\t\t\t\tclone = src && $.isPlainObject(src) ? src : {};\n\t\t\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\t\t\ttarget[name] = _simpleDeepMerge(clone, copy);\n\t\t\t\t\t\t\t// Don't bring in undefined values\n\t\t\t\t\t\t} else if (copy !== undefined) {\n\t\t\t\t\t\t\ttarget[name] = copy;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Return the modified object\n\t\treturn target;\n\t}\n\n\t/** Return a wrapper that calls sub.methodName() and exposes\n\t * this : tree\n\t * this._local : tree.ext.EXTNAME\n\t * this._super : base.methodName.call()\n\t * this._superApply : base.methodName.apply()\n\t */\n\tfunction _makeVirtualFunction(methodName, tree, base, extension, extName) {\n\t\t// $.ui.fancytree.debug(\"_makeVirtualFunction\", methodName, tree, base, extension, extName);\n\t\t// if(rexTestSuper && !rexTestSuper.test(func)){\n\t\t// // extension.methodName() doesn't call _super(), so no wrapper required\n\t\t// return func;\n\t\t// }\n\t\t// Use an immediate function as closure\n\t\tvar proxy = (function() {\n\t\t\tvar prevFunc = tree[methodName], // org. tree method or prev. proxy\n\t\t\t\tbaseFunc = extension[methodName], //\n\t\t\t\t_local = tree.ext[extName],\n\t\t\t\t_super = function() {\n\t\t\t\t\treturn prevFunc.apply(tree, arguments);\n\t\t\t\t},\n\t\t\t\t_superApply = function(args) {\n\t\t\t\t\treturn prevFunc.apply(tree, args);\n\t\t\t\t};\n\n\t\t\t// Return the wrapper function\n\t\t\treturn function() {\n\t\t\t\tvar prevLocal = tree._local,\n\t\t\t\t\tprevSuper = tree._super,\n\t\t\t\t\tprevSuperApply = tree._superApply;\n\n\t\t\t\ttry {\n\t\t\t\t\ttree._local = _local;\n\t\t\t\t\ttree._super = _super;\n\t\t\t\t\ttree._superApply = _superApply;\n\t\t\t\t\treturn baseFunc.apply(tree, arguments);\n\t\t\t\t} finally {\n\t\t\t\t\ttree._local = prevLocal;\n\t\t\t\t\ttree._super = prevSuper;\n\t\t\t\t\ttree._superApply = prevSuperApply;\n\t\t\t\t}\n\t\t\t};\n\t\t})(); // end of Immediate Function\n\t\treturn proxy;\n\t}\n\n\t/**\n\t * Subclass `base` by creating proxy functions\n\t */\n\tfunction _subclassObject(tree, base, extension, extName) {\n\t\t// $.ui.fancytree.debug(\"_subclassObject\", tree, base, extension, extName);\n\t\tfor (var attrName in extension) {\n\t\t\tif (typeof extension[attrName] === \"function\") {\n\t\t\t\tif (typeof tree[attrName] === \"function\") {\n\t\t\t\t\t// override existing method\n\t\t\t\t\ttree[attrName] = _makeVirtualFunction(\n\t\t\t\t\t\tattrName,\n\t\t\t\t\t\ttree,\n\t\t\t\t\t\tbase,\n\t\t\t\t\t\textension,\n\t\t\t\t\t\textName\n\t\t\t\t\t);\n\t\t\t\t} else if (attrName.charAt(0) === \"_\") {\n\t\t\t\t\t// Create private methods in tree.ext.EXTENSION namespace\n\t\t\t\t\ttree.ext[extName][attrName] = _makeVirtualFunction(\n\t\t\t\t\t\tattrName,\n\t\t\t\t\t\ttree,\n\t\t\t\t\t\tbase,\n\t\t\t\t\t\textension,\n\t\t\t\t\t\textName\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t$.error(\n\t\t\t\t\t\t\"Could not override tree.\" +\n\t\t\t\t\t\t\tattrName +\n\t\t\t\t\t\t\t\". Use prefix '_' to create tree.\" +\n\t\t\t\t\t\t\textName +\n\t\t\t\t\t\t\t\"._\" +\n\t\t\t\t\t\t\tattrName\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Create member variables in tree.ext.EXTENSION namespace\n\t\t\t\tif (attrName !== \"options\") {\n\t\t\t\t\ttree.ext[extName][attrName] = extension[attrName];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction _getResolvedPromise(context, argArray) {\n\t\tif (context === undefined) {\n\t\t\treturn $.Deferred(function() {\n\t\t\t\tthis.resolve();\n\t\t\t}).promise();\n\t\t}\n\t\treturn $.Deferred(function() {\n\t\t\tthis.resolveWith(context, argArray);\n\t\t}).promise();\n\t}\n\n\tfunction _getRejectedPromise(context, argArray) {\n\t\tif (context === undefined) {\n\t\t\treturn $.Deferred(function() {\n\t\t\t\tthis.reject();\n\t\t\t}).promise();\n\t\t}\n\t\treturn $.Deferred(function() {\n\t\t\tthis.rejectWith(context, argArray);\n\t\t}).promise();\n\t}\n\n\tfunction _makeResolveFunc(deferred, context) {\n\t\treturn function() {\n\t\t\tdeferred.resolveWith(context);\n\t\t};\n\t}\n\n\tfunction _getElementDataAsDict($el) {\n\t\t// Evaluate 'data-NAME' attributes with special treatment for 'data-json'.\n\t\tvar d = $.extend({}, $el.data()),\n\t\t\tjson = d.json;\n\n\t\tdelete d.fancytree; // added to container by widget factory (old jQuery UI)\n\t\tdelete d.uiFancytree; // added to container by widget factory\n\n\t\tif (json) {\n\t\t\tdelete d.json;\n\t\t\t// <li data-json='...'> is already returned as object (http://api.jquery.com/data/#data-html5)\n\t\t\td = $.extend(d, json);\n\t\t}\n\t\treturn d;\n\t}\n\n\tfunction _escapeTooltip(s) {\n\t\treturn (\"\" + s).replace(REX_TOOLTIP, function(s) {\n\t\t\treturn ENTITY_MAP[s];\n\t\t});\n\t}\n\n\t// TODO: use currying\n\tfunction _makeNodeTitleMatcher(s) {\n\t\ts = s.toLowerCase();\n\t\treturn function(node) {\n\t\t\treturn node.title.toLowerCase().indexOf(s) >= 0;\n\t\t};\n\t}\n\n\tfunction _makeNodeTitleStartMatcher(s) {\n\t\tvar reMatch = new RegExp(\"^\" + s, \"i\");\n\t\treturn function(node) {\n\t\t\treturn reMatch.test(node.title);\n\t\t};\n\t}\n\n\t/******************************************************************************\n\t * FancytreeNode\n\t */\n\n\t/**\n\t * Creates a new FancytreeNode\n\t *\n\t * @class FancytreeNode\n\t * @classdesc A FancytreeNode represents the hierarchical data model and operations.\n\t *\n\t * @param {FancytreeNode} parent\n\t * @param {NodeData} obj\n\t *\n\t * @property {Fancytree} tree The tree instance\n\t * @property {FancytreeNode} parent The parent node\n\t * @property {string} key Node id (must be unique inside the tree)\n\t * @property {string} title Display name (may contain HTML)\n\t * @property {object} data Contains all extra data that was passed on node creation\n\t * @property {FancytreeNode[] | null | undefined} children Array of child nodes.<br>\n\t * For lazy nodes, null or undefined means 'not yet loaded'. Use an empty array\n\t * to define a node that has no children.\n\t * @property {boolean} expanded Use isExpanded(), setExpanded() to access this property.\n\t * @property {string} extraClasses Additional CSS classes, added to the node's `<span>`.<br>\n\t * Note: use `node.add/remove/toggleClass()` to modify.\n\t * @property {boolean} folder Folder nodes have different default icons and click behavior.<br>\n\t * Note: Also non-folders may have children.\n\t * @property {string} statusNodeType null for standard nodes. Otherwise type of special system node: 'error', 'loading', 'nodata', or 'paging'.\n\t * @property {boolean} lazy True if this node is loaded on demand, i.e. on first expansion.\n\t * @property {boolean} selected Use isSelected(), setSelected() to access this property.\n\t * @property {string} tooltip Alternative description used as hover popup\n\t * @property {string} iconTooltip Description used as hover popup for icon. @since 2.27\n\t * @property {string} type Node type, used with tree.types map. @since 2.27\n\t */\n\tfunction FancytreeNode(parent, obj) {\n\t\tvar i, l, name, cl;\n\n\t\tthis.parent = parent;\n\t\tthis.tree = parent.tree;\n\t\tthis.ul = null;\n\t\tthis.li = null; // <li id='key' ftnode=this> tag\n\t\tthis.statusNodeType = null; // if this is a temp. node to display the status of its parent\n\t\tthis._isLoading = false; // if this node itself is loading\n\t\tthis._error = null; // {message: '...'} if a load error occurred\n\t\tthis.data = {};\n\n\t\t// TODO: merge this code with node.toDict()\n\t\t// copy attributes from obj object\n\t\tfor (i = 0, l = NODE_ATTRS.length; i < l; i++) {\n\t\t\tname = NODE_ATTRS[i];\n\t\t\tthis[name] = obj[name];\n\t\t}\n\t\t// unselectableIgnore and unselectableStatus imply unselectable\n\t\tif (\n\t\t\tthis.unselectableIgnore != null ||\n\t\t\tthis.unselectableStatus != null\n\t\t) {\n\t\t\tthis.unselectable = true;\n\t\t}\n\t\tif (obj.hideCheckbox) {\n\t\t\t$.error(\n\t\t\t\t\"'hideCheckbox' node option was removed in v2.23.0: use 'checkbox: false'\"\n\t\t\t);\n\t\t}\n\t\t// node.data += obj.data\n\t\tif (obj.data) {\n\t\t\t$.extend(this.data, obj.data);\n\t\t}\n\t\t// Copy all other attributes to this.data.NAME\n\t\tfor (name in obj) {\n\t\t\tif (\n\t\t\t\t!NODE_ATTR_MAP[name] &&\n\t\t\t\t!$.isFunction(obj[name]) &&\n\t\t\t\t!NONE_NODE_DATA_MAP[name]\n\t\t\t) {\n\t\t\t\t// node.data.NAME = obj.NAME\n\t\t\t\tthis.data[name] = obj[name];\n\t\t\t}\n\t\t}\n\n\t\t// Fix missing key\n\t\tif (this.key == null) {\n\t\t\t// test for null OR undefined\n\t\t\tif (this.tree.options.defaultKey) {\n\t\t\t\tthis.key = this.tree.options.defaultKey(this);\n\t\t\t\t_assert(this.key, \"defaultKey() must return a unique key\");\n\t\t\t} else {\n\t\t\t\tthis.key = \"_\" + FT._nextNodeKey++;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.key = \"\" + this.key; // Convert to string (#217)\n\t\t}\n\n\t\t// Fix tree.activeNode\n\t\t// TODO: not elegant: we use obj.active as marker to set tree.activeNode\n\t\t// when loading from a dictionary.\n\t\tif (obj.active) {\n\t\t\t_assert(\n\t\t\t\tthis.tree.activeNode === null,\n\t\t\t\t\"only one active node allowed\"\n\t\t\t);\n\t\t\tthis.tree.activeNode = this;\n\t\t}\n\t\tif (obj.selected) {\n\t\t\t// #186\n\t\t\tthis.tree.lastSelectedNode = this;\n\t\t}\n\t\t// TODO: handle obj.focus = true\n\n\t\t// Create child nodes\n\t\tcl = obj.children;\n\t\tif (cl) {\n\t\t\tif (cl.length) {\n\t\t\t\tthis._setChildren(cl);\n\t\t\t} else {\n\t\t\t\t// if an empty array was passed for a lazy node, keep it, in order to mark it 'loaded'\n\t\t\t\tthis.children = this.lazy ? [] : null;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.children = null;\n\t\t}\n\t\t// Add to key/ref map (except for root node)\n\t\t//\tif( parent ) {\n\t\tthis.tree._callHook(\"treeRegisterNode\", this.tree, true, this);\n\t\t//\t}\n\t}\n\n\tFancytreeNode.prototype = /** @lends FancytreeNode# */ {\n\t\t/* Return the direct child FancytreeNode with a given key, index. */\n\t\t_findDirectChild: function(ptr) {\n\t\t\tvar i,\n\t\t\t\tl,\n\t\t\t\tcl = this.children;\n\n\t\t\tif (cl) {\n\t\t\t\tif (typeof ptr === \"string\") {\n\t\t\t\t\tfor (i = 0, l = cl.length; i < l; i++) {\n\t\t\t\t\t\tif (cl[i].key === ptr) {\n\t\t\t\t\t\t\treturn cl[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (typeof ptr === \"number\") {\n\t\t\t\t\treturn this.children[ptr];\n\t\t\t\t} else if (ptr.parent === this) {\n\t\t\t\t\treturn ptr;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\t// TODO: activate()\n\t\t// TODO: activateSilently()\n\t\t/* Internal helper called in recursive addChildren sequence.*/\n\t\t_setChildren: function(children) {\n\t\t\t_assert(\n\t\t\t\tchildren && (!this.children || this.children.length === 0),\n\t\t\t\t\"only init supported\"\n\t\t\t);\n\t\t\tthis.children = [];\n\t\t\tfor (var i = 0, l = children.length; i < l; i++) {\n\t\t\t\tthis.children.push(new FancytreeNode(this, children[i]));\n\t\t\t}\n\t\t\tthis.tree._callHook(\n\t\t\t\t\"treeStructureChanged\",\n\t\t\t\tthis.tree,\n\t\t\t\t\"setChildren\"\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Append (or insert) a list of child nodes.\n\t\t *\n\t\t * @param {NodeData[]} children array of child node definitions (also single child accepted)\n\t\t * @param {FancytreeNode | string | Integer} [insertBefore] child node (or key or index of such).\n\t\t * If omitted, the new children are appended.\n\t\t * @returns {FancytreeNode} first child added\n\t\t *\n\t\t * @see FancytreeNode#applyPatch\n\t\t */\n\t\taddChildren: function(children, insertBefore) {\n\t\t\tvar i,\n\t\t\t\tl,\n\t\t\t\tpos,\n\t\t\t\torigFirstChild = this.getFirstChild(),\n\t\t\t\torigLastChild = this.getLastChild(),\n\t\t\t\tfirstNode = null,\n\t\t\t\tnodeList = [];\n\n\t\t\tif ($.isPlainObject(children)) {\n\t\t\t\tchildren = [children];\n\t\t\t}\n\t\t\tif (!this.children) {\n\t\t\t\tthis.children = [];\n\t\t\t}\n\t\t\tfor (i = 0, l = children.length; i < l; i++) {\n\t\t\t\tnodeList.push(new FancytreeNode(this, children[i]));\n\t\t\t}\n\t\t\tfirstNode = nodeList[0];\n\t\t\tif (insertBefore == null) {\n\t\t\t\tthis.children = this.children.concat(nodeList);\n\t\t\t} else {\n\t\t\t\t// Returns null if insertBefore is not a direct child:\n\t\t\t\tinsertBefore = this._findDirectChild(insertBefore);\n\t\t\t\tpos = $.inArray(insertBefore, this.children);\n\t\t\t\t_assert(pos >= 0, \"insertBefore must be an existing child\");\n\t\t\t\t// insert nodeList after children[pos]\n\t\t\t\tthis.children.splice.apply(\n\t\t\t\t\tthis.children,\n\t\t\t\t\t[pos, 0].concat(nodeList)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (origFirstChild && !insertBefore) {\n\t\t\t\t// #708: Fast path -- don't render every child of root, just the new ones!\n\t\t\t\t// #723, #729: but only if it's appended to an existing child list\n\t\t\t\tfor (i = 0, l = nodeList.length; i < l; i++) {\n\t\t\t\t\tnodeList[i].render(); // New nodes were never rendered before\n\t\t\t\t}\n\t\t\t\t// Adjust classes where status may have changed\n\t\t\t\t// Has a first child\n\t\t\t\tif (origFirstChild !== this.getFirstChild()) {\n\t\t\t\t\t// Different first child -- recompute classes\n\t\t\t\t\torigFirstChild.renderStatus();\n\t\t\t\t}\n\t\t\t\tif (origLastChild !== this.getLastChild()) {\n\t\t\t\t\t// Different last child -- recompute classes\n\t\t\t\t\torigLastChild.renderStatus();\n\t\t\t\t}\n\t\t\t} else if (!this.parent || this.parent.ul || this.tr) {\n\t\t\t\t// render if the parent was rendered (or this is a root node)\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t\tif (this.tree.options.selectMode === 3) {\n\t\t\t\tthis.fixSelection3FromEndNodes();\n\t\t\t}\n\t\t\tthis.triggerModifyChild(\n\t\t\t\t\"add\",\n\t\t\t\tnodeList.length === 1 ? nodeList[0] : null\n\t\t\t);\n\t\t\treturn firstNode;\n\t\t},\n\t\t/**\n\t\t * Add class to node's span tag and to .extraClasses.\n\t\t *\n\t\t * @param {string} className class name\n\t\t *\n\t\t * @since 2.17\n\t\t */\n\t\taddClass: function(className) {\n\t\t\treturn this.toggleClass(className, true);\n\t\t},\n\t\t/**\n\t\t * Append or prepend a node, or append a child node.\n\t\t *\n\t\t * This a convenience function that calls addChildren()\n\t\t *\n\t\t * @param {NodeData} node node definition\n\t\t * @param {string} [mode=child] 'before', 'after', 'firstChild', or 'child' ('over' is a synonym for 'child')\n\t\t * @returns {FancytreeNode} new node\n\t\t */\n\t\taddNode: function(node, mode) {\n\t\t\tif (mode === undefined || mode === \"over\") {\n\t\t\t\tmode = \"child\";\n\t\t\t}\n\t\t\tswitch (mode) {\n\t\t\t\tcase \"after\":\n\t\t\t\t\treturn this.getParent().addChildren(\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tthis.getNextSibling()\n\t\t\t\t\t);\n\t\t\t\tcase \"before\":\n\t\t\t\t\treturn this.getParent().addChildren(node, this);\n\t\t\t\tcase \"firstChild\":\n\t\t\t\t\t// Insert before the first child if any\n\t\t\t\t\tvar insertBefore = this.children ? this.children[0] : null;\n\t\t\t\t\treturn this.addChildren(node, insertBefore);\n\t\t\t\tcase \"child\":\n\t\t\t\tcase \"over\":\n\t\t\t\t\treturn this.addChildren(node);\n\t\t\t}\n\t\t\t_assert(false, \"Invalid mode: \" + mode);\n\t\t},\n\t\t/**Add child status nodes that indicate 'More...', etc.\n\t\t *\n\t\t * This also maintains the node's `partload` property.\n\t\t * @param {boolean|object} node optional node definition. Pass `false` to remove all paging nodes.\n\t\t * @param {string} [mode='child'] 'child'|firstChild'\n\t\t * @since 2.15\n\t\t */\n\t\taddPagingNode: function(node, mode) {\n\t\t\tvar i, n;\n\n\t\t\tmode = mode || \"child\";\n\t\t\tif (node === false) {\n\t\t\t\tfor (i = this.children.length - 1; i >= 0; i--) {\n\t\t\t\t\tn = this.children[i];\n\t\t\t\t\tif (n.statusNodeType === \"paging\") {\n\t\t\t\t\t\tthis.removeChild(n);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.partload = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tnode = $.extend(\n\t\t\t\t{\n\t\t\t\t\ttitle: this.tree.options.strings.moreData,\n\t\t\t\t\tstatusNodeType: \"paging\",\n\t\t\t\t\ticon: false,\n\t\t\t\t},\n\t\t\t\tnode\n\t\t\t);\n\t\t\tthis.partload = true;\n\t\t\treturn this.addNode(node, mode);\n\t\t},\n\t\t/**\n\t\t * Append new node after this.\n\t\t *\n\t\t * This a convenience function that calls addNode(node, 'after')\n\t\t *\n\t\t * @param {NodeData} node node definition\n\t\t * @returns {FancytreeNode} new node\n\t\t */\n\t\tappendSibling: function(node) {\n\t\t\treturn this.addNode(node, \"after\");\n\t\t},\n\t\t/**\n\t\t * (experimental) Apply a modification (or navigation) operation.\n\t\t *\n\t\t * @param {string} cmd\n\t\t * @param {object} [opts]\n\t\t * @see Fancytree#applyCommand\n\t\t * @since 2.32\n\t\t */\n\t\tapplyCommand: function(cmd, opts) {\n\t\t\treturn this.tree.applyCommand(cmd, this, opts);\n\t\t},\n\t\t/**\n\t\t * Modify existing child nodes.\n\t\t *\n\t\t * @param {NodePatch} patch\n\t\t * @returns {$.Promise}\n\t\t * @see FancytreeNode#addChildren\n\t\t */\n\t\tapplyPatch: function(patch) {\n\t\t\t// patch [key, null] means 'remove'\n\t\t\tif (patch === null) {\n\t\t\t\tthis.remove();\n\t\t\t\treturn _getResolvedPromise(this);\n\t\t\t}\n\t\t\t// TODO: make sure that root node is not collapsed or modified\n\t\t\t// copy (most) attributes to node.ATTR or node.data.ATTR\n\t\t\tvar name,\n\t\t\t\tpromise,\n\t\t\t\tv,\n\t\t\t\tIGNORE_MAP = { children: true, expanded: true, parent: true }; // TODO: should be global\n\n\t\t\tfor (name in patch) {\n\t\t\t\tif (patch.hasOwnProperty(name)) {\n\t\t\t\t\tv = patch[name];\n\t\t\t\t\tif (!IGNORE_MAP[name] && !$.isFunction(v)) {\n\t\t\t\t\t\tif (NODE_ATTR_MAP[name]) {\n\t\t\t\t\t\t\tthis[name] = v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.data[name] = v;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Remove and/or create children\n\t\t\tif (patch.hasOwnProperty(\"children\")) {\n\t\t\t\tthis.removeChildren();\n\t\t\t\tif (patch.children) {\n\t\t\t\t\t// only if not null and not empty list\n\t\t\t\t\t// TODO: addChildren instead?\n\t\t\t\t\tthis._setChildren(patch.children);\n\t\t\t\t}\n\t\t\t\t// TODO: how can we APPEND or INSERT child nodes?\n\t\t\t}\n\t\t\tif (this.isVisible()) {\n\t\t\t\tthis.renderTitle();\n\t\t\t\tthis.renderStatus();\n\t\t\t}\n\t\t\t// Expand collapse (final step, since this may be async)\n\t\t\tif (patch.hasOwnProperty(\"expanded\")) {\n\t\t\t\tpromise = this.setExpanded(patch.expanded);\n\t\t\t} else {\n\t\t\t\tpromise = _getResolvedPromise(this);\n\t\t\t}\n\t\t\treturn promise;\n\t\t},\n\t\t/** Collapse all sibling nodes.\n\t\t * @returns {$.Promise}\n\t\t */\n\t\tcollapseSiblings: function() {\n\t\t\treturn this.tree._callHook(\"nodeCollapseSiblings\", this);\n\t\t},\n\t\t/** Copy this node as sibling or child of `node`.\n\t\t *\n\t\t * @param {FancytreeNode} node source node\n\t\t * @param {string} [mode=child] 'before' | 'after' | 'child'\n\t\t * @param {Function} [map] callback function(NodeData) that could modify the new node\n\t\t * @returns {FancytreeNode} new\n\t\t */\n\t\tcopyTo: function(node, mode, map) {\n\t\t\treturn node.addNode(this.toDict(true, map), mode);\n\t\t},\n\t\t/** Count direct and indirect children.\n\t\t *\n\t\t * @param {boolean} [deep=true] pass 'false' to only count direct children\n\t\t * @returns {int} number of child nodes\n\t\t */\n\t\tcountChildren: function(deep) {\n\t\t\tvar cl = this.children,\n\t\t\t\ti,\n\t\t\t\tl,\n\t\t\t\tn;\n\t\t\tif (!cl) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tn = cl.length;\n\t\t\tif (deep !== false) {\n\t\t\t\tfor (i = 0, l = n; i < l; i++) {\n\t\t\t\t\tn += cl[i].countChildren();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn n;\n\t\t},\n\t\t// TODO: deactivate()\n\t\t/** Write to browser console if debugLevel >= 4 (prepending node info)\n\t\t *\n\t\t * @param {*} msg string or object or array of such\n\t\t */\n\t\tdebug: function(msg) {\n\t\t\tif (this.tree.options.debugLevel >= 4) {\n\t\t\t\tArray.prototype.unshift.call(arguments, this.toString());\n\t\t\t\tconsoleApply(\"log\", arguments);\n\t\t\t}\n\t\t},\n\t\t/** Deprecated.\n\t\t * @deprecated since 2014-02-16. Use resetLazy() instead.\n\t\t */\n\t\tdiscard: function() {\n\t\t\tthis.warn(\n\t\t\t\t\"FancytreeNode.discard() is deprecated since 2014-02-16. Use .resetLazy() instead.\"\n\t\t\t);\n\t\t\treturn this.resetLazy();\n\t\t},\n\t\t/** Remove DOM elements for all descendents. May be called on .collapse event\n\t\t * to keep the DOM small.\n\t\t * @param {boolean} [includeSelf=false]\n\t\t */\n\t\tdiscardMarkup: function(includeSelf) {\n\t\t\tvar fn = includeSelf ? \"nodeRemoveMarkup\" : \"nodeRemoveChildMarkup\";\n\t\t\tthis.tree._callHook(fn, this);\n\t\t},\n\t\t/** Write error to browser console if debugLevel >= 1 (prepending tree info)\n\t\t *\n\t\t * @param {*} msg string or object or array of such\n\t\t */\n\t\terror: function(msg) {\n\t\t\tif (this.tree.options.debugLevel >= 1) {\n\t\t\t\tArray.prototype.unshift.call(arguments, this.toString());\n\t\t\t\tconsoleApply(\"error\", arguments);\n\t\t\t}\n\t\t},\n\t\t/**Find all nodes that match condition (excluding self).\n\t\t *\n\t\t * @param {string | function(node)} match title string to search for, or a\n\t\t * callback function that returns `true` if a node is matched.\n\t\t * @returns {FancytreeNode[]} array of nodes (may be empty)\n\t\t */\n\t\tfindAll: function(match) {\n\t\t\tmatch = $.isFunction(match) ? match : _makeNodeTitleMatcher(match);\n\t\t\tvar res = [];\n\t\t\tthis.visit(function(n) {\n\t\t\t\tif (match(n)) {\n\t\t\t\t\tres.push(n);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn res;\n\t\t},\n\t\t/**Find first node that matches condition (excluding self).\n\t\t *\n\t\t * @param {string | function(node)} match title string to search for, or a\n\t\t * callback function that returns `true` if a node is matched.\n\t\t * @returns {FancytreeNode} matching node or null\n\t\t * @see FancytreeNode#findAll\n\t\t */\n\t\tfindFirst: function(match) {\n\t\t\tmatch = $.isFunction(match) ? match : _makeNodeTitleMatcher(match);\n\t\t\tvar res = null;\n\t\t\tthis.visit(function(n) {\n\t\t\t\tif (match(n)) {\n\t\t\t\t\tres = n;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn res;\n\t\t},\n\t\t/** Find a node relative to self.\n\t\t *\n\t\t * @param {number|string} where The keyCode that would normally trigger this move,\n\t\t *\t\tor a keyword ('down', 'first', 'last', 'left', 'parent', 'right', 'up').\n\t\t * @returns {FancytreeNode}\n\t\t * @since v2.31\n\t\t */\n\t\tfindRelatedNode: function(where, includeHidden) {\n\t\t\treturn this.tree.findRelatedNode(this, where, includeHidden);\n\t\t},\n\t\t/* Apply selection state (internal use only) */\n\t\t_changeSelectStatusAttrs: function(state) {\n\t\t\tvar changed = false,\n\t\t\t\topts = this.tree.options,\n\t\t\t\tunselectable = FT.evalOption(\n\t\t\t\t\t\"unselectable\",\n\t\t\t\t\tthis,\n\t\t\t\t\tthis,\n\t\t\t\t\topts,\n\t\t\t\t\tfalse\n\t\t\t\t),\n\t\t\t\tunselectableStatus = FT.evalOption(\n\t\t\t\t\t\"unselectableStatus\",\n\t\t\t\t\tthis,\n\t\t\t\t\tthis,\n\t\t\t\t\topts,\n\t\t\t\t\tundefined\n\t\t\t\t);\n\n\t\t\tif (unselectable && unselectableStatus != null) {\n\t\t\t\tstate = unselectableStatus;\n\t\t\t}\n\t\t\tswitch (state) {\n\t\t\t\tcase false:\n\t\t\t\t\tchanged = this.selected || this.partsel;\n\t\t\t\t\tthis.selected = false;\n\t\t\t\t\tthis.partsel = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase true:\n\t\t\t\t\tchanged = !this.selected || !this.partsel;\n\t\t\t\t\tthis.selected = true;\n\t\t\t\t\tthis.partsel = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase undefined:\n\t\t\t\t\tchanged = this.selected || !this.partsel;\n\t\t\t\t\tthis.selected = false;\n\t\t\t\t\tthis.partsel = true;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t_assert(false, \"invalid state: \" + state);\n\t\t\t}\n\t\t\t// this.debug(\"fixSelection3AfterLoad() _changeSelectStatusAttrs()\", state, changed);\n\t\t\tif (changed) {\n\t\t\t\tthis.renderStatus();\n\t\t\t}\n\t\t\treturn changed;\n\t\t},\n\t\t/**\n\t\t * Fix selection status, after this node was (de)selected in multi-hier mode.\n\t\t * This includes (de)selecting all children.\n\t\t */\n\t\tfixSelection3AfterClick: function(callOpts) {\n\t\t\tvar flag = this.isSelected();\n\n\t\t\t// this.debug(\"fixSelection3AfterClick()\");\n\n\t\t\tthis.visit(function(node) {\n\t\t\t\tnode._changeSelectStatusAttrs(flag);\n\t\t\t\tif (node.radiogroup) {\n\t\t\t\t\t// #931: don't (de)select this branch\n\t\t\t\t\treturn \"skip\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.fixSelection3FromEndNodes(callOpts);\n\t\t},\n\t\t/**\n\t\t * Fix selection status for multi-hier mode.\n\t\t * Only end-nodes are considered to update the descendants branch and parents.\n\t\t * Should be called after this node has loaded new children or after\n\t\t * children have been modified using the API.\n\t\t */\n\t\tfixSelection3FromEndNodes: function(callOpts) {\n\t\t\tvar opts = this.tree.options;\n\n\t\t\t// this.debug(\"fixSelection3FromEndNodes()\");\n\t\t\t_assert(opts.selectMode === 3, \"expected selectMode 3\");\n\n\t\t\t// Visit all end nodes and adjust their parent's `selected` and `partsel`\n\t\t\t// attributes. Return selection state true, false, or undefined.\n\t\t\tfunction _walk(node) {\n\t\t\t\tvar i,\n\t\t\t\t\tl,\n\t\t\t\t\tchild,\n\t\t\t\t\ts,\n\t\t\t\t\tstate,\n\t\t\t\t\tallSelected,\n\t\t\t\t\tsomeSelected,\n\t\t\t\t\tunselIgnore,\n\t\t\t\t\tunselState,\n\t\t\t\t\tchildren = node.children;\n\n\t\t\t\tif (children && children.length) {\n\t\t\t\t\t// check all children recursively\n\t\t\t\t\tallSelected = true;\n\t\t\t\t\tsomeSelected = false;\n\n\t\t\t\t\tfor (i = 0, l = children.length; i < l; i++) {\n\t\t\t\t\t\tchild = children[i];\n\t\t\t\t\t\t// the selection state of a node is not relevant; we need the end-nodes\n\t\t\t\t\t\ts = _walk(child);\n\t\t\t\t\t\t// if( !child.unselectableIgnore ) {\n\t\t\t\t\t\tunselIgnore = FT.evalOption(\n\t\t\t\t\t\t\t\"unselectableIgnore\",\n\t\t\t\t\t\t\tchild,\n\t\t\t\t\t\t\tchild,\n\t\t\t\t\t\t\topts,\n\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!unselIgnore) {\n\t\t\t\t\t\t\tif (s !== false) {\n\t\t\t\t\t\t\t\tsomeSelected = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (s !== true) {\n\t\t\t\t\t\t\t\tallSelected = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// eslint-disable-next-line no-nested-ternary\n\t\t\t\t\tstate = allSelected\n\t\t\t\t\t\t? true\n\t\t\t\t\t\t: someSelected\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: false;\n\t\t\t\t} else {\n\t\t\t\t\t// This is an end-node: simply report the status\n\t\t\t\t\tunselState = FT.evalOption(\n\t\t\t\t\t\t\"unselectableStatus\",\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\topts,\n\t\t\t\t\t\tundefined\n\t\t\t\t\t);\n\t\t\t\t\tstate = unselState == null ? !!node.selected : !!unselState;\n\t\t\t\t}\n\t\t\t\t// #939: Keep a `partsel` flag that was explicitly set on a lazy node\n\t\t\t\tif (\n\t\t\t\t\tnode.partsel &&\n\t\t\t\t\t!node.selected &&\n\t\t\t\t\tnode.lazy &&\n\t\t\t\t\tnode.children == null\n\t\t\t\t) {\n\t\t\t\t\tstate = undefined;\n\t\t\t\t}\n\t\t\t\tnode._changeSelectStatusAttrs(state);\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\t_walk(this);\n\n\t\t\t// Update parent's state\n\t\t\tthis.visitParents(function(node) {\n\t\t\t\tvar i,\n\t\t\t\t\tl,\n\t\t\t\t\tchild,\n\t\t\t\t\tstate,\n\t\t\t\t\tunselIgnore,\n\t\t\t\t\tunselState,\n\t\t\t\t\tchildren = node.children,\n\t\t\t\t\tallSelected = true,\n\t\t\t\t\tsomeSelected = false;\n\n\t\t\t\tfor (i = 0, l = children.length; i < l; i++) {\n\t\t\t\t\tchild = children[i];\n\t\t\t\t\tunselIgnore = FT.evalOption(\n\t\t\t\t\t\t\"unselectableIgnore\",\n\t\t\t\t\t\tchild,\n\t\t\t\t\t\tchild,\n\t\t\t\t\t\topts,\n\t\t\t\t\t\tfalse\n\t\t\t\t\t);\n\t\t\t\t\tif (!unselIgnore) {\n\t\t\t\t\t\tunselState = FT.evalOption(\n\t\t\t\t\t\t\t\"unselectableStatus\",\n\t\t\t\t\t\t\tchild,\n\t\t\t\t\t\t\tchild,\n\t\t\t\t\t\t\topts,\n\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t);\n\t\t\t\t\t\tstate =\n\t\t\t\t\t\t\tunselState == null\n\t\t\t\t\t\t\t\t? !!child.selected\n\t\t\t\t\t\t\t\t: !!unselState;\n\t\t\t\t\t\t// When fixing the parents, we trust the sibling status (i.e.\n\t\t\t\t\t\t// we don't recurse)\n\t\t\t\t\t\tif (state || child.partsel) {\n\t\t\t\t\t\t\tsomeSelected = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!state) {\n\t\t\t\t\t\t\tallSelected = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// eslint-disable-next-line no-nested-ternary\n\t\t\t\tstate = allSelected ? true : someSelected ? undefined : false;\n\t\t\t\tnode._changeSelectStatusAttrs(state);\n\t\t\t});\n\t\t},\n\t\t// TODO: focus()\n\t\t/**\n\t\t * Update node data. If dict contains 'children', then also replace\n\t\t * the hole sub tree.\n\t\t * @param {NodeData} dict\n\t\t *\n\t\t * @see FancytreeNode#addChildren\n\t\t * @see FancytreeNode#applyPatch\n\t\t */\n\t\tfromDict: function(dict) {\n\t\t\t// copy all other attributes to this.data.xxx\n\t\t\tfor (var name in dict) {\n\t\t\t\tif (NODE_ATTR_MAP[name]) {\n\t\t\t\t\t// node.NAME = dict.NAME\n\t\t\t\t\tthis[name] = dict[name];\n\t\t\t\t} else if (name === \"data\") {\n\t\t\t\t\t// node.data += dict.data\n\t\t\t\t\t$.extend(this.data, dict.data);\n\t\t\t\t} else if (\n\t\t\t\t\t!$.isFunction(dict[name]) &&\n\t\t\t\t\t!NONE_NODE_DATA_MAP[name]\n\t\t\t\t) {\n\t\t\t\t\t// node.data.NAME = dict.NAME\n\t\t\t\t\tthis.data[name] = dict[name];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (dict.children) {\n\t\t\t\t// recursively set children and render\n\t\t\t\tthis.removeChildren();\n\t\t\t\tthis.addChildren(dict.children);\n\t\t\t}\n\t\t\tthis.renderTitle();\n\t\t\t/*\n\t\t\tvar children = dict.children;\n\t\t\tif(children === undefined){\n\t\t\t\tthis.data = $.extend(this.data, dict);\n\t\t\t\tthis.render();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdict = $.extend({}, dict);\n\t\t\tdict.children = undefined;\n\t\t\tthis.data = $.extend(this.data, dict);\n\t\t\tthis.removeChildren();\n\t\t\tthis.addChild(children);\n\t\t\t*/\n\t\t},\n\t\t/** Return the list of child nodes (undefined for unexpanded lazy nodes).\n\t\t * @returns {FancytreeNode[] | undefined}\n\t\t */\n\t\tgetChildren: function() {\n\t\t\tif (this.hasChildren() === undefined) {\n\t\t\t\t// TODO: only required for lazy nodes?\n\t\t\t\treturn undefined; // Lazy node: unloaded, currently loading, or load error\n\t\t\t}\n\t\t\treturn this.children;\n\t\t},\n\t\t/** Return the first child node or null.\n\t\t * @returns {FancytreeNode | null}\n\t\t */\n\t\tgetFirstChild: function() {\n\t\t\treturn this.children ? this.children[0] : null;\n\t\t},\n\t\t/** Return the 0-based child index.\n\t\t * @returns {int}\n\t\t */\n\t\tgetIndex: function() {\n\t\t\t// return this.parent.children.indexOf(this);\n\t\t\treturn $.inArray(this, this.parent.children); // indexOf doesn't work in IE7\n\t\t},\n\t\t/** Return the hierarchical child index (1-based, e.g. '3.2.4').\n\t\t * @param {string} [separator=\".\"]\n\t\t * @param {int} [digits=1]\n\t\t * @returns {string}\n\t\t */\n\t\tgetIndexHier: function(separator, digits) {\n\t\t\tseparator = separator || \".\";\n\t\t\tvar s,\n\t\t\t\tres = [];\n\t\t\t$.each(this.getParentList(false, true), function(i, o) {\n\t\t\t\ts = \"\" + (o.getIndex() + 1);\n\t\t\t\tif (digits) {\n\t\t\t\t\t// prepend leading zeroes\n\t\t\t\t\ts = (\"0000000\" + s).substr(-digits);\n\t\t\t\t}\n\t\t\t\tres.push(s);\n\t\t\t});\n\t\t\treturn res.join(separator);\n\t\t},\n\t\t/** Return the parent keys separated by options.keyPathSeparator, e.g. \"/id_1/id_17/id_32\".\n\t\t *\n\t\t * (Unlike `node.getPath()`, this method prepends a \"/\" and inverts the first argument.)\n\t\t *\n\t\t * @see FancytreeNode#getPath\n\t\t * @param {boolean} [excludeSelf=false]\n\t\t * @returns {string}\n\t\t */\n\t\tgetKeyPath: function(excludeSelf) {\n\t\t\tvar sep = this.tree.options.keyPathSeparator;\n\n\t\t\treturn sep + this.getPath(!excludeSelf, \"key\", sep);\n\t\t},\n\t\t/** Return the last child of this node or null.\n\t\t * @returns {FancytreeNode | null}\n\t\t */\n\t\tgetLastChild: function() {\n\t\t\treturn this.children\n\t\t\t\t? this.children[this.children.length - 1]\n\t\t\t\t: null;\n\t\t},\n\t\t/** Return node depth. 0: System root node, 1: visible top-level node, 2: first sub-level, ... .\n\t\t * @returns {int}\n\t\t */\n\t\tgetLevel: function() {\n\t\t\tvar level = 0,\n\t\t\t\tdtn = this.parent;\n\t\t\twhile (dtn) {\n\t\t\t\tlevel++;\n\t\t\t\tdtn = dtn.parent;\n\t\t\t}\n\t\t\treturn level;\n\t\t},\n\t\t/** Return the successor node (under the same parent) or null.\n\t\t * @returns {FancytreeNode | null}\n\t\t */\n\t\tgetNextSibling: function() {\n\t\t\t// TODO: use indexOf, if available: (not in IE6)\n\t\t\tif (this.parent) {\n\t\t\t\tvar i,\n\t\t\t\t\tl,\n\t\t\t\t\tac = this.parent.children;\n\n\t\t\t\tfor (i = 0, l = ac.length - 1; i < l; i++) {\n\t\t\t\t\t// up to length-2, so next(last) = null\n\t\t\t\t\tif (ac[i] === this) {\n\t\t\t\t\t\treturn ac[i + 1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\t/** Return the parent node (null for the system root node).\n\t\t * @returns {FancytreeNode | null}\n\t\t */\n\t\tgetParent: function() {\n\t\t\t// TODO: return null for top-level nodes?\n\t\t\treturn this.parent;\n\t\t},\n\t\t/** Return an array of all parent nodes (top-down).\n\t\t * @param {boolean} [includeRoot=false] Include the invisible system root node.\n\t\t * @param {boolean} [includeSelf=false] Include the node itself.\n\t\t * @returns {FancytreeNode[]}\n\t\t */\n\t\tgetParentList: function(includeRoot, includeSelf) {\n\t\t\tvar l = [],\n\t\t\t\tdtn = includeSelf ? this : this.parent;\n\t\t\twhile (dtn) {\n\t\t\t\tif (includeRoot || dtn.parent) {\n\t\t\t\t\tl.unshift(dtn);\n\t\t\t\t}\n\t\t\t\tdtn = dtn.parent;\n\t\t\t}\n\t\t\treturn l;\n\t\t},\n\t\t/** Return a string representing the hierachical node path, e.g. \"a/b/c\".\n\t\t * @param {boolean} [includeSelf=true]\n\t\t * @param {string | function} [part=\"title\"] node property name or callback\n\t\t * @param {string} [separator=\"/\"]\n\t\t * @returns {string}\n\t\t * @since v2.31\n\t\t */\n\t\tgetPath: function(includeSelf, part, separator) {\n\t\t\tincludeSelf = includeSelf !== false;\n\t\t\tpart = part || \"title\";\n\t\t\tseparator = separator || \"/\";\n\n\t\t\tvar val,\n\t\t\t\tpath = [],\n\t\t\t\tisFunc = $.isFunction(part);\n\n\t\t\tthis.visitParents(function(n) {\n\t\t\t\tif (n.parent) {\n\t\t\t\t\tval = isFunc ? part(n) : n[part];\n\t\t\t\t\tpath.unshift(val);\n\t\t\t\t}\n\t\t\t}, includeSelf);\n\t\t\treturn path.join(separator);\n\t\t},\n\t\t/** Return the predecessor node (under the same parent) or null.\n\t\t * @returns {FancytreeNode | null}\n\t\t */\n\t\tgetPrevSibling: function() {\n\t\t\tif (this.parent) {\n\t\t\t\tvar i,\n\t\t\t\t\tl,\n\t\t\t\t\tac = this.parent.children;\n\n\t\t\t\tfor (i = 1, l = ac.length; i < l; i++) {\n\t\t\t\t\t// start with 1, so prev(first) = null\n\t\t\t\t\tif (ac[i] === this) {\n\t\t\t\t\t\treturn ac[i - 1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\t/**\n\t\t * Return an array of selected descendant nodes.\n\t\t * @param {boolean} [stopOnParents=false] only return the topmost selected\n\t\t * node (useful with selectMode 3)\n\t\t * @returns {FancytreeNode[]}\n\t\t */\n\t\tgetSelectedNodes: function(stopOnParents) {\n\t\t\tvar nodeList = [];\n\t\t\tthis.visit(function(node) {\n\t\t\t\tif (node.selected) {\n\t\t\t\t\tnodeList.push(node);\n\t\t\t\t\tif (stopOnParents === true) {\n\t\t\t\t\t\treturn \"skip\"; // stop processing this branch\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn nodeList;\n\t\t},\n\t\t/** Return true if node has children. Return undefined if not sure, i.e. the node is lazy and not yet loaded).\n\t\t * @returns {boolean | undefined}\n\t\t */\n\t\thasChildren: function() {\n\t\t\tif (this.lazy) {\n\t\t\t\tif (this.children == null) {\n\t\t\t\t\t// null or undefined: Not yet loaded\n\t\t\t\t\treturn undefined;\n\t\t\t\t} else if (this.children.length === 0) {\n\t\t\t\t\t// Loaded, but response was empty\n\t\t\t\t\treturn false;\n\t\t\t\t} else if (\n\t\t\t\t\tthis.children.length === 1 &&\n\t\t\t\t\tthis.children[0].isStatusNode()\n\t\t\t\t) {\n\t\t\t\t\t// Currently loading or load error\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn !!(this.children && this.children.length);\n\t\t},\n\t\t/**\n\t\t * Return true if node has `className` defined in .extraClasses.\n\t\t *\n\t\t * @param {string} className class name (separate multiple classes by space)\n\t\t * @returns {boolean}\n\t\t *\n\t\t * @since 2.32\n\t\t */\n\t\thasClass: function(className) {\n\t\t\treturn (\n\t\t\t\t(\" \" + (this.extraClasses || \"\") + \" \").indexOf(\n\t\t\t\t\t\" \" + className + \" \"\n\t\t\t\t) >= 0\n\t\t\t);\n\t\t},\n\t\t/** Return true if node has keyboard focus.\n\t\t * @returns {boolean}\n\t\t */\n\t\thasFocus: function() {\n\t\t\treturn this.tree.hasFocus() && this.tree.focusNode === this;\n\t\t},\n\t\t/** Write to browser console if debugLevel >= 3 (prepending node info)\n\t\t *\n\t\t * @param {*} msg string or object or array of such\n\t\t */\n\t\tinfo: function(msg) {\n\t\t\tif (this.tree.options.debugLevel >= 3) {\n\t\t\t\tArray.prototype.unshift.call(arguments, this.toString());\n\t\t\t\tconsoleApply(\"info\", arguments);\n\t\t\t}\n\t\t},\n\t\t/** Return true if node is active (see also FancytreeNode#isSelected).\n\t\t * @returns {boolean}\n\t\t */\n\t\tisActive: function() {\n\t\t\treturn this.tree.activeNode === this;\n\t\t},\n\t\t/** Return true if node is vertically below `otherNode`, i.e. rendered in a subsequent row.\n\t\t * @param {FancytreeNode} otherNode\n\t\t * @returns {boolean}\n\t\t * @since 2.28\n\t\t */\n\t\tisBelowOf: function(otherNode) {\n\t\t\treturn this.getIndexHier(\".\", 5) > otherNode.getIndexHier(\".\", 5);\n\t\t},\n\t\t/** Return true if node is a direct child of otherNode.\n\t\t * @param {FancytreeNode} otherNode\n\t\t * @returns {boolean}\n\t\t */\n\t\tisChildOf: function(otherNode) {\n\t\t\treturn this.parent && this.parent === otherNode;\n\t\t},\n\t\t/** Return true, if node is a direct or indirect sub node of otherNode.\n\t\t * @param {FancytreeNode} otherNode\n\t\t * @returns {boolean}\n\t\t */\n\t\tisDescendantOf: function(otherNode) {\n\t\t\tif (!otherNode || otherNode.tree !== this.tree) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar p = this.parent;\n\t\t\twhile (p) {\n\t\t\t\tif (p === otherNode) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (p === p.parent) {\n\t\t\t\t\t$.error(\"Recursive parent link: \" + p);\n\t\t\t\t}\n\t\t\t\tp = p.parent;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\t/** Return true if node is expanded.\n\t\t * @returns {boolean}\n\t\t */\n\t\tisExpanded: function() {\n\t\t\treturn !!this.expanded;\n\t\t},\n\t\t/** Return true if node is the first node of its parent's children.\n\t\t * @returns {boolean}\n\t\t */\n\t\tisFirstSibling: function() {\n\t\t\tvar p = this.parent;\n\t\t\treturn !p || p.children[0] === this;\n\t\t},\n\t\t/** Return true if node is a folder, i.e. has the node.folder attribute set.\n\t\t * @returns {boolean}\n\t\t */\n\t\tisFolder: function() {\n\t\t\treturn !!this.folder;\n\t\t},\n\t\t/** Return true if node is the last node of its parent's children.\n\t\t * @returns {boolean}\n\t\t */\n\t\tisLastSibling: function() {\n\t\t\tvar p = this.parent;\n\t\t\treturn !p || p.children[p.children.length - 1] === this;\n\t\t},\n\t\t/** Return true if node is lazy (even if data was already loaded)\n\t\t * @returns {boolean}\n\t\t */\n\t\tisLazy: function() {\n\t\t\treturn !!this.lazy;\n\t\t},\n\t\t/** Return true if node is lazy and loaded. For non-lazy nodes always return true.\n\t\t * @returns {boolean}\n\t\t */\n\t\tisLoaded: function() {\n\t\t\treturn !this.lazy || this.hasChildren() !== undefined; // Also checks if the only child is a status node\n\t\t},\n\t\t/** Return true if children are currently beeing loaded, i.e. a Ajax request is pending.\n\t\t * @returns {boolean}\n\t\t */\n\t\tisLoading: function() {\n\t\t\treturn !!this._isLoading;\n\t\t},\n\t\t/*\n\t\t * @deprecated since v2.4.0: Use isRootNode() instead\n\t\t */\n\t\tisRoot: function() {\n\t\t\treturn this.isRootNode();\n\t\t},\n\t\t/** Return true if node is partially selected (tri-state).\n\t\t * @returns {boolean}\n\t\t * @since 2.23\n\t\t */\n\t\tisPartsel: function() {\n\t\t\treturn !this.selected && !!this.partsel;\n\t\t},\n\t\t/** (experimental) Return true if this is partially loaded.\n\t\t * @returns {boolean}\n\t\t * @since 2.15\n\t\t */\n\t\tisPartload: function() {\n\t\t\treturn !!this.partload;\n\t\t},\n\t\t/** Return true if this is the (invisible) system root node.\n\t\t * @returns {boolean}\n\t\t * @since 2.4\n\t\t */\n\t\tisRootNode: function() {\n\t\t\treturn this.tree.rootNode === this;\n\t\t},\n\t\t/** Return true if node is selected, i.e. has a checkmark set (see also FancytreeNode#isActive).\n\t\t * @returns {boolean}\n\t\t */\n\t\tisSelected: function() {\n\t\t\treturn !!this.selected;\n\t\t},\n\t\t/** Return true if this node is a temporarily generated system node like\n\t\t * 'loading', 'paging', or 'error' (node.statusNodeType contains the type).\n\t\t * @returns {boolean}\n\t\t */\n\t\tisStatusNode: function() {\n\t\t\treturn !!this.statusNodeType;\n\t\t},\n\t\t/** Return true if this node is a status node of type 'paging'.\n\t\t * @returns {boolean}\n\t\t * @since 2.15\n\t\t */\n\t\tisPagingNode: function() {\n\t\t\treturn this.statusNodeType === \"paging\";\n\t\t},\n\t\t/** Return true if this a top level node, i.e. a direct child of the (invisible) system root node.\n\t\t * @returns {boolean}\n\t\t * @since 2.4\n\t\t */\n\t\tisTopLevel: function() {\n\t\t\treturn this.tree.rootNode === this.parent;\n\t\t},\n\t\t/** Return true if node is lazy and not yet loaded. For non-lazy nodes always return false.\n\t\t * @returns {boolean}\n\t\t */\n\t\tisUndefined: function() {\n\t\t\treturn this.hasChildren() === undefined; // also checks if the only child is a status node\n\t\t},\n\t\t/** Return true if all parent nodes are expanded. Note: this does not check\n\t\t * whether the node is scrolled into the visible part of the screen.\n\t\t * @returns {boolean}\n\t\t */\n\t\tisVisible: function() {\n\t\t\tvar i,\n\t\t\t\tl,\n\t\t\t\tn,\n\t\t\t\thasFilter = this.tree.enableFilter,\n\t\t\t\tparents = this.getParentList(false, false);\n\n\t\t\t// TODO: check $(n.span).is(\":visible\")\n\t\t\t// i.e. return false for nodes (but not parents) that are hidden\n\t\t\t// by a filter\n\t\t\tif (hasFilter && !this.match && !this.subMatchCount) {\n\t\t\t\tthis.debug(\n\t\t\t\t\t\"isVisible: HIDDEN (\" +\n\t\t\t\t\t\thasFilter +\n\t\t\t\t\t\t\", \" +\n\t\t\t\t\t\tthis.match +\n\t\t\t\t\t\t\", \" +\n\t\t\t\t\t\tthis.match +\n\t\t\t\t\t\t\")\"\n\t\t\t\t);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfor (i = 0, l = parents.length; i < l; i++) {\n\t\t\t\tn = parents[i];\n\n\t\t\t\tif (!n.expanded) {\n\t\t\t\t\tthis.debug(\"isVisible: HIDDEN (parent collapsed)\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// if (hasFilter && !n.match && !n.subMatchCount) {\n\t\t\t\t// \tthis.debug(\"isVisible: HIDDEN (\" + hasFilter + \", \" + this.match + \", \" + this.match + \")\");\n\t\t\t\t// \treturn false;\n\t\t\t\t// }\n\t\t\t}\n\t\t\tthis.debug(\"isVisible: VISIBLE\");\n\t\t\treturn true;\n\t\t},\n\t\t/** Deprecated.\n\t\t * @deprecated since 2014-02-16: use load() instead.\n\t\t */\n\t\tlazyLoad: function(discard) {\n\t\t\tthis.warn(\n\t\t\t\t\"FancytreeNode.lazyLoad() is deprecated since 2014-02-16. Use .load() instead.\"\n\t\t\t);\n\t\t\treturn this.load(discard);\n\t\t},\n\t\t/**\n\t\t * Load all children of a lazy node if neccessary. The <i>expanded</i> state is maintained.\n\t\t * @param {boolean} [forceReload=false] Pass true to discard any existing nodes before. Otherwise this method does nothing if the node was already loaded.\n\t\t * @returns {$.Promise}\n\t\t */\n\t\tload: function(forceReload) {\n\t\t\tvar res,\n\t\t\t\tsource,\n\t\t\t\tself = this,\n\t\t\t\twasExpanded = this.isExpanded();\n\n\t\t\t_assert(this.isLazy(), \"load() requires a lazy node\");\n\t\t\t// _assert( forceReload || this.isUndefined(), \"Pass forceReload=true to re-load a lazy node\" );\n\t\t\tif (!forceReload && !this.isUndefined()) {\n\t\t\t\treturn _getResolvedPromise(this);\n\t\t\t}\n\t\t\tif (this.isLoaded()) {\n\t\t\t\tthis.resetLazy(); // also collapses\n\t\t\t}\n\t\t\t// This method is also called by setExpanded() and loadKeyPath(), so we\n\t\t\t// have to avoid recursion.\n\t\t\tsource = this.tree._triggerNodeEvent(\"lazyLoad\", this);\n\t\t\tif (source === false) {\n\t\t\t\t// #69\n\t\t\t\treturn _getResolvedPromise(this);\n\t\t\t}\n\t\t\t_assert(\n\t\t\t\ttypeof source !== \"boolean\",\n\t\t\t\t\"lazyLoad event must return source in data.result\"\n\t\t\t);\n\t\t\tres = this.tree._callHook(\"nodeLoadChildren\", this, source);\n\t\t\tif (wasExpanded) {\n\t\t\t\tthis.expanded = true;\n\t\t\t\tres.always(function() {\n\t\t\t\t\tself.render();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tres.always(function() {\n\t\t\t\t\tself.renderStatus(); // fix expander icon to 'loaded'\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t\t/** Expand all parents and optionally scroll into visible area as neccessary.\n\t\t * Promise is resolved, when lazy loading and animations are done.\n\t\t * @param {object} [opts] passed to `setExpanded()`.\n\t\t * Defaults to {noAnimation: false, noEvents: false, scrollIntoView: true}\n\t\t * @returns {$.Promise}\n\t\t */\n\t\tmakeVisible: function(opts) {\n\t\t\tvar i,\n\t\t\t\tself = this,\n\t\t\t\tdeferreds = [],\n\t\t\t\tdfd = new $.Deferred(),\n\t\t\t\tparents = this.getParentList(false, false),\n\t\t\t\tlen = parents.length,\n\t\t\t\teffects = !(opts && opts.noAnimation === true),\n\t\t\t\tscroll = !(opts && opts.scrollIntoView === false);\n\n\t\t\t// Expand bottom-up, so only the top node is animated\n\t\t\tfor (i = len - 1; i >= 0; i--) {\n\t\t\t\t// self.debug(\"pushexpand\" + parents[i]);\n\t\t\t\tdeferreds.push(parents[i].setExpanded(true, opts));\n\t\t\t}\n\t\t\t$.when.apply($, deferreds).done(function() {\n\t\t\t\t// All expands have finished\n\t\t\t\t// self.debug(\"expand DONE\", scroll);\n\t\t\t\tif (scroll) {\n\t\t\t\t\tself.scrollIntoView(effects).done(function() {\n\t\t\t\t\t\t// self.debug(\"scroll DONE\");\n\t\t\t\t\t\tdfd.resolve();\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tdfd.resolve();\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn dfd.promise();\n\t\t},\n\t\t/** Move this node to targetNode.\n\t\t * @param {FancytreeNode} targetNode\n\t\t * @param {string} mode <pre>\n\t\t * 'child': append this node as last child of targetNode.\n\t\t * This is the default. To be compatble with the D'n'd\n\t\t * hitMode, we also accept 'over'.\n\t\t * 'firstChild': add this node as first child of targetNode.\n\t\t * 'before': add this node as sibling before targetNode.\n\t\t * 'after': add this node as sibling after targetNode.</pre>\n\t\t * @param {function} [map] optional callback(FancytreeNode) to allow modifcations\n\t\t */\n\t\tmoveTo: function(targetNode, mode, map) {\n\t\t\tif (mode === undefined || mode === \"over\") {\n\t\t\t\tmode = \"child\";\n\t\t\t} else if (mode === \"firstChild\") {\n\t\t\t\tif (targetNode.children && targetNode.children.length) {\n\t\t\t\t\tmode = \"before\";\n\t\t\t\t\ttargetNode = targetNode.children[0];\n\t\t\t\t} else {\n\t\t\t\t\tmode = \"child\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar pos,\n\t\t\t\ttree = this.tree,\n\t\t\t\tprevParent = this.parent,\n\t\t\t\ttargetParent =\n\t\t\t\t\tmode === \"child\" ? targetNode : targetNode.parent;\n\n\t\t\tif (this === targetNode) {\n\t\t\t\treturn;\n\t\t\t} else if (!this.parent) {\n\t\t\t\t$.error(\"Cannot move system root\");\n\t\t\t} else if (targetParent.isDescendantOf(this)) {\n\t\t\t\t$.error(\"Cannot move a node to its own descendant\");\n\t\t\t}\n\t\t\tif (targetParent !== prevParent) {\n\t\t\t\tprevParent.triggerModifyChild(\"remove\", this);\n\t\t\t}\n\t\t\t// Unlink this node from current parent\n\t\t\tif (this.parent.children.length === 1) {\n\t\t\t\tif (this.parent === targetParent) {\n\t\t\t\t\treturn; // #258\n\t\t\t\t}\n\t\t\t\tthis.parent.children = this.parent.lazy ? [] : null;\n\t\t\t\tthis.parent.expanded = false;\n\t\t\t} else {\n\t\t\t\tpos = $.inArray(this, this.parent.children);\n\t\t\t\t_assert(pos >= 0, \"invalid source parent\");\n\t\t\t\tthis.parent.children.splice(pos, 1);\n\t\t\t}\n\t\t\t// Remove from source DOM parent\n\t\t\t// if(this.parent.ul){\n\t\t\t// \tthis.parent.ul.removeChild(this.li);\n\t\t\t// }\n\n\t\t\t// Insert this node to target parent's child list\n\t\t\tthis.parent = targetParent;\n\t\t\tif (targetParent.hasChildren()) {\n\t\t\t\tswitch (mode) {\n\t\t\t\t\tcase \"child\":\n\t\t\t\t\t\t// Append to existing target children\n\t\t\t\t\t\ttargetParent.children.push(this);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"before\":\n\t\t\t\t\t\t// Insert this node before target node\n\t\t\t\t\t\tpos = $.inArray(targetNode, targetParent.children);\n\t\t\t\t\t\t_assert(pos >= 0, \"invalid target parent\");\n\t\t\t\t\t\ttargetParent.children.splice(pos, 0, this);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"after\":\n\t\t\t\t\t\t// Insert this node after target node\n\t\t\t\t\t\tpos = $.inArray(targetNode, targetParent.children);\n\t\t\t\t\t\t_assert(pos >= 0, \"invalid target parent\");\n\t\t\t\t\t\ttargetParent.children.splice(pos + 1, 0, this);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$.error(\"Invalid mode \" + mode);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttargetParent.children = [this];\n\t\t\t}\n\t\t\t// Parent has no <ul> tag yet:\n\t\t\t// if( !targetParent.ul ) {\n\t\t\t// \t// This is the parent's first child: create UL tag\n\t\t\t// \t// (Hidden, because it will be\n\t\t\t// \ttargetParent.ul = document.createElement(\"ul\");\n\t\t\t// \ttargetParent.ul.style.display = \"none\";\n\t\t\t// \ttargetParent.li.appendChild(targetParent.ul);\n\t\t\t// }\n\t\t\t// // Issue 319: Add to target DOM parent (only if node was already rendered(expanded))\n\t\t\t// if(this.li){\n\t\t\t// \ttargetParent.ul.appendChild(this.li);\n\t\t\t// }\n\n\t\t\t// Let caller modify the nodes\n\t\t\tif (map) {\n\t\t\t\ttargetNode.visit(map, true);\n\t\t\t}\n\t\t\tif (targetParent === prevParent) {\n\t\t\t\ttargetParent.triggerModifyChild(\"move\", this);\n\t\t\t} else {\n\t\t\t\t// prevParent.triggerModifyChild(\"remove\", this);\n\t\t\t\ttargetParent.triggerModifyChild(\"add\", this);\n\t\t\t}\n\t\t\t// Handle cross-tree moves\n\t\t\tif (tree !== targetNode.tree) {\n\t\t\t\t// Fix node.tree for all source nodes\n\t\t\t\t// \t_assert(false, \"Cross-tree move is not yet implemented.\");\n\t\t\t\tthis.warn(\"Cross-tree moveTo is experimental!\");\n\t\t\t\tthis.visit(function(n) {\n\t\t\t\t\t// TODO: fix selection state and activation, ...\n\t\t\t\t\tn.tree = targetNode.tree;\n\t\t\t\t}, true);\n\t\t\t}\n\n\t\t\t// A collaposed node won't re-render children, so we have to remove it manually\n\t\t\t// if( !targetParent.expanded ){\n\t\t\t// prevParent.ul.removeChild(this.li);\n\t\t\t// }\n\t\t\ttree._callHook(\"treeStructureChanged\", tree, \"moveTo\");\n\n\t\t\t// Update HTML markup\n\t\t\tif (!prevParent.isDescendantOf(targetParent)) {\n\t\t\t\tprevParent.render();\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetParent.isDescendantOf(prevParent) &&\n\t\t\t\ttargetParent !== prevParent\n\t\t\t) {\n\t\t\t\ttargetParent.render();\n\t\t\t}\n\t\t\t// TODO: fix selection state\n\t\t\t// TODO: fix active state\n\n\t\t\t/*\n\t\t\tvar tree = this.tree;\n\t\t\tvar opts = tree.options;\n\t\t\tvar pers = tree.persistence;\n\n\t\t\t// Always expand, if it's below minExpandLevel\n\t\t\t// tree.logDebug (\"%s._addChildNode(%o), l=%o\", this, ftnode, ftnode.getLevel());\n\t\t\tif ( opts.minExpandLevel >= ftnode.getLevel() ) {\n\t\t\t\t// tree.logDebug (\"Force expand for %o\", ftnode);\n\t\t\t\tthis.bExpanded = true;\n\t\t\t}\n\n\t\t\t// In multi-hier mode, update the parents selection state\n\t\t\t// DT issue #82: only if not initializing, because the children may not exist yet\n\t\t\t// if( !ftnode.data.isStatusNode() && opts.selectMode==3 && !isInitializing )\n\t\t\t// \tftnode._fixSelectionState();\n\n\t\t\t// In multi-hier mode, update the parents selection state\n\t\t\tif( ftnode.bSelected && opts.selectMode==3 ) {\n\t\t\t\tvar p = this;\n\t\t\t\twhile( p ) {\n\t\t\t\t\tif( !p.hasSubSel )\n\t\t\t\t\t\tp._setSubSel(true);\n\t\t\t\t\tp = p.parent;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// render this node and the new child\n\t\t\tif ( tree.bEnableUpdate )\n\t\t\t\tthis.render();\n\t\t\treturn ftnode;\n\t\t\t*/\n\t\t},\n\t\t/** Set focus relative to this node and optionally activate.\n\t\t *\n\t\t * 'left' collapses the node if it is expanded, or move to the parent\n\t\t * otherwise.\n\t\t * 'right' expands the node if it is collapsed, or move to the first\n\t\t * child otherwise.\n\t\t *\n\t\t * @param {string|number} where 'down', 'first', 'last', 'left', 'parent', 'right', or 'up'.\n\t\t * (Alternatively the keyCode that would normally trigger this move,\n\t\t * e.g. `$.ui.keyCode.LEFT` = 'left'.\n\t\t * @param {boolean} [activate=true]\n\t\t * @returns {$.Promise}\n\t\t */\n\t\tnavigate: function(where, activate) {\n\t\t\tvar node,\n\t\t\t\tKC = $.ui.keyCode;\n\n\t\t\t// Handle optional expand/collapse action for LEFT/RIGHT\n\t\t\tswitch (where) {\n\t\t\t\tcase \"left\":\n\t\t\t\tcase KC.LEFT:\n\t\t\t\t\tif (this.expanded) {\n\t\t\t\t\t\treturn this.setExpanded(false);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"right\":\n\t\t\t\tcase KC.RIGHT:\n\t\t\t\t\tif (!this.expanded && (this.children || this.lazy)) {\n\t\t\t\t\t\treturn this.setExpanded();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// Otherwise activate or focus the related node\n\t\t\tnode = this.findRelatedNode(where);\n\t\t\tif (node) {\n\t\t\t\t// setFocus/setActive will scroll later (if autoScroll is specified)\n\t\t\t\ttry {\n\t\t\t\t\tnode.makeVisible({ scrollIntoView: false });\n\t\t\t\t} catch (e) {} // #272\n\t\t\t\tif (activate === false) {\n\t\t\t\t\tnode.setFocus();\n\t\t\t\t\treturn _getResolvedPromise();\n\t\t\t\t}\n\t\t\t\treturn node.setActive();\n\t\t\t}\n\t\t\tthis.warn(\"Could not find related node '\" + where + \"'.\");\n\t\t\treturn _getResolvedPromise();\n\t\t},\n\t\t/**\n\t\t * Remove this node (not allowed for system root).\n\t\t */\n\t\tremove: function() {\n\t\t\treturn this.parent.removeChild(this);\n\t\t},\n\t\t/**\n\t\t * Remove childNode from list of direct children.\n\t\t * @param {FancytreeNode} childNode\n\t\t */\n\t\tremoveChild: function(childNode) {\n\t\t\treturn this.tree._callHook(\"nodeRemoveChild\", this, childNode);\n\t\t},\n\t\t/**\n\t\t * Remove all child nodes and descendents. This converts the node into a leaf.<br>\n\t\t * If this was a lazy node, it is still considered 'loaded'; call node.resetLazy()\n\t\t * in order to trigger lazyLoad on next expand.\n\t\t */\n\t\tremoveChildren: function() {\n\t\t\treturn this.tree._callHook(\"nodeRemoveChildren\", this);\n\t\t},\n\t\t/**\n\t\t * Remove class from node's span tag and .extraClasses.\n\t\t *\n\t\t * @param {string} className class name\n\t\t *\n\t\t * @since 2.17\n\t\t */\n\t\tremoveClass: function(className) {\n\t\t\treturn this.toggleClass(className, false);\n\t\t},\n\t\t/**\n\t\t * This method renders and updates all HTML markup that is required\n\t\t * to display this node in its current state.<br>\n\t\t * Note:\n\t\t * <ul>\n\t\t * <li>It should only be neccessary to call this method after the node object\n\t\t * was modified by direct access to its properties, because the common\n\t\t * API methods (node.setTitle(), moveTo(), addChildren(), remove(), ...)\n\t\t * already handle this.\n\t\t * <li> {@link FancytreeNode#renderTitle} and {@link FancytreeNode#renderStatus}\n\t\t * are implied. If changes are more local, calling only renderTitle() or\n\t\t * renderStatus() may be sufficient and faster.\n\t\t * </ul>\n\t\t *\n\t\t * @param {boolean} [force=false] re-render, even if html markup was already created\n\t\t * @param {boolean} [deep=false] also render all descendants, even if parent is collapsed\n\t\t */\n\t\trender: function(force, deep) {\n\t\t\treturn this.tree._callHook(\"nodeRender\", this, force, deep);\n\t\t},\n\t\t/** Create HTML markup for the node's outer `<span>` (expander, checkbox, icon, and title).\n\t\t * Implies {@link FancytreeNode#renderStatus}.\n\t\t * @see Fancytree_Hooks#nodeRenderTitle\n\t\t */\n\t\trenderTitle: function() {\n\t\t\treturn this.tree._callHook(\"nodeRenderTitle\", this);\n\t\t},\n\t\t/** Update element's CSS classes according to node state.\n\t\t * @see Fancytree_Hooks#nodeRenderStatus\n\t\t */\n\t\trenderStatus: function() {\n\t\t\treturn this.tree._callHook(\"nodeRenderStatus\", this);\n\t\t},\n\t\t/**\n\t\t * (experimental) Replace this node with `source`.\n\t\t * (Currently only available for paging nodes.)\n\t\t * @param {NodeData[]} source List of child node definitions\n\t\t * @since 2.15\n\t\t */\n\t\treplaceWith: function(source) {\n\t\t\tvar res,\n\t\t\t\tparent = this.parent,\n\t\t\t\tpos = $.inArray(this, parent.children),\n\t\t\t\tself = this;\n\n\t\t\t_assert(\n\t\t\t\tthis.isPagingNode(),\n\t\t\t\t\"replaceWith() currently requires a paging status node\"\n\t\t\t);\n\n\t\t\tres = this.tree._callHook(\"nodeLoadChildren\", this, source);\n\t\t\tres.done(function(data) {\n\t\t\t\t// New nodes are currently children of `this`.\n\t\t\t\tvar children = self.children;\n\t\t\t\t// Prepend newly loaded child nodes to `this`\n\t\t\t\t// Move new children after self\n\t\t\t\tfor (i = 0; i < children.length; i++) {\n\t\t\t\t\tchildren[i].parent = parent;\n\t\t\t\t}\n\t\t\t\tparent.children.splice.apply(\n\t\t\t\t\tparent.children,\n\t\t\t\t\t[pos + 1, 0].concat(children)\n\t\t\t\t);\n\n\t\t\t\t// Remove self\n\t\t\t\tself.children = null;\n\t\t\t\tself.remove();\n\t\t\t\t// Redraw new nodes\n\t\t\t\tparent.render();\n\t\t\t\t// TODO: set node.partload = false if this was tha last paging node?\n\t\t\t\t// parent.addPagingNode(false);\n\t\t\t}).fail(function() {\n\t\t\t\tself.setExpanded();\n\t\t\t});\n\t\t\treturn res;\n\t\t\t// $.error(\"Not implemented: replaceWith()\");\n\t\t},\n\t\t/**\n\t\t * Remove all children, collapse, and set the lazy-flag, so that the lazyLoad\n\t\t * event is triggered on next expand.\n\t\t */\n\t\tresetLazy: function() {\n\t\t\tthis.removeChildren();\n\t\t\tthis.expanded = false;\n\t\t\tthis.lazy = true;\n\t\t\tthis.children = undefined;\n\t\t\tthis.renderStatus();\n\t\t},\n\t\t/** Schedule activity for delayed execution (cancel any pending request).\n\t\t * scheduleAction('cancel') will only cancel a pending request (if any).\n\t\t * @param {string} mode\n\t\t * @param {number} ms\n\t\t */\n\t\tscheduleAction: function(mode, ms) {\n\t\t\tif (this.tree.timer) {\n\t\t\t\tclearTimeout(this.tree.timer);\n\t\t\t\tthis.tree.debug(\"clearTimeout(%o)\", this.tree.timer);\n\t\t\t}\n\t\t\tthis.tree.timer = null;\n\t\t\tvar self = this; // required for closures\n\t\t\tswitch (mode) {\n\t\t\t\tcase \"cancel\":\n\t\t\t\t\t// Simply made sure that timer was cleared\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"expand\":\n\t\t\t\t\tthis.tree.timer = setTimeout(function() {\n\t\t\t\t\t\tself.tree.debug(\"setTimeout: trigger expand\");\n\t\t\t\t\t\tself.setExpanded(true);\n\t\t\t\t\t}, ms);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"activate\":\n\t\t\t\t\tthis.tree.timer = setTimeout(function() {\n\t\t\t\t\t\tself.tree.debug(\"setTimeout: trigger activate\");\n\t\t\t\t\t\tself.setActive(true);\n\t\t\t\t\t}, ms);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t$.error(\"Invalid mode \" + mode);\n\t\t\t}\n\t\t\t// this.tree.debug(\"setTimeout(%s, %s): %s\", mode, ms, this.tree.timer);\n\t\t},\n\t\t/**\n\t\t *\n\t\t * @param {boolean | PlainObject} [effects=false] animation options.\n\t\t * @param {object} [options=null] {topNode: null, effects: ..., parent: ...} this node will remain visible in\n\t\t * any case, even if `this` is outside the scroll pane.\n\t\t * @returns {$.Promise}\n\t\t */\n\t\tscrollIntoView: function(effects, options) {\n\t\t\tif (options !== undefined && _isNode(options)) {\n\t\t\t\tthrow Error(\n\t\t\t\t\t\"scrollIntoView() with 'topNode' option is deprecated since 2014-05-08. Use 'options.topNode' instead.\"\n\t\t\t\t);\n\t\t\t}\n\t\t\t// The scroll parent is typically the plain tree's <UL> container.\n\t\t\t// For ext-table, we choose the nearest parent that has `position: relative`\n\t\t\t// and `overflow` set.\n\t\t\t// (This default can be overridden by the local or global `scrollParent` option.)\n\t\t\tvar opts = $.extend(\n\t\t\t\t\t{\n\t\t\t\t\t\teffects:\n\t\t\t\t\t\t\teffects === true\n\t\t\t\t\t\t\t\t? { duration: 200, queue: false }\n\t\t\t\t\t\t\t\t: effects,\n\t\t\t\t\t\tscrollOfs: this.tree.options.scrollOfs,\n\t\t\t\t\t\tscrollParent: this.tree.options.scrollParent,\n\t\t\t\t\t\ttopNode: null,\n\t\t\t\t\t},\n\t\t\t\t\toptions\n\t\t\t\t),\n\t\t\t\t$scrollParent = opts.scrollParent,\n\t\t\t\t$container = this.tree.$container,\n\t\t\t\toverflowY = $container.css(\"overflow-y\");\n\n\t\t\tif (!$scrollParent) {\n\t\t\t\tif (this.tree.tbody) {\n\t\t\t\t\t$scrollParent = $container.scrollParent();\n\t\t\t\t} else if (overflowY === \"scroll\" || overflowY === \"auto\") {\n\t\t\t\t\t$scrollParent = $container;\n\t\t\t\t} else {\n\t\t\t\t\t// #922 plain tree in a non-fixed-sized UL scrolls inside its parent\n\t\t\t\t\t$scrollParent = $container.scrollParent();\n\t\t\t\t}\n\t\t\t} else if (!$scrollParent.jquery) {\n\t\t\t\t// Make sure we have a jQuery object\n\t\t\t\t$scrollParent = $($scrollParent);\n\t\t\t}\n\t\t\tif (\n\t\t\t\t$scrollParent[0] === document ||\n\t\t\t\t$scrollParent[0] === document.body\n\t\t\t) {\n\t\t\t\t// `document` may be returned by $().scrollParent(), if nothing is found,\n\t\t\t\t// but would not work: (see #894)\n\t\t\t\tthis.debug(\n\t\t\t\t\t\"scrollIntoView(): normalizing scrollParent to 'window':\",\n\t\t\t\t\t$scrollParent[0]\n\t\t\t\t);\n\t\t\t\t$scrollParent = $(window);\n\t\t\t}\n\t\t\t// eslint-disable-next-line one-var\n\t\t\tvar topNodeY,\n\t\t\t\tnodeY,\n\t\t\t\thorzScrollbarHeight,\n\t\t\t\tcontainerOffsetTop,\n\t\t\t\tdfd = new $.Deferred(),\n\t\t\t\tself = this,\n\t\t\t\tnodeHeight = $(this.span).height(),\n\t\t\t\ttopOfs = opts.scrollOfs.top || 0,\n\t\t\t\tbottomOfs = opts.scrollOfs.bottom || 0,\n\t\t\t\tcontainerHeight = $scrollParent.height(),\n\t\t\t\tscrollTop = $scrollParent.scrollTop(),\n\t\t\t\t$animateTarget = $scrollParent,\n\t\t\t\tisParentWindow = $scrollParent[0] === window,\n\t\t\t\ttopNode = opts.topNode || null,\n\t\t\t\tnewScrollTop = null;\n\n\t\t\t// this.debug(\"scrollIntoView(), scrollTop=\" + scrollTop, opts.scrollOfs);\n\t\t\t// _assert($(this.span).is(\":visible\"), \"scrollIntoView node is invisible\"); // otherwise we cannot calc offsets\n\t\t\tif (!this.isVisible()) {\n\t\t\t\t// We cannot calc offsets for hidden elements\n\t\t\t\tthis.warn(\"scrollIntoView(): node is invisible.\");\n\t\t\t\treturn _getResolvedPromise();\n\t\t\t}\n\t\t\tif (isParentWindow) {\n\t\t\t\tnodeY = $(this.span).offset().top;\n\t\t\t\ttopNodeY =\n\t\t\t\t\ttopNode && topNode.span ? $(topNode.span).offset().top : 0;\n\t\t\t\t$animateTarget = $(\"html,body\");\n\t\t\t} else {\n\t\t\t\t_assert(\n\t\t\t\t\t$scrollParent[0] !== document &&\n\t\t\t\t\t\t$scrollParent[0] !== document.body,\n\t\t\t\t\t\"scrollParent should be a simple element or `window`, not document or body.\"\n\t\t\t\t);\n\n\t\t\t\tcontainerOffsetTop = $scrollParent.offset().top;\n\t\t\t\tnodeY =\n\t\t\t\t\t$(this.span).offset().top - containerOffsetTop + scrollTop; // relative to scroll parent\n\t\t\t\ttopNodeY = topNode\n\t\t\t\t\t? $(topNode.span).offset().top -\n\t\t\t\t\t containerOffsetTop +\n\t\t\t\t\t scrollTop\n\t\t\t\t\t: 0;\n\t\t\t\thorzScrollbarHeight = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\t$scrollParent.innerHeight() - $scrollParent[0].clientHeight\n\t\t\t\t);\n\t\t\t\tcontainerHeight -= horzScrollbarHeight;\n\t\t\t}\n\n\t\t\t// this.debug(\" scrollIntoView(), nodeY=\" + nodeY + \", containerHeight=\" + containerHeight);\n\t\t\tif (nodeY < scrollTop + topOfs) {\n\t\t\t\t// Node is above visible container area\n\t\t\t\tnewScrollTop = nodeY - topOfs;\n\t\t\t\t// this.debug(\" scrollIntoView(), UPPER newScrollTop=\" + newScrollTop);\n\t\t\t} else if (\n\t\t\t\tnodeY + nodeHeight >\n\t\t\t\tscrollTop + containerHeight - bottomOfs\n\t\t\t) {\n\t\t\t\tnewScrollTop = nodeY + nodeHeight - containerHeight + bottomOfs;\n\t\t\t\t// this.debug(\" scrollIntoView(), LOWER newScrollTop=\" + newScrollTop);\n\t\t\t\t// If a topNode was passed, make sure that it is never scrolled\n\t\t\t\t// outside the upper border\n\t\t\t\tif (topNode) {\n\t\t\t\t\t_assert(\n\t\t\t\t\t\ttopNode.isRootNode() || topNode.isVisible(),\n\t\t\t\t\t\t\"topNode must be visible\"\n\t\t\t\t\t);\n\t\t\t\t\tif (topNodeY < newScrollTop) {\n\t\t\t\t\t\tnewScrollTop = topNodeY - topOfs;\n\t\t\t\t\t\t// this.debug(\" scrollIntoView(), TOP newScrollTop=\" + newScrollTop);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newScrollTop === null) {\n\t\t\t\tdfd.resolveWith(this);\n\t\t\t} else {\n\t\t\t\t// this.debug(\" scrollIntoView(), SET newScrollTop=\" + newScrollTop);\n\t\t\t\tif (opts.effects) {\n\t\t\t\t\topts.effects.complete = function() {\n\t\t\t\t\t\tdfd.resolveWith(self);\n\t\t\t\t\t};\n\t\t\t\t\t$animateTarget.stop(true).animate(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tscrollTop: newScrollTop,\n\t\t\t\t\t\t},\n\t\t\t\t\t\topts.effects\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t$animateTarget[0].scrollTop = newScrollTop;\n\t\t\t\t\tdfd.resolveWith(this);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn dfd.promise();\n\t\t},\n\n\t\t/**Activate this node.\n\t\t *\n\t\t * The `cell` option requires the ext-table and ext-ariagrid extensions.\n\t\t *\n\t\t * @param {boolean} [flag=true] pass false to deactivate\n\t\t * @param {object} [opts] additional options. Defaults to {noEvents: false, noFocus: false, cell: null}\n\t\t * @returns {$.Promise}\n\t\t */\n\t\tsetActive: function(flag, opts) {\n\t\t\treturn this.tree._callHook(\"nodeSetActive\", this, flag, opts);\n\t\t},\n\t\t/**Expand or collapse this node. Promise is resolved, when lazy loading and animations are done.\n\t\t * @param {boolean} [flag=true] pass false to collapse\n\t\t * @param {object} [opts] additional options. Defaults to {noAnimation: false, noEvents: false}\n\t\t * @returns {$.Promise}\n\t\t */\n\t\tsetExpanded: function(flag, opts) {\n\t\t\treturn this.tree._callHook(\"nodeSetExpanded\", this, flag, opts);\n\t\t},\n\t\t/**Set keyboard focus to this node.\n\t\t * @param {boolean} [flag=true] pass false to blur\n\t\t * @see Fancytree#setFocus\n\t\t */\n\t\tsetFocus: function(flag) {\n\t\t\treturn this.tree._callHook(\"nodeSetFocus\", this, flag);\n\t\t},\n\t\t/**Select this node, i.e. check the checkbox.\n\t\t * @param {boolean} [flag=true] pass false to deselect\n\t\t * @param {object} [opts] additional options. Defaults to {noEvents: false, p\n\t\t * propagateDown: null, propagateUp: null, callback: null }\n\t\t */\n\t\tsetSelected: function(flag, opts) {\n\t\t\treturn this.tree._callHook(\"nodeSetSelected\", this, flag, opts);\n\t\t},\n\t\t/**Mark a lazy node as 'error', 'loading', 'nodata', or 'ok'.\n\t\t * @param {string} status 'error'|'empty'|'ok'\n\t\t * @param {string} [message]\n\t\t * @param {string} [details]\n\t\t */\n\t\tsetStatus: function(status, message, details) {\n\t\t\treturn this.tree._callHook(\n\t\t\t\t\"nodeSetStatus\",\n\t\t\t\tthis,\n\t\t\t\tstatus,\n\t\t\t\tmessage,\n\t\t\t\tdetails\n\t\t\t);\n\t\t},\n\t\t/**Rename this node.\n\t\t * @param {string} title\n\t\t */\n\t\tsetTitle: function(title) {\n\t\t\tthis.title = title;\n\t\t\tthis.renderTitle();\n\t\t\tthis.triggerModify(\"rename\");\n\t\t},\n\t\t/**Sort child list by title.\n\t\t * @param {function} [cmp] custom compare function(a, b) that returns -1, 0, or 1 (defaults to sort by title).\n\t\t * @param {boolean} [deep=false] pass true to sort all descendant nodes\n\t\t */\n\t\tsortChildren: function(cmp, deep) {\n\t\t\tvar i,\n\t\t\t\tl,\n\t\t\t\tcl = this.children;\n\n\t\t\tif (!cl) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcmp =\n\t\t\t\tcmp ||\n\t\t\t\tfunction(a, b) {\n\t\t\t\t\tvar x = a.title.toLowerCase(),\n\t\t\t\t\t\ty = b.title.toLowerCase();\n\n\t\t\t\t\t// eslint-disable-next-line no-nested-ternary\n\t\t\t\t\treturn x === y ? 0 : x > y ? 1 : -1;\n\t\t\t\t};\n\t\t\tcl.sort(cmp);\n\t\t\tif (deep) {\n\t\t\t\tfor (i = 0, l = cl.length; i < l; i++) {\n\t\t\t\t\tif (cl[i].children) {\n\t\t\t\t\t\tcl[i].sortChildren(cmp, \"$norender$\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (deep !== \"$norender$\") {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t\tthis.triggerModifyChild(\"sort\");\n\t\t},\n\t\t/** Convert node (or whole branch) into a plain object.\n\t\t *\n\t\t * The result is compatible with node.addChildren().\n\t\t *\n\t\t * @param {boolean} [recursive=false] include child nodes\n\t\t * @param {function} [callback] callback(dict, node) is called for every node, in order to allow modifications.\n\t\t * Return `false` to ignore this node or \"skip\" to include this node without its children.\n\t\t * @returns {NodeData}\n\t\t */\n\t\ttoDict: function(recursive, callback) {\n\t\t\tvar i,\n\t\t\t\tl,\n\t\t\t\tnode,\n\t\t\t\tres,\n\t\t\t\tdict = {},\n\t\t\t\tself = this;\n\n\t\t\t$.each(NODE_ATTRS, function(i, a) {\n\t\t\t\tif (self[a] || self[a] === false) {\n\t\t\t\t\tdict[a] = self[a];\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (!$.isEmptyObject(this.data)) {\n\t\t\t\tdict.data = $.extend({}, this.data);\n\t\t\t\tif ($.isEmptyObject(dict.data)) {\n\t\t\t\t\tdelete dict.data;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (callback) {\n\t\t\t\tres = callback(dict, self);\n\t\t\t\tif (res === false) {\n\t\t\t\t\treturn false; // Don't include this node nor its children\n\t\t\t\t}\n\t\t\t\tif (res === \"skip\") {\n\t\t\t\t\trecursive = false; // Include this node, but not the children\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (recursive) {\n\t\t\t\tif (this.hasChildren()) {\n\t\t\t\t\tdict.children = [];\n\t\t\t\t\tfor (i = 0, l = this.children.length; i < l; i++) {\n\t\t\t\t\t\tnode = this.children[i];\n\t\t\t\t\t\tif (!node.isStatusNode()) {\n\t\t\t\t\t\t\tres = node.toDict(true, callback);\n\t\t\t\t\t\t\tif (res !== false) {\n\t\t\t\t\t\t\t\tdict.children.push(res);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn dict;\n\t\t},\n\t\t/**\n\t\t * Set, clear, or toggle class of node's span tag and .extraClasses.\n\t\t *\n\t\t * @param {string} className class name (separate multiple classes by space)\n\t\t * @param {boolean} [flag] true/false to add/remove class. If omitted, class is toggled.\n\t\t * @returns {boolean} true if a class was added\n\t\t *\n\t\t * @since 2.17\n\t\t */\n\t\ttoggleClass: function(value, flag) {\n\t\t\tvar className,\n\t\t\t\thasClass,\n\t\t\t\trnotwhite = /\\S+/g,\n\t\t\t\tclassNames = value.match(rnotwhite) || [],\n\t\t\t\ti = 0,\n\t\t\t\twasAdded = false,\n\t\t\t\tstatusElem = this[this.tree.statusClassPropName],\n\t\t\t\tcurClasses = \" \" + (this.extraClasses || \"\") + \" \";\n\n\t\t\t// this.info(\"toggleClass('\" + value + \"', \" + flag + \")\", curClasses);\n\t\t\t// Modify DOM element directly if it already exists\n\t\t\tif (statusElem) {\n\t\t\t\t$(statusElem).toggleClass(value, flag);\n\t\t\t}\n\t\t\t// Modify node.extraClasses to make this change persistent\n\t\t\t// Toggle if flag was not passed\n\t\t\twhile ((className = classNames[i++])) {\n\t\t\t\thasClass = curClasses.indexOf(\" \" + className + \" \") >= 0;\n\t\t\t\tflag = flag === undefined ? !hasClass : !!flag;\n\t\t\t\tif (flag) {\n\t\t\t\t\tif (!hasClass) {\n\t\t\t\t\t\tcurClasses += className + \" \";\n\t\t\t\t\t\twasAdded = true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\twhile (curClasses.indexOf(\" \" + className + \" \") > -1) {\n\t\t\t\t\t\tcurClasses = curClasses.replace(\n\t\t\t\t\t\t\t\" \" + className + \" \",\n\t\t\t\t\t\t\t\" \"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.extraClasses = $.trim(curClasses);\n\t\t\t// this.info(\"-> toggleClass('\" + value + \"', \" + flag + \"): '\" + this.extraClasses + \"'\");\n\t\t\treturn wasAdded;\n\t\t},\n\t\t/** Flip expanded status. */\n\t\ttoggleExpanded: function() {\n\t\t\treturn this.tree._callHook(\"nodeToggleExpanded\", this);\n\t\t},\n\t\t/** Flip selection status. */\n\t\ttoggleSelected: function() {\n\t\t\treturn this.tree._callHook(\"nodeToggleSelected\", this);\n\t\t},\n\t\ttoString: function() {\n\t\t\treturn \"FancytreeNode@\" + this.key + \"[title='\" + this.title + \"']\";\n\t\t\t// return \"<FancytreeNode(#\" + this.key + \", '\" + this.title + \"')>\";\n\t\t},\n\t\t/**\n\t\t * Trigger `modifyChild` event on a parent to signal that a child was modified.\n\t\t * @param {string} operation Type of change: 'add', 'remove', 'rename', 'move', 'data', ...\n\t\t * @param {FancytreeNode} [childNode]\n\t\t * @param {object} [extra]\n\t\t */\n\t\ttriggerModifyChild: function(operation, childNode, extra) {\n\t\t\tvar data,\n\t\t\t\tmodifyChild = this.tree.options.modifyChild;\n\n\t\t\tif (modifyChild) {\n\t\t\t\tif (childNode && childNode.parent !== this) {\n\t\t\t\t\t$.error(\n\t\t\t\t\t\t\"childNode \" + childNode + \" is not a child of \" + this\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tdata = {\n\t\t\t\t\tnode: this,\n\t\t\t\t\ttree: this.tree,\n\t\t\t\t\toperation: operation,\n\t\t\t\t\tchildNode: childNode || null,\n\t\t\t\t};\n\t\t\t\tif (extra) {\n\t\t\t\t\t$.extend(data, extra);\n\t\t\t\t}\n\t\t\t\tmodifyChild({ type: \"modifyChild\" }, data);\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Trigger `modifyChild` event on node.parent(!).\n\t\t * @param {string} operation Type of change: 'add', 'remove', 'rename', 'move', 'data', ...\n\t\t * @param {object} [extra]\n\t\t */\n\t\ttriggerModify: function(operation, extra) {\n\t\t\tthis.parent.triggerModifyChild(operation, this, extra);\n\t\t},\n\t\t/** Call fn(node) for all child nodes in hierarchical order (depth-first).<br>\n\t\t * Stop iteration, if fn() returns false. Skip current branch, if fn() returns \"skip\".<br>\n\t\t * Return false if iteration was stopped.\n\t\t *\n\t\t * @param {function} fn the callback function.\n\t\t * Return false to stop iteration, return \"skip\" to skip this node and\n\t\t * its children only.\n\t\t * @param {boolean} [includeSelf=false]\n\t\t * @returns {boolean}\n\t\t */\n\t\tvisit: function(fn, includeSelf) {\n\t\t\tvar i,\n\t\t\t\tl,\n\t\t\t\tres = true,\n\t\t\t\tchildren = this.children;\n\n\t\t\tif (includeSelf === true) {\n\t\t\t\tres = fn(this);\n\t\t\t\tif (res === false || res === \"skip\") {\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (children) {\n\t\t\t\tfor (i = 0, l = children.length; i < l; i++) {\n\t\t\t\t\tres = children[i].visit(fn, true);\n\t\t\t\t\tif (res === false) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t\t/** Call fn(node) for all child nodes and recursively load lazy children.<br>\n\t\t * <b>Note:</b> If you need this method, you probably should consider to review\n\t\t * your architecture! Recursivley loading nodes is a perfect way for lazy\n\t\t * programmers to flood the server with requests ;-)\n\t\t *\n\t\t * @param {function} [fn] optional callback function.\n\t\t * Return false to stop iteration, return \"skip\" to skip this node and\n\t\t * its children only.\n\t\t * @param {boolean} [includeSelf=false]\n\t\t * @returns {$.Promise}\n\t\t * @since 2.4\n\t\t */\n\t\tvisitAndLoad: function(fn, includeSelf, _recursion) {\n\t\t\tvar dfd,\n\t\t\t\tres,\n\t\t\t\tloaders,\n\t\t\t\tnode = this;\n\n\t\t\t// node.debug(\"visitAndLoad\");\n\t\t\tif (fn && includeSelf === true) {\n\t\t\t\tres = fn(node);\n\t\t\t\tif (res === false || res === \"skip\") {\n\t\t\t\t\treturn _recursion ? res : _getResolvedPromise();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!node.children && !node.lazy) {\n\t\t\t\treturn _getResolvedPromise();\n\t\t\t}\n\t\t\tdfd = new $.Deferred();\n\t\t\tloaders = [];\n\t\t\t// node.debug(\"load()...\");\n\t\t\tnode.load().done(function() {\n\t\t\t\t// node.debug(\"load()... done.\");\n\t\t\t\tfor (var i = 0, l = node.children.length; i < l; i++) {\n\t\t\t\t\tres = node.children[i].visitAndLoad(fn, true, true);\n\t\t\t\t\tif (res === false) {\n\t\t\t\t\t\tdfd.reject();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (res !== \"skip\") {\n\t\t\t\t\t\tloaders.push(res); // Add promise to the list\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$.when.apply(this, loaders).then(function() {\n\t\t\t\t\tdfd.resolve();\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn dfd.promise();\n\t\t},\n\t\t/** Call fn(node) for all parent nodes, bottom-up, including invisible system root.<br>\n\t\t * Stop iteration, if fn() returns false.<br>\n\t\t * Return false if iteration was stopped.\n\t\t *\n\t\t * @param {function} fn the callback function.\n\t\t * Return false to stop iteration, return \"skip\" to skip this node and children only.\n\t\t * @param {boolean} [includeSelf=false]\n\t\t * @returns {boolean}\n\t\t */\n\t\tvisitParents: function(fn, includeSelf) {\n\t\t\t// Visit parent nodes (bottom up)\n\t\t\tif (includeSelf && fn(this) === false) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar p = this.parent;\n\t\t\twhile (p) {\n\t\t\t\tif (fn(p) === false) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tp = p.parent;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\t/** Call fn(node) for all sibling nodes.<br>\n\t\t * Stop iteration, if fn() returns false.<br>\n\t\t * Return false if iteration was stopped.\n\t\t *\n\t\t * @param {function} fn the callback function.\n\t\t * Return false to stop iteration.\n\t\t * @param {boolean} [includeSelf=false]\n\t\t * @returns {boolean}\n\t\t */\n\t\tvisitSiblings: function(fn, includeSelf) {\n\t\t\tvar i,\n\t\t\t\tl,\n\t\t\t\tn,\n\t\t\t\tac = this.parent.children;\n\n\t\t\tfor (i = 0, l = ac.length; i < l; i++) {\n\t\t\t\tn = ac[i];\n\t\t\t\tif (includeSelf || n !== this) {\n\t\t\t\t\tif (fn(n) === false) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\t/** Write warning to browser console if debugLevel >= 2 (prepending node info)\n\t\t *\n\t\t * @param {*} msg string or object or array of such\n\t\t */\n\t\twarn: function(msg) {\n\t\t\tif (this.tree.options.debugLevel >= 2) {\n\t\t\t\tArray.prototype.unshift.call(arguments, this.toString());\n\t\t\t\tconsoleApply(\"warn\", arguments);\n\t\t\t}\n\t\t},\n\t};\n\n\t/******************************************************************************\n\t * Fancytree\n\t */\n\t/**\n\t * Construct a new tree object.\n\t *\n\t * @class Fancytree\n\t * @classdesc The controller behind a fancytree.\n\t * This class also contains 'hook methods': see {@link Fancytree_Hooks}.\n\t *\n\t * @param {Widget} widget\n\t *\n\t * @property {string} _id Automatically generated unique tree instance ID, e.g. \"1\".\n\t * @property {string} _ns Automatically generated unique tree namespace, e.g. \".fancytree-1\".\n\t * @property {FancytreeNode} activeNode Currently active node or null.\n\t * @property {string} ariaPropName Property name of FancytreeNode that contains the element which will receive the aria attributes.\n\t * Typically \"li\", but \"tr\" for table extension.\n\t * @property {jQueryObject} $container Outer `<ul>` element (or `<table>` element for ext-table).\n\t * @property {jQueryObject} $div A jQuery object containing the element used to instantiate the tree widget (`widget.element`)\n\t * @property {object|array} columns Recommended place to store shared column meta data. @since 2.27\n\t * @property {object} data Metadata, i.e. properties that may be passed to `source` in addition to a children array.\n\t * @property {object} ext Hash of all active plugin instances.\n\t * @property {FancytreeNode} focusNode Currently focused node or null.\n\t * @property {FancytreeNode} lastSelectedNode Used to implement selectMode 1 (single select)\n\t * @property {string} nodeContainerAttrName Property name of FancytreeNode that contains the outer element of single nodes.\n\t * Typically \"li\", but \"tr\" for table extension.\n\t * @property {FancytreeOptions} options Current options, i.e. default options + options passed to constructor.\n\t * @property {FancytreeNode} rootNode Invisible system root node.\n\t * @property {string} statusClassPropName Property name of FancytreeNode that contains the element which will receive the status classes.\n\t * Typically \"span\", but \"tr\" for table extension.\n\t * @property {object} types Map for shared type specific meta data, used with node.type attribute. @since 2.27\n\t * @property {object} viewport See ext-vieport. @since v2.31\n\t * @property {object} widget Base widget instance.\n\t */\n\tfunction Fancytree(widget) {\n\t\tthis.widget = widget;\n\t\tthis.$div = widget.element;\n\t\tthis.options = widget.options;\n\t\tif (this.options) {\n\t\t\tif (this.options.lazyload !== undefined) {\n\t\t\t\t$.error(\n\t\t\t\t\t\"The 'lazyload' event is deprecated since 2014-02-25. Use 'lazyLoad' (with uppercase L) instead.\"\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (this.options.loaderror !== undefined) {\n\t\t\t\t$.error(\n\t\t\t\t\t\"The 'loaderror' event was renamed since 2014-07-03. Use 'loadError' (with uppercase E) instead.\"\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (this.options.fx !== undefined) {\n\t\t\t\t$.error(\n\t\t\t\t\t\"The 'fx' option was replaced by 'toggleEffect' since 2014-11-30.\"\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (this.options.removeNode !== undefined) {\n\t\t\t\t$.error(\n\t\t\t\t\t\"The 'removeNode' event was replaced by 'modifyChild' since 2.20 (2016-09-10).\"\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tthis.ext = {}; // Active extension instances\n\t\tthis.types = {};\n\t\tthis.columns = {};\n\t\t// allow to init tree.data.foo from <div data-foo=''>\n\t\tthis.data = _getElementDataAsDict(this.$div);\n\t\t// TODO: use widget.uuid instead?\n\t\tthis._id = \"\" + (this.options.treeId || $.ui.fancytree._nextId++);\n\t\t// TODO: use widget.eventNamespace instead?\n\t\tthis._ns = \".fancytree-\" + this._id; // append for namespaced events\n\t\tthis.activeNode = null;\n\t\tthis.focusNode = null;\n\t\tthis._hasFocus = null;\n\t\tthis._tempCache = {};\n\t\tthis._lastMousedownNode = null;\n\t\tthis._enableUpdate = true;\n\t\tthis.lastSelectedNode = null;\n\t\tthis.systemFocusElement = null;\n\t\tthis.lastQuicksearchTerm = \"\";\n\t\tthis.lastQuicksearchTime = 0;\n\t\tthis.viewport = null; // ext-grid\n\n\t\tthis.statusClassPropName = \"span\";\n\t\tthis.ariaPropName = \"li\";\n\t\tthis.nodeContainerAttrName = \"li\";\n\n\t\t// Remove previous markup if any\n\t\tthis.$div.find(\">ul.fancytree-container\").remove();\n\n\t\t// Create a node without parent.\n\t\tvar fakeParent = { tree: this },\n\t\t\t$ul;\n\t\tthis.rootNode = new FancytreeNode(fakeParent, {\n\t\t\ttitle: \"root\",\n\t\t\tkey: \"root_\" + this._id,\n\t\t\tchildren: null,\n\t\t\texpanded: true,\n\t\t});\n\t\tthis.rootNode.parent = null;\n\n\t\t// Create root markup\n\t\t$ul = $(\"<ul>\", {\n\t\t\tid: \"ft-id-\" + this._id,\n\t\t\tclass: \"ui-fancytree fancytree-container fancytree-plain\",\n\t\t}).appendTo(this.$div);\n\t\tthis.$container = $ul;\n\t\tthis.rootNode.ul = $ul[0];\n\n\t\tif (this.options.debugLevel == null) {\n\t\t\tthis.options.debugLevel = FT.debugLevel;\n\t\t}\n\t\t// // Add container to the TAB chain\n\t\t// // See http://www.w3.org/TR/wai-aria-practices/#focus_activedescendant\n\t\t// // #577: Allow to set tabindex to \"0\", \"-1\" and \"\"\n\t\t// this.$container.attr(\"tabindex\", this.options.tabindex);\n\n\t\t// if( this.options.rtl ) {\n\t\t// \tthis.$container.attr(\"DIR\", \"RTL\").addClass(\"fancytree-rtl\");\n\t\t// // }else{\n\t\t// //\tthis.$container.attr(\"DIR\", null).removeClass(\"fancytree-rtl\");\n\t\t// }\n\t\t// if(this.options.aria){\n\t\t// \tthis.$container.attr(\"role\", \"tree\");\n\t\t// \tif( this.options.selectMode !== 1 ) {\n\t\t// \t\tthis.$container.attr(\"aria-multiselectable\", true);\n\t\t// \t}\n\t\t// }\n\t}\n\n\tFancytree.prototype = /** @lends Fancytree# */ {\n\t\t/* Return a context object that can be re-used for _callHook().\n\t\t * @param {Fancytree | FancytreeNode | EventData} obj\n\t\t * @param {Event} originalEvent\n\t\t * @param {Object} extra\n\t\t * @returns {EventData}\n\t\t */\n\t\t_makeHookContext: function(obj, originalEvent, extra) {\n\t\t\tvar ctx, tree;\n\t\t\tif (obj.node !== undefined) {\n\t\t\t\t// obj is already a context object\n\t\t\t\tif (originalEvent && obj.originalEvent !== originalEvent) {\n\t\t\t\t\t$.error(\"invalid args\");\n\t\t\t\t}\n\t\t\t\tctx = obj;\n\t\t\t} else if (obj.tree) {\n\t\t\t\t// obj is a FancytreeNode\n\t\t\t\ttree = obj.tree;\n\t\t\t\tctx = {\n\t\t\t\t\tnode: obj,\n\t\t\t\t\ttree: tree,\n\t\t\t\t\twidget: tree.widget,\n\t\t\t\t\toptions: tree.widget.options,\n\t\t\t\t\toriginalEvent: originalEvent,\n\t\t\t\t\ttypeInfo: tree.types[obj.type] || {},\n\t\t\t\t};\n\t\t\t} else if (obj.widget) {\n\t\t\t\t// obj is a Fancytree\n\t\t\t\tctx = {\n\t\t\t\t\tnode: null,\n\t\t\t\t\ttree: obj,\n\t\t\t\t\twidget: obj.widget,\n\t\t\t\t\toptions: obj.widget.options,\n\t\t\t\t\toriginalEvent: originalEvent,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\t$.error(\"invalid args\");\n\t\t\t}\n\t\t\tif (extra) {\n\t\t\t\t$.extend(ctx, extra);\n\t\t\t}\n\t\t\treturn ctx;\n\t\t},\n\t\t/* Trigger a hook function: funcName(ctx, [...]).\n\t\t *\n\t\t * @param {string} funcName\n\t\t * @param {Fancytree|FancytreeNode|EventData} contextObject\n\t\t * @param {any} [_extraArgs] optional additional arguments\n\t\t * @returns {any}\n\t\t */\n\t\t_callHook: function(funcName, contextObject, _extraArgs) {\n\t\t\tvar ctx = this._makeHookContext(contextObject),\n\t\t\t\tfn = this[funcName],\n\t\t\t\targs = Array.prototype.slice.call(arguments, 2);\n\t\t\tif (!$.isFunction(fn)) {\n\t\t\t\t$.error(\"_callHook('\" + funcName + \"') is not a function\");\n\t\t\t}\n\t\t\targs.unshift(ctx);\n\t\t\t// this.debug(\"_hook\", funcName, ctx.node && ctx.node.toString() || ctx.tree.toString(), args);\n\t\t\treturn fn.apply(this, args);\n\t\t},\n\t\t_setExpiringValue: function(key, value, ms) {\n\t\t\tthis._tempCache[key] = {\n\t\t\t\tvalue: value,\n\t\t\t\texpire: Date.now() + (+ms || 50),\n\t\t\t};\n\t\t},\n\t\t_getExpiringValue: function(key) {\n\t\t\tvar entry = this._tempCache[key];\n\t\t\tif (entry && entry.expire > Date.now()) {\n\t\t\t\treturn entry.value;\n\t\t\t}\n\t\t\tdelete this._tempCache[key];\n\t\t\treturn null;\n\t\t},\n\t\t/* Check if current extensions dependencies are met and throw an error if not.\n\t\t *\n\t\t * This method may be called inside the `treeInit` hook for custom extensions.\n\t\t *\n\t\t * @param {string} extension name of the required extension\n\t\t * @param {boolean} [required=true] pass `false` if the extension is optional, but we want to check for order if it is present\n\t\t * @param {boolean} [before] `true` if `name` must be included before this, `false` otherwise (use `null` if order doesn't matter)\n\t\t * @param {string} [message] optional error message (defaults to a descriptve error message)\n\t\t */\n\t\t_requireExtension: function(name, required, before, message) {\n\t\t\tif (before != null) {\n\t\t\t\tbefore = !!before;\n\t\t\t}\n\t\t\tvar thisName = this._local.name,\n\t\t\t\textList = this.options.extensions,\n\t\t\t\tisBefore =\n\t\t\t\t\t$.inArray(name, extList) < $.inArray(thisName, extList),\n\t\t\t\tisMissing = required && this.ext[name] == null,\n\t\t\t\tbadOrder = !isMissing && before != null && before !== isBefore;\n\n\t\t\t_assert(\n\t\t\t\tthisName && thisName !== name,\n\t\t\t\t\"invalid or same name '\" + thisName + \"' (require yourself?)\"\n\t\t\t);\n\n\t\t\tif (isMissing || badOrder) {\n\t\t\t\tif (!message) {\n\t\t\t\t\tif (isMissing || required) {\n\t\t\t\t\t\tmessage =\n\t\t\t\t\t\t\t\"'\" +\n\t\t\t\t\t\t\tthisName +\n\t\t\t\t\t\t\t\"' extension requires '\" +\n\t\t\t\t\t\t\tname +\n\t\t\t\t\t\t\t\"'\";\n\t\t\t\t\t\tif (badOrder) {\n\t\t\t\t\t\t\tmessage +=\n\t\t\t\t\t\t\t\t\" to be registered \" +\n\t\t\t\t\t\t\t\t(before ? \"before\" : \"after\") +\n\t\t\t\t\t\t\t\t\" itself\";\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmessage =\n\t\t\t\t\t\t\t\"If used together, `\" +\n\t\t\t\t\t\t\tname +\n\t\t\t\t\t\t\t\"` must be registered \" +\n\t\t\t\t\t\t\t(before ? \"before\" : \"after\") +\n\t\t\t\t\t\t\t\" `\" +\n\t\t\t\t\t\t\tthisName +\n\t\t\t\t\t\t\t\"`\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$.error(message);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\t/** Activate node with a given key and fire focus and activate events.\n\t\t *\n\t\t * A previously activated node will be deactivated.\n\t\t * If activeVisible option is set, all parents will be expanded as necessary.\n\t\t * Pass key = false, to deactivate the current node only.\n\t\t * @param {string} key\n\t\t * @param {object} [opts] additional options. Defaults to {noEvents: false, noFocus: false}\n\t\t * @returns {FancytreeNode} activated node (null, if not found)\n\t\t */\n\t\tactivateKey: function(key, opts) {\n\t\t\tvar node = this.getNodeByKey(key);\n\t\t\tif (node) {\n\t\t\t\tnode.setActive(true, opts);\n\t\t\t} else if (this.activeNode) {\n\t\t\t\tthis.activeNode.setActive(false, opts);\n\t\t\t}\n\t\t\treturn node;\n\t\t},\n\t\t/** (experimental) Add child status nodes that indicate 'More...', ....\n\t\t * @param {boolean|object} node optional node definition. Pass `false` to remove all paging nodes.\n\t\t * @param {string} [mode='append'] 'child'|firstChild'\n\t\t * @since 2.15\n\t\t */\n\t\taddPagingNode: function(node, mode) {\n\t\t\treturn this.rootNode.addPagingNode(node, mode);\n\t\t},\n\t\t/**\n\t\t * (experimental) Apply a modification (or navigation) operation.\n\t\t *\n\t\t * Valid commands:\n\t\t * - 'moveUp', 'moveDown'\n\t\t * - 'indent', 'outdent'\n\t\t * - 'remove'\n\t\t * - 'edit', 'addChild', 'addSibling': (reqires ext-edit extension)\n\t\t * - 'cut', 'copy', 'paste': (use an internal singleton 'clipboard')\n\t\t * - 'down', 'first', 'last', 'left', 'parent', 'right', 'up': navigate\n\t\t *\n\t\t * @param {string} cmd\n\t\t * @param {FancytreeNode} [node=active_node]\n\t\t * @param {object} [opts] Currently unused\n\t\t *\n\t\t * @since 2.32\n\t\t */\n\t\tapplyCommand: function(cmd, node, opts_) {\n\t\t\tvar // clipboard,\n\t\t\t\trefNode;\n\t\t\t// opts = $.extend(\n\t\t\t// \t{ setActive: true, clipboard: CLIPBOARD },\n\t\t\t// \topts_\n\t\t\t// );\n\n\t\t\tnode = node || this.getActiveNode();\n\t\t\t// clipboard = opts.clipboard;\n\n\t\t\tswitch (cmd) {\n\t\t\t\t// Sorting and indentation:\n\t\t\t\tcase \"moveUp\":\n\t\t\t\t\trefNode = node.getPrevSibling();\n\t\t\t\t\tif (refNode) {\n\t\t\t\t\t\tnode.moveTo(refNode, \"before\");\n\t\t\t\t\t\tnode.setActive();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"moveDown\":\n\t\t\t\t\trefNode = node.getNextSibling();\n\t\t\t\t\tif (refNode) {\n\t\t\t\t\t\tnode.moveTo(refNode, \"after\");\n\t\t\t\t\t\tnode.setActive();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"indent\":\n\t\t\t\t\trefNode = node.getPrevSibling();\n\t\t\t\t\tif (refNode) {\n\t\t\t\t\t\tnode.moveTo(refNode, \"child\");\n\t\t\t\t\t\trefNode.setExpanded();\n\t\t\t\t\t\tnode.setActive();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"outdent\":\n\t\t\t\t\tif (!node.isTopLevel()) {\n\t\t\t\t\t\tnode.moveTo(node.getParent(), \"after\");\n\t\t\t\t\t\tnode.setActive();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t// Remove:\n\t\t\t\tcase \"remove\":\n\t\t\t\t\trefNode = node.getPrevSibling() || node.getParent();\n\t\t\t\t\tnode.remove();\n\t\t\t\t\tif (refNode) {\n\t\t\t\t\t\trefNode.setActive();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t// Add, edit (requires ext-edit):\n\t\t\t\tcase \"addChild\":\n\t\t\t\t\tnode.editCreateNode(\"child\", \"\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"addSibling\":\n\t\t\t\t\tnode.editCreateNode(\"after\", \"\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"rename\":\n\t\t\t\t\tnode.editStart();\n\t\t\t\t\tbreak;\n\t\t\t\t// Simple clipboard simulation:\n\t\t\t\t// case \"cut\":\n\t\t\t\t// \tclipboard = { mode: cmd, data: node };\n\t\t\t\t// \tbreak;\n\t\t\t\t// case \"copy\":\n\t\t\t\t// \tclipboard = {\n\t\t\t\t// \t\tmode: cmd,\n\t\t\t\t// \t\tdata: node.toDict(function(n) {\n\t\t\t\t// \t\t\tdelete n.key;\n\t\t\t\t// \t\t}),\n\t\t\t\t// \t};\n\t\t\t\t// \tbreak;\n\t\t\t\t// case \"clear\":\n\t\t\t\t// \tclipboard = null;\n\t\t\t\t// \tbreak;\n\t\t\t\t// case \"paste\":\n\t\t\t\t// \tif (clipboard.mode === \"cut\") {\n\t\t\t\t// \t\t// refNode = node.getPrevSibling();\n\t\t\t\t// \t\tclipboard.data.moveTo(node, \"child\");\n\t\t\t\t// \t\tclipboard.data.setActive();\n\t\t\t\t// \t} else if (clipboard.mode === \"copy\") {\n\t\t\t\t// \t\tnode.addChildren(clipboard.data).setActive();\n\t\t\t\t// \t}\n\t\t\t\t// \tbreak;\n\t\t\t\t// Navigation commands:\n\t\t\t\tcase \"down\":\n\t\t\t\tcase \"first\":\n\t\t\t\tcase \"last\":\n\t\t\t\tcase \"left\":\n\t\t\t\tcase \"parent\":\n\t\t\t\tcase \"right\":\n\t\t\t\tcase \"up\":\n\t\t\t\t\treturn node.navigate(cmd);\n\t\t\t\tdefault:\n\t\t\t\t\t$.error(\"Unhandled command: '\" + cmd + \"'\");\n\t\t\t}\n\t\t},\n\t\t/** (experimental) Modify existing data model.\n\t\t *\n\t\t * @param {Array} patchList array of [key, NodePatch] arrays\n\t\t * @returns {$.Promise} resolved, when all patches have been applied\n\t\t * @see TreePatch\n\t\t */\n\t\tapplyPatch: function(patchList) {\n\t\t\tvar dfd,\n\t\t\t\ti,\n\t\t\t\tp2,\n\t\t\t\tkey,\n\t\t\t\tpatch,\n\t\t\t\tnode,\n\t\t\t\tpatchCount = patchList.length,\n\t\t\t\tdeferredList = [];\n\n\t\t\tfor (i = 0; i < patchCount; i++) {\n\t\t\t\tp2 = patchList[i];\n\t\t\t\t_assert(\n\t\t\t\t\tp2.length === 2,\n\t\t\t\t\t\"patchList must be an array of length-2-arrays\"\n\t\t\t\t);\n\t\t\t\tkey = p2[0];\n\t\t\t\tpatch = p2[1];\n\t\t\t\tnode = key === null ? this.rootNode : this.getNodeByKey(key);\n\t\t\t\tif (node) {\n\t\t\t\t\tdfd = new $.Deferred();\n\t\t\t\t\tdeferredList.push(dfd);\n\t\t\t\t\tnode.applyPatch(patch).always(_makeResolveFunc(dfd, node));\n\t\t\t\t} else {\n\t\t\t\t\tthis.warn(\"could not find node with key '\" + key + \"'\");\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Return a promise that is resolved, when ALL patches were applied\n\t\t\treturn $.when.apply($, deferredList).promise();\n\t\t},\n\t\t/* TODO: implement in dnd extension\n\t\tcancelDrag: function() {\n\t\t\t\tvar dd = $.ui.ddmanager.current;\n\t\t\t\tif(dd){\n\t\t\t\t\tdd.cancel();\n\t\t\t\t}\n\t\t\t},\n\t\t*/\n\t\t/** Remove all nodes.\n\t\t * @since 2.14\n\t\t */\n\t\tclear: function(source) {\n\t\t\tthis._callHook(\"treeClear\", this);\n\t\t},\n\t\t/** Return the number of nodes.\n\t\t * @returns {integer}\n\t\t */\n\t\tcount: function() {\n\t\t\treturn this.rootNode.countChildren();\n\t\t},\n\t\t/** Write to browser console if debugLevel >= 4 (prepending tree name)\n\t\t *\n\t\t * @param {*} msg string or object or array of such\n\t\t */\n\t\tdebug: function(msg) {\n\t\t\tif (this.options.debugLevel >= 4) {\n\t\t\t\tArray.prototype.unshift.call(arguments, this.toString());\n\t\t\t\tconsoleApply(\"log\", arguments);\n\t\t\t}\n\t\t},\n\t\t/** Enable (or disable) the tree control.\n\t\t *\n\t\t * @param {boolean} [flag=true] pass false to disable\n\t\t * @since 2.30\n\t\t */\n\t\tenable: function(flag) {\n\t\t\tif (flag === false) {\n\t\t\t\tthis.widget.disable();\n\t\t\t} else {\n\t\t\t\tthis.widget.enable();\n\t\t\t}\n\t\t},\n\t\t/** Temporarily suppress rendering to improve performance on bulk-updates.\n\t\t *\n\t\t * @param {boolean} flag\n\t\t * @returns {boolean} previous status\n\t\t * @since 2.19\n\t\t */\n\t\tenableUpdate: function(flag) {\n\t\t\tflag = flag !== false;\n\t\t\tif (!!this._enableUpdate === !!flag) {\n\t\t\t\treturn flag;\n\t\t\t}\n\t\t\tthis._enableUpdate = flag;\n\t\t\tif (flag) {\n\t\t\t\tthis.debug(\"enableUpdate(true): redraw \"); //, this._dirtyRoots);\n\t\t\t\tthis._callHook(\"treeStructureChanged\", this, \"enableUpdate\");\n\t\t\t\tthis.render();\n\t\t\t} else {\n\t\t\t\t// \tthis._dirtyRoots = null;\n\t\t\t\tthis.debug(\"enableUpdate(false)...\");\n\t\t\t}\n\t\t\treturn !flag; // return previous value\n\t\t},\n\t\t/** Write error to browser console if debugLevel >= 1 (prepending tree info)\n\t\t *\n\t\t * @param {*} msg string or object or array of such\n\t\t */\n\t\terror: function(msg) {\n\t\t\tif (this.options.debugLevel >= 1) {\n\t\t\t\tArray.prototype.unshift.call(arguments, this.toString());\n\t\t\t\tconsoleApply(\"error\", arguments);\n\t\t\t}\n\t\t},\n\t\t/** Expand (or collapse) all parent nodes.\n\t\t *\n\t\t * This convenience method uses `tree.visit()` and `tree.setExpanded()`\n\t\t * internally.\n\t\t *\n\t\t * @param {boolean} [flag=true] pass false to collapse\n\t\t * @param {object} [opts] passed to setExpanded()\n\t\t * @since 2.30\n\t\t */\n\t\texpandAll: function(flag, opts) {\n\t\t\tvar prev = this.enableUpdate(false);\n\n\t\t\tflag = flag !== false;\n\t\t\tthis.visit(function(node) {\n\t\t\t\tif (\n\t\t\t\t\tnode.hasChildren() !== false &&\n\t\t\t\t\tnode.isExpanded() !== flag\n\t\t\t\t) {\n\t\t\t\t\tnode.setExpanded(flag, opts);\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.enableUpdate(prev);\n\t\t},\n\t\t/**Find all nodes that matches condition.\n\t\t *\n\t\t * @param {string | function(node)} match title string to search for, or a\n\t\t * callback function that returns `true` if a node is matched.\n\t\t * @returns {FancytreeNode[]} array of nodes (may be empty)\n\t\t * @see FancytreeNode#findAll\n\t\t * @since 2.12\n\t\t */\n\t\tfindAll: function(match) {\n\t\t\treturn this.rootNode.findAll(match);\n\t\t},\n\t\t/**Find first node that matches condition.\n\t\t *\n\t\t * @param {string | function(node)} match title string to search for, or a\n\t\t * callback function that returns `true` if a node is matched.\n\t\t * @returns {FancytreeNode} matching node or null\n\t\t * @see FancytreeNode#findFirst\n\t\t * @since 2.12\n\t\t */\n\t\tfindFirst: function(match) {\n\t\t\treturn this.rootNode.findFirst(match);\n\t\t},\n\t\t/** Find the next visible node that starts with `match`, starting at `startNode`\n\t\t * and wrap-around at the end.\n\t\t *\n\t\t * @param {string|function} match\n\t\t * @param {FancytreeNode} [startNode] defaults to first node\n\t\t * @returns {FancytreeNode} matching node or null\n\t\t */\n\t\tfindNextNode: function(match, startNode) {\n\t\t\t//, visibleOnly) {\n\t\t\tvar res = null,\n\t\t\t\tfirstNode = this.getFirstChild();\n\n\t\t\tmatch =\n\t\t\t\ttypeof match === \"string\"\n\t\t\t\t\t? _makeNodeTitleStartMatcher(match)\n\t\t\t\t\t: match;\n\t\t\tstartNode = startNode || firstNode;\n\n\t\t\tfunction _checkNode(n) {\n\t\t\t\t// console.log(\"_check \" + n)\n\t\t\t\tif (match(n)) {\n\t\t\t\t\tres = n;\n\t\t\t\t}\n\t\t\t\tif (res || n === startNode) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.visitRows(_checkNode, {\n\t\t\t\tstart: startNode,\n\t\t\t\tincludeSelf: false,\n\t\t\t});\n\t\t\t// Wrap around search\n\t\t\tif (!res && startNode !== firstNode) {\n\t\t\t\tthis.visitRows(_checkNode, {\n\t\t\t\t\tstart: firstNode,\n\t\t\t\t\tincludeSelf: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t\t/** Find a node relative to another node.\n\t\t *\n\t\t * @param {FancytreeNode} node\n\t\t * @param {string|number} where 'down', 'first', 'last', 'left', 'parent', 'right', or 'up'.\n\t\t * (Alternatively the keyCode that would normally trigger this move,\n\t\t * e.g. `$.ui.keyCode.LEFT` = 'left'.\n\t\t * @param {boolean} [includeHidden=false] Not yet implemented\n\t\t * @returns {FancytreeNode|null}\n\t\t * @since v2.31\n\t\t */\n\t\tfindRelatedNode: function(node, where, includeHidden) {\n\t\t\tvar res = null,\n\t\t\t\tKC = $.ui.keyCode;\n\n\t\t\tswitch (where) {\n\t\t\t\tcase \"parent\":\n\t\t\t\tcase KC.BACKSPACE:\n\t\t\t\t\tif (node.parent && node.parent.parent) {\n\t\t\t\t\t\tres = node.parent;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"first\":\n\t\t\t\tcase KC.HOME:\n\t\t\t\t\t// First visible node\n\t\t\t\t\tthis.visit(function(n) {\n\t\t\t\t\t\tif (n.isVisible()) {\n\t\t\t\t\t\t\tres = n;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"last\":\n\t\t\t\tcase KC.END:\n\t\t\t\t\tthis.visit(function(n) {\n\t\t\t\t\t\t// last visible node\n\t\t\t\t\t\tif (n.isVisible()) {\n\t\t\t\t\t\t\tres = n;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"left\":\n\t\t\t\tcase KC.LEFT:\n\t\t\t\t\tif (node.expanded) {\n\t\t\t\t\t\tnode.setExpanded(false);\n\t\t\t\t\t} else if (node.parent && node.parent.parent) {\n\t\t\t\t\t\tres = node.parent;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"right\":\n\t\t\t\tcase KC.RIGHT:\n\t\t\t\t\tif (!node.expanded && (node.children || node.lazy)) {\n\t\t\t\t\t\tnode.setExpanded();\n\t\t\t\t\t\tres = node;\n\t\t\t\t\t} else if (node.children && node.children.length) {\n\t\t\t\t\t\tres = node.children[0];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"up\":\n\t\t\t\tcase KC.UP:\n\t\t\t\t\tthis.visitRows(\n\t\t\t\t\t\tfunction(n) {\n\t\t\t\t\t\t\tres = n;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ start: node, reverse: true, includeSelf: false }\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"down\":\n\t\t\t\tcase KC.DOWN:\n\t\t\t\t\tthis.visitRows(\n\t\t\t\t\t\tfunction(n) {\n\t\t\t\t\t\t\tres = n;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ start: node, includeSelf: false }\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthis.tree.warn(\"Unknown relation '\" + where + \"'.\");\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t\t// TODO: fromDict\n\t\t/**\n\t\t * Generate INPUT elements that can be submitted with html forms.\n\t\t *\n\t\t * In selectMode 3 only the topmost selected nodes are considered, unless\n\t\t * `opts.stopOnParents: false` is passed.\n\t\t *\n\t\t * @example\n\t\t * // Generate input elements for active and selected nodes\n\t\t * tree.generateFormElements();\n\t\t * // Generate input elements selected nodes, using a custom `name` attribute\n\t\t * tree.generateFormElements(\"cust_sel\", false);\n\t\t * // Generate input elements using a custom filter\n\t\t * tree.generateFormElements(true, true, { filter: function(node) {\n\t\t * return node.isSelected() && node.data.yes;\n\t\t * }});\n\t\t *\n\t\t * @param {boolean | string} [selected=true] Pass false to disable, pass a string to override the field name (default: 'ft_ID[]')\n\t\t * @param {boolean | string} [active=true] Pass false to disable, pass a string to override the field name (default: 'ft_ID_active')\n\t\t * @param {object} [opts] default { filter: null, stopOnParents: true }\n\t\t */\n\t\tgenerateFormElements: function(selected, active, opts) {\n\t\t\topts = opts || {};\n\n\t\t\tvar nodeList,\n\t\t\t\tselectedName =\n\t\t\t\t\ttypeof selected === \"string\"\n\t\t\t\t\t\t? selected\n\t\t\t\t\t\t: \"ft_\" + this._id + \"[]\",\n\t\t\t\tactiveName =\n\t\t\t\t\ttypeof active === \"string\"\n\t\t\t\t\t\t? active\n\t\t\t\t\t\t: \"ft_\" + this._id + \"_active\",\n\t\t\t\tid = \"fancytree_result_\" + this._id,\n\t\t\t\t$result = $(\"#\" + id),\n\t\t\t\tstopOnParents =\n\t\t\t\t\tthis.options.selectMode === 3 &&\n\t\t\t\t\topts.stopOnParents !== false;\n\n\t\t\tif ($result.length) {\n\t\t\t\t$result.empty();\n\t\t\t} else {\n\t\t\t\t$result = $(\"<div>\", {\n\t\t\t\t\tid: id,\n\t\t\t\t})\n\t\t\t\t\t.hide()\n\t\t\t\t\t.insertAfter(this.$container);\n\t\t\t}\n\t\t\tif (active !== false && this.activeNode) {\n\t\t\t\t$result.append(\n\t\t\t\t\t$(\"<input>\", {\n\t\t\t\t\t\ttype: \"radio\",\n\t\t\t\t\t\tname: activeName,\n\t\t\t\t\t\tvalue: this.activeNode.key,\n\t\t\t\t\t\tchecked: true,\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t\tfunction _appender(node) {\n\t\t\t\t$result.append(\n\t\t\t\t\t$(\"<input>\", {\n\t\t\t\t\t\ttype: \"checkbox\",\n\t\t\t\t\t\tname: selectedName,\n\t\t\t\t\t\tvalue: node.key,\n\t\t\t\t\t\tchecked: true,\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (opts.filter) {\n\t\t\t\tthis.visit(function(node) {\n\t\t\t\t\tvar res = opts.filter(node);\n\t\t\t\t\tif (res === \"skip\") {\n\t\t\t\t\t\treturn res;\n\t\t\t\t\t}\n\t\t\t\t\tif (res !== false) {\n\t\t\t\t\t\t_appender(node);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (selected !== false) {\n\t\t\t\tnodeList = this.getSelectedNodes(stopOnParents);\n\t\t\t\t$.each(nodeList, function(idx, node) {\n\t\t\t\t\t_appender(node);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Return the currently active node or null.\n\t\t * @returns {FancytreeNode}\n\t\t */\n\t\tgetActiveNode: function() {\n\t\t\treturn this.activeNode;\n\t\t},\n\t\t/** Return the first top level node if any (not the invisible root node).\n\t\t * @returns {FancytreeNode | null}\n\t\t */\n\t\tgetFirstChild: function() {\n\t\t\treturn this.rootNode.getFirstChild();\n\t\t},\n\t\t/**\n\t\t * Return node that has keyboard focus or null.\n\t\t * @returns {FancytreeNode}\n\t\t */\n\t\tgetFocusNode: function() {\n\t\t\treturn this.focusNode;\n\t\t},\n\t\t/**\n\t\t * Return current option value.\n\t\t * (Note: this is the preferred variant of `$().fancytree(\"option\", \"KEY\")`)\n\t\t *\n\t\t * @param {string} name option name (may contain '.')\n\t\t * @returns {any}\n\t\t */\n\t\tgetOption: function(optionName) {\n\t\t\treturn this.widget.option(optionName);\n\t\t},\n\t\t/**\n\t\t * Return node with a given key or null if not found.\n\t\t *\n\t\t * @param {string} key\n\t\t * @param {FancytreeNode} [searchRoot] only search below this node\n\t\t * @returns {FancytreeNode | null}\n\t\t */\n\t\tgetNodeByKey: function(key, searchRoot) {\n\t\t\t// Search the DOM by element ID (assuming this is faster than traversing all nodes).\n\t\t\tvar el, match;\n\t\t\t// TODO: use tree.keyMap if available\n\t\t\t// TODO: check opts.generateIds === true\n\t\t\tif (!searchRoot) {\n\t\t\t\tel = document.getElementById(this.options.idPrefix + key);\n\t\t\t\tif (el) {\n\t\t\t\t\treturn el.ftnode ? el.ftnode : null;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Not found in the DOM, but still may be in an unrendered part of tree\n\t\t\tsearchRoot = searchRoot || this.rootNode;\n\t\t\tmatch = null;\n\t\t\tsearchRoot.visit(function(node) {\n\t\t\t\tif (node.key === key) {\n\t\t\t\t\tmatch = node;\n\t\t\t\t\treturn false; // Stop iteration\n\t\t\t\t}\n\t\t\t}, true);\n\t\t\treturn match;\n\t\t},\n\t\t/** Return the invisible system root node.\n\t\t * @returns {FancytreeNode}\n\t\t */\n\t\tgetRootNode: function() {\n\t\t\treturn this.rootNode;\n\t\t},\n\t\t/**\n\t\t * Return an array of selected nodes.\n\t\t * @param {boolean} [stopOnParents=false] only return the topmost selected\n\t\t * node (useful with selectMode 3)\n\t\t * @returns {FancytreeNode[]}\n\t\t */\n\t\tgetSelectedNodes: function(stopOnParents) {\n\t\t\treturn this.rootNode.getSelectedNodes(stopOnParents);\n\t\t},\n\t\t/** Return true if the tree control has keyboard focus\n\t\t * @returns {boolean}\n\t\t */\n\t\thasFocus: function() {\n\t\t\treturn !!this._hasFocus;\n\t\t},\n\t\t/** Write to browser console if debugLevel >= 3 (prepending tree name)\n\t\t * @param {*} msg string or object or array of such\n\t\t */\n\t\tinfo: function(msg) {\n\t\t\tif (this.options.debugLevel >= 3) {\n\t\t\t\tArray.prototype.unshift.call(arguments, this.toString());\n\t\t\t\tconsoleApply(\"info\", arguments);\n\t\t\t}\n\t\t},\n\t\t/** Return true if any node is currently beeing loaded, i.e. a Ajax request is pending.\n\t\t * @returns {boolean}\n\t\t * @since 2.32\n\t\t */\n\t\tisLoading: function() {\n\t\t\tvar res = false;\n\n\t\t\tthis.rootNode.visit(function(n) {\n\t\t\t\t// also visit rootNode\n\t\t\t\tif (n._isLoading || n._requestId) {\n\t\t\t\t\tres = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}, true);\n\t\t\treturn res;\n\t\t},\n\t\t/*\n\t\tTODO: isInitializing: function() {\n\t\t\treturn ( this.phase==\"init\" || this.phase==\"postInit\" );\n\t\t},\n\t\tTODO: isReloading: function() {\n\t\t\treturn ( this.phase==\"init\" || this.phase==\"postInit\" ) && this.options.persist && this.persistence.cookiesFound;\n\t\t},\n\t\tTODO: isUserEvent: function() {\n\t\t\treturn ( this.phase==\"userEvent\" );\n\t\t},\n\t\t*/\n\n\t\t/**\n\t\t * Make sure that a node with a given ID is loaded, by traversing - and\n\t\t * loading - its parents. This method is meant for lazy hierarchies.\n\t\t * A callback is executed for every node as we go.\n\t\t * @example\n\t\t * // Resolve using node.key:\n\t\t * tree.loadKeyPath(\"/_3/_23/_26/_27\", function(node, status){\n\t\t * if(status === \"loaded\") {\n\t\t * console.log(\"loaded intermediate node \" + node);\n\t\t * }else if(status === \"ok\") {\n\t\t * node.activate();\n\t\t * }\n\t\t * });\n\t\t * // Use deferred promise:\n\t\t * tree.loadKeyPath(\"/_3/_23/_26/_27\").progress(function(data){\n\t\t * if(data.status === \"loaded\") {\n\t\t * console.log(\"loaded intermediate node \" + data.node);\n\t\t * }else if(data.status === \"ok\") {\n\t\t * node.activate();\n\t\t * }\n\t\t * }).done(function(){\n\t\t * ...\n\t\t * });\n\t\t * // Custom path segment resolver:\n\t\t * tree.loadKeyPath(\"/321/431/21/2\", {\n\t\t * matchKey: function(node, key){\n\t\t * return node.data.refKey === key;\n\t\t * },\n\t\t * callback: function(node, status){\n\t\t * if(status === \"loaded\") {\n\t\t * console.log(\"loaded intermediate node \" + node);\n\t\t * }else if(status === \"ok\") {\n\t\t * node.activate();\n\t\t * }\n\t\t * }\n\t\t * });\n\t\t * @param {string | string[]} keyPathList one or more key paths (e.g. '/3/2_1/7')\n\t\t * @param {function | object} optsOrCallback callback(node, status) is called for every visited node ('loading', 'loaded', 'ok', 'error').\n\t\t * Pass an object to define custom key matchers for the path segments: {callback: function, matchKey: function}.\n\t\t * @returns {$.Promise}\n\t\t */\n\t\tloadKeyPath: function(keyPathList, optsOrCallback) {\n\t\t\tvar callback,\n\t\t\t\ti,\n\t\t\t\tpath,\n\t\t\t\tself = this,\n\t\t\t\tdfd = new $.Deferred(),\n\t\t\t\tparent = this.getRootNode(),\n\t\t\t\tsep = this.options.keyPathSeparator,\n\t\t\t\tpathSegList = [],\n\t\t\t\topts = $.extend({}, optsOrCallback);\n\n\t\t\t// Prepare options\n\t\t\tif (typeof optsOrCallback === \"function\") {\n\t\t\t\tcallback = optsOrCallback;\n\t\t\t} else if (optsOrCallback && optsOrCallback.callback) {\n\t\t\t\tcallback = optsOrCallback.callback;\n\t\t\t}\n\t\t\topts.callback = function(ctx, node, status) {\n\t\t\t\tif (callback) {\n\t\t\t\t\tcallback.call(ctx, node, status);\n\t\t\t\t}\n\t\t\t\tdfd.notifyWith(ctx, [{ node: node, status: status }]);\n\t\t\t};\n\t\t\tif (opts.matchKey == null) {\n\t\t\t\topts.matchKey = function(node, key) {\n\t\t\t\t\treturn node.key === key;\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Convert array of path strings to array of segment arrays\n\t\t\tif (!$.isArray(keyPathList)) {\n\t\t\t\tkeyPathList = [keyPathList];\n\t\t\t}\n\t\t\tfor (i = 0; i < keyPathList.length; i++) {\n\t\t\t\tpath = keyPathList[i];\n\t\t\t\t// strip leading slash\n\t\t\t\tif (path.charAt(0) === sep) {\n\t\t\t\t\tpath = path.substr(1);\n\t\t\t\t}\n\t\t\t\t// segListMap[path] = { parent: parent, segList: path.split(sep) };\n\t\t\t\tpathSegList.push(path.split(sep));\n\t\t\t\t// targetList.push({ parent: parent, segList: path.split(sep)/* , path: path*/});\n\t\t\t}\n\t\t\t// The timeout forces async behavior always (even if nodes are all loaded)\n\t\t\t// This way a potential progress() event will fire.\n\t\t\tsetTimeout(function() {\n\t\t\t\tself._loadKeyPathImpl(dfd, opts, parent, pathSegList).done(\n\t\t\t\t\tfunction() {\n\t\t\t\t\t\tdfd.resolve();\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}, 0);\n\t\t\treturn dfd.promise();\n\t\t},\n\t\t/*\n\t\t * Resolve a list of paths, relative to one parent node.\n\t\t */\n\t\t_loadKeyPathImpl: function(dfd, opts, parent, pathSegList) {\n\t\t\tvar deferredList,\n\t\t\t\ti,\n\t\t\t\tkey,\n\t\t\t\tnode,\n\t\t\t\tnodeKey,\n\t\t\t\tremain,\n\t\t\t\tremainMap,\n\t\t\t\ttmpParent,\n\t\t\t\tsegList,\n\t\t\t\tsubDfd,\n\t\t\t\tself = this;\n\n\t\t\tfunction __findChild(parent, key) {\n\t\t\t\t// console.log(\"__findChild\", key, parent);\n\t\t\t\tvar i,\n\t\t\t\t\tl,\n\t\t\t\t\tcl = parent.children;\n\n\t\t\t\tif (cl) {\n\t\t\t\t\tfor (i = 0, l = cl.length; i < l; i++) {\n\t\t\t\t\t\tif (opts.matchKey(cl[i], key)) {\n\t\t\t\t\t\t\treturn cl[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// console.log(\"_loadKeyPathImpl, parent=\", parent, \", pathSegList=\", pathSegList);\n\n\t\t\t// Pass 1:\n\t\t\t// Handle all path segments for nodes that are already loaded.\n\t\t\t// Collect distinct top-most lazy nodes in a map.\n\t\t\t// Note that we can use node.key to de-dupe entries, even if a custom matcher would\n\t\t\t// look for other node attributes.\n\t\t\t// map[node.key] => {node: node, pathList: [list of remaining rest-paths]}\n\t\t\tremainMap = {};\n\n\t\t\tfor (i = 0; i < pathSegList.length; i++) {\n\t\t\t\tsegList = pathSegList[i];\n\t\t\t\t// target = targetList[i];\n\n\t\t\t\t// Traverse and pop path segments (i.e. keys), until we hit a lazy, unloaded node\n\t\t\t\ttmpParent = parent;\n\t\t\t\twhile (segList.length) {\n\t\t\t\t\tkey = segList.shift();\n\t\t\t\t\tnode = __findChild(tmpParent, key);\n\t\t\t\t\tif (!node) {\n\t\t\t\t\t\tthis.warn(\n\t\t\t\t\t\t\t\"loadKeyPath: key not found: \" +\n\t\t\t\t\t\t\t\tkey +\n\t\t\t\t\t\t\t\t\" (parent: \" +\n\t\t\t\t\t\t\t\ttmpParent +\n\t\t\t\t\t\t\t\t\")\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\topts.callback(this, key, \"error\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (segList.length === 0) {\n\t\t\t\t\t\topts.callback(this, node, \"ok\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (!node.lazy || node.hasChildren() !== undefined) {\n\t\t\t\t\t\topts.callback(this, node, \"loaded\");\n\t\t\t\t\t\ttmpParent = node;\n\t\t\t\t\t} else {\n\t\t\t\t\t\topts.callback(this, node, \"loaded\");\n\t\t\t\t\t\tkey = node.key; //target.segList.join(sep);\n\t\t\t\t\t\tif (remainMap[key]) {\n\t\t\t\t\t\t\tremainMap[key].pathSegList.push(segList);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tremainMap[key] = {\n\t\t\t\t\t\t\t\tparent: node,\n\t\t\t\t\t\t\t\tpathSegList: [segList],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// console.log(\"_loadKeyPathImpl AFTER pass 1, remainMap=\", remainMap);\n\n\t\t\t// Now load all lazy nodes and continue iteration for remaining paths\n\t\t\tdeferredList = [];\n\n\t\t\t// Avoid jshint warning 'Don't make functions within a loop.':\n\t\t\tfunction __lazyload(dfd, parent, pathSegList) {\n\t\t\t\t// console.log(\"__lazyload\", parent, \"pathSegList=\", pathSegList);\n\t\t\t\topts.callback(self, parent, \"loading\");\n\t\t\t\tparent\n\t\t\t\t\t.load()\n\t\t\t\t\t.done(function() {\n\t\t\t\t\t\tself._loadKeyPathImpl\n\t\t\t\t\t\t\t.call(self, dfd, opts, parent, pathSegList)\n\t\t\t\t\t\t\t.always(_makeResolveFunc(dfd, self));\n\t\t\t\t\t})\n\t\t\t\t\t.fail(function(errMsg) {\n\t\t\t\t\t\tself.warn(\"loadKeyPath: error loading lazy \" + parent);\n\t\t\t\t\t\topts.callback(self, node, \"error\");\n\t\t\t\t\t\tdfd.rejectWith(self);\n\t\t\t\t\t});\n\t\t\t}\n\t\t\t// remainMap contains parent nodes, each with a list of relative sub-paths.\n\t\t\t// We start loading all of them now, and pass the the list to each loader.\n\t\t\tfor (nodeKey in remainMap) {\n\t\t\t\tif (remainMap.hasOwnProperty(nodeKey)) {\n\t\t\t\t\tremain = remainMap[nodeKey];\n\t\t\t\t\t// console.log(\"for(): remain=\", remain, \"remainMap=\", remainMap);\n\t\t\t\t\t// key = remain.segList.shift();\n\t\t\t\t\t// node = __findChild(remain.parent, key);\n\t\t\t\t\t// if (node == null) { // #576\n\t\t\t\t\t// \t// Issue #576, refactored for v2.27:\n\t\t\t\t\t// \t// The root cause was, that sometimes the wrong parent was used here\n\t\t\t\t\t// \t// to find the next segment.\n\t\t\t\t\t// \t// Falling back to getNodeByKey() was a hack that no longer works if a custom\n\t\t\t\t\t// \t// matcher is used, because we cannot assume that a single segment-key is unique\n\t\t\t\t\t// \t// throughout the tree.\n\t\t\t\t\t// \tself.error(\"loadKeyPath: error loading child by key '\" + key + \"' (parent: \" + target.parent + \")\", target);\n\t\t\t\t\t// \t// \tnode = self.getNodeByKey(key);\n\t\t\t\t\t// \tcontinue;\n\t\t\t\t\t// }\n\t\t\t\t\tsubDfd = new $.Deferred();\n\t\t\t\t\tdeferredList.push(subDfd);\n\t\t\t\t\t__lazyload(subDfd, remain.parent, remain.pathSegList);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Return a promise that is resolved, when ALL paths were loaded\n\t\t\treturn $.when.apply($, deferredList).promise();\n\t\t},\n\t\t/** Re-fire beforeActivate, activate, and (optional) focus events.\n\t\t * Calling this method in the `init` event, will activate the node that\n\t\t * was marked 'active' in the source data, and optionally set the keyboard\n\t\t * focus.\n\t\t * @param [setFocus=false]\n\t\t */\n\t\treactivate: function(setFocus) {\n\t\t\tvar res,\n\t\t\t\tnode = this.activeNode;\n\n\t\t\tif (!node) {\n\t\t\t\treturn _getResolvedPromise();\n\t\t\t}\n\t\t\tthis.activeNode = null; // Force re-activating\n\t\t\tres = node.setActive(true, { noFocus: true });\n\t\t\tif (setFocus) {\n\t\t\t\tnode.setFocus();\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t\t/** Reload tree from source and return a promise.\n\t\t * @param [source] optional new source (defaults to initial source data)\n\t\t * @returns {$.Promise}\n\t\t */\n\t\treload: function(source) {\n\t\t\tthis._callHook(\"treeClear\", this);\n\t\t\treturn this._callHook(\"treeLoad\", this, source);\n\t\t},\n\t\t/**Render tree (i.e. create DOM elements for all top-level nodes).\n\t\t * @param {boolean} [force=false] create DOM elemnts, even if parent is collapsed\n\t\t * @param {boolean} [deep=false]\n\t\t */\n\t\trender: function(force, deep) {\n\t\t\treturn this.rootNode.render(force, deep);\n\t\t},\n\t\t/**(De)select all nodes.\n\t\t * @param {boolean} [flag=true]\n\t\t * @since 2.28\n\t\t */\n\t\tselectAll: function(flag) {\n\t\t\tthis.visit(function(node) {\n\t\t\t\tnode.setSelected(flag);\n\t\t\t});\n\t\t},\n\t\t// TODO: selectKey: function(key, select)\n\t\t// TODO: serializeArray: function(stopOnParents)\n\t\t/**\n\t\t * @param {boolean} [flag=true]\n\t\t */\n\t\tsetFocus: function(flag) {\n\t\t\treturn this._callHook(\"treeSetFocus\", this, flag);\n\t\t},\n\t\t/**\n\t\t * Set current option value.\n\t\t * (Note: this is the preferred variant of `$().fancytree(\"option\", \"KEY\", VALUE)`)\n\t\t * @param {string} name option name (may contain '.')\n\t\t * @param {any} new value\n\t\t */\n\t\tsetOption: function(optionName, value) {\n\t\t\treturn this.widget.option(optionName, value);\n\t\t},\n\t\t/**\n\t\t * Return all nodes as nested list of {@link NodeData}.\n\t\t *\n\t\t * @param {boolean} [includeRoot=false] Returns the hidden system root node (and its children)\n\t\t * @param {function} [callback] callback(dict, node) is called for every node, in order to allow modifications.\n\t\t * Return `false` to ignore this node or \"skip\" to include this node without its children.\n\t\t * @returns {Array | object}\n\t\t * @see FancytreeNode#toDict\n\t\t */\n\t\ttoDict: function(includeRoot, callback) {\n\t\t\tvar res = this.rootNode.toDict(true, callback);\n\t\t\treturn includeRoot ? res : res.children;\n\t\t},\n\t\t/* Implicitly called for string conversions.\n\t\t * @returns {string}\n\t\t */\n\t\ttoString: function() {\n\t\t\treturn \"Fancytree@\" + this._id;\n\t\t\t// return \"<Fancytree(#\" + this._id + \")>\";\n\t\t},\n\t\t/* _trigger a widget event with additional node ctx.\n\t\t * @see EventData\n\t\t */\n\t\t_triggerNodeEvent: function(type, node, originalEvent, extra) {\n\t\t\t// this.debug(\"_trigger(\" + type + \"): '\" + ctx.node.title + \"'\", ctx);\n\t\t\tvar ctx = this._makeHookContext(node, originalEvent, extra),\n\t\t\t\tres = this.widget._trigger(type, originalEvent, ctx);\n\t\t\tif (res !== false && ctx.result !== undefined) {\n\t\t\t\treturn ctx.result;\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t\t/* _trigger a widget event with additional tree data. */\n\t\t_triggerTreeEvent: function(type, originalEvent, extra) {\n\t\t\t// this.debug(\"_trigger(\" + type + \")\", ctx);\n\t\t\tvar ctx = this._makeHookContext(this, originalEvent, extra),\n\t\t\t\tres = this.widget._trigger(type, originalEvent, ctx);\n\n\t\t\tif (res !== false && ctx.result !== undefined) {\n\t\t\t\treturn ctx.result;\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t\t/** Call fn(node) for all nodes in hierarchical order (depth-first).\n\t\t *\n\t\t * @param {function} fn the callback function.\n\t\t * Return false to stop iteration, return \"skip\" to skip this node and children only.\n\t\t * @returns {boolean} false, if the iterator was stopped.\n\t\t */\n\t\tvisit: function(fn) {\n\t\t\treturn this.rootNode.visit(fn, false);\n\t\t},\n\t\t/** Call fn(node) for all nodes in vertical order, top down (or bottom up).<br>\n\t\t * Stop iteration, if fn() returns false.<br>\n\t\t * Return false if iteration was stopped.\n\t\t *\n\t\t * @param {function} fn the callback function.\n\t\t * Return false to stop iteration, return \"skip\" to skip this node and children only.\n\t\t * @param {object} [options]\n\t\t * Defaults:\n\t\t * {start: First top node, reverse: false, includeSelf: true, includeHidden: false}\n\t\t * @returns {boolean} false if iteration was cancelled\n\t\t * @since 2.28\n\t\t */\n\t\tvisitRows: function(fn, opts) {\n\t\t\tif (!this.rootNode.children) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (opts && opts.reverse) {\n\t\t\t\tdelete opts.reverse;\n\t\t\t\treturn this._visitRowsUp(fn, opts);\n\t\t\t}\n\t\t\topts = opts || {};\n\n\t\t\tvar i,\n\t\t\t\tnextIdx,\n\t\t\t\tparent,\n\t\t\t\tres,\n\t\t\t\tsiblings,\n\t\t\t\tsiblingOfs = 0,\n\t\t\t\tskipFirstNode = opts.includeSelf === false,\n\t\t\t\tincludeHidden = !!opts.includeHidden,\n\t\t\t\tcheckFilter = !includeHidden && this.enableFilter,\n\t\t\t\tnode = opts.start || this.rootNode.children[0];\n\n\t\t\tparent = node.parent;\n\t\t\twhile (parent) {\n\t\t\t\t// visit siblings\n\t\t\t\tsiblings = parent.children;\n\t\t\t\tnextIdx = siblings.indexOf(node) + siblingOfs;\n\n\t\t\t\tfor (i = nextIdx; i < siblings.length; i++) {\n\t\t\t\t\tnode = siblings[i];\n\t\t\t\t\tif (checkFilter && !node.match && !node.subMatchCount) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (!skipFirstNode && fn(node) === false) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tskipFirstNode = false;\n\t\t\t\t\t// Dive into node's child nodes\n\t\t\t\t\tif (\n\t\t\t\t\t\tnode.children &&\n\t\t\t\t\t\tnode.children.length &&\n\t\t\t\t\t\t(includeHidden || node.expanded)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Disable warning: Functions declared within loops referencing an outer\n\t\t\t\t\t\t// scoped variable may lead to confusing semantics:\n\t\t\t\t\t\t/*jshint -W083 */\n\t\t\t\t\t\tres = node.visit(function(n) {\n\t\t\t\t\t\t\tif (checkFilter && !n.match && !n.subMatchCount) {\n\t\t\t\t\t\t\t\treturn \"skip\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (fn(n) === false) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!includeHidden && n.children && !n.expanded) {\n\t\t\t\t\t\t\t\treturn \"skip\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, false);\n\t\t\t\t\t\t/*jshint +W083 */\n\t\t\t\t\t\tif (res === false) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Visit parent nodes (bottom up)\n\t\t\t\tnode = parent;\n\t\t\t\tparent = parent.parent;\n\t\t\t\tsiblingOfs = 1; //\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\t/* Call fn(node) for all nodes in vertical order, bottom up.\n\t\t */\n\t\t_visitRowsUp: function(fn, opts) {\n\t\t\tvar children,\n\t\t\t\tidx,\n\t\t\t\tparent,\n\t\t\t\tincludeHidden = !!opts.includeHidden,\n\t\t\t\tnode = opts.start || this.rootNode.children[0];\n\n\t\t\twhile (true) {\n\t\t\t\tparent = node.parent;\n\t\t\t\tchildren = parent.children;\n\n\t\t\t\tif (children[0] === node) {\n\t\t\t\t\t// If this is already the first sibling, goto parent\n\t\t\t\t\tnode = parent;\n\t\t\t\t\tif (!node.parent) {\n\t\t\t\t\t\tbreak; // first node of the tree\n\t\t\t\t\t}\n\t\t\t\t\tchildren = parent.children;\n\t\t\t\t} else {\n\t\t\t\t\t// Otherwise, goto prev. sibling\n\t\t\t\t\tidx = children.indexOf(node);\n\t\t\t\t\tnode = children[idx - 1];\n\t\t\t\t\t// If the prev. sibling has children, follow down to last descendant\n\t\t\t\t\twhile (\n\t\t\t\t\t\t// See: https://github.com/eslint/eslint/issues/11302\n\t\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\t\t(includeHidden || node.expanded) &&\n\t\t\t\t\t\tnode.children &&\n\t\t\t\t\t\tnode.children.length\n\t\t\t\t\t) {\n\t\t\t\t\t\tchildren = node.children;\n\t\t\t\t\t\tparent = node;\n\t\t\t\t\t\tnode = children[children.length - 1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Skip invisible\n\t\t\t\tif (!includeHidden && !node.isVisible()) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (fn(node) === false) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t/** Write warning to browser console if debugLevel >= 2 (prepending tree info)\n\t\t *\n\t\t * @param {*} msg string or object or array of such\n\t\t */\n\t\twarn: function(msg) {\n\t\t\tif (this.options.debugLevel >= 2) {\n\t\t\t\tArray.prototype.unshift.call(arguments, this.toString());\n\t\t\t\tconsoleApply(\"warn\", arguments);\n\t\t\t}\n\t\t},\n\t};\n\n\t/**\n\t * These additional methods of the {@link Fancytree} class are 'hook functions'\n\t * that can be used and overloaded by extensions.\n\t * (See <a href=\"https://github.com/mar10/fancytree/wiki/TutorialExtensions\">writing extensions</a>.)\n\t * @mixin Fancytree_Hooks\n\t */\n\t$.extend(\n\t\tFancytree.prototype,\n\t\t/** @lends Fancytree_Hooks# */\n\t\t{\n\t\t\t/** Default handling for mouse click events.\n\t\t\t *\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\tnodeClick: function(ctx) {\n\t\t\t\tvar activate,\n\t\t\t\t\texpand,\n\t\t\t\t\t// event = ctx.originalEvent,\n\t\t\t\t\ttargetType = ctx.targetType,\n\t\t\t\t\tnode = ctx.node;\n\n\t\t\t\t// this.debug(\"ftnode.onClick(\" + event.type + \"): ftnode:\" + this + \", button:\" + event.button + \", which: \" + event.which, ctx);\n\t\t\t\t// TODO: use switch\n\t\t\t\t// TODO: make sure clicks on embedded <input> doesn't steal focus (see table sample)\n\t\t\t\tif (targetType === \"expander\") {\n\t\t\t\t\tif (node.isLoading()) {\n\t\t\t\t\t\t// #495: we probably got a click event while a lazy load is pending.\n\t\t\t\t\t\t// The 'expanded' state is not yet set, so 'toggle' would expand\n\t\t\t\t\t\t// and trigger lazyLoad again.\n\t\t\t\t\t\t// It would be better to allow to collapse/expand the status node\n\t\t\t\t\t\t// while loading (instead of ignoring), but that would require some\n\t\t\t\t\t\t// more work.\n\t\t\t\t\t\tnode.debug(\"Got 2nd click while loading: ignored\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// Clicking the expander icon always expands/collapses\n\t\t\t\t\tthis._callHook(\"nodeToggleExpanded\", ctx);\n\t\t\t\t} else if (targetType === \"checkbox\") {\n\t\t\t\t\t// Clicking the checkbox always (de)selects\n\t\t\t\t\tthis._callHook(\"nodeToggleSelected\", ctx);\n\t\t\t\t\tif (ctx.options.focusOnSelect) {\n\t\t\t\t\t\t// #358\n\t\t\t\t\t\tthis._callHook(\"nodeSetFocus\", ctx, true);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Honor `clickFolderMode` for\n\t\t\t\t\texpand = false;\n\t\t\t\t\tactivate = true;\n\t\t\t\t\tif (node.folder) {\n\t\t\t\t\t\tswitch (ctx.options.clickFolderMode) {\n\t\t\t\t\t\t\tcase 2: // expand only\n\t\t\t\t\t\t\t\texpand = true;\n\t\t\t\t\t\t\t\tactivate = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3: // expand and activate\n\t\t\t\t\t\t\t\tactivate = true;\n\t\t\t\t\t\t\t\texpand = true; //!node.isExpanded();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t// else 1 or 4: just activate\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (activate) {\n\t\t\t\t\t\tthis.nodeSetFocus(ctx);\n\t\t\t\t\t\tthis._callHook(\"nodeSetActive\", ctx, true);\n\t\t\t\t\t}\n\t\t\t\t\tif (expand) {\n\t\t\t\t\t\tif (!activate) {\n\t\t\t\t\t\t\t// this._callHook(\"nodeSetFocus\", ctx);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// this._callHook(\"nodeSetExpanded\", ctx, true);\n\t\t\t\t\t\tthis._callHook(\"nodeToggleExpanded\", ctx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Make sure that clicks stop, otherwise <a href='#'> jumps to the top\n\t\t\t\t// if(event.target.localName === \"a\" && event.target.className === \"fancytree-title\"){\n\t\t\t\t// \tevent.preventDefault();\n\t\t\t\t// }\n\t\t\t\t// TODO: return promise?\n\t\t\t},\n\t\t\t/** Collapse all other children of same parent.\n\t\t\t *\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param {object} callOpts\n\t\t\t */\n\t\t\tnodeCollapseSiblings: function(ctx, callOpts) {\n\t\t\t\t// TODO: return promise?\n\t\t\t\tvar ac,\n\t\t\t\t\ti,\n\t\t\t\t\tl,\n\t\t\t\t\tnode = ctx.node;\n\n\t\t\t\tif (node.parent) {\n\t\t\t\t\tac = node.parent.children;\n\t\t\t\t\tfor (i = 0, l = ac.length; i < l; i++) {\n\t\t\t\t\t\tif (ac[i] !== node && ac[i].expanded) {\n\t\t\t\t\t\t\tthis._callHook(\n\t\t\t\t\t\t\t\t\"nodeSetExpanded\",\n\t\t\t\t\t\t\t\tac[i],\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\tcallOpts\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t/** Default handling for mouse douleclick events.\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\tnodeDblclick: function(ctx) {\n\t\t\t\t// TODO: return promise?\n\t\t\t\tif (\n\t\t\t\t\tctx.targetType === \"title\" &&\n\t\t\t\t\tctx.options.clickFolderMode === 4\n\t\t\t\t) {\n\t\t\t\t\t// this.nodeSetFocus(ctx);\n\t\t\t\t\t// this._callHook(\"nodeSetActive\", ctx, true);\n\t\t\t\t\tthis._callHook(\"nodeToggleExpanded\", ctx);\n\t\t\t\t}\n\t\t\t\t// TODO: prevent text selection on dblclicks\n\t\t\t\tif (ctx.targetType === \"title\") {\n\t\t\t\t\tctx.originalEvent.preventDefault();\n\t\t\t\t}\n\t\t\t},\n\t\t\t/** Default handling for mouse keydown events.\n\t\t\t *\n\t\t\t * NOTE: this may be called with node == null if tree (but no node) has focus.\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\tnodeKeydown: function(ctx) {\n\t\t\t\t// TODO: return promise?\n\t\t\t\tvar matchNode,\n\t\t\t\t\tstamp,\n\t\t\t\t\t_res,\n\t\t\t\t\tfocusNode,\n\t\t\t\t\tevent = ctx.originalEvent,\n\t\t\t\t\tnode = ctx.node,\n\t\t\t\t\ttree = ctx.tree,\n\t\t\t\t\topts = ctx.options,\n\t\t\t\t\twhich = event.which,\n\t\t\t\t\t// #909: Use event.key, to get unicode characters.\n\t\t\t\t\t// We can't use `/\\w/.test(key)`, because that would\n\t\t\t\t\t// only detect plain ascii alpha-numerics. But we still need\n\t\t\t\t\t// to ignore modifier-only, whitespace, cursor-keys, etc.\n\t\t\t\t\tkey = event.key || String.fromCharCode(which),\n\t\t\t\t\tspecialModifiers = !!(\n\t\t\t\t\t\tevent.altKey ||\n\t\t\t\t\t\tevent.ctrlKey ||\n\t\t\t\t\t\tevent.metaKey\n\t\t\t\t\t),\n\t\t\t\t\tisAlnum =\n\t\t\t\t\t\t!MODIFIERS[which] &&\n\t\t\t\t\t\t!SPECIAL_KEYCODES[which] &&\n\t\t\t\t\t\t!specialModifiers,\n\t\t\t\t\t$target = $(event.target),\n\t\t\t\t\thandled = true,\n\t\t\t\t\tactivate = !(event.ctrlKey || !opts.autoActivate);\n\n\t\t\t\t// (node || FT).debug(\"ftnode.nodeKeydown(\" + event.type + \"): ftnode:\" + this + \", charCode:\" + event.charCode + \", keyCode: \" + event.keyCode + \", which: \" + event.which);\n\t\t\t\t// FT.debug( \"eventToString(): \" + FT.eventToString(event) + \", key='\" + key + \"', isAlnum: \" + isAlnum );\n\n\t\t\t\t// Set focus to active (or first node) if no other node has the focus yet\n\t\t\t\tif (!node) {\n\t\t\t\t\tfocusNode = this.getActiveNode() || this.getFirstChild();\n\t\t\t\t\tif (focusNode) {\n\t\t\t\t\t\tfocusNode.setFocus();\n\t\t\t\t\t\tnode = ctx.node = this.focusNode;\n\t\t\t\t\t\tnode.debug(\"Keydown force focus on active node\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\topts.quicksearch &&\n\t\t\t\t\tisAlnum &&\n\t\t\t\t\t!$target.is(\":input:enabled\")\n\t\t\t\t) {\n\t\t\t\t\t// Allow to search for longer streaks if typed in quickly\n\t\t\t\t\tstamp = Date.now();\n\t\t\t\t\tif (stamp - tree.lastQuicksearchTime > 500) {\n\t\t\t\t\t\ttree.lastQuicksearchTerm = \"\";\n\t\t\t\t\t}\n\t\t\t\t\ttree.lastQuicksearchTime = stamp;\n\t\t\t\t\ttree.lastQuicksearchTerm += key;\n\t\t\t\t\t// tree.debug(\"quicksearch find\", tree.lastQuicksearchTerm);\n\t\t\t\t\tmatchNode = tree.findNextNode(\n\t\t\t\t\t\ttree.lastQuicksearchTerm,\n\t\t\t\t\t\ttree.getActiveNode()\n\t\t\t\t\t);\n\t\t\t\t\tif (matchNode) {\n\t\t\t\t\t\tmatchNode.setActive();\n\t\t\t\t\t}\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tswitch (FT.eventToString(event)) {\n\t\t\t\t\tcase \"+\":\n\t\t\t\t\tcase \"=\": // 187: '+' @ Chrome, Safari\n\t\t\t\t\t\ttree.nodeSetExpanded(ctx, true);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"-\":\n\t\t\t\t\t\ttree.nodeSetExpanded(ctx, false);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"space\":\n\t\t\t\t\t\tif (node.isPagingNode()) {\n\t\t\t\t\t\t\ttree._triggerNodeEvent(\"clickPaging\", ctx, event);\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tFT.evalOption(\"checkbox\", node, node, opts, false)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// #768\n\t\t\t\t\t\t\ttree.nodeToggleSelected(ctx);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttree.nodeSetActive(ctx, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"return\":\n\t\t\t\t\t\ttree.nodeSetActive(ctx, true);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"home\":\n\t\t\t\t\tcase \"end\":\n\t\t\t\t\tcase \"backspace\":\n\t\t\t\t\tcase \"left\":\n\t\t\t\t\tcase \"right\":\n\t\t\t\t\tcase \"up\":\n\t\t\t\t\tcase \"down\":\n\t\t\t\t\t\t_res = node.navigate(event.which, activate);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\thandled = false;\n\t\t\t\t}\n\t\t\t\tif (handled) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// /** Default handling for mouse keypress events. */\n\t\t\t// nodeKeypress: function(ctx) {\n\t\t\t// var event = ctx.originalEvent;\n\t\t\t// },\n\n\t\t\t// /** Trigger lazyLoad event (async). */\n\t\t\t// nodeLazyLoad: function(ctx) {\n\t\t\t// var node = ctx.node;\n\t\t\t// if(this._triggerNodeEvent())\n\t\t\t// },\n\t\t\t/** Load child nodes (async).\n\t\t\t *\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param {object[]|object|string|$.Promise|function} source\n\t\t\t * @returns {$.Promise} The deferred will be resolved as soon as the (ajax)\n\t\t\t * data was rendered.\n\t\t\t */\n\t\t\tnodeLoadChildren: function(ctx, source) {\n\t\t\t\tvar ajax,\n\t\t\t\t\tdelay,\n\t\t\t\t\tdfd,\n\t\t\t\t\tres,\n\t\t\t\t\ttree = ctx.tree,\n\t\t\t\t\tnode = ctx.node,\n\t\t\t\t\trequestId = Date.now();\n\n\t\t\t\tif ($.isFunction(source)) {\n\t\t\t\t\tsource = source.call(tree, { type: \"source\" }, ctx);\n\t\t\t\t\t_assert(\n\t\t\t\t\t\t!$.isFunction(source),\n\t\t\t\t\t\t\"source callback must not return another function\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (source.url) {\n\t\t\t\t\tif (node._requestId) {\n\t\t\t\t\t\tnode.warn(\n\t\t\t\t\t\t\t\"Recursive load request #\" +\n\t\t\t\t\t\t\t\trequestId +\n\t\t\t\t\t\t\t\t\" while #\" +\n\t\t\t\t\t\t\t\tnode._requestId +\n\t\t\t\t\t\t\t\t\" is pending.\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// } else {\n\t\t\t\t\t\t// \tnode.debug(\"Send load request #\" + requestId);\n\t\t\t\t\t}\n\t\t\t\t\t// `source` is an Ajax options object\n\t\t\t\t\tajax = $.extend({}, ctx.options.ajax, source);\n\t\t\t\t\tnode._requestId = requestId;\n\t\t\t\t\tif (ajax.debugDelay) {\n\t\t\t\t\t\t// simulate a slow server\n\t\t\t\t\t\tdelay = ajax.debugDelay;\n\t\t\t\t\t\tdelete ajax.debugDelay; // remove debug option\n\t\t\t\t\t\tif ($.isArray(delay)) {\n\t\t\t\t\t\t\t// random delay range [min..max]\n\t\t\t\t\t\t\tdelay =\n\t\t\t\t\t\t\t\tdelay[0] +\n\t\t\t\t\t\t\t\tMath.random() * (delay[1] - delay[0]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnode.warn(\n\t\t\t\t\t\t\t\"nodeLoadChildren waiting debugDelay \" +\n\t\t\t\t\t\t\t\tMath.round(delay) +\n\t\t\t\t\t\t\t\t\" ms ...\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdfd = $.Deferred(function(dfd) {\n\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t$.ajax(ajax)\n\t\t\t\t\t\t\t\t\t.done(function() {\n\t\t\t\t\t\t\t\t\t\tdfd.resolveWith(this, arguments);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.fail(function() {\n\t\t\t\t\t\t\t\t\t\tdfd.rejectWith(this, arguments);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}, delay);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdfd = $.ajax(ajax);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Defer the deferred: we want to be able to reject, even if ajax\n\t\t\t\t\t// resolved ok.\n\t\t\t\t\tsource = new $.Deferred();\n\t\t\t\t\tdfd.done(function(data, textStatus, jqXHR) {\n\t\t\t\t\t\tvar errorObj, res;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(this.dataType === \"json\" ||\n\t\t\t\t\t\t\t\tthis.dataType === \"jsonp\") &&\n\t\t\t\t\t\t\ttypeof data === \"string\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t$.error(\n\t\t\t\t\t\t\t\t\"Ajax request returned a string (did you get the JSON dataType wrong?).\"\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (node._requestId && node._requestId > requestId) {\n\t\t\t\t\t\t\t// The expected request time stamp is later than `requestId`\n\t\t\t\t\t\t\t// (which was kept as as closure variable to this handler function)\n\t\t\t\t\t\t\t// node.warn(\"Ignored load response for obsolete request #\" + requestId + \" (expected #\" + node._requestId + \")\");\n\t\t\t\t\t\t\tsource.rejectWith(this, [RECURSIVE_REQUEST_ERROR]);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t// } else {\n\t\t\t\t\t\t\t// \tnode.debug(\"Response returned for load request #\" + requestId);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// postProcess is similar to the standard ajax dataFilter hook,\n\t\t\t\t\t\t// but it is also called for JSONP\n\t\t\t\t\t\tif (ctx.options.postProcess) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t// The handler may either\n\t\t\t\t\t\t\t\t// - modify `ctx.response` in-place (and leave `ctx.result` undefined)\n\t\t\t\t\t\t\t\t// => res = undefined\n\t\t\t\t\t\t\t\t// - return a replacement in `ctx.result`\n\t\t\t\t\t\t\t\t// => res = <new data>\n\t\t\t\t\t\t\t\t// If res contains an `error` property, an error status is displayed\n\t\t\t\t\t\t\t\tres = tree._triggerNodeEvent(\n\t\t\t\t\t\t\t\t\t\"postProcess\",\n\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\tctx.originalEvent,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tresponse: data,\n\t\t\t\t\t\t\t\t\t\terror: null,\n\t\t\t\t\t\t\t\t\t\tdataType: this.dataType,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\tres = {\n\t\t\t\t\t\t\t\t\terror: e,\n\t\t\t\t\t\t\t\t\tmessage: \"\" + e,\n\t\t\t\t\t\t\t\t\tdetails: \"postProcess failed\",\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (res.error) {\n\t\t\t\t\t\t\t\terrorObj = $.isPlainObject(res.error)\n\t\t\t\t\t\t\t\t\t? res.error\n\t\t\t\t\t\t\t\t\t: { message: res.error };\n\t\t\t\t\t\t\t\terrorObj = tree._makeHookContext(\n\t\t\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\t\terrorObj\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tsource.rejectWith(this, [errorObj]);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t$.isArray(res) ||\n\t\t\t\t\t\t\t\t($.isPlainObject(res) &&\n\t\t\t\t\t\t\t\t\t$.isArray(res.children))\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// Use `ctx.result` if valid\n\t\t\t\t\t\t\t\t// (otherwise use existing data, which may have been modified in-place)\n\t\t\t\t\t\t\t\tdata = res;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tdata &&\n\t\t\t\t\t\t\tdata.hasOwnProperty(\"d\") &&\n\t\t\t\t\t\t\tctx.options.enableAspx\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Process ASPX WebMethod JSON object inside \"d\" property\n\t\t\t\t\t\t\tdata =\n\t\t\t\t\t\t\t\ttypeof data.d === \"string\"\n\t\t\t\t\t\t\t\t\t? $.parseJSON(data.d)\n\t\t\t\t\t\t\t\t\t: data.d;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsource.resolveWith(this, [data]);\n\t\t\t\t\t}).fail(function(jqXHR, textStatus, errorThrown) {\n\t\t\t\t\t\tvar errorObj = tree._makeHookContext(node, null, {\n\t\t\t\t\t\t\terror: jqXHR,\n\t\t\t\t\t\t\targs: Array.prototype.slice.call(arguments),\n\t\t\t\t\t\t\tmessage: errorThrown,\n\t\t\t\t\t\t\tdetails: jqXHR.status + \": \" + errorThrown,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tsource.rejectWith(this, [errorObj]);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// #383: accept and convert ECMAScript 6 Promise\n\t\t\t\tif ($.isFunction(source.then) && $.isFunction(source.catch)) {\n\t\t\t\t\tdfd = source;\n\t\t\t\t\tsource = new $.Deferred();\n\t\t\t\t\tdfd.then(\n\t\t\t\t\t\tfunction(value) {\n\t\t\t\t\t\t\tsource.resolve(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfunction(reason) {\n\t\t\t\t\t\t\tsource.reject(reason);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif ($.isFunction(source.promise)) {\n\t\t\t\t\t// `source` is a deferred, i.e. ajax request\n\t\t\t\t\t// _assert(!node.isLoading(), \"recursive load\");\n\t\t\t\t\ttree.nodeSetStatus(ctx, \"loading\");\n\n\t\t\t\t\tsource\n\t\t\t\t\t\t.done(function(children) {\n\t\t\t\t\t\t\ttree.nodeSetStatus(ctx, \"ok\");\n\t\t\t\t\t\t\tnode._requestId = null;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.fail(function(error) {\n\t\t\t\t\t\t\tvar ctxErr;\n\n\t\t\t\t\t\t\tif (error === RECURSIVE_REQUEST_ERROR) {\n\t\t\t\t\t\t\t\tnode.warn(\n\t\t\t\t\t\t\t\t\t\"Ignored response for obsolete load request #\" +\n\t\t\t\t\t\t\t\t\t\trequestId +\n\t\t\t\t\t\t\t\t\t\t\" (expected #\" +\n\t\t\t\t\t\t\t\t\t\tnode._requestId +\n\t\t\t\t\t\t\t\t\t\t\")\"\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\terror.node &&\n\t\t\t\t\t\t\t\terror.error &&\n\t\t\t\t\t\t\t\terror.message\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// error is already a context object\n\t\t\t\t\t\t\t\tctxErr = error;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tctxErr = tree._makeHookContext(node, null, {\n\t\t\t\t\t\t\t\t\terror: error, // it can be jqXHR or any custom error\n\t\t\t\t\t\t\t\t\targs: Array.prototype.slice.call(arguments),\n\t\t\t\t\t\t\t\t\tmessage: error\n\t\t\t\t\t\t\t\t\t\t? error.message || error.toString()\n\t\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (ctxErr.message === \"[object Object]\") {\n\t\t\t\t\t\t\t\t\tctxErr.message = \"\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnode.warn(\n\t\t\t\t\t\t\t\t\"Load children failed (\" + ctxErr.message + \")\",\n\t\t\t\t\t\t\t\tctxErr\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttree._triggerNodeEvent(\n\t\t\t\t\t\t\t\t\t\"loadError\",\n\t\t\t\t\t\t\t\t\tctxErr,\n\t\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t\t\t) !== false\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\ttree.nodeSetStatus(\n\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t\t\t\tctxErr.message,\n\t\t\t\t\t\t\t\t\tctxErr.details\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tif (ctx.options.postProcess) {\n\t\t\t\t\t\t// #792: Call postProcess for non-deferred source\n\t\t\t\t\t\tres = tree._triggerNodeEvent(\n\t\t\t\t\t\t\t\"postProcess\",\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tctx.originalEvent,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tresponse: source,\n\t\t\t\t\t\t\t\terror: null,\n\t\t\t\t\t\t\t\tdataType: typeof source,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t$.isArray(res) ||\n\t\t\t\t\t\t\t($.isPlainObject(res) && $.isArray(res.children))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Use `ctx.result` if valid\n\t\t\t\t\t\t\t// (otherwise use existing data, which may have been modified in-place)\n\t\t\t\t\t\t\tsource = res;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// $.when(source) resolves also for non-deferreds\n\t\t\t\treturn $.when(source).done(function(children) {\n\t\t\t\t\tvar metaData, noDataRes;\n\n\t\t\t\t\tif ($.isPlainObject(children)) {\n\t\t\t\t\t\t// We got {foo: 'abc', children: [...]}\n\t\t\t\t\t\t// Copy extra properties to tree.data.foo\n\t\t\t\t\t\t_assert(\n\t\t\t\t\t\t\tnode.isRootNode(),\n\t\t\t\t\t\t\t\"source may only be an object for root nodes (expecting an array of child objects otherwise)\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\t_assert(\n\t\t\t\t\t\t\t$.isArray(children.children),\n\t\t\t\t\t\t\t\"if an object is passed as source, it must contain a 'children' array (all other properties are added to 'tree.data')\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tmetaData = children;\n\t\t\t\t\t\tchildren = children.children;\n\t\t\t\t\t\tdelete metaData.children;\n\t\t\t\t\t\t// Copy some attributes to tree.data\n\t\t\t\t\t\t$.each(TREE_ATTRS, function(i, attr) {\n\t\t\t\t\t\t\tif (metaData[attr] !== undefined) {\n\t\t\t\t\t\t\t\ttree[attr] = metaData[attr];\n\t\t\t\t\t\t\t\tdelete metaData[attr];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// Copy all other attributes to tree.data.NAME\n\t\t\t\t\t\t$.extend(tree.data, metaData);\n\t\t\t\t\t}\n\t\t\t\t\t_assert($.isArray(children), \"expected array of children\");\n\t\t\t\t\tnode._setChildren(children);\n\n\t\t\t\t\tif (tree.options.nodata && children.length === 0) {\n\t\t\t\t\t\tif ($.isFunction(tree.options.nodata)) {\n\t\t\t\t\t\t\tnoDataRes = tree.options.nodata.call(\n\t\t\t\t\t\t\t\ttree,\n\t\t\t\t\t\t\t\t{ type: \"nodata\" },\n\t\t\t\t\t\t\t\tctx\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttree.options.nodata === true &&\n\t\t\t\t\t\t\tnode.isRootNode()\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnoDataRes = tree.options.strings.nodata;\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttypeof tree.options.nodata === \"string\" &&\n\t\t\t\t\t\t\tnode.isRootNode()\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnoDataRes = tree.options.nodata;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (noDataRes) {\n\t\t\t\t\t\t\tnode.setStatus(\"nodata\", noDataRes);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// trigger fancytreeloadchildren\n\t\t\t\t\ttree._triggerNodeEvent(\"loadChildren\", node);\n\t\t\t\t});\n\t\t\t},\n\t\t\t/** [Not Implemented] */\n\t\t\tnodeLoadKeyPath: function(ctx, keyPathList) {\n\t\t\t\t// TODO: implement and improve\n\t\t\t\t// http://code.google.com/p/dynatree/issues/detail?id=222\n\t\t\t},\n\t\t\t/**\n\t\t\t * Remove a single direct child of ctx.node.\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param {FancytreeNode} childNode dircect child of ctx.node\n\t\t\t */\n\t\t\tnodeRemoveChild: function(ctx, childNode) {\n\t\t\t\tvar idx,\n\t\t\t\t\tnode = ctx.node,\n\t\t\t\t\t// opts = ctx.options,\n\t\t\t\t\tsubCtx = $.extend({}, ctx, { node: childNode }),\n\t\t\t\t\tchildren = node.children;\n\n\t\t\t\t// FT.debug(\"nodeRemoveChild()\", node.toString(), childNode.toString());\n\n\t\t\t\tif (children.length === 1) {\n\t\t\t\t\t_assert(childNode === children[0], \"invalid single child\");\n\t\t\t\t\treturn this.nodeRemoveChildren(ctx);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tthis.activeNode &&\n\t\t\t\t\t(childNode === this.activeNode ||\n\t\t\t\t\t\tthis.activeNode.isDescendantOf(childNode))\n\t\t\t\t) {\n\t\t\t\t\tthis.activeNode.setActive(false); // TODO: don't fire events\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tthis.focusNode &&\n\t\t\t\t\t(childNode === this.focusNode ||\n\t\t\t\t\t\tthis.focusNode.isDescendantOf(childNode))\n\t\t\t\t) {\n\t\t\t\t\tthis.focusNode = null;\n\t\t\t\t}\n\t\t\t\t// TODO: persist must take care to clear select and expand cookies\n\t\t\t\tthis.nodeRemoveMarkup(subCtx);\n\t\t\t\tthis.nodeRemoveChildren(subCtx);\n\t\t\t\tidx = $.inArray(childNode, children);\n\t\t\t\t_assert(idx >= 0, \"invalid child\");\n\t\t\t\t// Notify listeners\n\t\t\t\tnode.triggerModifyChild(\"remove\", childNode);\n\t\t\t\t// Unlink to support GC\n\t\t\t\tchildNode.visit(function(n) {\n\t\t\t\t\tn.parent = null;\n\t\t\t\t}, true);\n\t\t\t\tthis._callHook(\"treeRegisterNode\", this, false, childNode);\n\t\t\t\t// remove from child list\n\t\t\t\tchildren.splice(idx, 1);\n\t\t\t},\n\t\t\t/**Remove HTML markup for all descendents of ctx.node.\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\tnodeRemoveChildMarkup: function(ctx) {\n\t\t\t\tvar node = ctx.node;\n\n\t\t\t\t// FT.debug(\"nodeRemoveChildMarkup()\", node.toString());\n\t\t\t\t// TODO: Unlink attr.ftnode to support GC\n\t\t\t\tif (node.ul) {\n\t\t\t\t\tif (node.isRootNode()) {\n\t\t\t\t\t\t$(node.ul).empty();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(node.ul).remove();\n\t\t\t\t\t\tnode.ul = null;\n\t\t\t\t\t}\n\t\t\t\t\tnode.visit(function(n) {\n\t\t\t\t\t\tn.li = n.ul = null;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\t/**Remove all descendants of ctx.node.\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\tnodeRemoveChildren: function(ctx) {\n\t\t\t\tvar //subCtx,\n\t\t\t\t\ttree = ctx.tree,\n\t\t\t\t\tnode = ctx.node,\n\t\t\t\t\tchildren = node.children;\n\t\t\t\t// opts = ctx.options;\n\n\t\t\t\t// FT.debug(\"nodeRemoveChildren()\", node.toString());\n\t\t\t\tif (!children) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this.activeNode && this.activeNode.isDescendantOf(node)) {\n\t\t\t\t\tthis.activeNode.setActive(false); // TODO: don't fire events\n\t\t\t\t}\n\t\t\t\tif (this.focusNode && this.focusNode.isDescendantOf(node)) {\n\t\t\t\t\tthis.focusNode = null;\n\t\t\t\t}\n\t\t\t\t// TODO: persist must take care to clear select and expand cookies\n\t\t\t\tthis.nodeRemoveChildMarkup(ctx);\n\t\t\t\t// Unlink children to support GC\n\t\t\t\t// TODO: also delete this.children (not possible using visit())\n\t\t\t\t// subCtx = $.extend({}, ctx);\n\t\t\t\tnode.triggerModifyChild(\"remove\", null);\n\t\t\t\tnode.visit(function(n) {\n\t\t\t\t\tn.parent = null;\n\t\t\t\t\ttree._callHook(\"treeRegisterNode\", tree, false, n);\n\t\t\t\t});\n\t\t\t\tif (node.lazy) {\n\t\t\t\t\t// 'undefined' would be interpreted as 'not yet loaded' for lazy nodes\n\t\t\t\t\tnode.children = [];\n\t\t\t\t} else {\n\t\t\t\t\tnode.children = null;\n\t\t\t\t}\n\t\t\t\tif (!node.isRootNode()) {\n\t\t\t\t\tnode.expanded = false; // #449, #459\n\t\t\t\t}\n\t\t\t\tthis.nodeRenderStatus(ctx);\n\t\t\t},\n\t\t\t/**Remove HTML markup for ctx.node and all its descendents.\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\tnodeRemoveMarkup: function(ctx) {\n\t\t\t\tvar node = ctx.node;\n\t\t\t\t// FT.debug(\"nodeRemoveMarkup()\", node.toString());\n\t\t\t\t// TODO: Unlink attr.ftnode to support GC\n\t\t\t\tif (node.li) {\n\t\t\t\t\t$(node.li).remove();\n\t\t\t\t\tnode.li = null;\n\t\t\t\t}\n\t\t\t\tthis.nodeRemoveChildMarkup(ctx);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Create `<li><span>..</span> .. </li>` tags for this node.\n\t\t\t *\n\t\t\t * This method takes care that all HTML markup is created that is required\n\t\t\t * to display this node in its current state.\n\t\t\t *\n\t\t\t * Call this method to create new nodes, or after the strucuture\n\t\t\t * was changed (e.g. after moving this node or adding/removing children)\n\t\t\t * nodeRenderTitle() and nodeRenderStatus() are implied.\n\t\t\t * ```html\n\t\t\t * <li id='KEY' ftnode=NODE>\n\t\t\t * <span class='fancytree-node fancytree-expanded fancytree-has-children fancytree-lastsib fancytree-exp-el fancytree-ico-e'>\n\t\t\t * <span class=\"fancytree-expander\"></span>\n\t\t\t * <span class=\"fancytree-checkbox\"></span> // only present in checkbox mode\n\t\t\t * <span class=\"fancytree-icon\"></span>\n\t\t\t * <a href=\"#\" class=\"fancytree-title\"> Node 1 </a>\n\t\t\t * </span>\n\t\t\t * <ul> // only present if node has children\n\t\t\t * <li id='KEY' ftnode=NODE> child1 ... </li>\n\t\t\t * <li id='KEY' ftnode=NODE> child2 ... </li>\n\t\t\t * </ul>\n\t\t\t * </li>\n\t\t\t * ```\n\t\t\t *\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param {boolean} [force=false] re-render, even if html markup was already created\n\t\t\t * @param {boolean} [deep=false] also render all descendants, even if parent is collapsed\n\t\t\t * @param {boolean} [collapsed=false] force root node to be collapsed, so we can apply animated expand later\n\t\t\t */\n\t\t\tnodeRender: function(ctx, force, deep, collapsed, _recursive) {\n\t\t\t\t/* This method must take care of all cases where the current data mode\n\t\t\t\t * (i.e. node hierarchy) does not match the current markup.\n\t\t\t\t *\n\t\t\t\t * - node was not yet rendered:\n\t\t\t\t * create markup\n\t\t\t\t * - node was rendered: exit fast\n\t\t\t\t * - children have been added\n\t\t\t\t * - children have been removed\n\t\t\t\t */\n\t\t\t\tvar childLI,\n\t\t\t\t\tchildNode1,\n\t\t\t\t\tchildNode2,\n\t\t\t\t\ti,\n\t\t\t\t\tl,\n\t\t\t\t\tnext,\n\t\t\t\t\tsubCtx,\n\t\t\t\t\tnode = ctx.node,\n\t\t\t\t\ttree = ctx.tree,\n\t\t\t\t\topts = ctx.options,\n\t\t\t\t\taria = opts.aria,\n\t\t\t\t\tfirstTime = false,\n\t\t\t\t\tparent = node.parent,\n\t\t\t\t\tisRootNode = !parent,\n\t\t\t\t\tchildren = node.children,\n\t\t\t\t\tsuccessorLi = null;\n\t\t\t\t// FT.debug(\"nodeRender(\" + !!force + \", \" + !!deep + \")\", node.toString());\n\n\t\t\t\tif (tree._enableUpdate === false) {\n\t\t\t\t\t// tree.debug(\"no render\", tree._enableUpdate);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!isRootNode && !parent.ul) {\n\t\t\t\t\t// Calling node.collapse on a deep, unrendered node\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t_assert(isRootNode || parent.ul, \"parent UL must exist\");\n\n\t\t\t\t// Render the node\n\t\t\t\tif (!isRootNode) {\n\t\t\t\t\t// Discard markup on force-mode, or if it is not linked to parent <ul>\n\t\t\t\t\tif (\n\t\t\t\t\t\tnode.li &&\n\t\t\t\t\t\t(force || node.li.parentNode !== node.parent.ul)\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (node.li.parentNode === node.parent.ul) {\n\t\t\t\t\t\t\t// #486: store following node, so we can insert the new markup there later\n\t\t\t\t\t\t\tsuccessorLi = node.li.nextSibling;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// May happen, when a top-level node was dropped over another\n\t\t\t\t\t\t\tthis.debug(\n\t\t\t\t\t\t\t\t\"Unlinking \" +\n\t\t\t\t\t\t\t\t\tnode +\n\t\t\t\t\t\t\t\t\t\" (must be child of \" +\n\t\t\t\t\t\t\t\t\tnode.parent +\n\t\t\t\t\t\t\t\t\t\")\"\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//\t this.debug(\"nodeRemoveMarkup...\");\n\t\t\t\t\t\tthis.nodeRemoveMarkup(ctx);\n\t\t\t\t\t}\n\t\t\t\t\t// Create <li><span /> </li>\n\t\t\t\t\t// node.debug(\"render...\");\n\t\t\t\t\tif (node.li) {\n\t\t\t\t\t\t// this.nodeRenderTitle(ctx);\n\t\t\t\t\t\tthis.nodeRenderStatus(ctx);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// node.debug(\"render... really\");\n\t\t\t\t\t\tfirstTime = true;\n\t\t\t\t\t\tnode.li = document.createElement(\"li\");\n\t\t\t\t\t\tnode.li.ftnode = node;\n\n\t\t\t\t\t\tif (node.key && opts.generateIds) {\n\t\t\t\t\t\t\tnode.li.id = opts.idPrefix + node.key;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnode.span = document.createElement(\"span\");\n\t\t\t\t\t\tnode.span.className = \"fancytree-node\";\n\t\t\t\t\t\tif (aria && !node.tr) {\n\t\t\t\t\t\t\t$(node.li).attr(\"role\", \"treeitem\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnode.li.appendChild(node.span);\n\n\t\t\t\t\t\t// Create inner HTML for the <span> (expander, checkbox, icon, and title)\n\t\t\t\t\t\tthis.nodeRenderTitle(ctx);\n\n\t\t\t\t\t\t// Allow tweaking and binding, after node was created for the first time\n\t\t\t\t\t\tif (opts.createNode) {\n\t\t\t\t\t\t\topts.createNode.call(\n\t\t\t\t\t\t\t\ttree,\n\t\t\t\t\t\t\t\t{ type: \"createNode\" },\n\t\t\t\t\t\t\t\tctx\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Allow tweaking after node state was rendered\n\t\t\t\t\tif (opts.renderNode) {\n\t\t\t\t\t\topts.renderNode.call(tree, { type: \"renderNode\" }, ctx);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Visit child nodes\n\t\t\t\tif (children) {\n\t\t\t\t\tif (isRootNode || node.expanded || deep === true) {\n\t\t\t\t\t\t// Create a UL to hold the children\n\t\t\t\t\t\tif (!node.ul) {\n\t\t\t\t\t\t\tnode.ul = document.createElement(\"ul\");\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t(collapsed === true && !_recursive) ||\n\t\t\t\t\t\t\t\t!node.expanded\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// hide top UL, so we can use an animation to show it later\n\t\t\t\t\t\t\t\tnode.ul.style.display = \"none\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (aria) {\n\t\t\t\t\t\t\t\t$(node.ul).attr(\"role\", \"group\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (node.li) {\n\t\t\t\t\t\t\t\t// issue #67\n\t\t\t\t\t\t\t\tnode.li.appendChild(node.ul);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tnode.tree.$div.append(node.ul);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Add child markup\n\t\t\t\t\t\tfor (i = 0, l = children.length; i < l; i++) {\n\t\t\t\t\t\t\tsubCtx = $.extend({}, ctx, { node: children[i] });\n\t\t\t\t\t\t\tthis.nodeRender(subCtx, force, deep, false, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Remove <li> if nodes have moved to another parent\n\t\t\t\t\t\tchildLI = node.ul.firstChild;\n\t\t\t\t\t\twhile (childLI) {\n\t\t\t\t\t\t\tchildNode2 = childLI.ftnode;\n\t\t\t\t\t\t\tif (childNode2 && childNode2.parent !== node) {\n\t\t\t\t\t\t\t\tnode.debug(\n\t\t\t\t\t\t\t\t\t\"_fixParent: remove missing \" + childNode2,\n\t\t\t\t\t\t\t\t\tchildLI\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tnext = childLI.nextSibling;\n\t\t\t\t\t\t\t\tchildLI.parentNode.removeChild(childLI);\n\t\t\t\t\t\t\t\tchildLI = next;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tchildLI = childLI.nextSibling;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Make sure, that <li> order matches node.children order.\n\t\t\t\t\t\tchildLI = node.ul.firstChild;\n\t\t\t\t\t\tfor (i = 0, l = children.length - 1; i < l; i++) {\n\t\t\t\t\t\t\tchildNode1 = children[i];\n\t\t\t\t\t\t\tchildNode2 = childLI.ftnode;\n\t\t\t\t\t\t\tif (childNode1 === childNode2) {\n\t\t\t\t\t\t\t\tchildLI = childLI.nextSibling;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// node.debug(\"_fixOrder: mismatch at index \" + i + \": \" + childNode1 + \" != \" + childNode2);\n\t\t\t\t\t\t\t\tnode.ul.insertBefore(\n\t\t\t\t\t\t\t\t\tchildNode1.li,\n\t\t\t\t\t\t\t\t\tchildNode2.li\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// No children: remove markup if any\n\t\t\t\t\tif (node.ul) {\n\t\t\t\t\t\t// alert(\"remove child markup for \" + node);\n\t\t\t\t\t\tthis.warn(\"remove child markup for \" + node);\n\t\t\t\t\t\tthis.nodeRemoveChildMarkup(ctx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!isRootNode) {\n\t\t\t\t\t// Update element classes according to node state\n\t\t\t\t\t// this.nodeRenderStatus(ctx);\n\t\t\t\t\t// Finally add the whole structure to the DOM, so the browser can render\n\t\t\t\t\tif (firstTime) {\n\t\t\t\t\t\t// #486: successorLi is set, if we re-rendered (i.e. discarded)\n\t\t\t\t\t\t// existing markup, which we want to insert at the same position.\n\t\t\t\t\t\t// (null is equivalent to append)\n\t\t\t\t\t\t// \t\tparent.ul.appendChild(node.li);\n\t\t\t\t\t\tparent.ul.insertBefore(node.li, successorLi);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t/** Create HTML inside the node's outer `<span>` (i.e. expander, checkbox,\n\t\t\t * icon, and title).\n\t\t\t *\n\t\t\t * nodeRenderStatus() is implied.\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param {string} [title] optinal new title\n\t\t\t */\n\t\t\tnodeRenderTitle: function(ctx, title) {\n\t\t\t\t// set node connector images, links and text\n\t\t\t\tvar checkbox,\n\t\t\t\t\tclassName,\n\t\t\t\t\ticon,\n\t\t\t\t\tnodeTitle,\n\t\t\t\t\trole,\n\t\t\t\t\ttabindex,\n\t\t\t\t\ttooltip,\n\t\t\t\t\ticonTooltip,\n\t\t\t\t\tnode = ctx.node,\n\t\t\t\t\ttree = ctx.tree,\n\t\t\t\t\topts = ctx.options,\n\t\t\t\t\taria = opts.aria,\n\t\t\t\t\tlevel = node.getLevel(),\n\t\t\t\t\tares = [];\n\n\t\t\t\tif (title !== undefined) {\n\t\t\t\t\tnode.title = title;\n\t\t\t\t}\n\t\t\t\tif (!node.span || tree._enableUpdate === false) {\n\t\t\t\t\t// Silently bail out if node was not rendered yet, assuming\n\t\t\t\t\t// node.render() will be called as the node becomes visible\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Connector (expanded, expandable or simple)\n\t\t\t\trole =\n\t\t\t\t\taria && node.hasChildren() !== false\n\t\t\t\t\t\t? \" role='button'\"\n\t\t\t\t\t\t: \"\";\n\t\t\t\tif (level < opts.minExpandLevel) {\n\t\t\t\t\tif (!node.lazy) {\n\t\t\t\t\t\tnode.expanded = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (level > 1) {\n\t\t\t\t\t\tares.push(\n\t\t\t\t\t\t\t\"<span \" +\n\t\t\t\t\t\t\t\trole +\n\t\t\t\t\t\t\t\t\" class='fancytree-expander fancytree-expander-fixed'></span>\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// .. else (i.e. for root level) skip expander/connector alltogether\n\t\t\t\t} else {\n\t\t\t\t\tares.push(\n\t\t\t\t\t\t\"<span \" + role + \" class='fancytree-expander'></span>\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// Checkbox mode\n\t\t\t\tcheckbox = FT.evalOption(\"checkbox\", node, node, opts, false);\n\n\t\t\t\tif (checkbox && !node.isStatusNode()) {\n\t\t\t\t\trole = aria ? \" role='checkbox'\" : \"\";\n\t\t\t\t\tclassName = \"fancytree-checkbox\";\n\t\t\t\t\tif (\n\t\t\t\t\t\tcheckbox === \"radio\" ||\n\t\t\t\t\t\t(node.parent && node.parent.radiogroup)\n\t\t\t\t\t) {\n\t\t\t\t\t\tclassName += \" fancytree-radio\";\n\t\t\t\t\t}\n\t\t\t\t\tares.push(\n\t\t\t\t\t\t\"<span \" + role + \" class='\" + className + \"'></span>\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// Folder or doctype icon\n\t\t\t\tif (node.data.iconClass !== undefined) {\n\t\t\t\t\t// 2015-11-16\n\t\t\t\t\t// Handle / warn about backward compatibility\n\t\t\t\t\tif (node.icon) {\n\t\t\t\t\t\t$.error(\n\t\t\t\t\t\t\t\"'iconClass' node option is deprecated since v2.14.0: use 'icon' only instead\"\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode.warn(\n\t\t\t\t\t\t\t\"'iconClass' node option is deprecated since v2.14.0: use 'icon' instead\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tnode.icon = node.data.iconClass;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If opts.icon is a callback and returns something other than undefined, use that\n\t\t\t\t// else if node.icon is a boolean or string, use that\n\t\t\t\t// else if opts.icon is a boolean or string, use that\n\t\t\t\t// else show standard icon (which may be different for folders or documents)\n\t\t\t\ticon = FT.evalOption(\"icon\", node, node, opts, true);\n\t\t\t\t// if( typeof icon !== \"boolean\" ) {\n\t\t\t\t// \t// icon is defined, but not true/false: must be a string\n\t\t\t\t// \ticon = \"\" + icon;\n\t\t\t\t// }\n\t\t\t\tif (icon !== false) {\n\t\t\t\t\trole = aria ? \" role='presentation'\" : \"\";\n\n\t\t\t\t\ticonTooltip = FT.evalOption(\n\t\t\t\t\t\t\"iconTooltip\",\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\topts,\n\t\t\t\t\t\tnull\n\t\t\t\t\t);\n\t\t\t\t\ticonTooltip = iconTooltip\n\t\t\t\t\t\t? \" title='\" + _escapeTooltip(iconTooltip) + \"'\"\n\t\t\t\t\t\t: \"\";\n\n\t\t\t\t\tif (typeof icon === \"string\") {\n\t\t\t\t\t\tif (TEST_IMG.test(icon)) {\n\t\t\t\t\t\t\t// node.icon is an image url. Prepend imagePath\n\t\t\t\t\t\t\ticon =\n\t\t\t\t\t\t\t\ticon.charAt(0) === \"/\"\n\t\t\t\t\t\t\t\t\t? icon\n\t\t\t\t\t\t\t\t\t: (opts.imagePath || \"\") + icon;\n\t\t\t\t\t\t\tares.push(\n\t\t\t\t\t\t\t\t\"<img src='\" +\n\t\t\t\t\t\t\t\t\ticon +\n\t\t\t\t\t\t\t\t\t\"' class='fancytree-icon'\" +\n\t\t\t\t\t\t\t\t\ticonTooltip +\n\t\t\t\t\t\t\t\t\t\" alt='' />\"\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tares.push(\n\t\t\t\t\t\t\t\t\"<span \" +\n\t\t\t\t\t\t\t\t\trole +\n\t\t\t\t\t\t\t\t\t\" class='fancytree-custom-icon \" +\n\t\t\t\t\t\t\t\t\ticon +\n\t\t\t\t\t\t\t\t\t\"'\" +\n\t\t\t\t\t\t\t\t\ticonTooltip +\n\t\t\t\t\t\t\t\t\t\"></span>\"\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (icon.text) {\n\t\t\t\t\t\tares.push(\n\t\t\t\t\t\t\t\"<span \" +\n\t\t\t\t\t\t\t\trole +\n\t\t\t\t\t\t\t\t\" class='fancytree-custom-icon \" +\n\t\t\t\t\t\t\t\t(icon.addClass || \"\") +\n\t\t\t\t\t\t\t\t\"'\" +\n\t\t\t\t\t\t\t\ticonTooltip +\n\t\t\t\t\t\t\t\t\">\" +\n\t\t\t\t\t\t\t\tFT.escapeHtml(icon.text) +\n\t\t\t\t\t\t\t\t\"</span>\"\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (icon.html) {\n\t\t\t\t\t\tares.push(\n\t\t\t\t\t\t\t\"<span \" +\n\t\t\t\t\t\t\t\trole +\n\t\t\t\t\t\t\t\t\" class='fancytree-custom-icon \" +\n\t\t\t\t\t\t\t\t(icon.addClass || \"\") +\n\t\t\t\t\t\t\t\t\"'\" +\n\t\t\t\t\t\t\t\ticonTooltip +\n\t\t\t\t\t\t\t\t\">\" +\n\t\t\t\t\t\t\t\ticon.html +\n\t\t\t\t\t\t\t\t\"</span>\"\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// standard icon: theme css will take care of this\n\t\t\t\t\t\tares.push(\n\t\t\t\t\t\t\t\"<span \" +\n\t\t\t\t\t\t\t\trole +\n\t\t\t\t\t\t\t\t\" class='fancytree-icon'\" +\n\t\t\t\t\t\t\t\ticonTooltip +\n\t\t\t\t\t\t\t\t\"></span>\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Node title\n\t\t\t\tnodeTitle = \"\";\n\t\t\t\tif (opts.renderTitle) {\n\t\t\t\t\tnodeTitle =\n\t\t\t\t\t\topts.renderTitle.call(\n\t\t\t\t\t\t\ttree,\n\t\t\t\t\t\t\t{ type: \"renderTitle\" },\n\t\t\t\t\t\t\tctx\n\t\t\t\t\t\t) || \"\";\n\t\t\t\t}\n\t\t\t\tif (!nodeTitle) {\n\t\t\t\t\ttooltip = FT.evalOption(\"tooltip\", node, node, opts, null);\n\t\t\t\t\tif (tooltip === true) {\n\t\t\t\t\t\ttooltip = node.title;\n\t\t\t\t\t}\n\t\t\t\t\t// if( node.tooltip ) {\n\t\t\t\t\t// \ttooltip = node.tooltip;\n\t\t\t\t\t// } else if ( opts.tooltip ) {\n\t\t\t\t\t// \ttooltip = opts.tooltip === true ? node.title : opts.tooltip.call(tree, node);\n\t\t\t\t\t// }\n\t\t\t\t\ttooltip = tooltip\n\t\t\t\t\t\t? \" title='\" + _escapeTooltip(tooltip) + \"'\"\n\t\t\t\t\t\t: \"\";\n\t\t\t\t\ttabindex = opts.titlesTabbable ? \" tabindex='0'\" : \"\";\n\n\t\t\t\t\tnodeTitle =\n\t\t\t\t\t\t\"<span class='fancytree-title'\" +\n\t\t\t\t\t\ttooltip +\n\t\t\t\t\t\ttabindex +\n\t\t\t\t\t\t\">\" +\n\t\t\t\t\t\t(opts.escapeTitles\n\t\t\t\t\t\t\t? FT.escapeHtml(node.title)\n\t\t\t\t\t\t\t: node.title) +\n\t\t\t\t\t\t\"</span>\";\n\t\t\t\t}\n\t\t\t\tares.push(nodeTitle);\n\t\t\t\t// Note: this will trigger focusout, if node had the focus\n\t\t\t\t//$(node.span).html(ares.join(\"\")); // it will cleanup the jQuery data currently associated with SPAN (if any), but it executes more slowly\n\t\t\t\tnode.span.innerHTML = ares.join(\"\");\n\t\t\t\t// Update CSS classes\n\t\t\t\tthis.nodeRenderStatus(ctx);\n\t\t\t\tif (opts.enhanceTitle) {\n\t\t\t\t\tctx.$title = $(\">span.fancytree-title\", node.span);\n\t\t\t\t\tnodeTitle =\n\t\t\t\t\t\topts.enhanceTitle.call(\n\t\t\t\t\t\t\ttree,\n\t\t\t\t\t\t\t{ type: \"enhanceTitle\" },\n\t\t\t\t\t\t\tctx\n\t\t\t\t\t\t) || \"\";\n\t\t\t\t}\n\t\t\t},\n\t\t\t/** Update element classes according to node state.\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\tnodeRenderStatus: function(ctx) {\n\t\t\t\t// Set classes for current status\n\t\t\t\tvar $ariaElem,\n\t\t\t\t\tnode = ctx.node,\n\t\t\t\t\ttree = ctx.tree,\n\t\t\t\t\topts = ctx.options,\n\t\t\t\t\t// \tnodeContainer = node[tree.nodeContainerAttrName],\n\t\t\t\t\thasChildren = node.hasChildren(),\n\t\t\t\t\tisLastSib = node.isLastSibling(),\n\t\t\t\t\taria = opts.aria,\n\t\t\t\t\tcn = opts._classNames,\n\t\t\t\t\tcnList = [],\n\t\t\t\t\tstatusElem = node[tree.statusClassPropName];\n\n\t\t\t\tif (!statusElem || tree._enableUpdate === false) {\n\t\t\t\t\t// if this function is called for an unrendered node, ignore it (will be updated on nect render anyway)\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (aria) {\n\t\t\t\t\t$ariaElem = $(node.tr || node.li);\n\t\t\t\t}\n\t\t\t\t// Build a list of class names that we will add to the node <span>\n\t\t\t\tcnList.push(cn.node);\n\t\t\t\tif (tree.activeNode === node) {\n\t\t\t\t\tcnList.push(cn.active);\n\t\t\t\t\t// \t\t$(\">span.fancytree-title\", statusElem).attr(\"tabindex\", \"0\");\n\t\t\t\t\t// \t\ttree.$container.removeAttr(\"tabindex\");\n\t\t\t\t\t// }else{\n\t\t\t\t\t// \t\t$(\">span.fancytree-title\", statusElem).removeAttr(\"tabindex\");\n\t\t\t\t\t// \t\ttree.$container.attr(\"tabindex\", \"0\");\n\t\t\t\t}\n\t\t\t\tif (tree.focusNode === node) {\n\t\t\t\t\tcnList.push(cn.focused);\n\t\t\t\t}\n\t\t\t\tif (node.expanded) {\n\t\t\t\t\tcnList.push(cn.expanded);\n\t\t\t\t}\n\t\t\t\tif (aria) {\n\t\t\t\t\tif (hasChildren === false) {\n\t\t\t\t\t\t$ariaElem.removeAttr(\"aria-expanded\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$ariaElem.attr(\"aria-expanded\", Boolean(node.expanded));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (node.folder) {\n\t\t\t\t\tcnList.push(cn.folder);\n\t\t\t\t}\n\t\t\t\tif (hasChildren !== false) {\n\t\t\t\t\tcnList.push(cn.hasChildren);\n\t\t\t\t}\n\t\t\t\t// TODO: required?\n\t\t\t\tif (isLastSib) {\n\t\t\t\t\tcnList.push(cn.lastsib);\n\t\t\t\t}\n\t\t\t\tif (node.lazy && node.children == null) {\n\t\t\t\t\tcnList.push(cn.lazy);\n\t\t\t\t}\n\t\t\t\tif (node.partload) {\n\t\t\t\t\tcnList.push(cn.partload);\n\t\t\t\t}\n\t\t\t\tif (node.partsel) {\n\t\t\t\t\tcnList.push(cn.partsel);\n\t\t\t\t}\n\t\t\t\tif (FT.evalOption(\"unselectable\", node, node, opts, false)) {\n\t\t\t\t\tcnList.push(cn.unselectable);\n\t\t\t\t}\n\t\t\t\tif (node._isLoading) {\n\t\t\t\t\tcnList.push(cn.loading);\n\t\t\t\t}\n\t\t\t\tif (node._error) {\n\t\t\t\t\tcnList.push(cn.error);\n\t\t\t\t}\n\t\t\t\tif (node.statusNodeType) {\n\t\t\t\t\tcnList.push(cn.statusNodePrefix + node.statusNodeType);\n\t\t\t\t}\n\t\t\t\tif (node.selected) {\n\t\t\t\t\tcnList.push(cn.selected);\n\t\t\t\t\tif (aria) {\n\t\t\t\t\t\t$ariaElem.attr(\"aria-selected\", true);\n\t\t\t\t\t}\n\t\t\t\t} else if (aria) {\n\t\t\t\t\t$ariaElem.attr(\"aria-selected\", false);\n\t\t\t\t}\n\t\t\t\tif (node.extraClasses) {\n\t\t\t\t\tcnList.push(node.extraClasses);\n\t\t\t\t}\n\t\t\t\t// IE6 doesn't correctly evaluate multiple class names,\n\t\t\t\t// so we create combined class names that can be used in the CSS\n\t\t\t\tif (hasChildren === false) {\n\t\t\t\t\tcnList.push(\n\t\t\t\t\t\tcn.combinedExpanderPrefix + \"n\" + (isLastSib ? \"l\" : \"\")\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tcnList.push(\n\t\t\t\t\t\tcn.combinedExpanderPrefix +\n\t\t\t\t\t\t\t(node.expanded ? \"e\" : \"c\") +\n\t\t\t\t\t\t\t(node.lazy && node.children == null ? \"d\" : \"\") +\n\t\t\t\t\t\t\t(isLastSib ? \"l\" : \"\")\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tcnList.push(\n\t\t\t\t\tcn.combinedIconPrefix +\n\t\t\t\t\t\t(node.expanded ? \"e\" : \"c\") +\n\t\t\t\t\t\t(node.folder ? \"f\" : \"\")\n\t\t\t\t);\n\t\t\t\t// node.span.className = cnList.join(\" \");\n\t\t\t\tstatusElem.className = cnList.join(\" \");\n\n\t\t\t\t// TODO: we should not set this in the <span> tag also, if we set it here:\n\t\t\t\t// Maybe most (all) of the classes should be set in LI instead of SPAN?\n\t\t\t\tif (node.li) {\n\t\t\t\t\t// #719: we have to consider that there may be already other classes:\n\t\t\t\t\t$(node.li).toggleClass(cn.lastsib, isLastSib);\n\t\t\t\t}\n\t\t\t},\n\t\t\t/** Activate node.\n\t\t\t * flag defaults to true.\n\t\t\t * If flag is true, the node is activated (must be a synchronous operation)\n\t\t\t * If flag is false, the node is deactivated (must be a synchronous operation)\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param {boolean} [flag=true]\n\t\t\t * @param {object} [opts] additional options. Defaults to {noEvents: false, noFocus: false}\n\t\t\t * @returns {$.Promise}\n\t\t\t */\n\t\t\tnodeSetActive: function(ctx, flag, callOpts) {\n\t\t\t\t// Handle user click / [space] / [enter], according to clickFolderMode.\n\t\t\t\tcallOpts = callOpts || {};\n\t\t\t\tvar subCtx,\n\t\t\t\t\tnode = ctx.node,\n\t\t\t\t\ttree = ctx.tree,\n\t\t\t\t\topts = ctx.options,\n\t\t\t\t\tnoEvents = callOpts.noEvents === true,\n\t\t\t\t\tnoFocus = callOpts.noFocus === true,\n\t\t\t\t\tscroll = callOpts.scrollIntoView !== false,\n\t\t\t\t\tisActive = node === tree.activeNode;\n\n\t\t\t\t// flag defaults to true\n\t\t\t\tflag = flag !== false;\n\t\t\t\t// node.debug(\"nodeSetActive\", flag);\n\n\t\t\t\tif (isActive === flag) {\n\t\t\t\t\t// Nothing to do\n\t\t\t\t\treturn _getResolvedPromise(node);\n\t\t\t\t} else if (\n\t\t\t\t\tflag &&\n\t\t\t\t\t!noEvents &&\n\t\t\t\t\tthis._triggerNodeEvent(\n\t\t\t\t\t\t\"beforeActivate\",\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tctx.originalEvent\n\t\t\t\t\t) === false\n\t\t\t\t) {\n\t\t\t\t\t// Callback returned false\n\t\t\t\t\treturn _getRejectedPromise(node, [\"rejected\"]);\n\t\t\t\t}\n\t\t\t\tif (flag) {\n\t\t\t\t\tif (tree.activeNode) {\n\t\t\t\t\t\t_assert(\n\t\t\t\t\t\t\ttree.activeNode !== node,\n\t\t\t\t\t\t\t\"node was active (inconsistency)\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsubCtx = $.extend({}, ctx, { node: tree.activeNode });\n\t\t\t\t\t\ttree.nodeSetActive(subCtx, false);\n\t\t\t\t\t\t_assert(\n\t\t\t\t\t\t\ttree.activeNode === null,\n\t\t\t\t\t\t\t\"deactivate was out of sync?\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (opts.activeVisible) {\n\t\t\t\t\t\t// If no focus is set (noFocus: true) and there is no focused node, this node is made visible.\n\t\t\t\t\t\t// scroll = noFocus && tree.focusNode == null;\n\t\t\t\t\t\t// #863: scroll by default (unless `scrollIntoView: false` was passed)\n\t\t\t\t\t\tnode.makeVisible({ scrollIntoView: scroll });\n\t\t\t\t\t}\n\t\t\t\t\ttree.activeNode = node;\n\t\t\t\t\ttree.nodeRenderStatus(ctx);\n\t\t\t\t\tif (!noFocus) {\n\t\t\t\t\t\ttree.nodeSetFocus(ctx);\n\t\t\t\t\t}\n\t\t\t\t\tif (!noEvents) {\n\t\t\t\t\t\ttree._triggerNodeEvent(\n\t\t\t\t\t\t\t\"activate\",\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\tctx.originalEvent\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t_assert(\n\t\t\t\t\t\ttree.activeNode === node,\n\t\t\t\t\t\t\"node was not active (inconsistency)\"\n\t\t\t\t\t);\n\t\t\t\t\ttree.activeNode = null;\n\t\t\t\t\tthis.nodeRenderStatus(ctx);\n\t\t\t\t\tif (!noEvents) {\n\t\t\t\t\t\tctx.tree._triggerNodeEvent(\n\t\t\t\t\t\t\t\"deactivate\",\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\tctx.originalEvent\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn _getResolvedPromise(node);\n\t\t\t},\n\t\t\t/** Expand or collapse node, return Deferred.promise.\n\t\t\t *\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param {boolean} [flag=true]\n\t\t\t * @param {object} [opts] additional options. Defaults to `{noAnimation: false, noEvents: false}`\n\t\t\t * @returns {$.Promise} The deferred will be resolved as soon as the (lazy)\n\t\t\t * data was retrieved, rendered, and the expand animation finished.\n\t\t\t */\n\t\t\tnodeSetExpanded: function(ctx, flag, callOpts) {\n\t\t\t\tcallOpts = callOpts || {};\n\t\t\t\tvar _afterLoad,\n\t\t\t\t\tdfd,\n\t\t\t\t\ti,\n\t\t\t\t\tl,\n\t\t\t\t\tparents,\n\t\t\t\t\tprevAC,\n\t\t\t\t\tnode = ctx.node,\n\t\t\t\t\ttree = ctx.tree,\n\t\t\t\t\topts = ctx.options,\n\t\t\t\t\tnoAnimation = callOpts.noAnimation === true,\n\t\t\t\t\tnoEvents = callOpts.noEvents === true;\n\n\t\t\t\t// flag defaults to true\n\t\t\t\tflag = flag !== false;\n\n\t\t\t\t// node.debug(\"nodeSetExpanded(\" + flag + \")\");\n\n\t\t\t\tif ((node.expanded && flag) || (!node.expanded && !flag)) {\n\t\t\t\t\t// Nothing to do\n\t\t\t\t\t// node.debug(\"nodeSetExpanded(\" + flag + \"): nothing to do\");\n\t\t\t\t\treturn _getResolvedPromise(node);\n\t\t\t\t} else if (flag && !node.lazy && !node.hasChildren()) {\n\t\t\t\t\t// Prevent expanding of empty nodes\n\t\t\t\t\t// return _getRejectedPromise(node, [\"empty\"]);\n\t\t\t\t\treturn _getResolvedPromise(node);\n\t\t\t\t} else if (!flag && node.getLevel() < opts.minExpandLevel) {\n\t\t\t\t\t// Prevent collapsing locked levels\n\t\t\t\t\treturn _getRejectedPromise(node, [\"locked\"]);\n\t\t\t\t} else if (\n\t\t\t\t\t!noEvents &&\n\t\t\t\t\tthis._triggerNodeEvent(\n\t\t\t\t\t\t\"beforeExpand\",\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tctx.originalEvent\n\t\t\t\t\t) === false\n\t\t\t\t) {\n\t\t\t\t\t// Callback returned false\n\t\t\t\t\treturn _getRejectedPromise(node, [\"rejected\"]);\n\t\t\t\t}\n\t\t\t\t// If this node inside a collpased node, no animation and scrolling is needed\n\t\t\t\tif (!noAnimation && !node.isVisible()) {\n\t\t\t\t\tnoAnimation = callOpts.noAnimation = true;\n\t\t\t\t}\n\n\t\t\t\tdfd = new $.Deferred();\n\n\t\t\t\t// Auto-collapse mode: collapse all siblings\n\t\t\t\tif (flag && !node.expanded && opts.autoCollapse) {\n\t\t\t\t\tparents = node.getParentList(false, true);\n\t\t\t\t\tprevAC = opts.autoCollapse;\n\t\t\t\t\ttry {\n\t\t\t\t\t\topts.autoCollapse = false;\n\t\t\t\t\t\tfor (i = 0, l = parents.length; i < l; i++) {\n\t\t\t\t\t\t\t// TODO: should return promise?\n\t\t\t\t\t\t\tthis._callHook(\n\t\t\t\t\t\t\t\t\"nodeCollapseSiblings\",\n\t\t\t\t\t\t\t\tparents[i],\n\t\t\t\t\t\t\t\tcallOpts\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\topts.autoCollapse = prevAC;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger expand/collapse after expanding\n\t\t\t\tdfd.done(function() {\n\t\t\t\t\tvar lastChild = node.getLastChild();\n\n\t\t\t\t\tif (flag && opts.autoScroll && !noAnimation && lastChild) {\n\t\t\t\t\t\t// Scroll down to last child, but keep current node visible\n\t\t\t\t\t\tlastChild\n\t\t\t\t\t\t\t.scrollIntoView(true, { topNode: node })\n\t\t\t\t\t\t\t.always(function() {\n\t\t\t\t\t\t\t\tif (!noEvents) {\n\t\t\t\t\t\t\t\t\tctx.tree._triggerNodeEvent(\n\t\t\t\t\t\t\t\t\t\tflag ? \"expand\" : \"collapse\",\n\t\t\t\t\t\t\t\t\t\tctx\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!noEvents) {\n\t\t\t\t\t\t\tctx.tree._triggerNodeEvent(\n\t\t\t\t\t\t\t\tflag ? \"expand\" : \"collapse\",\n\t\t\t\t\t\t\t\tctx\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// vvv Code below is executed after loading finished:\n\t\t\t\t_afterLoad = function(callback) {\n\t\t\t\t\tvar cn = opts._classNames,\n\t\t\t\t\t\tisVisible,\n\t\t\t\t\t\tisExpanded,\n\t\t\t\t\t\teffect = opts.toggleEffect;\n\n\t\t\t\t\tnode.expanded = flag;\n\t\t\t\t\ttree._callHook(\n\t\t\t\t\t\t\"treeStructureChanged\",\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tflag ? \"expand\" : \"collapse\"\n\t\t\t\t\t);\n\t\t\t\t\t// Create required markup, but make sure the top UL is hidden, so we\n\t\t\t\t\t// can animate later\n\t\t\t\t\ttree._callHook(\"nodeRender\", ctx, false, false, true);\n\n\t\t\t\t\t// Hide children, if node is collapsed\n\t\t\t\t\tif (node.ul) {\n\t\t\t\t\t\tisVisible = node.ul.style.display !== \"none\";\n\t\t\t\t\t\tisExpanded = !!node.expanded;\n\t\t\t\t\t\tif (isVisible === isExpanded) {\n\t\t\t\t\t\t\tnode.warn(\n\t\t\t\t\t\t\t\t\"nodeSetExpanded: UL.style.display already set\"\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (!effect || noAnimation) {\n\t\t\t\t\t\t\tnode.ul.style.display =\n\t\t\t\t\t\t\t\tnode.expanded || !parent ? \"\" : \"none\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// The UI toggle() effect works with the ext-wide extension,\n\t\t\t\t\t\t\t// while jQuery.animate() has problems when the title span\n\t\t\t\t\t\t\t// has position: absolute.\n\t\t\t\t\t\t\t// Since jQuery UI 1.12, the blind effect requires the parent\n\t\t\t\t\t\t\t// element to have 'position: relative'.\n\t\t\t\t\t\t\t// See #716, #717\n\t\t\t\t\t\t\t$(node.li).addClass(cn.animating); // #717\n\n\t\t\t\t\t\t\tif ($.isFunction($(node.ul)[effect.effect])) {\n\t\t\t\t\t\t\t\ttree.debug(\n\t\t\t\t\t\t\t\t\t\"use jquery.\" + effect.effect + \" method\"\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t$(node.ul)[effect.effect]({\n\t\t\t\t\t\t\t\t\tduration: effect.duration,\n\t\t\t\t\t\t\t\t\talways: function() {\n\t\t\t\t\t\t\t\t\t\t// node.debug(\"fancytree-animating end: \" + node.li.className);\n\t\t\t\t\t\t\t\t\t\t$(this).removeClass(cn.animating); // #716\n\t\t\t\t\t\t\t\t\t\t$(node.li).removeClass(cn.animating); // #717\n\t\t\t\t\t\t\t\t\t\tcallback();\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// The UI toggle() effect works with the ext-wide extension,\n\t\t\t\t\t\t\t\t// while jQuery.animate() has problems when the title span\n\t\t\t\t\t\t\t\t// has positon: absolute.\n\t\t\t\t\t\t\t\t// Since jQuery UI 1.12, the blind effect requires the parent\n\t\t\t\t\t\t\t\t// element to have 'position: relative'.\n\t\t\t\t\t\t\t\t// See #716, #717\n\t\t\t\t\t\t\t\t// tree.debug(\"use specified effect (\" + effect.effect + \") with the jqueryui.toggle method\");\n\n\t\t\t\t\t\t\t\t// try to stop an animation that might be already in progress\n\t\t\t\t\t\t\t\t$(node.ul).stop(true, true); //< does not work after resetLazy has been called for a node whose animation wasn't complete and effect was \"blind\"\n\n\t\t\t\t\t\t\t\t// dirty fix to remove a defunct animation (effect: \"blind\") after resetLazy has been called\n\t\t\t\t\t\t\t\t$(node.ul)\n\t\t\t\t\t\t\t\t\t.parent()\n\t\t\t\t\t\t\t\t\t.find(\".ui-effects-placeholder\")\n\t\t\t\t\t\t\t\t\t.remove();\n\n\t\t\t\t\t\t\t\t$(node.ul).toggle(\n\t\t\t\t\t\t\t\t\teffect.effect,\n\t\t\t\t\t\t\t\t\teffect.options,\n\t\t\t\t\t\t\t\t\teffect.duration,\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\t// node.debug(\"fancytree-animating end: \" + node.li.className);\n\t\t\t\t\t\t\t\t\t\t$(this).removeClass(cn.animating); // #716\n\t\t\t\t\t\t\t\t\t\t$(node.li).removeClass(cn.animating); // #717\n\t\t\t\t\t\t\t\t\t\tcallback();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcallback();\n\t\t\t\t};\n\t\t\t\t// ^^^ Code above is executed after loading finshed.\n\n\t\t\t\t// Load lazy nodes, if any. Then continue with _afterLoad()\n\t\t\t\tif (flag && node.lazy && node.hasChildren() === undefined) {\n\t\t\t\t\t// node.debug(\"nodeSetExpanded: load start...\");\n\t\t\t\t\tnode.load()\n\t\t\t\t\t\t.done(function() {\n\t\t\t\t\t\t\t// node.debug(\"nodeSetExpanded: load done\");\n\t\t\t\t\t\t\tif (dfd.notifyWith) {\n\t\t\t\t\t\t\t\t// requires jQuery 1.6+\n\t\t\t\t\t\t\t\tdfd.notifyWith(node, [\"loaded\"]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t_afterLoad(function() {\n\t\t\t\t\t\t\t\tdfd.resolveWith(node);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.fail(function(errMsg) {\n\t\t\t\t\t\t\t_afterLoad(function() {\n\t\t\t\t\t\t\t\tdfd.rejectWith(node, [\n\t\t\t\t\t\t\t\t\t\"load failed (\" + errMsg + \")\",\n\t\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t/*\n\t\t\t\t\tvar source = tree._triggerNodeEvent(\"lazyLoad\", node, ctx.originalEvent);\n\t\t\t\t\t_assert(typeof source !== \"boolean\", \"lazyLoad event must return source in data.result\");\n\t\t\t\t\tnode.debug(\"nodeSetExpanded: load start...\");\n\t\t\t\t\tthis._callHook(\"nodeLoadChildren\", ctx, source).done(function(){\n\t\t\t\t\t\tnode.debug(\"nodeSetExpanded: load done\");\n\t\t\t\t\t\tif(dfd.notifyWith){ // requires jQuery 1.6+\n\t\t\t\t\t\t\tdfd.notifyWith(node, [\"loaded\"]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_afterLoad.call(tree);\n\t\t\t\t\t}).fail(function(errMsg){\n\t\t\t\t\t\tdfd.rejectWith(node, [\"load failed (\" + errMsg + \")\"]);\n\t\t\t\t\t});\n\t\t\t\t\t*/\n\t\t\t\t} else {\n\t\t\t\t\t_afterLoad(function() {\n\t\t\t\t\t\tdfd.resolveWith(node);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// node.debug(\"nodeSetExpanded: returns\");\n\t\t\t\treturn dfd.promise();\n\t\t\t},\n\t\t\t/** Focus or blur this node.\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param {boolean} [flag=true]\n\t\t\t */\n\t\t\tnodeSetFocus: function(ctx, flag) {\n\t\t\t\t// ctx.node.debug(\"nodeSetFocus(\" + flag + \")\");\n\t\t\t\tvar ctx2,\n\t\t\t\t\ttree = ctx.tree,\n\t\t\t\t\tnode = ctx.node,\n\t\t\t\t\topts = tree.options,\n\t\t\t\t\t// et = ctx.originalEvent && ctx.originalEvent.type,\n\t\t\t\t\tisInput = ctx.originalEvent\n\t\t\t\t\t\t? $(ctx.originalEvent.target).is(\":input\")\n\t\t\t\t\t\t: false;\n\n\t\t\t\tflag = flag !== false;\n\n\t\t\t\t// (node || tree).debug(\"nodeSetFocus(\" + flag + \"), event: \" + et + \", isInput: \"+ isInput);\n\t\t\t\t// Blur previous node if any\n\t\t\t\tif (tree.focusNode) {\n\t\t\t\t\tif (tree.focusNode === node && flag) {\n\t\t\t\t\t\t// node.debug(\"nodeSetFocus(\" + flag + \"): nothing to do\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tctx2 = $.extend({}, ctx, { node: tree.focusNode });\n\t\t\t\t\ttree.focusNode = null;\n\t\t\t\t\tthis._triggerNodeEvent(\"blur\", ctx2);\n\t\t\t\t\tthis._callHook(\"nodeRenderStatus\", ctx2);\n\t\t\t\t}\n\t\t\t\t// Set focus to container and node\n\t\t\t\tif (flag) {\n\t\t\t\t\tif (!this.hasFocus()) {\n\t\t\t\t\t\tnode.debug(\"nodeSetFocus: forcing container focus\");\n\t\t\t\t\t\tthis._callHook(\"treeSetFocus\", ctx, true, {\n\t\t\t\t\t\t\tcalledByNode: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tnode.makeVisible({ scrollIntoView: false });\n\t\t\t\t\ttree.focusNode = node;\n\t\t\t\t\tif (opts.titlesTabbable) {\n\t\t\t\t\t\tif (!isInput) {\n\t\t\t\t\t\t\t// #621\n\t\t\t\t\t\t\t$(node.span)\n\t\t\t\t\t\t\t\t.find(\".fancytree-title\")\n\t\t\t\t\t\t\t\t.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (opts.aria) {\n\t\t\t\t\t\t// Set active descendant to node's span ID (create one, if needed)\n\t\t\t\t\t\t$(tree.$container).attr(\n\t\t\t\t\t\t\t\"aria-activedescendant\",\n\t\t\t\t\t\t\t$(node.tr || node.li)\n\t\t\t\t\t\t\t\t.uniqueId()\n\t\t\t\t\t\t\t\t.attr(\"id\")\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// \"ftal_\" + opts.idPrefix + node.key);\n\t\t\t\t\t}\n\t\t\t\t\t// $(node.span).find(\".fancytree-title\").focus();\n\t\t\t\t\tthis._triggerNodeEvent(\"focus\", ctx);\n\n\t\t\t\t\t// determine if we have focus on or inside tree container\n\t\t\t\t\tvar hasFancytreeFocus =\n\t\t\t\t\t\tdocument.activeElement === tree.$container.get(0) ||\n\t\t\t\t\t\t$(document.activeElement, tree.$container).length >= 1;\n\n\t\t\t\t\tif (!hasFancytreeFocus) {\n\t\t\t\t\t\t// We cannot set KB focus to a node, so use the tree container\n\t\t\t\t\t\t// #563, #570: IE scrolls on every call to .focus(), if the container\n\t\t\t\t\t\t// is partially outside the viewport. So do it only, when absolutely\n\t\t\t\t\t\t// necessary.\n\t\t\t\t\t\t$(tree.$container).focus();\n\t\t\t\t\t}\n\n\t\t\t\t\t// if( opts.autoActivate ){\n\t\t\t\t\t// \ttree.nodeSetActive(ctx, true);\n\t\t\t\t\t// }\n\t\t\t\t\tif (opts.autoScroll) {\n\t\t\t\t\t\tnode.scrollIntoView();\n\t\t\t\t\t}\n\t\t\t\t\tthis._callHook(\"nodeRenderStatus\", ctx);\n\t\t\t\t}\n\t\t\t},\n\t\t\t/** (De)Select node, return new status (sync).\n\t\t\t *\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param {boolean} [flag=true]\n\t\t\t * @param {object} [opts] additional options. Defaults to {noEvents: false,\n\t\t\t * propagateDown: null, propagateUp: null,\n\t\t\t * callback: null,\n\t\t\t * }\n\t\t\t * @returns {boolean} previous status\n\t\t\t */\n\t\t\tnodeSetSelected: function(ctx, flag, callOpts) {\n\t\t\t\tcallOpts = callOpts || {};\n\t\t\t\tvar node = ctx.node,\n\t\t\t\t\ttree = ctx.tree,\n\t\t\t\t\topts = ctx.options,\n\t\t\t\t\tnoEvents = callOpts.noEvents === true,\n\t\t\t\t\tparent = node.parent;\n\n\t\t\t\t// flag defaults to true\n\t\t\t\tflag = flag !== false;\n\n\t\t\t\t// node.debug(\"nodeSetSelected(\" + flag + \")\", ctx);\n\n\t\t\t\t// Cannot (de)select unselectable nodes directly (only by propagation or\n\t\t\t\t// by setting the `.selected` property)\n\t\t\t\tif (FT.evalOption(\"unselectable\", node, node, opts, false)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Remember the user's intent, in case down -> up propagation prevents\n\t\t\t\t// applying it to node.selected\n\t\t\t\tnode._lastSelectIntent = flag; // Confusing use of '!'\n\n\t\t\t\t// Nothing to do?\n\t\t\t\tif (!!node.selected === flag) {\n\t\t\t\t\tif (opts.selectMode === 3 && node.partsel && !flag) {\n\t\t\t\t\t\t// If propagation prevented selecting this node last time, we still\n\t\t\t\t\t\t// want to allow to apply setSelected(false) now\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn flag;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!noEvents &&\n\t\t\t\t\tthis._triggerNodeEvent(\n\t\t\t\t\t\t\"beforeSelect\",\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tctx.originalEvent\n\t\t\t\t\t) === false\n\t\t\t\t) {\n\t\t\t\t\treturn !!node.selected;\n\t\t\t\t}\n\t\t\t\tif (flag && opts.selectMode === 1) {\n\t\t\t\t\t// single selection mode (we don't uncheck all tree nodes, for performance reasons)\n\t\t\t\t\tif (tree.lastSelectedNode) {\n\t\t\t\t\t\ttree.lastSelectedNode.setSelected(false);\n\t\t\t\t\t}\n\t\t\t\t\tnode.selected = flag;\n\t\t\t\t} else if (\n\t\t\t\t\topts.selectMode === 3 &&\n\t\t\t\t\tparent &&\n\t\t\t\t\t!parent.radiogroup &&\n\t\t\t\t\t!node.radiogroup\n\t\t\t\t) {\n\t\t\t\t\t// multi-hierarchical selection mode\n\t\t\t\t\tnode.selected = flag;\n\t\t\t\t\tnode.fixSelection3AfterClick(callOpts);\n\t\t\t\t} else if (parent && parent.radiogroup) {\n\t\t\t\t\tnode.visitSiblings(function(n) {\n\t\t\t\t\t\tn._changeSelectStatusAttrs(flag && n === node);\n\t\t\t\t\t}, true);\n\t\t\t\t} else {\n\t\t\t\t\t// default: selectMode: 2, multi selection mode\n\t\t\t\t\tnode.selected = flag;\n\t\t\t\t}\n\t\t\t\tthis.nodeRenderStatus(ctx);\n\t\t\t\ttree.lastSelectedNode = flag ? node : null;\n\t\t\t\tif (!noEvents) {\n\t\t\t\t\ttree._triggerNodeEvent(\"select\", ctx);\n\t\t\t\t}\n\t\t\t},\n\t\t\t/** Show node status (ok, loading, error, nodata) using styles and a dummy child node.\n\t\t\t *\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param status\n\t\t\t * @param message\n\t\t\t * @param details\n\t\t\t * @since 2.3\n\t\t\t */\n\t\t\tnodeSetStatus: function(ctx, status, message, details) {\n\t\t\t\tvar node = ctx.node,\n\t\t\t\t\ttree = ctx.tree;\n\n\t\t\t\tfunction _clearStatusNode() {\n\t\t\t\t\t// Remove dedicated dummy node, if any\n\t\t\t\t\tvar firstChild = node.children ? node.children[0] : null;\n\t\t\t\t\tif (firstChild && firstChild.isStatusNode()) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// I've seen exceptions here with loadKeyPath...\n\t\t\t\t\t\t\tif (node.ul) {\n\t\t\t\t\t\t\t\tnode.ul.removeChild(firstChild.li);\n\t\t\t\t\t\t\t\tfirstChild.li = null; // avoid leaks (DT issue 215)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t\tif (node.children.length === 1) {\n\t\t\t\t\t\t\tnode.children = [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.children.shift();\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttree._callHook(\n\t\t\t\t\t\t\t\"treeStructureChanged\",\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\"clearStatusNode\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfunction _setStatusNode(data, type) {\n\t\t\t\t\t// Create/modify the dedicated dummy node for 'loading...' or\n\t\t\t\t\t// 'error!' status. (only called for direct child of the invisible\n\t\t\t\t\t// system root)\n\t\t\t\t\tvar firstChild = node.children ? node.children[0] : null;\n\t\t\t\t\tif (firstChild && firstChild.isStatusNode()) {\n\t\t\t\t\t\t$.extend(firstChild, data);\n\t\t\t\t\t\tfirstChild.statusNodeType = type;\n\t\t\t\t\t\ttree._callHook(\"nodeRenderTitle\", firstChild);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode._setChildren([data]);\n\t\t\t\t\t\ttree._callHook(\n\t\t\t\t\t\t\t\"treeStructureChanged\",\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\"setStatusNode\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tnode.children[0].statusNodeType = type;\n\t\t\t\t\t\ttree.render();\n\t\t\t\t\t}\n\t\t\t\t\treturn node.children[0];\n\t\t\t\t}\n\n\t\t\t\tswitch (status) {\n\t\t\t\t\tcase \"ok\":\n\t\t\t\t\t\t_clearStatusNode();\n\t\t\t\t\t\tnode._isLoading = false;\n\t\t\t\t\t\tnode._error = null;\n\t\t\t\t\t\tnode.renderStatus();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"loading\":\n\t\t\t\t\t\tif (!node.parent) {\n\t\t\t\t\t\t\t_setStatusNode(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\t\t\ttree.options.strings.loading +\n\t\t\t\t\t\t\t\t\t\t(message ? \" (\" + message + \")\" : \"\"),\n\t\t\t\t\t\t\t\t\t// icon: true, // needed for 'loding' icon\n\t\t\t\t\t\t\t\t\tcheckbox: false,\n\t\t\t\t\t\t\t\t\ttooltip: details,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tstatus\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnode._isLoading = true;\n\t\t\t\t\t\tnode._error = null;\n\t\t\t\t\t\tnode.renderStatus();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"error\":\n\t\t\t\t\t\t_setStatusNode(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\t\ttree.options.strings.loadError +\n\t\t\t\t\t\t\t\t\t(message ? \" (\" + message + \")\" : \"\"),\n\t\t\t\t\t\t\t\t// icon: false,\n\t\t\t\t\t\t\t\tcheckbox: false,\n\t\t\t\t\t\t\t\ttooltip: details,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstatus\n\t\t\t\t\t\t);\n\t\t\t\t\t\tnode._isLoading = false;\n\t\t\t\t\t\tnode._error = { message: message, details: details };\n\t\t\t\t\t\tnode.renderStatus();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"nodata\":\n\t\t\t\t\t\t_setStatusNode(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttitle: message || tree.options.strings.noData,\n\t\t\t\t\t\t\t\t// icon: false,\n\t\t\t\t\t\t\t\tcheckbox: false,\n\t\t\t\t\t\t\t\ttooltip: details,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstatus\n\t\t\t\t\t\t);\n\t\t\t\t\t\tnode._isLoading = false;\n\t\t\t\t\t\tnode._error = null;\n\t\t\t\t\t\tnode.renderStatus();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$.error(\"invalid node status \" + status);\n\t\t\t\t}\n\t\t\t},\n\t\t\t/**\n\t\t\t *\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\tnodeToggleExpanded: function(ctx) {\n\t\t\t\treturn this.nodeSetExpanded(ctx, !ctx.node.expanded);\n\t\t\t},\n\t\t\t/**\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\tnodeToggleSelected: function(ctx) {\n\t\t\t\tvar node = ctx.node,\n\t\t\t\t\tflag = !node.selected;\n\n\t\t\t\t// In selectMode: 3 this node may be unselected+partsel, even if\n\t\t\t\t// setSelected(true) was called before, due to `unselectable` children.\n\t\t\t\t// In this case, we now toggle as `setSelected(false)`\n\t\t\t\tif (\n\t\t\t\t\tnode.partsel &&\n\t\t\t\t\t!node.selected &&\n\t\t\t\t\tnode._lastSelectIntent === true\n\t\t\t\t) {\n\t\t\t\t\tflag = false;\n\t\t\t\t\tnode.selected = true; // so it is not considered 'nothing to do'\n\t\t\t\t}\n\t\t\t\tnode._lastSelectIntent = flag;\n\t\t\t\treturn this.nodeSetSelected(ctx, flag);\n\t\t\t},\n\t\t\t/** Remove all nodes.\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\ttreeClear: function(ctx) {\n\t\t\t\tvar tree = ctx.tree;\n\t\t\t\ttree.activeNode = null;\n\t\t\t\ttree.focusNode = null;\n\t\t\t\ttree.$div.find(\">ul.fancytree-container\").empty();\n\t\t\t\t// TODO: call destructors and remove reference loops\n\t\t\t\ttree.rootNode.children = null;\n\t\t\t\ttree._callHook(\"treeStructureChanged\", ctx, \"clear\");\n\t\t\t},\n\t\t\t/** Widget was created (called only once, even it re-initialized).\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\ttreeCreate: function(ctx) {},\n\t\t\t/** Widget was destroyed.\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\ttreeDestroy: function(ctx) {\n\t\t\t\tthis.$div.find(\">ul.fancytree-container\").remove();\n\t\t\t\tif (this.$source) {\n\t\t\t\t\tthis.$source.removeClass(\"fancytree-helper-hidden\");\n\t\t\t\t}\n\t\t\t},\n\t\t\t/** Widget was (re-)initialized.\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\ttreeInit: function(ctx) {\n\t\t\t\tvar tree = ctx.tree,\n\t\t\t\t\topts = tree.options;\n\n\t\t\t\t//this.debug(\"Fancytree.treeInit()\");\n\t\t\t\t// Add container to the TAB chain\n\t\t\t\t// See http://www.w3.org/TR/wai-aria-practices/#focus_activedescendant\n\t\t\t\t// #577: Allow to set tabindex to \"0\", \"-1\" and \"\"\n\t\t\t\ttree.$container.attr(\"tabindex\", opts.tabindex);\n\n\t\t\t\t// Copy some attributes to tree.data\n\t\t\t\t$.each(TREE_ATTRS, function(i, attr) {\n\t\t\t\t\tif (opts[attr] !== undefined) {\n\t\t\t\t\t\ttree.info(\"Move option \" + attr + \" to tree\");\n\t\t\t\t\t\ttree[attr] = opts[attr];\n\t\t\t\t\t\tdelete opts[attr];\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (opts.checkboxAutoHide) {\n\t\t\t\t\ttree.$container.addClass(\"fancytree-checkbox-auto-hide\");\n\t\t\t\t}\n\t\t\t\tif (opts.rtl) {\n\t\t\t\t\ttree.$container\n\t\t\t\t\t\t.attr(\"DIR\", \"RTL\")\n\t\t\t\t\t\t.addClass(\"fancytree-rtl\");\n\t\t\t\t} else {\n\t\t\t\t\ttree.$container\n\t\t\t\t\t\t.removeAttr(\"DIR\")\n\t\t\t\t\t\t.removeClass(\"fancytree-rtl\");\n\t\t\t\t}\n\t\t\t\tif (opts.aria) {\n\t\t\t\t\ttree.$container.attr(\"role\", \"tree\");\n\t\t\t\t\tif (opts.selectMode !== 1) {\n\t\t\t\t\t\ttree.$container.attr(\"aria-multiselectable\", true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.treeLoad(ctx);\n\t\t\t},\n\t\t\t/** Parse Fancytree from source, as configured in the options.\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param {object} [source] optional new source (use last data otherwise)\n\t\t\t */\n\t\t\ttreeLoad: function(ctx, source) {\n\t\t\t\tvar metaData,\n\t\t\t\t\ttype,\n\t\t\t\t\t$ul,\n\t\t\t\t\ttree = ctx.tree,\n\t\t\t\t\t$container = ctx.widget.element,\n\t\t\t\t\tdfd,\n\t\t\t\t\t// calling context for root node\n\t\t\t\t\trootCtx = $.extend({}, ctx, { node: this.rootNode });\n\n\t\t\t\tif (tree.rootNode.children) {\n\t\t\t\t\tthis.treeClear(ctx);\n\t\t\t\t}\n\t\t\t\tsource = source || this.options.source;\n\n\t\t\t\tif (!source) {\n\t\t\t\t\ttype = $container.data(\"type\") || \"html\";\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase \"html\":\n\t\t\t\t\t\t\t$ul = $container.find(\">ul\").first();\n\t\t\t\t\t\t\t$ul.addClass(\n\t\t\t\t\t\t\t\t\"ui-fancytree-source fancytree-helper-hidden\"\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tsource = $.ui.fancytree.parseHtml($ul);\n\t\t\t\t\t\t\t// allow to init tree.data.foo from <ul data-foo=''>\n\t\t\t\t\t\t\tthis.data = $.extend(\n\t\t\t\t\t\t\t\tthis.data,\n\t\t\t\t\t\t\t\t_getElementDataAsDict($ul)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"json\":\n\t\t\t\t\t\t\tsource = $.parseJSON($container.text());\n\t\t\t\t\t\t\t// $container already contains the <ul>, but we remove the plain (json) text\n\t\t\t\t\t\t\t// $container.empty();\n\t\t\t\t\t\t\t$container\n\t\t\t\t\t\t\t\t.contents()\n\t\t\t\t\t\t\t\t.filter(function() {\n\t\t\t\t\t\t\t\t\treturn this.nodeType === 3;\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.remove();\n\t\t\t\t\t\t\tif ($.isPlainObject(source)) {\n\t\t\t\t\t\t\t\t// We got {foo: 'abc', children: [...]}\n\t\t\t\t\t\t\t\t_assert(\n\t\t\t\t\t\t\t\t\t$.isArray(source.children),\n\t\t\t\t\t\t\t\t\t\"if an object is passed as source, it must contain a 'children' array (all other properties are added to 'tree.data')\"\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tmetaData = source;\n\t\t\t\t\t\t\t\tsource = source.children;\n\t\t\t\t\t\t\t\tdelete metaData.children;\n\t\t\t\t\t\t\t\t// Copy some attributes to tree.data\n\t\t\t\t\t\t\t\t$.each(TREE_ATTRS, function(i, attr) {\n\t\t\t\t\t\t\t\t\tif (metaData[attr] !== undefined) {\n\t\t\t\t\t\t\t\t\t\ttree[attr] = metaData[attr];\n\t\t\t\t\t\t\t\t\t\tdelete metaData[attr];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t// Copy extra properties to tree.data.foo\n\t\t\t\t\t\t\t\t$.extend(tree.data, metaData);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t$.error(\"Invalid data-type: \" + type);\n\t\t\t\t\t}\n\t\t\t\t} else if (typeof source === \"string\") {\n\t\t\t\t\t// TODO: source is an element ID\n\t\t\t\t\t$.error(\"Not implemented\");\n\t\t\t\t}\n\n\t\t\t\t// TODO: might be useful? Let's wait for a use case...\n\t\t\t\t// tree._triggerTreeEvent(\"beforeInitLoad\", null);\n\n\t\t\t\t// Trigger fancytreeinit after nodes have been loaded\n\t\t\t\tdfd = this.nodeLoadChildren(rootCtx, source)\n\t\t\t\t\t.done(function() {\n\t\t\t\t\t\ttree._callHook(\n\t\t\t\t\t\t\t\"treeStructureChanged\",\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\"loadChildren\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\ttree.render();\n\t\t\t\t\t\tif (ctx.options.selectMode === 3) {\n\t\t\t\t\t\t\ttree.rootNode.fixSelection3FromEndNodes();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (tree.activeNode && tree.options.activeVisible) {\n\t\t\t\t\t\t\ttree.activeNode.makeVisible();\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttree._triggerTreeEvent(\"init\", null, { status: true });\n\t\t\t\t\t})\n\t\t\t\t\t.fail(function() {\n\t\t\t\t\t\ttree.render();\n\t\t\t\t\t\ttree._triggerTreeEvent(\"init\", null, { status: false });\n\t\t\t\t\t});\n\t\t\t\treturn dfd;\n\t\t\t},\n\t\t\t/** Node was inserted into or removed from the tree.\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param {boolean} add\n\t\t\t * @param {FancytreeNode} node\n\t\t\t */\n\t\t\ttreeRegisterNode: function(ctx, add, node) {\n\t\t\t\tctx.tree._callHook(\n\t\t\t\t\t\"treeStructureChanged\",\n\t\t\t\t\tctx,\n\t\t\t\t\tadd ? \"addNode\" : \"removeNode\"\n\t\t\t\t);\n\t\t\t},\n\t\t\t/** Widget got focus.\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param {boolean} [flag=true]\n\t\t\t */\n\t\t\ttreeSetFocus: function(ctx, flag, callOpts) {\n\t\t\t\tvar targetNode;\n\n\t\t\t\tflag = flag !== false;\n\n\t\t\t\t// this.debug(\"treeSetFocus(\" + flag + \"), callOpts: \", callOpts, this.hasFocus());\n\t\t\t\t// this.debug(\" focusNode: \" + this.focusNode);\n\t\t\t\t// this.debug(\" activeNode: \" + this.activeNode);\n\t\t\t\tif (flag !== this.hasFocus()) {\n\t\t\t\t\tthis._hasFocus = flag;\n\t\t\t\t\tif (!flag && this.focusNode) {\n\t\t\t\t\t\t// Node also looses focus if widget blurs\n\t\t\t\t\t\tthis.focusNode.setFocus(false);\n\t\t\t\t\t} else if (flag && (!callOpts || !callOpts.calledByNode)) {\n\t\t\t\t\t\t$(this.$container).focus();\n\t\t\t\t\t}\n\t\t\t\t\tthis.$container.toggleClass(\"fancytree-treefocus\", flag);\n\t\t\t\t\tthis._triggerTreeEvent(flag ? \"focusTree\" : \"blurTree\");\n\t\t\t\t\tif (flag && !this.activeNode) {\n\t\t\t\t\t\t// #712: Use last mousedowned node ('click' event fires after focusin)\n\t\t\t\t\t\ttargetNode =\n\t\t\t\t\t\t\tthis._lastMousedownNode || this.getFirstChild();\n\t\t\t\t\t\tif (targetNode) {\n\t\t\t\t\t\t\ttargetNode.setFocus();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t/** Widget option was set using `$().fancytree(\"option\", \"KEY\", VALUE)`.\n\t\t\t *\n\t\t\t * Note: `key` may reference a nested option, e.g. 'dnd5.scroll'.\n\t\t\t * In this case `value`contains the complete, modified `dnd5` option hash.\n\t\t\t * We can check for changed values like\n\t\t\t * if( value.scroll !== tree.options.dnd5.scroll ) {...}\n\t\t\t *\n\t\t\t * @param {EventData} ctx\n\t\t\t * @param {string} key option name\n\t\t\t * @param {any} value option value\n\t\t\t */\n\t\t\ttreeSetOption: function(ctx, key, value) {\n\t\t\t\tvar tree = ctx.tree,\n\t\t\t\t\tcallDefault = true,\n\t\t\t\t\tcallCreate = false,\n\t\t\t\t\tcallRender = false;\n\n\t\t\t\tswitch (key) {\n\t\t\t\t\tcase \"aria\":\n\t\t\t\t\tcase \"checkbox\":\n\t\t\t\t\tcase \"icon\":\n\t\t\t\t\tcase \"minExpandLevel\":\n\t\t\t\t\tcase \"tabindex\":\n\t\t\t\t\t\t// tree._callHook(\"treeCreate\", tree);\n\t\t\t\t\t\tcallCreate = true;\n\t\t\t\t\t\tcallRender = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"checkboxAutoHide\":\n\t\t\t\t\t\ttree.$container.toggleClass(\n\t\t\t\t\t\t\t\"fancytree-checkbox-auto-hide\",\n\t\t\t\t\t\t\t!!value\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"escapeTitles\":\n\t\t\t\t\tcase \"tooltip\":\n\t\t\t\t\t\tcallRender = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"rtl\":\n\t\t\t\t\t\tif (value === false) {\n\t\t\t\t\t\t\ttree.$container\n\t\t\t\t\t\t\t\t.removeAttr(\"DIR\")\n\t\t\t\t\t\t\t\t.removeClass(\"fancytree-rtl\");\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttree.$container\n\t\t\t\t\t\t\t\t.attr(\"DIR\", \"RTL\")\n\t\t\t\t\t\t\t\t.addClass(\"fancytree-rtl\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcallRender = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"source\":\n\t\t\t\t\t\tcallDefault = false;\n\t\t\t\t\t\ttree._callHook(\"treeLoad\", tree, value);\n\t\t\t\t\t\tcallRender = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ttree.debug(\n\t\t\t\t\t\"set option \" +\n\t\t\t\t\t\tkey +\n\t\t\t\t\t\t\"=\" +\n\t\t\t\t\t\tvalue +\n\t\t\t\t\t\t\" <\" +\n\t\t\t\t\t\ttypeof value +\n\t\t\t\t\t\t\">\"\n\t\t\t\t);\n\t\t\t\tif (callDefault) {\n\t\t\t\t\tif (this.widget._super) {\n\t\t\t\t\t\t// jQuery UI 1.9+\n\t\t\t\t\t\tthis.widget._super.call(this.widget, key, value);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// jQuery UI <= 1.8, we have to manually invoke the _setOption method from the base widget\n\t\t\t\t\t\t$.Widget.prototype._setOption.call(\n\t\t\t\t\t\t\tthis.widget,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (callCreate) {\n\t\t\t\t\ttree._callHook(\"treeCreate\", tree);\n\t\t\t\t}\n\t\t\t\tif (callRender) {\n\t\t\t\t\ttree.render(true, false); // force, not-deep\n\t\t\t\t}\n\t\t\t},\n\t\t\t/** A Node was added, removed, moved, or it's visibility changed.\n\t\t\t * @param {EventData} ctx\n\t\t\t */\n\t\t\ttreeStructureChanged: function(ctx, type) {},\n\t\t}\n\t);\n\n\t/*******************************************************************************\n\t * jQuery UI widget boilerplate\n\t */\n\n\t/**\n\t * The plugin (derrived from <a href=\" http://api.jqueryui.com/jQuery.widget/\">jQuery.Widget</a>).<br>\n\t * This constructor is not called directly. Use `$(selector).fancytree({})`\n\t * to initialize the plugin instead.<br>\n\t * <pre class=\"sh_javascript sunlight-highlight-javascript\">// Access widget methods and members:\n\t * var tree = $(\"#tree\").fancytree(\"getTree\");\n\t * var node = $(\"#tree\").fancytree(\"getActiveNode\", \"1234\");\n\t * </pre>\n\t *\n\t * @mixin Fancytree_Widget\n\t */\n\n\t$.widget(\n\t\t\"ui.fancytree\",\n\t\t/** @lends Fancytree_Widget# */\n\t\t{\n\t\t\t/**These options will be used as defaults\n\t\t\t * @type {FancytreeOptions}\n\t\t\t */\n\t\t\toptions: {\n\t\t\t\tactiveVisible: true,\n\t\t\t\tajax: {\n\t\t\t\t\ttype: \"GET\",\n\t\t\t\t\tcache: false, // false: Append random '_' argument to the request url to prevent caching.\n\t\t\t\t\t// timeout: 0, // >0: Make sure we get an ajax error if server is unreachable\n\t\t\t\t\tdataType: \"json\", // Expect json format and pass json object to callbacks.\n\t\t\t\t},\n\t\t\t\taria: true,\n\t\t\t\tautoActivate: true,\n\t\t\t\tautoCollapse: false,\n\t\t\t\tautoScroll: false,\n\t\t\t\tcheckbox: false,\n\t\t\t\tclickFolderMode: 4,\n\t\t\t\tdebugLevel: null, // 0..4 (null: use global setting $.ui.fancytree.debugLevel)\n\t\t\t\tdisabled: false, // TODO: required anymore?\n\t\t\t\tenableAspx: true,\n\t\t\t\tescapeTitles: false,\n\t\t\t\textensions: [],\n\t\t\t\t// fx: { height: \"toggle\", duration: 200 },\n\t\t\t\t// toggleEffect: { effect: \"drop\", options: {direction: \"left\"}, duration: 200 },\n\t\t\t\t// toggleEffect: { effect: \"slide\", options: {direction: \"up\"}, duration: 200 },\n\t\t\t\t//toggleEffect: { effect: \"blind\", options: {direction: \"vertical\", scale: \"box\"}, duration: 200 },\n\t\t\t\ttoggleEffect: { effect: \"slideToggle\", duration: 200 }, //< \"toggle\" or \"slideToggle\" to use jQuery instead of jQueryUI for toggleEffect animation\n\t\t\t\tgenerateIds: false,\n\t\t\t\ticon: true,\n\t\t\t\tidPrefix: \"ft_\",\n\t\t\t\tfocusOnSelect: false,\n\t\t\t\tkeyboard: true,\n\t\t\t\tkeyPathSeparator: \"/\",\n\t\t\t\tminExpandLevel: 1,\n\t\t\t\tnodata: true, // (bool, string, or callback) display message, when no data available\n\t\t\t\tquicksearch: false,\n\t\t\t\trtl: false,\n\t\t\t\tscrollOfs: { top: 0, bottom: 0 },\n\t\t\t\tscrollParent: null,\n\t\t\t\tselectMode: 2,\n\t\t\t\tstrings: {\n\t\t\t\t\tloading: \"Loading...\", // … would be escaped when escapeTitles is true\n\t\t\t\t\tloadError: \"Load error!\",\n\t\t\t\t\tmoreData: \"More...\",\n\t\t\t\t\tnoData: \"No data.\",\n\t\t\t\t},\n\t\t\t\ttabindex: \"0\",\n\t\t\t\ttitlesTabbable: false,\n\t\t\t\ttooltip: false,\n\t\t\t\ttreeId: null,\n\t\t\t\t_classNames: {\n\t\t\t\t\tnode: \"fancytree-node\",\n\t\t\t\t\tfolder: \"fancytree-folder\",\n\t\t\t\t\tanimating: \"fancytree-animating\",\n\t\t\t\t\tcombinedExpanderPrefix: \"fancytree-exp-\",\n\t\t\t\t\tcombinedIconPrefix: \"fancytree-ico-\",\n\t\t\t\t\thasChildren: \"fancytree-has-children\",\n\t\t\t\t\tactive: \"fancytree-active\",\n\t\t\t\t\tselected: \"fancytree-selected\",\n\t\t\t\t\texpanded: \"fancytree-expanded\",\n\t\t\t\t\tlazy: \"fancytree-lazy\",\n\t\t\t\t\tfocused: \"fancytree-focused\",\n\t\t\t\t\tpartload: \"fancytree-partload\",\n\t\t\t\t\tpartsel: \"fancytree-partsel\",\n\t\t\t\t\tradio: \"fancytree-radio\",\n\t\t\t\t\t// radiogroup: \"fancytree-radiogroup\",\n\t\t\t\t\tunselectable: \"fancytree-unselectable\",\n\t\t\t\t\tlastsib: \"fancytree-lastsib\",\n\t\t\t\t\tloading: \"fancytree-loading\",\n\t\t\t\t\terror: \"fancytree-error\",\n\t\t\t\t\tstatusNodePrefix: \"fancytree-statusnode-\",\n\t\t\t\t},\n\t\t\t\t// events\n\t\t\t\tlazyLoad: null,\n\t\t\t\tpostProcess: null,\n\t\t\t},\n\t\t\t/* Set up the widget, Called on first $().fancytree() */\n\t\t\t_create: function() {\n\t\t\t\tthis.tree = new Fancytree(this);\n\n\t\t\t\tthis.$source =\n\t\t\t\t\tthis.source || this.element.data(\"type\") === \"json\"\n\t\t\t\t\t\t? this.element\n\t\t\t\t\t\t: this.element.find(\">ul\").first();\n\t\t\t\t// Subclass Fancytree instance with all enabled extensions\n\t\t\t\tvar extension,\n\t\t\t\t\textName,\n\t\t\t\t\ti,\n\t\t\t\t\topts = this.options,\n\t\t\t\t\textensions = opts.extensions,\n\t\t\t\t\tbase = this.tree;\n\n\t\t\t\tfor (i = 0; i < extensions.length; i++) {\n\t\t\t\t\textName = extensions[i];\n\t\t\t\t\textension = $.ui.fancytree._extensions[extName];\n\t\t\t\t\tif (!extension) {\n\t\t\t\t\t\t$.error(\n\t\t\t\t\t\t\t\"Could not apply extension '\" +\n\t\t\t\t\t\t\t\textName +\n\t\t\t\t\t\t\t\t\"' (it is not registered, did you forget to include it?)\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// Add extension options as tree.options.EXTENSION\n\t\t\t\t\t// \t_assert(!this.tree.options[extName], \"Extension name must not exist as option name: \" + extName);\n\n\t\t\t\t\t// console.info(\"extend \" + extName, extension.options, this.tree.options[extName])\n\t\t\t\t\t// issue #876: we want to replace custom array-options, not merge them\n\t\t\t\t\tthis.tree.options[extName] = _simpleDeepMerge(\n\t\t\t\t\t\t{},\n\t\t\t\t\t\textension.options,\n\t\t\t\t\t\tthis.tree.options[extName]\n\t\t\t\t\t);\n\t\t\t\t\t// this.tree.options[extName] = $.extend(true, {}, extension.options, this.tree.options[extName]);\n\n\t\t\t\t\t// console.info(\"extend \" + extName + \" =>\", this.tree.options[extName])\n\t\t\t\t\t// console.info(\"extend \" + extName + \" org default =>\", extension.options)\n\n\t\t\t\t\t// Add a namespace tree.ext.EXTENSION, to hold instance data\n\t\t\t\t\t_assert(\n\t\t\t\t\t\tthis.tree.ext[extName] === undefined,\n\t\t\t\t\t\t\"Extension name must not exist as Fancytree.ext attribute: '\" +\n\t\t\t\t\t\t\textName +\n\t\t\t\t\t\t\t\"'\"\n\t\t\t\t\t);\n\t\t\t\t\t// this.tree[extName] = extension;\n\t\t\t\t\tthis.tree.ext[extName] = {};\n\t\t\t\t\t// Subclass Fancytree methods using proxies.\n\t\t\t\t\t_subclassObject(this.tree, base, extension, extName);\n\t\t\t\t\t// current extension becomes base for the next extension\n\t\t\t\t\tbase = extension;\n\t\t\t\t}\n\t\t\t\t//\n\t\t\t\tif (opts.icons !== undefined) {\n\t\t\t\t\t// 2015-11-16\n\t\t\t\t\tif (opts.icon === true) {\n\t\t\t\t\t\tthis.tree.warn(\n\t\t\t\t\t\t\t\"'icons' tree option is deprecated since v2.14.0: use 'icon' instead\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\topts.icon = opts.icons;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$.error(\n\t\t\t\t\t\t\t\"'icons' tree option is deprecated since v2.14.0: use 'icon' only instead\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (opts.iconClass !== undefined) {\n\t\t\t\t\t// 2015-11-16\n\t\t\t\t\tif (opts.icon) {\n\t\t\t\t\t\t$.error(\n\t\t\t\t\t\t\t\"'iconClass' tree option is deprecated since v2.14.0: use 'icon' only instead\"\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.tree.warn(\n\t\t\t\t\t\t\t\"'iconClass' tree option is deprecated since v2.14.0: use 'icon' instead\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\topts.icon = opts.iconClass;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (opts.tabbable !== undefined) {\n\t\t\t\t\t// 2016-04-04\n\t\t\t\t\topts.tabindex = opts.tabbable ? \"0\" : \"-1\";\n\t\t\t\t\tthis.tree.warn(\n\t\t\t\t\t\t\"'tabbable' tree option is deprecated since v2.17.0: use 'tabindex='\" +\n\t\t\t\t\t\t\topts.tabindex +\n\t\t\t\t\t\t\t\"' instead\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t//\n\t\t\t\tthis.tree._callHook(\"treeCreate\", this.tree);\n\t\t\t\t// Note: 'fancytreecreate' event is fired by widget base class\n\t\t\t\t// this.tree._triggerTreeEvent(\"create\");\n\t\t\t},\n\n\t\t\t/* Called on every $().fancytree() */\n\t\t\t_init: function() {\n\t\t\t\tthis.tree._callHook(\"treeInit\", this.tree);\n\t\t\t\t// TODO: currently we call bind after treeInit, because treeInit\n\t\t\t\t// might change tree.$container.\n\t\t\t\t// It would be better, to move event binding into hooks altogether\n\t\t\t\tthis._bind();\n\t\t\t},\n\n\t\t\t/* Use the _setOption method to respond to changes to options. */\n\t\t\t_setOption: function(key, value) {\n\t\t\t\treturn this.tree._callHook(\n\t\t\t\t\t\"treeSetOption\",\n\t\t\t\t\tthis.tree,\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue\n\t\t\t\t);\n\t\t\t},\n\n\t\t\t/** Use the destroy method to clean up any modifications your widget has made to the DOM */\n\t\t\tdestroy: function() {\n\t\t\t\tthis._unbind();\n\t\t\t\tthis.tree._callHook(\"treeDestroy\", this.tree);\n\t\t\t\t// In jQuery UI 1.8, you must invoke the destroy method from the base widget\n\t\t\t\t$.Widget.prototype.destroy.call(this);\n\t\t\t\t// TODO: delete tree and nodes to make garbage collect easier?\n\t\t\t\t// TODO: In jQuery UI 1.9 and above, you would define _destroy instead of destroy and not call the base method\n\t\t\t},\n\n\t\t\t// -------------------------------------------------------------------------\n\n\t\t\t/* Remove all event handlers for our namespace */\n\t\t\t_unbind: function() {\n\t\t\t\tvar ns = this.tree._ns;\n\t\t\t\tthis.element.off(ns);\n\t\t\t\tthis.tree.$container.off(ns);\n\t\t\t\t$(document).off(ns);\n\t\t\t},\n\t\t\t/* Add mouse and kyboard handlers to the container */\n\t\t\t_bind: function() {\n\t\t\t\tvar self = this,\n\t\t\t\t\topts = this.options,\n\t\t\t\t\ttree = this.tree,\n\t\t\t\t\tns = tree._ns;\n\t\t\t\t// selstartEvent = ( $.support.selectstart ? \"selectstart\" : \"mousedown\" )\n\n\t\t\t\t// Remove all previuous handlers for this tree\n\t\t\t\tthis._unbind();\n\n\t\t\t\t//alert(\"keydown\" + ns + \"foc=\" + tree.hasFocus() + tree.$container);\n\t\t\t\t// tree.debug(\"bind events; container: \", tree.$container);\n\t\t\t\ttree.$container\n\t\t\t\t\t.on(\"focusin\" + ns + \" focusout\" + ns, function(event) {\n\t\t\t\t\t\tvar node = FT.getNode(event),\n\t\t\t\t\t\t\tflag = event.type === \"focusin\";\n\n\t\t\t\t\t\tif (!flag && node && $(event.target).is(\"a\")) {\n\t\t\t\t\t\t\t// #764\n\t\t\t\t\t\t\tnode.debug(\n\t\t\t\t\t\t\t\t\"Ignored focusout on embedded <a> element.\"\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// tree.treeOnFocusInOut.call(tree, event);\n\t\t\t\t\t\t// tree.debug(\"Tree container got event \" + event.type, node, event, FT.getEventTarget(event));\n\t\t\t\t\t\tif (flag) {\n\t\t\t\t\t\t\tif (tree._getExpiringValue(\"focusin\")) {\n\t\t\t\t\t\t\t\t// #789: IE 11 may send duplicate focusin events\n\t\t\t\t\t\t\t\ttree.debug(\"Ignored double focusin.\");\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttree._setExpiringValue(\"focusin\", true, 50);\n\n\t\t\t\t\t\t\tif (!node) {\n\t\t\t\t\t\t\t\t// #789: IE 11 may send focusin before mousdown(?)\n\t\t\t\t\t\t\t\tnode = tree._getExpiringValue(\"mouseDownNode\");\n\t\t\t\t\t\t\t\tif (node) {\n\t\t\t\t\t\t\t\t\ttree.debug(\n\t\t\t\t\t\t\t\t\t\t\"Reconstruct mouse target for focusin from recent event.\"\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (node) {\n\t\t\t\t\t\t\t// For example clicking into an <input> that is part of a node\n\t\t\t\t\t\t\ttree._callHook(\n\t\t\t\t\t\t\t\t\"nodeSetFocus\",\n\t\t\t\t\t\t\t\ttree._makeHookContext(node, event),\n\t\t\t\t\t\t\t\tflag\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttree.tbody &&\n\t\t\t\t\t\t\t\t$(event.target).parents(\n\t\t\t\t\t\t\t\t\t\"table.fancytree-container > thead\"\n\t\t\t\t\t\t\t\t).length\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// #767: ignore events in the table's header\n\t\t\t\t\t\t\t\ttree.debug(\n\t\t\t\t\t\t\t\t\t\"Ignore focus event outside table body.\",\n\t\t\t\t\t\t\t\t\tevent\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttree._callHook(\"treeSetFocus\", tree, flag);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.on(\"selectstart\" + ns, \"span.fancytree-title\", function(\n\t\t\t\t\t\tevent\n\t\t\t\t\t) {\n\t\t\t\t\t\t// prevent mouse-drags to select text ranges\n\t\t\t\t\t\t// tree.debug(\"<span title> got event \" + event.type);\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t})\n\t\t\t\t\t.on(\"keydown\" + ns, function(event) {\n\t\t\t\t\t\t// TODO: also bind keyup and keypress\n\t\t\t\t\t\t// tree.debug(\"got event \" + event.type + \", hasFocus:\" + tree.hasFocus());\n\t\t\t\t\t\t// if(opts.disabled || opts.keyboard === false || !tree.hasFocus() ){\n\t\t\t\t\t\tif (opts.disabled || opts.keyboard === false) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar res,\n\t\t\t\t\t\t\tnode = tree.focusNode, // node may be null\n\t\t\t\t\t\t\tctx = tree._makeHookContext(node || tree, event),\n\t\t\t\t\t\t\tprevPhase = tree.phase;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\ttree.phase = \"userEvent\";\n\t\t\t\t\t\t\t// If a 'fancytreekeydown' handler returns false, skip the default\n\t\t\t\t\t\t\t// handling (implemented by tree.nodeKeydown()).\n\t\t\t\t\t\t\tif (node) {\n\t\t\t\t\t\t\t\tres = tree._triggerNodeEvent(\n\t\t\t\t\t\t\t\t\t\"keydown\",\n\t\t\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\t\t\tevent\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tres = tree._triggerTreeEvent(\"keydown\", event);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (res === \"preventNav\") {\n\t\t\t\t\t\t\t\tres = true; // prevent keyboard navigation, but don't prevent default handling of embedded input controls\n\t\t\t\t\t\t\t} else if (res !== false) {\n\t\t\t\t\t\t\t\tres = tree._callHook(\"nodeKeydown\", ctx);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn res;\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\ttree.phase = prevPhase;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.on(\"mousedown\" + ns, function(event) {\n\t\t\t\t\t\tvar et = FT.getEventTarget(event);\n\t\t\t\t\t\t// self.tree.debug(\"event(\" + event.type + \"): node: \", et.node);\n\t\t\t\t\t\t// #712: Store the clicked node, so we can use it when we get a focusin event\n\t\t\t\t\t\t// ('click' event fires after focusin)\n\t\t\t\t\t\t// tree.debug(\"event(\" + event.type + \"): node: \", et.node);\n\t\t\t\t\t\ttree._lastMousedownNode = et ? et.node : null;\n\t\t\t\t\t\t// #789: Store the node also for a short period, so we can use it\n\t\t\t\t\t\t// in a *resulting* focusin event\n\t\t\t\t\t\ttree._setExpiringValue(\n\t\t\t\t\t\t\t\"mouseDownNode\",\n\t\t\t\t\t\t\ttree._lastMousedownNode\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t\t.on(\"click\" + ns + \" dblclick\" + ns, function(event) {\n\t\t\t\t\t\tif (opts.disabled) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar ctx,\n\t\t\t\t\t\t\tet = FT.getEventTarget(event),\n\t\t\t\t\t\t\tnode = et.node,\n\t\t\t\t\t\t\ttree = self.tree,\n\t\t\t\t\t\t\tprevPhase = tree.phase;\n\n\t\t\t\t\t\t// self.tree.debug(\"event(\" + event.type + \"): node: \", node);\n\t\t\t\t\t\tif (!node) {\n\t\t\t\t\t\t\treturn true; // Allow bubbling of other events\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx = tree._makeHookContext(node, event);\n\t\t\t\t\t\t// self.tree.debug(\"event(\" + event.type + \"): node: \", node);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\ttree.phase = \"userEvent\";\n\t\t\t\t\t\t\tswitch (event.type) {\n\t\t\t\t\t\t\t\tcase \"click\":\n\t\t\t\t\t\t\t\t\tctx.targetType = et.type;\n\t\t\t\t\t\t\t\t\tif (node.isPagingNode()) {\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\ttree._triggerNodeEvent(\n\t\t\t\t\t\t\t\t\t\t\t\t\"clickPaging\",\n\t\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\t\tevent\n\t\t\t\t\t\t\t\t\t\t\t) === true\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn tree._triggerNodeEvent(\n\t\t\t\t\t\t\t\t\t\t\"click\",\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\tevent\n\t\t\t\t\t\t\t\t\t) === false\n\t\t\t\t\t\t\t\t\t\t? false\n\t\t\t\t\t\t\t\t\t\t: tree._callHook(\"nodeClick\", ctx);\n\t\t\t\t\t\t\t\tcase \"dblclick\":\n\t\t\t\t\t\t\t\t\tctx.targetType = et.type;\n\t\t\t\t\t\t\t\t\treturn tree._triggerNodeEvent(\n\t\t\t\t\t\t\t\t\t\t\"dblclick\",\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\tevent\n\t\t\t\t\t\t\t\t\t) === false\n\t\t\t\t\t\t\t\t\t\t? false\n\t\t\t\t\t\t\t\t\t\t: tree._callHook(\"nodeDblclick\", ctx);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\ttree.phase = prevPhase;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t},\n\t\t\t/** Return the active node or null.\n\t\t\t * @returns {FancytreeNode}\n\t\t\t */\n\t\t\tgetActiveNode: function() {\n\t\t\t\treturn this.tree.activeNode;\n\t\t\t},\n\t\t\t/** Return the matching node or null.\n\t\t\t * @param {string} key\n\t\t\t * @returns {FancytreeNode}\n\t\t\t */\n\t\t\tgetNodeByKey: function(key) {\n\t\t\t\treturn this.tree.getNodeByKey(key);\n\t\t\t},\n\t\t\t/** Return the invisible system root node.\n\t\t\t * @returns {FancytreeNode}\n\t\t\t */\n\t\t\tgetRootNode: function() {\n\t\t\t\treturn this.tree.rootNode;\n\t\t\t},\n\t\t\t/** Return the current tree instance.\n\t\t\t * @returns {Fancytree}\n\t\t\t */\n\t\t\tgetTree: function() {\n\t\t\t\treturn this.tree;\n\t\t\t},\n\t\t}\n\t);\n\n\t// $.ui.fancytree was created by the widget factory. Create a local shortcut:\n\tFT = $.ui.fancytree;\n\n\t/**\n\t * Static members in the `$.ui.fancytree` namespace.<br>\n\t * <br>\n\t * <pre class=\"sh_javascript sunlight-highlight-javascript\">// Access static members:\n\t * var node = $.ui.fancytree.getNode(element);\n\t * alert($.ui.fancytree.version);\n\t * </pre>\n\t *\n\t * @mixin Fancytree_Static\n\t */\n\t$.extend(\n\t\t$.ui.fancytree,\n\t\t/** @lends Fancytree_Static# */\n\t\t{\n\t\t\t/** @type {string} */\n\t\t\tversion: \"2.32.0\", // Set to semver by 'grunt release'\n\t\t\t/** @type {string} */\n\t\t\tbuildType: \"production\", // Set to 'production' by 'grunt build'\n\t\t\t/** @type {int} */\n\t\t\tdebugLevel: 3, // Set to 3 by 'grunt build'\n\t\t\t// Used by $.ui.fancytree.debug() and as default for tree.options.debugLevel\n\n\t\t\t_nextId: 1,\n\t\t\t_nextNodeKey: 1,\n\t\t\t_extensions: {},\n\t\t\t// focusTree: null,\n\n\t\t\t/** Expose class object as $.ui.fancytree._FancytreeClass */\n\t\t\t_FancytreeClass: Fancytree,\n\t\t\t/** Expose class object as $.ui.fancytree._FancytreeNodeClass */\n\t\t\t_FancytreeNodeClass: FancytreeNode,\n\t\t\t/* Feature checks to provide backwards compatibility */\n\t\t\tjquerySupports: {\n\t\t\t\t// http://jqueryui.com/upgrade-guide/1.9/#deprecated-offset-option-merged-into-my-and-at\n\t\t\t\tpositionMyOfs: isVersionAtLeast($.ui.version, 1, 9),\n\t\t\t},\n\t\t\t/** Throw an error if condition fails (debug method).\n\t\t\t * @param {boolean} cond\n\t\t\t * @param {string} msg\n\t\t\t */\n\t\t\tassert: function(cond, msg) {\n\t\t\t\treturn _assert(cond, msg);\n\t\t\t},\n\t\t\t/** Create a new Fancytree instance on a target element.\n\t\t\t *\n\t\t\t * @param {Element | jQueryObject | string} el Target DOM element or selector\n\t\t\t * @param {FancytreeOptions} [opts] Fancytree options\n\t\t\t * @returns {Fancytree} new tree instance\n\t\t\t * @example\n\t\t\t * var tree = $.ui.fancytree.createTree(\"#tree\", {\n\t\t\t * source: {url: \"my/webservice\"}\n\t\t\t * }); // Create tree for this matching element\n\t\t\t *\n\t\t\t * @since 2.25\n\t\t\t */\n\t\t\tcreateTree: function(el, opts) {\n\t\t\t\tvar tree = $(el)\n\t\t\t\t\t.fancytree(opts)\n\t\t\t\t\t.fancytree(\"getTree\");\n\t\t\t\treturn tree;\n\t\t\t},\n\t\t\t/** Return a function that executes *fn* at most every *timeout* ms.\n\t\t\t * @param {integer} timeout\n\t\t\t * @param {function} fn\n\t\t\t * @param {boolean} [invokeAsap=false]\n\t\t\t * @param {any} [ctx]\n\t\t\t */\n\t\t\tdebounce: function(timeout, fn, invokeAsap, ctx) {\n\t\t\t\tvar timer;\n\t\t\t\tif (arguments.length === 3 && typeof invokeAsap !== \"boolean\") {\n\t\t\t\t\tctx = invokeAsap;\n\t\t\t\t\tinvokeAsap = false;\n\t\t\t\t}\n\t\t\t\treturn function() {\n\t\t\t\t\tvar args = arguments;\n\t\t\t\t\tctx = ctx || this;\n\t\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\t\tinvokeAsap && !timer && fn.apply(ctx, args);\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ttimer = setTimeout(function() {\n\t\t\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\t\t\tinvokeAsap || fn.apply(ctx, args);\n\t\t\t\t\t\ttimer = null;\n\t\t\t\t\t}, timeout);\n\t\t\t\t};\n\t\t\t},\n\t\t\t/** Write message to console if debugLevel >= 4\n\t\t\t * @param {string} msg\n\t\t\t */\n\t\t\tdebug: function(msg) {\n\t\t\t\tif ($.ui.fancytree.debugLevel >= 4) {\n\t\t\t\t\tconsoleApply(\"log\", arguments);\n\t\t\t\t}\n\t\t\t},\n\t\t\t/** Write error message to console if debugLevel >= 1.\n\t\t\t * @param {string} msg\n\t\t\t */\n\t\t\terror: function(msg) {\n\t\t\t\tif ($.ui.fancytree.debugLevel >= 1) {\n\t\t\t\t\tconsoleApply(\"error\", arguments);\n\t\t\t\t}\n\t\t\t},\n\t\t\t/** Convert `<`, `>`, `&`, `\"`, `'`, and `/` to the equivalent entities.\n\t\t\t *\n\t\t\t * @param {string} s\n\t\t\t * @returns {string}\n\t\t\t */\n\t\t\tescapeHtml: function(s) {\n\t\t\t\treturn (\"\" + s).replace(REX_HTML, function(s) {\n\t\t\t\t\treturn ENTITY_MAP[s];\n\t\t\t\t});\n\t\t\t},\n\t\t\t/** Make jQuery.position() arguments backwards compatible, i.e. if\n\t\t\t * jQuery UI version <= 1.8, convert\n\t\t\t * { my: \"left+3 center\", at: \"left bottom\", of: $target }\n\t\t\t * to\n\t\t\t * { my: \"left center\", at: \"left bottom\", of: $target, offset: \"3 0\" }\n\t\t\t *\n\t\t\t * See http://jqueryui.com/upgrade-guide/1.9/#deprecated-offset-option-merged-into-my-and-at\n\t\t\t * and http://jsfiddle.net/mar10/6xtu9a4e/\n\t\t\t *\n\t\t\t * @param {object} opts\n\t\t\t * @returns {object} the (potentially modified) original opts hash object\n\t\t\t */\n\t\t\tfixPositionOptions: function(opts) {\n\t\t\t\tif (opts.offset || (\"\" + opts.my + opts.at).indexOf(\"%\") >= 0) {\n\t\t\t\t\t$.error(\n\t\t\t\t\t\t\"expected new position syntax (but '%' is not supported)\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!$.ui.fancytree.jquerySupports.positionMyOfs) {\n\t\t\t\t\tvar // parse 'left+3 center' into ['left+3 center', 'left', '+3', 'center', undefined]\n\t\t\t\t\t\tmyParts = /(\\w+)([+-]?\\d+)?\\s+(\\w+)([+-]?\\d+)?/.exec(\n\t\t\t\t\t\t\topts.my\n\t\t\t\t\t\t),\n\t\t\t\t\t\tatParts = /(\\w+)([+-]?\\d+)?\\s+(\\w+)([+-]?\\d+)?/.exec(\n\t\t\t\t\t\t\topts.at\n\t\t\t\t\t\t),\n\t\t\t\t\t\t// convert to numbers\n\t\t\t\t\t\tdx =\n\t\t\t\t\t\t\t(myParts[2] ? +myParts[2] : 0) +\n\t\t\t\t\t\t\t(atParts[2] ? +atParts[2] : 0),\n\t\t\t\t\t\tdy =\n\t\t\t\t\t\t\t(myParts[4] ? +myParts[4] : 0) +\n\t\t\t\t\t\t\t(atParts[4] ? +atParts[4] : 0);\n\n\t\t\t\t\topts = $.extend({}, opts, {\n\t\t\t\t\t\t// make a copy and overwrite\n\t\t\t\t\t\tmy: myParts[1] + \" \" + myParts[3],\n\t\t\t\t\t\tat: atParts[1] + \" \" + atParts[3],\n\t\t\t\t\t});\n\t\t\t\t\tif (dx || dy) {\n\t\t\t\t\t\topts.offset = \"\" + dx + \" \" + dy;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn opts;\n\t\t\t},\n\t\t\t/** Return a {node: FancytreeNode, type: TYPE} object for a mouse event.\n\t\t\t *\n\t\t\t * @param {Event} event Mouse event, e.g. click, ...\n\t\t\t * @returns {object} Return a {node: FancytreeNode, type: TYPE} object\n\t\t\t * TYPE: 'title' | 'prefix' | 'expander' | 'checkbox' | 'icon' | undefined\n\t\t\t */\n\t\t\tgetEventTarget: function(event) {\n\t\t\t\tvar $target,\n\t\t\t\t\ttree,\n\t\t\t\t\ttcn = event && event.target ? event.target.className : \"\",\n\t\t\t\t\tres = { node: this.getNode(event.target), type: undefined };\n\t\t\t\t// We use a fast version of $(res.node).hasClass()\n\t\t\t\t// See http://jsperf.com/test-for-classname/2\n\t\t\t\tif (/\\bfancytree-title\\b/.test(tcn)) {\n\t\t\t\t\tres.type = \"title\";\n\t\t\t\t} else if (/\\bfancytree-expander\\b/.test(tcn)) {\n\t\t\t\t\tres.type =\n\t\t\t\t\t\tres.node.hasChildren() === false\n\t\t\t\t\t\t\t? \"prefix\"\n\t\t\t\t\t\t\t: \"expander\";\n\t\t\t\t\t// }else if( /\\bfancytree-checkbox\\b/.test(tcn) || /\\bfancytree-radio\\b/.test(tcn) ){\n\t\t\t\t} else if (/\\bfancytree-checkbox\\b/.test(tcn)) {\n\t\t\t\t\tres.type = \"checkbox\";\n\t\t\t\t} else if (/\\bfancytree(-custom)?-icon\\b/.test(tcn)) {\n\t\t\t\t\tres.type = \"icon\";\n\t\t\t\t} else if (/\\bfancytree-node\\b/.test(tcn)) {\n\t\t\t\t\t// Somewhere near the title\n\t\t\t\t\tres.type = \"title\";\n\t\t\t\t} else if (event && event.target) {\n\t\t\t\t\t$target = $(event.target);\n\t\t\t\t\tif ($target.is(\"ul[role=group]\")) {\n\t\t\t\t\t\t// #nnn: Clicking right to a node may hit the surrounding UL\n\t\t\t\t\t\ttree = res.node && res.node.tree;\n\t\t\t\t\t\t(tree || FT).debug(\"Ignoring click on outer UL.\");\n\t\t\t\t\t\tres.node = null;\n\t\t\t\t\t} else if ($target.closest(\".fancytree-title\").length) {\n\t\t\t\t\t\t// #228: clicking an embedded element inside a title\n\t\t\t\t\t\tres.type = \"title\";\n\t\t\t\t\t} else if ($target.closest(\".fancytree-checkbox\").length) {\n\t\t\t\t\t\t// E.g. <svg> inside checkbox span\n\t\t\t\t\t\tres.type = \"checkbox\";\n\t\t\t\t\t} else if ($target.closest(\".fancytree-expander\").length) {\n\t\t\t\t\t\tres.type = \"expander\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn res;\n\t\t\t},\n\t\t\t/** Return a string describing the affected node region for a mouse event.\n\t\t\t *\n\t\t\t * @param {Event} event Mouse event, e.g. click, mousemove, ...\n\t\t\t * @returns {string} 'title' | 'prefix' | 'expander' | 'checkbox' | 'icon' | undefined\n\t\t\t */\n\t\t\tgetEventTargetType: function(event) {\n\t\t\t\treturn this.getEventTarget(event).type;\n\t\t\t},\n\t\t\t/** Return a FancytreeNode instance from element, event, or jQuery object.\n\t\t\t *\n\t\t\t * @param {Element | jQueryObject | Event} el\n\t\t\t * @returns {FancytreeNode} matching node or null\n\t\t\t */\n\t\t\tgetNode: function(el) {\n\t\t\t\tif (el instanceof FancytreeNode) {\n\t\t\t\t\treturn el; // el already was a FancytreeNode\n\t\t\t\t} else if (el instanceof $) {\n\t\t\t\t\tel = el[0]; // el was a jQuery object: use the DOM element\n\t\t\t\t} else if (el.originalEvent !== undefined) {\n\t\t\t\t\tel = el.target; // el was an Event\n\t\t\t\t}\n\t\t\t\twhile (el) {\n\t\t\t\t\tif (el.ftnode) {\n\t\t\t\t\t\treturn el.ftnode;\n\t\t\t\t\t}\n\t\t\t\t\tel = el.parentNode;\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t/** Return a Fancytree instance, from element, index, event, or jQueryObject.\n\t\t\t *\n\t\t\t * @param {Element | jQueryObject | Event | integer | string} [el]\n\t\t\t * @returns {Fancytree} matching tree or null\n\t\t\t * @example\n\t\t\t * $.ui.fancytree.getTree(); // Get first Fancytree instance on page\n\t\t\t * $.ui.fancytree.getTree(1); // Get second Fancytree instance on page\n\t\t\t * $.ui.fancytree.getTree(event); // Get tree for this mouse- or keyboard event\n\t\t\t * $.ui.fancytree.getTree(\"foo\"); // Get tree for this `opts.treeId`\n\t\t\t * $.ui.fancytree.getTree(\"#tree\"); // Get tree for this matching element\n\t\t\t *\n\t\t\t * @since 2.13\n\t\t\t */\n\t\t\tgetTree: function(el) {\n\t\t\t\tvar widget,\n\t\t\t\t\torgEl = el;\n\n\t\t\t\tif (el instanceof Fancytree) {\n\t\t\t\t\treturn el; // el already was a Fancytree\n\t\t\t\t}\n\t\t\t\tif (el === undefined) {\n\t\t\t\t\tel = 0; // get first tree\n\t\t\t\t}\n\t\t\t\tif (typeof el === \"number\") {\n\t\t\t\t\tel = $(\".fancytree-container\").eq(el); // el was an integer: return nth instance\n\t\t\t\t} else if (typeof el === \"string\") {\n\t\t\t\t\t// `el` may be a treeId or a selector:\n\t\t\t\t\tel = $(\"#ft-id-\" + orgEl).eq(0);\n\t\t\t\t\tif (!el.length) {\n\t\t\t\t\t\tel = $(orgEl).eq(0); // el was a selector: use first match\n\t\t\t\t\t}\n\t\t\t\t} else if (el instanceof $) {\n\t\t\t\t\tel = el.eq(0); // el was a jQuery object: use the first DOM element\n\t\t\t\t} else if (el.originalEvent !== undefined) {\n\t\t\t\t\tel = $(el.target); // el was an Event\n\t\t\t\t}\n\t\t\t\tel = el.closest(\":ui-fancytree\");\n\t\t\t\twidget = el.data(\"ui-fancytree\") || el.data(\"fancytree\"); // the latter is required by jQuery <= 1.8\n\t\t\t\treturn widget ? widget.tree : null;\n\t\t\t},\n\t\t\t/** Return an option value that has a default, but may be overridden by a\n\t\t\t * callback or a node instance attribute.\n\t\t\t *\n\t\t\t * Evaluation sequence:<br>\n\t\t\t *\n\t\t\t * If tree.options.<optionName> is a callback that returns something, use that.<br>\n\t\t\t * Else if node.<optionName> is defined, use that.<br>\n\t\t\t * Else if tree.options.<optionName> is a value, use that.<br>\n\t\t\t * Else use `defaultValue`.\n\t\t\t *\n\t\t\t * @param {string} optionName name of the option property (on node and tree)\n\t\t\t * @param {FancytreeNode} node passed to the callback\n\t\t\t * @param {object} nodeObject where to look for the local option property, e.g. `node` or `node.data`\n\t\t\t * @param {object} treeOption where to look for the tree option, e.g. `tree.options` or `tree.options.dnd5`\n\t\t\t * @param {any} [defaultValue]\n\t\t\t * @returns {any}\n\t\t\t *\n\t\t\t * @example\n\t\t\t * // Check for node.foo, tree,options.foo(), and tree.options.foo:\n\t\t\t * $.ui.fancytree.evalOption(\"foo\", node, node, tree.options);\n\t\t\t * // Check for node.data.bar, tree,options.qux.bar(), and tree.options.qux.bar:\n\t\t\t * $.ui.fancytree.evalOption(\"bar\", node, node.data, tree.options.qux);\n\t\t\t *\n\t\t\t * @since 2.22\n\t\t\t */\n\t\t\tevalOption: function(\n\t\t\t\toptionName,\n\t\t\t\tnode,\n\t\t\t\tnodeObject,\n\t\t\t\ttreeOptions,\n\t\t\t\tdefaultValue\n\t\t\t) {\n\t\t\t\tvar ctx,\n\t\t\t\t\tres,\n\t\t\t\t\ttree = node.tree,\n\t\t\t\t\ttreeOpt = treeOptions[optionName],\n\t\t\t\t\tnodeOpt = nodeObject[optionName];\n\n\t\t\t\tif ($.isFunction(treeOpt)) {\n\t\t\t\t\tctx = {\n\t\t\t\t\t\tnode: node,\n\t\t\t\t\t\ttree: tree,\n\t\t\t\t\t\twidget: tree.widget,\n\t\t\t\t\t\toptions: tree.widget.options,\n\t\t\t\t\t\ttypeInfo: tree.types[node.type] || {},\n\t\t\t\t\t};\n\t\t\t\t\tres = treeOpt.call(tree, { type: optionName }, ctx);\n\t\t\t\t\tif (res == null) {\n\t\t\t\t\t\tres = nodeOpt;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tres = nodeOpt == null ? treeOpt : nodeOpt;\n\t\t\t\t}\n\t\t\t\tif (res == null) {\n\t\t\t\t\tres = defaultValue; // no option set at all: return default\n\t\t\t\t}\n\t\t\t\treturn res;\n\t\t\t},\n\t\t\t/** Set expander, checkbox, or node icon, supporting string and object format.\n\t\t\t *\n\t\t\t * @param {Element | jQueryObject} span\n\t\t\t * @param {string} baseClass\n\t\t\t * @param {string | object} icon\n\t\t\t * @since 2.27\n\t\t\t */\n\t\t\tsetSpanIcon: function(span, baseClass, icon) {\n\t\t\t\tvar $span = $(span);\n\n\t\t\t\tif (typeof icon === \"string\") {\n\t\t\t\t\t$span.attr(\"class\", baseClass + \" \" + icon);\n\t\t\t\t} else {\n\t\t\t\t\t// support object syntax: { text: ligature, addClasse: classname }\n\t\t\t\t\tif (icon.text) {\n\t\t\t\t\t\t$span.text(\"\" + icon.text);\n\t\t\t\t\t} else if (icon.html) {\n\t\t\t\t\t\tspan.innerHTML = icon.html;\n\t\t\t\t\t}\n\t\t\t\t\t$span.attr(\n\t\t\t\t\t\t\"class\",\n\t\t\t\t\t\tbaseClass + \" \" + (icon.addClass || \"\")\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t\t/** Convert a keydown or mouse event to a canonical string like 'ctrl+a',\n\t\t\t * 'ctrl+shift+f2', 'shift+leftdblclick'.\n\t\t\t *\n\t\t\t * This is especially handy for switch-statements in event handlers.\n\t\t\t *\n\t\t\t * @param {event}\n\t\t\t * @returns {string}\n\t\t\t *\n\t\t\t * @example\n\n\t\t\tswitch( $.ui.fancytree.eventToString(event) ) {\n\t\t\t\tcase \"-\":\n\t\t\t\t\ttree.nodeSetExpanded(ctx, false);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"shift+return\":\n\t\t\t\t\ttree.nodeSetActive(ctx, true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"down\":\n\t\t\t\t\tres = node.navigate(event.which, activate);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\thandled = false;\n\t\t\t}\n\t\t\tif( handled ){\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t\t*/\n\t\t\teventToString: function(event) {\n\t\t\t\t// Poor-man's hotkeys. See here for a complete implementation:\n\t\t\t\t// https://github.com/jeresig/jquery.hotkeys\n\t\t\t\tvar which = event.which,\n\t\t\t\t\tet = event.type,\n\t\t\t\t\ts = [];\n\n\t\t\t\tif (event.altKey) {\n\t\t\t\t\ts.push(\"alt\");\n\t\t\t\t}\n\t\t\t\tif (event.ctrlKey) {\n\t\t\t\t\ts.push(\"ctrl\");\n\t\t\t\t}\n\t\t\t\tif (event.metaKey) {\n\t\t\t\t\ts.push(\"meta\");\n\t\t\t\t}\n\t\t\t\tif (event.shiftKey) {\n\t\t\t\t\ts.push(\"shift\");\n\t\t\t\t}\n\n\t\t\t\tif (et === \"click\" || et === \"dblclick\") {\n\t\t\t\t\ts.push(MOUSE_BUTTONS[event.button] + et);\n\t\t\t\t} else if (et === \"wheel\") {\n\t\t\t\t\ts.push(et);\n\t\t\t\t} else if (!IGNORE_KEYCODES[which]) {\n\t\t\t\t\ts.push(\n\t\t\t\t\t\tSPECIAL_KEYCODES[which] ||\n\t\t\t\t\t\t\tString.fromCharCode(which).toLowerCase()\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn s.join(\"+\");\n\t\t\t},\n\t\t\t/** Write message to console if debugLevel >= 3\n\t\t\t * @param {string} msg\n\t\t\t */\n\t\t\tinfo: function(msg) {\n\t\t\t\tif ($.ui.fancytree.debugLevel >= 3) {\n\t\t\t\t\tconsoleApply(\"info\", arguments);\n\t\t\t\t}\n\t\t\t},\n\t\t\t/* @deprecated: use eventToString(event) instead.\n\t\t\t */\n\t\t\tkeyEventToString: function(event) {\n\t\t\t\tthis.warn(\n\t\t\t\t\t\"keyEventToString() is deprecated: use eventToString()\"\n\t\t\t\t);\n\t\t\t\treturn this.eventToString(event);\n\t\t\t},\n\t\t\t/** Return a wrapped handler method, that provides `this._super`.\n\t\t\t *\n\t\t\t * @example\n\t\t\t\t// Implement `opts.createNode` event to add the 'draggable' attribute\n\t\t\t\t$.ui.fancytree.overrideMethod(ctx.options, \"createNode\", function(event, data) {\n\t\t\t\t\t// Default processing if any\n\t\t\t\t\tthis._super.apply(this, arguments);\n\t\t\t\t\t// Add 'draggable' attribute\n\t\t\t\t\tdata.node.span.draggable = true;\n\t\t\t\t});\n\t\t\t *\n\t\t\t * @param {object} instance\n\t\t\t * @param {string} methodName\n\t\t\t * @param {function} handler\n\t\t\t * @param {object} [context] optional context\n\t\t\t */\n\t\t\toverrideMethod: function(instance, methodName, handler, context) {\n\t\t\t\tvar prevSuper,\n\t\t\t\t\t_super = instance[methodName] || $.noop;\n\n\t\t\t\tinstance[methodName] = function() {\n\t\t\t\t\tvar self = context || this;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tprevSuper = self._super;\n\t\t\t\t\t\tself._super = _super;\n\t\t\t\t\t\treturn handler.apply(self, arguments);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tself._super = prevSuper;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\t\t\t/**\n\t\t\t * Parse tree data from HTML <ul> markup\n\t\t\t *\n\t\t\t * @param {jQueryObject} $ul\n\t\t\t * @returns {NodeData[]}\n\t\t\t */\n\t\t\tparseHtml: function($ul) {\n\t\t\t\tvar classes,\n\t\t\t\t\tclassName,\n\t\t\t\t\textraClasses,\n\t\t\t\t\ti,\n\t\t\t\t\tiPos,\n\t\t\t\t\tl,\n\t\t\t\t\ttmp,\n\t\t\t\t\ttmp2,\n\t\t\t\t\t$children = $ul.find(\">li\"),\n\t\t\t\t\tchildren = [];\n\n\t\t\t\t$children.each(function() {\n\t\t\t\t\tvar allData,\n\t\t\t\t\t\tlowerCaseAttr,\n\t\t\t\t\t\t$li = $(this),\n\t\t\t\t\t\t$liSpan = $li.find(\">span\", this).first(),\n\t\t\t\t\t\t$liA = $liSpan.length ? null : $li.find(\">a\").first(),\n\t\t\t\t\t\td = { tooltip: null, data: {} };\n\n\t\t\t\t\tif ($liSpan.length) {\n\t\t\t\t\t\td.title = $liSpan.html();\n\t\t\t\t\t} else if ($liA && $liA.length) {\n\t\t\t\t\t\t// If a <li><a> tag is specified, use it literally and extract href/target.\n\t\t\t\t\t\td.title = $liA.html();\n\t\t\t\t\t\td.data.href = $liA.attr(\"href\");\n\t\t\t\t\t\td.data.target = $liA.attr(\"target\");\n\t\t\t\t\t\td.tooltip = $liA.attr(\"title\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If only a <li> tag is specified, use the trimmed string up to\n\t\t\t\t\t\t// the next child <ul> tag.\n\t\t\t\t\t\td.title = $li.html();\n\t\t\t\t\t\tiPos = d.title.search(/<ul/i);\n\t\t\t\t\t\tif (iPos >= 0) {\n\t\t\t\t\t\t\td.title = d.title.substring(0, iPos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\td.title = $.trim(d.title);\n\n\t\t\t\t\t// Make sure all fields exist\n\t\t\t\t\tfor (i = 0, l = CLASS_ATTRS.length; i < l; i++) {\n\t\t\t\t\t\td[CLASS_ATTRS[i]] = undefined;\n\t\t\t\t\t}\n\t\t\t\t\t// Initialize to `true`, if class is set and collect extraClasses\n\t\t\t\t\tclasses = this.className.split(\" \");\n\t\t\t\t\textraClasses = [];\n\t\t\t\t\tfor (i = 0, l = classes.length; i < l; i++) {\n\t\t\t\t\t\tclassName = classes[i];\n\t\t\t\t\t\tif (CLASS_ATTR_MAP[className]) {\n\t\t\t\t\t\t\td[className] = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\textraClasses.push(className);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\td.extraClasses = extraClasses.join(\" \");\n\n\t\t\t\t\t// Parse node options from ID, title and class attributes\n\t\t\t\t\ttmp = $li.attr(\"title\");\n\t\t\t\t\tif (tmp) {\n\t\t\t\t\t\td.tooltip = tmp; // overrides <a title='...'>\n\t\t\t\t\t}\n\t\t\t\t\ttmp = $li.attr(\"id\");\n\t\t\t\t\tif (tmp) {\n\t\t\t\t\t\td.key = tmp;\n\t\t\t\t\t}\n\t\t\t\t\t// Translate hideCheckbox -> checkbox:false\n\t\t\t\t\tif ($li.attr(\"hideCheckbox\")) {\n\t\t\t\t\t\td.checkbox = false;\n\t\t\t\t\t}\n\t\t\t\t\t// Add <li data-NAME='...'> as node.data.NAME\n\t\t\t\t\tallData = _getElementDataAsDict($li);\n\t\t\t\t\tif (allData && !$.isEmptyObject(allData)) {\n\t\t\t\t\t\t// #507: convert data-hidecheckbox (lower case) to hideCheckbox\n\t\t\t\t\t\tfor (lowerCaseAttr in NODE_ATTR_LOWERCASE_MAP) {\n\t\t\t\t\t\t\tif (allData.hasOwnProperty(lowerCaseAttr)) {\n\t\t\t\t\t\t\t\tallData[\n\t\t\t\t\t\t\t\t\tNODE_ATTR_LOWERCASE_MAP[lowerCaseAttr]\n\t\t\t\t\t\t\t\t] = allData[lowerCaseAttr];\n\t\t\t\t\t\t\t\tdelete allData[lowerCaseAttr];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// #56: Allow to set special node.attributes from data-...\n\t\t\t\t\t\tfor (i = 0, l = NODE_ATTRS.length; i < l; i++) {\n\t\t\t\t\t\t\ttmp = NODE_ATTRS[i];\n\t\t\t\t\t\t\ttmp2 = allData[tmp];\n\t\t\t\t\t\t\tif (tmp2 != null) {\n\t\t\t\t\t\t\t\tdelete allData[tmp];\n\t\t\t\t\t\t\t\td[tmp] = tmp2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// All other data-... goes to node.data...\n\t\t\t\t\t\t$.extend(d.data, allData);\n\t\t\t\t\t}\n\t\t\t\t\t// Recursive reading of child nodes, if LI tag contains an UL tag\n\t\t\t\t\t$ul = $li.find(\">ul\").first();\n\t\t\t\t\tif ($ul.length) {\n\t\t\t\t\t\td.children = $.ui.fancytree.parseHtml($ul);\n\t\t\t\t\t} else {\n\t\t\t\t\t\td.children = d.lazy ? undefined : null;\n\t\t\t\t\t}\n\t\t\t\t\tchildren.push(d);\n\t\t\t\t\t// FT.debug(\"parse \", d, children);\n\t\t\t\t});\n\t\t\t\treturn children;\n\t\t\t},\n\t\t\t/** Add Fancytree extension definition to the list of globally available extensions.\n\t\t\t *\n\t\t\t * @param {object} definition\n\t\t\t */\n\t\t\tregisterExtension: function(definition) {\n\t\t\t\t_assert(\n\t\t\t\t\tdefinition.name != null,\n\t\t\t\t\t\"extensions must have a `name` property.\"\n\t\t\t\t);\n\t\t\t\t_assert(\n\t\t\t\t\tdefinition.version != null,\n\t\t\t\t\t\"extensions must have a `version` property.\"\n\t\t\t\t);\n\t\t\t\t$.ui.fancytree._extensions[definition.name] = definition;\n\t\t\t},\n\t\t\t/** Inverse of escapeHtml().\n\t\t\t *\n\t\t\t * @param {string} s\n\t\t\t * @returns {string}\n\t\t\t */\n\t\t\tunescapeHtml: function(s) {\n\t\t\t\tvar e = document.createElement(\"div\");\n\t\t\t\te.innerHTML = s;\n\t\t\t\treturn e.childNodes.length === 0\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: e.childNodes[0].nodeValue;\n\t\t\t},\n\t\t\t/** Write warning message to console if debugLevel >= 2.\n\t\t\t * @param {string} msg\n\t\t\t */\n\t\t\twarn: function(msg) {\n\t\t\t\tif ($.ui.fancytree.debugLevel >= 2) {\n\t\t\t\t\tconsoleApply(\"warn\", arguments);\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t);\n\n\t// Value returned by `require('jquery.fancytree')`\n\treturn $.ui.fancytree;\n}); // End of closure\n","/**\n * Admin modules\n */\n\nconst WP_Smush = WP_Smush || {};\nwindow.WP_Smush = WP_Smush;\n\n/**\n * IE polyfill for includes.\n *\n * @since 3.1.0\n * @param {string} search\n * @param {number} start\n * @return {boolean} Returns true if searchString appears as a substring of the result of converting this\n * object to a String, at one or more positions that are\n * greater than or equal to position; otherwise, returns false.\n */\nif ( ! String.prototype.includes ) {\n\tString.prototype.includes = function( search, start ) {\n\t\tif ( typeof start !== 'number' ) {\n\t\t\tstart = 0;\n\t\t}\n\n\t\tif ( start + search.length > this.length ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn this.indexOf( search, start ) !== -1;\n\t};\n}\n\nrequire( './modules/helpers' );\nrequire( './modules/admin' );\nrequire( './modules/bulk-smush' );\nrequire( './modules/onboarding' );\nrequire( './modules/directory-smush' );\nrequire( './smush/cdn' );\nrequire( './smush/lazy-load' );\nrequire( './modules/bulk-restore' );\n\n/**\n * Notice scripts.\n *\n * Notices are used in the following functions:\n *\n * @used-by \\Smush\\Core\\Modules\\Smush::smush_updated()\n * @used-by \\Smush\\Core\\Integrations\\S3::3_support_required_notice()\n * @used-by \\Smush\\App\\Abstract_Page::installation_notice()\n *\n * TODO: should this be moved out in a separate file like common.scss?\n */\nrequire( './modules/notice' );\n","/* global WP_Smush */\n/* global ajaxurl */\n/* global wp_smush_msgs */\n/* global smush_vars */\n\n/**\n * Helpers functions.\n *\n * @since 2.9.0 Moved from admin.js\n */\n( function() {\n\t'use strict';\n\n\tWP_Smush.helpers = {\n\t\tinit: () => {},\n\n\t\t/**\n\t\t * Convert bytes to human readable form.\n\t\t *\n\t\t * @param {number} a Bytes\n\t\t * @param {number} b Number of digits\n\t\t * @return {*} Formatted Bytes\n\t\t */\n\t\tformatBytes: ( a, b ) => {\n\t\t\tconst thresh = 1024,\n\t\t\t\tunits = [ 'KB', 'MB', 'GB', 'TB', 'PB' ];\n\n\t\t\tif ( Math.abs( a ) < thresh ) {\n\t\t\t\treturn a + ' B';\n\t\t\t}\n\n\t\t\tlet u = -1;\n\n\t\t\tdo {\n\t\t\t\ta /= thresh;\n\t\t\t\t++u;\n\t\t\t} while ( Math.abs( a ) >= thresh && u < units.length - 1 );\n\n\t\t\treturn a.toFixed( b ) + ' ' + units[ u ];\n\t\t},\n\n\t\t/**\n\t\t * Get size from a string.\n\t\t *\n\t\t * @param {string} formattedSize Formatter string\n\t\t * @return {*} Formatted Bytes\n\t\t */\n\t\tgetSizeFromString: ( formattedSize ) => {\n\t\t\treturn formattedSize.replace( /[a-zA-Z]/g, '' ).trim();\n\t\t},\n\n\t\t/**\n\t\t * Get type from formatted string.\n\t\t *\n\t\t * @param {string} formattedSize Formatted string\n\t\t * @return {*} Formatted Bytes\n\t\t */\n\t\tgetFormatFromString: ( formattedSize ) => {\n\t\t\treturn formattedSize.replace( /[0-9.]/g, '' ).trim();\n\t\t},\n\n\t\t/**\n\t\t * Stackoverflow: http://stackoverflow.com/questions/1726630/formatting-a-number-with-exactly-two-decimals-in-javascript\n\t\t *\n\t\t * @param {number} num\n\t\t * @param {number} decimals\n\t\t * @return {number} Number\n\t\t */\n\t\tprecise_round: ( num, decimals ) => {\n\t\t\tconst sign = num >= 0 ? 1 : -1;\n\t\t\t// Keep the percentage below 100.\n\t\t\tnum = num > 100 ? 100 : num;\n\t\t\treturn ( Math.round( ( num * Math.pow( 10, decimals ) ) + ( sign * 0.001 ) ) / Math.pow( 10, decimals ) );\n\t\t},\n\n\t\t/**\n\t\t * Reset settings.\n\t\t *\n\t\t * @since 3.2.0\n\t\t */\n\t\tresetSettings: () => {\n\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\txhr.open( 'POST', ajaxurl + '?action=reset_settings', true );\n\t\t\txhr.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );\n\t\t\txhr.onload = () => {\n\t\t\t\tif ( 200 === xhr.status ) {\n\t\t\t\t\tconst res = JSON.parse( xhr.response );\n\t\t\t\t\tif ( 'undefined' !== typeof res.success && res.success ) {\n\t\t\t\t\t\twindow.location.href = wp_smush_msgs.smush_url;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\twindow.console.log( 'Request failed. Returned status of ' + xhr.status );\n\t\t\t\t}\n\t\t\t};\n\t\t\txhr.send( '_ajax_nonce=' + smush_vars.nonce.get_smush_status );\n\t\t},\n\n\t};\n\n\tWP_Smush.helpers.init();\n}() );\n","import Smush from '../smush/smush';\n\nconst remove_element = function( el, timeout ) {\n\tif ( typeof timeout === 'undefined' ) {\n\t\ttimeout = 100;\n\t}\n\tel.fadeTo( timeout, 0, function() {\n\t\tel.slideUp( timeout, function() {\n\t\t\tel.remove();\n\t\t} );\n\t} );\n};\n\njQuery( function( $ ) {\n\t'use strict';\n\n\t/** Disable the action links **/\n\tconst disable_links = function( c_element ) {\n\t\tconst parent = c_element.parent();\n\t\t//reduce parent opacity\n\t\tparent.css( { opacity: '0.5' } );\n\t\t//Disable Links\n\t\tparent.find( 'a' ).attr( 'disabled', 'disabled' );\n\t};\n\n\t/** Enable the Action Links **/\n\tconst enable_links = function( c_element ) {\n\t\tconst parent = c_element.parent();\n\n\t\t//reduce parent opacity\n\t\tparent.css( { opacity: '1' } );\n\t\t//Disable Links\n\t\tparent.find( 'a' ).removeAttr( 'disabled' );\n\t};\n\t/**\n\t * Restore image request with a specified action for Media Library / NextGen Gallery\n *\n\t * @param e\n\t * @param current_button\n\t * @param smush_action\n\t * @return {boolean}\n\t */\n\tconst process_smush_action = function( e, current_button, smush_action, action ) {\n\t\t//If disabled\n\t\tif ( 'disabled' == current_button.attr( 'disabled' ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\t//Remove Error\n\t\t$( '.wp-smush-error' ).remove();\n\n\t\t//Hide stats\n\t\t$( '.smush-stats-wrapper' ).hide();\n\n\t\tlet mode = 'grid';\n\t\tif ( 'smush_restore_image' == smush_action ) {\n\t\t\tif ( $( document ).find( 'div.media-modal.wp-core-ui' ).length > 0 ) {\n\t\t\t\tmode = 'grid';\n\t\t\t} else {\n\t\t\t\tmode = window.location.search.indexOf( 'item' ) > -1 ? 'grid' : 'list';\n\t\t\t}\n\t\t}\n\n\t\t//Get the image ID and nonce\n\t\tconst params = {\n\t\t\taction: smush_action,\n\t\t\tattachment_id: current_button.data( 'id' ),\n\t\t\tmode,\n\t\t\t_nonce: current_button.data( 'nonce' ),\n\t\t};\n\n\t\t//Reduce the opacity of stats and disable the click\n\t\tdisable_links( current_button );\n\n\t\tSmush.progressBar( current_button, wp_smush_msgs[ action ], 'show' );\n\n\t\t//Restore the image\n\t\t$.post( ajaxurl, params, function( r ) {\n\t\t\tSmush.progressBar( current_button, wp_smush_msgs[ action ], 'hide' );\n\n\t\t\t//reset all functionality\n\t\t\tenable_links( current_button );\n\n\t\t\tif ( r.success && 'undefined' !== typeof ( r.data.button ) ) {\n\t\t\t\t//Replace in immediate parent for nextgen\n\t\t\t\tif ( 'undefined' !== typeof ( this.data ) && this.data.indexOf( 'nextgen' ) > -1 ) {\n\t\t\t\t\t//Show the smush button, and remove stats and restore option\n\t\t\t\t\tcurrent_button.parent().html( r.data.button );\n\t\t\t\t} else {\n\t\t\t\t\t//Show the smush button, and remove stats and restore option\n\t\t\t\t\tconsole.log( current_button.parents().eq( 2 ) );\n\t\t\t\t\tcurrent_button.parents().eq( 1 ).html( r.data.button );\n\t\t\t\t}\n\n\t\t\t\tif ( 'undefined' !== typeof ( r.data ) && 'restore' === action ) {\n\t\t\t\t\tSmush.updateImageStats( r.data.new_size );\n\t\t\t\t}\n\t\t\t} else if ( r.data.message ) {\n\t\t\t\t//show error\n\t\t\t\tcurrent_button.parent().append( r.data.message );\n\t\t\t}\n\t\t} );\n\t};\n\n\t/**\n\t * Validates the Resize Width and Height against the Largest Thumbnail Width and Height\n\t *\n\t * @param wrapper_div jQuery object for the whole setting row wrapper div\n\t * @param width_only Whether to validate only width\n\t * @param height_only Validate only Height\n\t * @return {boolean} All Good or not\n\t *\n\t */\n\tconst validate_resize_settings = function( wrapper_div, width_only, height_only ) {\n\t\tconst resize_checkbox = wrapper_div.find( '#wp-smush-resize, #wp-smush-resize-quick-setup' );\n\n\t\tif ( ! height_only ) {\n\t\t\tvar width_input = wrapper_div.find( '#wp-smush-resize_width, #quick-setup-resize_width' );\n\t\t\tvar width_error_note = wrapper_div.find( '.sui-notice-info.wp-smush-update-width' );\n\t\t}\n\t\tif ( ! width_only ) {\n\t\t\tvar height_input = wrapper_div.find( '#wp-smush-resize_height, #quick-setup-resize_height' );\n\t\t\tvar height_error_note = wrapper_div.find( '.sui-notice-info.wp-smush-update-height' );\n\t\t}\n\n\t\tlet width_error = false;\n\t\tlet height_error = false;\n\n\t\t//If resize settings is not enabled, return true\n\t\tif ( ! resize_checkbox.is( ':checked' ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t//Check if we have localised width and height\n\t\tif ( 'undefined' === typeof ( wp_smushit_data.resize_sizes ) || 'undefined' === typeof ( wp_smushit_data.resize_sizes.width ) ) {\n\t\t\t//Rely on server validation\n\t\t\treturn true;\n\t\t}\n\n\t\t//Check for width\n\t\tif ( ! height_only && 'undefined' !== typeof width_input && parseInt( wp_smushit_data.resize_sizes.width ) > parseInt( width_input.val() ) ) {\n\t\t\twidth_input.parent().addClass( 'sui-form-field-error' );\n\t\t\twidth_error_note.show( 'slow' );\n\t\t\twidth_error = true;\n\t\t} else {\n\t\t\t//Remove error class\n\t\t\twidth_input.parent().removeClass( 'sui-form-field-error' );\n\t\t\twidth_error_note.hide();\n\t\t\tif ( height_input.hasClass( 'error' ) ) {\n\t\t\t\theight_error_note.show( 'slow' );\n\t\t\t}\n\t\t}\n\n\t\t//Check for height\n\t\tif ( ! width_only && 'undefined' !== typeof height_input && parseInt( wp_smushit_data.resize_sizes.height ) > parseInt( height_input.val() ) ) {\n\t\t\theight_input.parent().addClass( 'sui-form-field-error' );\n\t\t\t//If we are not showing the width error already\n\t\t\tif ( ! width_error ) {\n\t\t\t\theight_error_note.show( 'slow' );\n\t\t\t}\n\t\t\theight_error = true;\n\t\t} else {\n\t\t\t//Remove error class\n\t\t\theight_input.parent().removeClass( 'sui-form-field-error' );\n\t\t\theight_error_note.hide();\n\t\t\tif ( width_input.hasClass( 'error' ) ) {\n\t\t\t\twidth_error_note.show( 'slow' );\n\t\t\t}\n\t\t}\n\n\t\tif ( width_error || height_error ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\t/**\n\t * Update the progress bar width if we have images that needs to be resmushed\n *\n\t * @param unsmushed_count\n\t * @return {boolean}\n\t */\n\tconst update_progress_bar_resmush = function( unsmushed_count ) {\n\t\tif ( 'undefined' === typeof unsmushed_count ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst smushed_count = wp_smushit_data.count_total - unsmushed_count;\n\n\t\t//Update the Progress Bar Width\n\t\t// get the progress bar\n\t\tconst $progress_bar = jQuery( '.bulk-smush-wrapper .wp-smush-progress-inner' );\n\t\tif ( $progress_bar.length < 1 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst width = ( smushed_count / wp_smushit_data.count_total ) * 100;\n\n\t\t// increase progress\n\t\t$progress_bar.css( 'width', width + '%' );\n\t};\n\n\tconst run_re_check = function( process_settings ) {\n\t\tconst button = $( '.wp-smush-scan' );\n\n\t\t// Empty the button text and add loader class.\n\t\tbutton.text( '' ).addClass( 'sui-button-onload sui-icon-loader sui-loading' ).blur();\n\n\t\t// Check if type is set in data attributes.\n\t\tlet scan_type = button.data( 'type' );\n\t\tscan_type = 'undefined' === typeof scan_type ? 'media' : scan_type;\n\n\t\t// Remove the Skip resmush attribute from button.\n\t\t$( '.wp-smush-all' ).removeAttr( 'data-smush' );\n\n\t\t// Remove notices.\n\t\tconst notices = $( '.sui-notice-top.sui-notice-success' );\n\t\tnotices.slideUp( 100, function() {\n\t\t\tnotices.remove();\n\t\t} );\n\n\t\t// Disable Bulk smush button and itself.\n\t\t$( '.wp-smush-all' ).attr( 'disabled', 'disabled' );\n\n\t\t// Hide Settings changed Notice.\n\t\t$( '.wp-smush-settings-changed' ).hide();\n\n\t\t// Ajax params.\n\t\tconst params = {\n\t\t\taction: 'scan_for_resmush',\n\t\t\ttype: scan_type,\n\t\t\tget_ui: true,\n\t\t\tprocess_settings,\n\t\t\twp_smush_options_nonce: jQuery( '#wp_smush_options_nonce' ).val(),\n\t\t};\n\n\t\t// Send ajax request and get ids if any.\n\t\t$.get( ajaxurl, params, function( r ) {\n\t\t\t// Check if we have the ids, initialize the local variable.\n\t\t\tif ( 'undefined' !== typeof r.data ) {\n\t\t\t\t// Update Resmush id list.\n\t\t\t\tif ( 'undefined' !== typeof r.data.resmush_ids ) {\n\t\t\t\t\twp_smushit_data.resmush = r.data.resmush_ids;\n\n\t\t\t\t\t// Update wp_smushit_data ( Smushed count, Smushed Percent, Image count, Super smush count, resize savings, conversion savings ).\n\t\t\t\t\tif ( 'undefinied' !== typeof wp_smushit_data ) {\n\t\t\t\t\t\twp_smushit_data.count_smushed = 'undefined' !== typeof r.data.count_smushed ? r.data.count_smushed : wp_smushit_data.count_smushed;\n\t\t\t\t\t\twp_smushit_data.count_supersmushed = 'undefined' !== typeof r.data.count_supersmushed ? r.data.count_supersmushed : wp_smushit_data.count_supersmushed;\n\t\t\t\t\t\twp_smushit_data.count_images = 'undefined' !== typeof r.data.count_image ? r.data.count_image : wp_smushit_data.count_images;\n\t\t\t\t\t\twp_smushit_data.size_before = 'undefined' !== typeof r.data.size_before ? r.data.size_before : wp_smushit_data.size_before;\n\t\t\t\t\t\twp_smushit_data.size_after = 'undefined' !== typeof r.data.size_after ? r.data.size_after : wp_smushit_data.size_after;\n\t\t\t\t\t\twp_smushit_data.savings_resize = 'undefined' !== typeof r.data.savings_resize ? r.data.savings_resize : wp_smushit_data.savings_resize;\n\t\t\t\t\t\twp_smushit_data.savings_conversion = 'undefined' !== typeof r.data.savings_conversion ? r.data.savings_conversion : wp_smushit_data.savings_conversion;\n\t\t\t\t\t\twp_smushit_data.count_resize = 'undefined' !== typeof r.data.count_resize ? r.data.count_resize : wp_smushit_data.count_resize;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'nextgen' === scan_type ) {\n\t\t\t\t\t\twp_smushit_data.bytes = parseInt( wp_smushit_data.size_before ) - parseInt( wp_smushit_data.size_after );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Hide the Existing wrapper.\n\t\t\t\t\tconst notices = $( '.bulk-smush-wrapper .sui-notice' );\n\t\t\t\t\tif ( notices.length > 0 ) {\n\t\t\t\t\t\tnotices.hide();\n\t\t\t\t\t\t$( '.wp-smush-pagespeed-recommendation' ).hide();\n\t\t\t\t\t}\n\t\t\t\t\t// Remove existing Re-Smush notices.\n\t\t\t\t\t$( '.wp-smush-resmush-notice' ).remove();\n\n\t\t\t\t\t// Show Bulk wrapper.\n\t\t\t\t\t$( '.wp-smush-bulk-wrapper' ).show();\n\t\t\t\t}\n\t\t\t\t// If content is received, Prepend it.\n\t\t\t\tif ( 'undefined' !== typeof r.data.content ) {\n\t\t\t\t\t$( '.bulk-smush-wrapper .sui-box-body > p:first-of-type' ).after( r.data.content );\n\t\t\t\t}\n\t\t\t\t// If we have any notice to show.\n\t\t\t\tif ( 'undefined' !== typeof r.data.notice ) {\n\t\t\t\t\t$( '.wp-smush-page-header' ).after( r.data.notice );\n\t\t\t\t}\n\t\t\t\t// Hide errors.\n\t\t\t\t$( 'div.smush-final-log' ).hide();\n\n\t\t\t\t// Hide Super Smush notice if it's enabled in media settings.\n\t\t\t\tif ( 'undefined' !== typeof r.data.super_smush && r.data.super_smush ) {\n\t\t\t\t\tconst enable_lossy = jQuery( '.wp-smush-enable-lossy' );\n\t\t\t\t\tif ( enable_lossy.length > 0 ) {\n\t\t\t\t\t\tenable_lossy.remove();\n\t\t\t\t\t}\n\t\t\t\t\tif ( 'undefined' !== r.data.super_smush_stats ) {\n\t\t\t\t\t\t$( '.super-smush-attachments .wp-smush-stats' ).html( r.data.super_smush_stats );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tSmush.updateStats( scan_type );\n\t\t\t}\n\t\t} ).always( function() {\n\t\t\t// Hide the progress bar.\n\t\t\tjQuery( '.bulk-smush-wrapper .wp-smush-bulk-progress-bar-wrapper' ).hide();\n\n\t\t\t// Add check complete status to button.\n\t\t\tbutton.text( wp_smush_msgs.resmush_complete )\n\t\t\t\t.removeClass( 'sui-button-onload sui-icon-loader sui-loading' )\n\t\t\t\t.addClass( 'smush-button-check-success' );\n\n\t\t\t// Remove success message from button.\n\t\t\tsetTimeout( function() {\n\t\t\t\tbutton.removeClass( 'smush-button-check-success' )\n\t\t\t\t\t.html( '<i class=\"sui-icon-update\" aria-hidden=\"true\"></i>' + wp_smush_msgs.resmush_check );\n\t\t\t}, 2000 );\n\n\t\t\t$( '.wp-smush-all' ).removeAttr( 'disabled' );\n\n\t\t\t// If wp-smush-re-check-message is there, remove it.\n\t\t\tconst reCheckMessage = $( '.wp-smush-re-check-message' );\n\t\t\tif ( reCheckMessage.length ) {\n\t\t\t\tremove_element( reCheckMessage );\n\t\t\t}\n\t\t} );\n\t};\n\n\t// Scroll the element to top of the page.\n\tconst goToByScroll = function( selector ) {\n\t\t// Scroll if element found.\n\t\tif ( $( selector ).length > 0 ) {\n\t\t\t$( 'html, body' ).animate( {\n\t\t\t\tscrollTop: $( selector ).offset().top - 100,\n\t\t\t}, 'slow'\n\t\t\t);\n\t\t}\n\t};\n\n\tconst update_cummulative_stats = function( stats ) {\n\t\t//Update Directory Smush Stats\n\t\tif ( 'undefined' !== typeof ( stats.dir_smush ) ) {\n\t\t\tconst stats_human = $( 'li.smush-dir-savings span.wp-smush-stats span.wp-smush-stats-human' );\n\t\t\tconst stats_percent = $( 'li.smush-dir-savings span.wp-smush-stats span.wp-smush-stats-percent' );\n\n\t\t\t// Do not replace if 0 savings.\n\t\t\tif ( stats.dir_smush.bytes > 0 ) {\n\t\t\t\t// Hide selector.\n\t\t\t\t$( 'li.smush-dir-savings .wp-smush-stats-label-message' ).hide();\n\t\t\t\t//Update Savings in bytes\n\t\t\t\tif ( stats_human.length > 0 ) {\n\t\t\t\t\tstats_human.html( stats.dir_smush.human );\n\t\t\t\t} else {\n\t\t\t\t\tvar span = '<span class=\"wp-smush-stats-human\">' + stats.dir_smush.bytes + '</span>';\n\t\t\t\t}\n\n\t\t\t\t//Percentage section\n\t\t\t\tif ( stats.dir_smush.percent > 0 ) {\n\t\t\t\t\t// Show size and percentage separator.\n\t\t\t\t\t$( 'li.smush-dir-savings span.wp-smush-stats span.wp-smush-stats-sep' ).removeClass( 'sui-hidden' );\n\t\t\t\t\t//Update Optimisation percentage\n\t\t\t\t\tif ( stats_percent.length > 0 ) {\n\t\t\t\t\t\tstats_percent.html( stats.dir_smush.percent + '%' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar span = '<span class=\"wp-smush-stats-percent\">' + stats.dir_smush.percent + '%' + '</span>';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//Update Combined stats\n\t\tif ( 'undefined' !== typeof ( stats.combined_stats ) && stats.combined_stats.length > 0 ) {\n\t\t\tconst c_stats = stats.combined_stats;\n\n\t\t\tlet smush_percent = ( c_stats.smushed / c_stats.total_count ) * 100;\n\t\t\tsmush_percent = WP_Smush.helpers.precise_round( smush_percent, 1 );\n\n\t\t\t//Smushed Percent\n\t\t\tif ( smush_percent ) {\n\t\t\t\t$( 'div.wp-smush-count-total span.wp-smush-images-percent' ).html( smush_percent );\n\t\t\t}\n\t\t\t//Update Total Attachment Count\n\t\t\tif ( c_stats.total_count ) {\n\t\t\t\t$( 'span.wp-smush-count-total span.wp-smush-total-optimised' ).html( c_stats.total_count );\n\t\t\t}\n\t\t\t//Update Savings and Percent\n\t\t\tif ( c_stats.savings ) {\n\t\t\t\t$( 'span.wp-smush-savings span.wp-smush-stats-human' ).html( c_stats.savings );\n\t\t\t}\n\t\t\tif ( c_stats.percent ) {\n\t\t\t\t$( 'span.wp-smush-savings span.wp-smush-stats-percent' ).html( c_stats.percent );\n\t\t\t}\n\t\t}\n\t};\n\n\t//Remove span tag from URL\n\tfunction removeSpan( url ) {\n\t\tvar url = url.slice( url.indexOf( '?' ) + 1 ).split( '&' );\n\t\tfor ( let i = 0; i < url.length; i++ ) {\n\t\t\tconst urlparam = decodeURI( url[ i ] ).split( /=(.+)/ )[ 1 ];\n\t\t\treturn urlparam.replace( /<(?:.|\\n)*?>/gm, '' );\n\t\t}\n\t}\n\n\t/**\n\t * When 'All' is selected for the Image Sizes setting, select all available sizes.\n\t *\n\t * @since 3.2.1\n\t */\n\t$( '#all-image-sizes' ).on( 'change', function() {\n\t\t$( 'input[name^=\"wp-smush-image_sizes\"]' ).prop( 'checked', true );\n\t} );\n\n\t/**\n\t * Handle re-check api status button click (Settings)\n\t *\n\t * @since 3.2.0.2\n\t */\n\t$( '#wp-smush-update-api-status' ).on( 'click', function( e ) {\n\t\te.preventDefault();\n\n\t\t//$(this).prop('disabled', true);\n\t\t$( this ).addClass( 'sui-button-onload' );\n\n\t\t$.post( ajaxurl, { action: 'recheck_api_status' }, function() {\n\t\t\tlocation.reload();\n\t\t} );\n\t} );\n\n\t/**\n\t * Handle the Smush Stats link click\n\t */\n\t$( 'body' ).on( 'click', 'a.smush-stats-details', function( e ) {\n\t\t//If disabled\n\t\tif ( 'disabled' == $( this ).attr( 'disabled' ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// prevent the default action\n\t\te.preventDefault();\n\t\t//Replace the `+` with a `-`\n\t\tconst slide_symbol = $( this ).find( '.stats-toggle' );\n\t\t$( this ).parents().eq( 1 ).find( '.smush-stats-wrapper' ).slideToggle();\n\t\tslide_symbol.text( slide_symbol.text() == '+' ? '-' : '+' );\n\t} );\n\n\t/** Handle smush button click **/\n\t$( 'body' ).on( 'click', '.wp-smush-send:not(.wp-smush-resmush)', function( e ) {\n\t\t// prevent the default action\n\t\te.preventDefault();\n\t\tnew Smush( $( this ), false );\n\t} );\n\n\t/** Handle show in bulk smush button click **/\n\t$( 'body' ).on( 'click', '.wp-smush-remove-skipped', function( e ) {\n\t\te.preventDefault();\n\n\t\tconst self = $( this );\n\n\t\t// Send Ajax request to remove the image from the skip list.\n\t\t$.post( ajaxurl, {\n\t\t\taction: 'remove_from_skip_list',\n\t\t\tid: self.attr( 'data-id' ),\n\t\t} )\n\t\t\t.done( () => {\n\t\t\t\te.target.classList.remove( 'wp-smush-remove-skipped' );\n\t\t\t\te.target.classList.add( 'smush-ignore-image' );\n\t\t\t\te.target.text = wp_smush_msgs.ignore;\n\t\t\t\tself.parent().find( '.smush-status' ).text( wp_smush_msgs.not_processed );\n\t\t\t} );\n\t} );\n\n\t/** Handle NextGen Gallery smush button click **/\n\t$( 'body' ).on( 'click', '.wp-smush-nextgen-send', function( e ) {\n\t\t// prevent the default action\n\t\te.preventDefault();\n\t\tnew Smush( $( this ), false, 'nextgen' );\n\t} );\n\n\t/** Handle NextGen Gallery Bulk smush button click **/\n\t$( 'body' ).on( 'click', '.wp-smush-nextgen-bulk', function( e ) {\n\t\t// prevent the default action\n\t\te.preventDefault();\n\n\t\t// Remove existing Re-Smush notices.\n\t\t$( '.wp-smush-resmush-notice' ).remove();\n\n\t\t//Check for ids, if there is none (Unsmushed or lossless), don't call smush function\n\t\tif ( 'undefined' === typeof wp_smushit_data ||\n\t\t\t( wp_smushit_data.unsmushed.length === 0 && wp_smushit_data.resmush.length === 0 )\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tjQuery( '.wp-smush-all, .wp-smush-scan' ).attr( 'disabled', 'disabled' );\n\t\t$( '.wp-smush-notice.wp-smush-remaining' ).hide();\n\t\tnew Smush( $( this ), true, 'nextgen' );\n\t} );\n\n\t/** Restore: Media Library **/\n\t$( 'body' ).on( 'click', '.wp-smush-action.wp-smush-restore', function( e ) {\n\t\tconst current_button = $( this );\n\t\tprocess_smush_action( e, current_button, 'smush_restore_image', 'restore' );\n\t} );\n\n\t/** Resmush: Media Library **/\n\t$( 'body' ).on( 'click', '.wp-smush-action.wp-smush-resmush', function( e ) {\n\t\tprocess_smush_action( e, $( this ), 'smush_resmush_image', 'smushing' );\n\t} );\n\n\t/** Restore: NextGen Gallery **/\n\t$( 'body' ).on( 'click', '.wp-smush-action.wp-smush-nextgen-restore', function( e ) {\n\t\tprocess_smush_action( e, $( this ), 'smush_restore_nextgen_image', 'restore' );\n\t} );\n\n\t/** Resmush: NextGen Gallery **/\n\t$( 'body' ).on( 'click', '.wp-smush-action.wp-smush-nextgen-resmush', function( e ) {\n\t\tprocess_smush_action( e, $( this ), 'smush_resmush_nextgen_image', 'smushing' );\n\t} );\n\n\t//Scan For resmushing images\n\t$( '.wp-smush-scan' ).on( 'click', function( e ) {\n\t\te.preventDefault();\n\t\trun_re_check( false );\n\t} );\n\n\t//Dismiss Welcome notice\n\t//@todo: Use it for popup\n\t$( '#wp-smush-welcome-box .smush-dismiss-welcome' ).on( 'click', function( e ) {\n\t\te.preventDefault();\n\t\tconst $el = $( this ).parents().eq( 1 );\n\t\tremove_element( $el );\n\n\t\t//Send a ajax request to save the dismissed notice option\n\t\tconst param = {\n\t\t\taction: 'dismiss_welcome_notice',\n\t\t};\n\t\t$.post( ajaxurl, param );\n\t} );\n\n\t//Remove Notice\n\t$( 'body' ).on( 'click', '.wp-smush-notice .icon-fi-close', function( e ) {\n\t\te.preventDefault();\n\t\tconst $el = $( this ).parent();\n\t\tremove_element( $el );\n\t} );\n\n\t/**\n * Parse remove data change.\n */\n\t$( 'input[name=wp-smush-keep_data]' ).on( 'change', function( e ) {\n\t\tconst otherClass = 'keep_data-true' === e.target.id ? 'keep_data-false' : 'keep_data-true';\n\t\te.target.parentNode.classList.add( 'active' );\n\t\tdocument.getElementById( otherClass ).parentNode.classList.remove( 'active' );\n\t} );\n\n\t// On Click Update Settings. Check for change in settings.\n\t$( 'button#wp-smush-save-settings' ).on( 'click', function( e ) {\n\t\te.preventDefault();\n\n\t\tlet setting_type = '';\n\t\tconst setting_input = $( 'input[name=\"setting-type\"]' );\n\t\t// Check if setting type is set in the form.\n\t\tif ( setting_input.length > 0 ) {\n\t\t\tsetting_type = setting_input.val();\n\t\t}\n\n\t\t// Show the spinner.\n\t\tconst self = $( this );\n\t\tself.parent().find( 'span.sui-icon-loader.sui-loading' ).removeClass( 'sui-hidden' );\n\n\t\t// Save settings if in network admin.\n\t\tif ( '' != setting_type && 'network' == setting_type ) {\n\t\t\t// Ajax param.\n\t\t\tlet param = {\n\t\t\t\taction: 'save_settings',\n\t\t\t\twp_smush_options_nonce: $( '#wp_smush_options_nonce' ).val(),\n\t\t\t};\n\n\t\t\tparam = jQuery.param( param ) + '&' + jQuery( 'form#wp-smush-settings-form' ).serialize();\n\n\t\t\t// Send ajax, Update Settings, And Check For resmush.\n\t\t\tjQuery.post( ajaxurl, param ).done( function() {\n\t\t\t\tjQuery( 'form#wp-smush-settings-form' ).submit();\n\t\t\t\treturn true;\n\t\t\t} );\n\t\t} else {\n\t\t\t$( '.wp-smush-hex-notice' ).hide();\n\n\t\t\t// Update text.\n\t\t\tself.attr( 'disabled', 'disabled' ).addClass( 'button-grey' );\n\n\t\t\t// Update save button text.\n\t\t\tif ( 'undefined' !== typeof self.attr( 'data-msg' ) && self.attr( 'data-msg' ).length > 0 ) {\n\t\t\t\tself.html( self.attr( 'data-msg' ) );\n\t\t\t} else {\n\t\t\t\tself.html( wp_smush_msgs.checking );\n\t\t\t}\n\n\t\t\t// Check if type is set in data attributes.\n\t\t\tlet scan_type = self.data( 'type' );\n\t\t\tscan_type = 'undefined' === typeof scan_type ? 'media' : scan_type;\n\n\t\t\t// Ajax param.\n\t\t\tlet param = {\n\t\t\t\taction: 'scan_for_resmush',\n\t\t\t\twp_smush_options_nonce: jQuery( '#wp_smush_options_nonce' ).val(),\n\t\t\t\ttype: scan_type,\n\t\t\t};\n\n\t\t\tparam = jQuery.param( param ) + '&' + jQuery( 'form#wp-smush-settings-form' ).serialize();\n\n\t\t\t// Send ajax, Update Settings, And Check For resmush.\n\t\t\tjQuery.post( ajaxurl, param ).done( function() {\n\t\t\t\tjQuery( 'form#wp-smush-settings-form' ).submit();\n\t\t\t\treturn true;\n\t\t\t} );\n\t\t}\n\t} );\n\n\t// On re-Smush click.\n\t$( 'body' ).on( 'click', '.wp-smush-skip-resmush', function( e ) {\n\t\te.preventDefault();\n\n\t\tconst self = jQuery( this ),\n\t\t\t container = self.parents().eq( 1 ),\n\t\t\t el = self.parent();\n\n\t\t// Remove Parent div.\n\t\tremove_element( el );\n\n\t\t// Remove Settings Notice.\n\t\t$( '.sui-notice-top.sui-notice-success' ).remove();\n\n\t\t// Set button attribute to skip re-smush ids.\n\t\tcontainer.find( '.wp-smush-all' ).attr( 'data-smush', 'skip_resmush' );\n\n\t\t// Update Smushed count.\n\t\twp_smushit_data.count_smushed = parseInt( wp_smushit_data.count_smushed ) + wp_smushit_data.resmush.length;\n\t\twp_smushit_data.count_supersmushed = parseInt( wp_smushit_data.count_supersmushed ) + wp_smushit_data.resmush.length;\n\n\t\t// Update stats.\n\t\tif ( wp_smushit_data.count_smushed === wp_smushit_data.count_total ) {\n\t\t\t// Show all done notice.\n\t\t\t$( '.wp-smush-notice.wp-smush-all-done, .wp-smush-pagespeed-recommendation' ).show();\n\n\t\t\t// Hide Smush button.\n\t\t\t$( '.wp-smush-bulk-wrapper ' ).hide();\n\t\t}\n\n\t\t// Remove re-Smush notice.\n\t\t$( '.wp-smush-resmush-notice' ).remove();\n\n\t\tlet type = $( '.wp-smush-scan' ).data( 'type' );\n\t\ttype = 'undefined' === typeof type ? 'media' : type;\n\n\t\tconst smushed_count = 'undefined' !== typeof wp_smushit_data.count_smushed ? wp_smushit_data.count_smushed : 0;\n\n\t\tlet smush_percent = ( smushed_count / wp_smushit_data.count_total ) * 100;\n\t\tsmush_percent = WP_Smush.helpers.precise_round( smush_percent, 1 );\n\n\t\t$( '.wp-smush-images-percent' ).html( smush_percent );\n\n\t\t// Update the progress bar width. Get the progress bar.\n\t\tconst progress_bar = jQuery( '.bulk-smush-wrapper .wp-smush-progress-inner' );\n\t\tif ( progress_bar.length < 1 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Increase progress.\n\t\tprogress_bar.css( 'width', smush_percent + '%' );\n\n\t\t// Show the default bulk smush notice.\n\t\t$( '.wp-smush-bulk-wrapper' ).show();\n\t\t$( '.wp-smush-bulk-wrapper .sui-notice' ).show();\n\n\t\tconst params = {\n\t\t\taction: 'delete_resmush_list',\n\t\t\ttype,\n\t\t};\n\n\t\t//Delete resmush list, @todo: update stats from the ajax response\n\t\t$.post( ajaxurl, params, function( res ) {\n\t\t\t// Remove the whole li element on success\n\t\t\tif ( res.success && 'undefined' !== typeof res.data.stats ) {\n\t\t\t\tconst stats = res.data.stats;\n\t\t\t\t// Update wp_smushit_data ( Smushed count, Smushed Percent, Image count, Super smush count, resize savings, conversion savings )\n\t\t\t\tif ( 'undefinied' !== typeof wp_smushit_data ) {\n\t\t\t\t\twp_smushit_data.count_images = 'undefined' !== typeof stats.count_images ? parseInt( wp_smushit_data.count_images ) + stats.count_images : wp_smushit_data.count_images;\n\t\t\t\t\twp_smushit_data.size_before = 'undefined' !== typeof stats.size_before ? parseInt( wp_smushit_data.size_before ) + stats.size_before : wp_smushit_data.size_before;\n\t\t\t\t\twp_smushit_data.size_after = 'undefined' !== typeof stats.size_after ? parseInt( wp_smushit_data.size_after ) + stats.size_after : wp_smushit_data.size_after;\n\t\t\t\t\twp_smushit_data.savings_resize = 'undefined' !== typeof stats.savings_resize ? parseInt( wp_smushit_data.savings_resize ) + stats.savings_resize : wp_smushit_data.savings_resize;\n\t\t\t\t\twp_smushit_data.savings_conversion = 'undefined' !== typeof stats.savings_conversion ? parseInt( wp_smushit_data.savings_conversion ) + stats.savings_conversion : wp_smushit_data.savings_conversion;\n\n\t\t\t\t\t// Add directory smush stats.\n\t\t\t\t\tif ( 'undefined' !== typeof ( wp_smushit_data.savings_dir_smush ) && 'undefined' !== typeof ( wp_smushit_data.savings_dir_smush.orig_size ) ) {\n\t\t\t\t\t\twp_smushit_data.size_before = 'undefined' !== typeof wp_smushit_data.savings_dir_smush ? parseInt( wp_smushit_data.size_before ) + parseInt( wp_smushit_data.savings_dir_smush.orig_size ) : wp_smushit_data.size_before;\n\t\t\t\t\t\twp_smushit_data.size_after = 'undefined' !== typeof wp_smushit_data.savings_dir_smush ? parseInt( wp_smushit_data.size_after ) + parseInt( wp_smushit_data.savings_dir_smush.image_size ) : wp_smushit_data.size_after;\n\t\t\t\t\t}\n\n\t\t\t\t\twp_smushit_data.count_resize = 'undefined' !== typeof stats.count_resize ? parseInt( wp_smushit_data.count_resize ) + stats.count_resize : wp_smushit_data.count_resize;\n\t\t\t\t}\n\t\t\t\t// Smush notice.\n\t\t\t\tconst remainingCountDiv = $( '.bulk-smush-wrapper .wp-smush-remaining-count' );\n\t\t\t\tif ( remainingCountDiv.length && 'undefined' !== typeof wp_smushit_data.unsmushed ) {\n\t\t\t\t\tremainingCountDiv.html( wp_smushit_data.unsmushed.length );\n\t\t\t\t}\n\n\t\t\t\t// If no images left, hide the notice, show all success notice.\n\t\t\t\tif ( 'undefined' !== typeof wp_smushit_data.unsmushed || wp_smushit_data.unsmushed.length === 0 ) {\n\t\t\t\t\t$( '.wp-smush-bulk-wrapper .sui-notice' ).hide();\n\t\t\t\t\t$( '.sui-notice-success.wp-smush-all-done' ).show();\n\t\t\t\t}\n\n\t\t\t\tSmush.updateStats();\n\t\t\t}\n\t\t} );\n\t} );\n\n\t/**\n\t * Enable resize in settings and scroll.\n\t */\n\tconst scroll_and_enable_resize = function() {\n\t\t// Enable resize, show resize settings.\n\t\t$( '#wp-smush-resize' ).prop( 'checked', true ).focus();\n\t\t$( 'div.wp-smush-resize-settings-wrap' ).show();\n\n\t\t// Scroll down to settings area.\n\t\tgoToByScroll( '#column-wp-smush-resize' );\n\t};\n\n\t/**\n\t * Enable super smush in settings and scroll.\n\t */\n\tconst scroll_and_enable_lossy = function() {\n\t\t// Enable super smush.\n\t\t$( '#wp-smush-lossy' ).prop( 'checked', true ).focus();\n\n\t\t// Scroll down to settings area.\n\t\tgoToByScroll( '#column-wp-smush-lossy' );\n\t};\n\n\t// Enable super smush on clicking link from stats area.\n\t$( 'a.wp-smush-lossy-enable' ).on( 'click', function( e ) {\n\t\te.preventDefault();\n\n\t\tscroll_and_enable_lossy();\n\t} );\n\n\t// Enable resize on clicking link from stats area.\n\t$( '.wp-smush-resize-enable' ).on( 'click', function( e ) {\n\t\te.preventDefault();\n\n\t\tscroll_and_enable_resize();\n\t} );\n\n\t// If settings string is found in url, enable and scroll.\n\tif ( window.location.hash ) {\n\t\tconst setting_hash = window.location.hash.substring( 1 );\n\t\t// Enable and scroll to resize settings.\n\t\tif ( 'enable-resize' === setting_hash ) {\n\t\t\tscroll_and_enable_resize();\n\t\t} else if ( 'enable-lossy' === setting_hash ) {\n\t\t\t// Enable and scroll to lossy settings.\n\t\t\tscroll_and_enable_lossy();\n\t\t}\n\t}\n\n\t//Trigger Bulk\n\t$( 'body' ).on( 'click', '.wp-smush-trigger-bulk', function( e ) {\n\t\te.preventDefault();\n\n\t\t//Induce Setting button save click\n\t\tif ( 'undefined' !== typeof e.target.dataset.type && 'nextgen' === e.target.dataset.type ) {\n\t\t\t$( '.wp-smush-nextgen-bulk' ).click();\n\t\t} else {\n\t\t\t$( '.wp-smush-all' ).click();\n\t\t}\n\n\t\t$( 'span.sui-notice-dismiss' ).click();\n\t} );\n\n\t//Trigger Bulk\n\t$( 'body' ).on( 'click', '#bulk-smush-top-notice-close', function( e ) {\n\t\te.preventDefault();\n\t\t$( this ).parent().parent().slideUp( 'slow' );\n\t} );\n\n\t//Allow the checkboxes to be Keyboard Accessible\n\t$( '.wp-smush-setting-row .toggle-checkbox' ).focus( function() {\n\t\t//If Space is pressed\n\t\t$( this ).keypress( function( e ) {\n\t\t\tif ( e.keyCode == 32 ) {\n\t\t\t\te.preventDefault();\n\t\t\t\t$( this ).find( '.toggle-checkbox' ).click();\n\t\t\t}\n\t\t} );\n\t} );\n\n\t// Re-Validate Resize Width And Height.\n\t$( 'body' ).on( 'blur', '.wp-smush-resize-input', function() {\n\t\tconst self = $( this );\n\n\t\tconst wrapper_div = self.parents().eq( 4 );\n\n\t\t// Initiate the check.\n\t\tvalidate_resize_settings( wrapper_div, false, false ); // run the validation.\n\t} );\n\n\t// Handle Resize Checkbox toggle, to show/hide width, height settings.\n\t$( 'body' ).on( 'click', '#wp-smush-resize, #wp-smush-resize-quick-setup', function() {\n\t\tconst self = $( this );\n\t\tconst settings_wrap = $( '.wp-smush-resize-settings-wrap' );\n\n\t\tif ( self.is( ':checked' ) ) {\n\t\t\tsettings_wrap.show();\n\t\t} else {\n\t\t\tsettings_wrap.hide();\n\t\t}\n\t} );\n\n\t// Handle Automatic Smush Checkbox toggle, to show/hide image size settings.\n\t$( '#column-wp-smush-auto' ).on( 'click', '#wp-smush-auto', function() {\n\t\tconst settings_wrap = $( '#column-wp-smush-auto .auto-smush-notice' );\n\n\t\tif ( $( this ).is( ':checked' ) ) {\n\t\t\tsettings_wrap.show();\n\t\t} else {\n\t\t\tsettings_wrap.hide();\n\t\t}\n\t} );\n\n\t// Handle auto detect checkbox toggle, to show/hide highlighting notice.\n\t$( 'body' ).on( 'click', '#wp-smush-detection', function() {\n\t\tconst self = $( this );\n\t\tconst notice_wrap = $( '.smush-highlighting-notice' );\n\t\tconst warning_wrap = $( '.smush-highlighting-warning' );\n\n\t\t// Setting enabled.\n\t\tif ( self.is( ':checked' ) ) {\n\t\t\t// Highlighting is already active and setting not saved.\n\t\t\tif ( notice_wrap.length > 0 ) {\n\t\t\t\tnotice_wrap.show();\n\t\t\t} else {\n\t\t\t\twarning_wrap.show();\n\t\t\t}\n\t\t} else {\n\t\t\tnotice_wrap.hide();\n\t\t\twarning_wrap.hide();\n\t\t}\n\t} );\n\n\t// Handle PNG to JPG Checkbox toggle, to show/hide Transparent image conversion settings.\n\t$( '#wp-smush-png_to_jpg' ).click( function() {\n\t\tconst self = $( this );\n\t\tconst settings_wrap = $( '.wp-smush-png_to_jpg-wrap' );\n\n\t\tif ( self.is( ':checked' ) ) {\n\t\t\tsettings_wrap.show();\n\t\t} else {\n\t\t\tsettings_wrap.hide();\n\t\t}\n\t} );\n\n\t//Handle Re-check button functionality\n\t$( '#wp-smush-revalidate-member' ).on( 'click', function( e ) {\n\t\te.preventDefault();\n\t\t//Ajax Params\n\t\tconst params = {\n\t\t\taction: 'smush_show_warning',\n\t\t};\n\t\tconst link = $( this );\n\t\tconst parent = link.parents().eq( 1 );\n\t\tparent.addClass( 'loading-notice' );\n\t\t$.get( ajaxurl, params, function( r ) {\n\t\t\t//remove the warning\n\t\t\tparent.removeClass( 'loading-notice' ).addClass( 'loaded-notice' );\n\t\t\tif ( 0 == r ) {\n\t\t\t\tparent.attr( 'data-message', wp_smush_msgs.membership_valid );\n\t\t\t\tremove_element( parent, 1000 );\n\t\t\t} else {\n\t\t\t\tparent.attr( 'data-message', wp_smush_msgs.membership_invalid );\n\t\t\t\tsetTimeout( function remove_loader() {\n\t\t\t\t\tparent.removeClass( 'loaded-notice' );\n\t\t\t\t}, 1000 );\n\t\t\t}\n\t\t} );\n\t} );\n\n\t//Initiate Re-check if the variable is set\n\tif ( 'undefined' !== typeof ( wp_smush_run_re_check ) && 1 == wp_smush_run_re_check && $( '.wp-smush-scan' ).length > 0 ) {\n\t\trun_re_check( false );\n\t}\n\n\tif ( $( 'li.smush-dir-savings' ).length > 0 ) {\n\t\t// Update Directory Smush, as soon as the page loads.\n\t\tconst stats_param = {\n\t\t\taction: 'get_dir_smush_stats',\n\t\t};\n\t\t$.get( ajaxurl, stats_param, function( r ) {\n\t\t\t//Hide the spinner\n\t\t\t$( 'li.smush-dir-savings .sui-icon-loader' ).hide();\n\n\t\t\t//If there are no errors, and we have a message to display\n\t\t\tif ( ! r.success && 'undefined' !== typeof ( r.data.message ) ) {\n\t\t\t\t$( 'div.wp-smush-scan-result div.content' ).prepend( r.data.message );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t//If there is no value in r\n\t\t\tif ( 'undefined' === typeof ( r.data ) || 'undefined' === typeof ( r.data.dir_smush ) ) {\n\t\t\t\t//Append the text\n\t\t\t\t$( 'li.smush-dir-savings span.wp-smush-stats' ).append( wp_smush_msgs.ajax_error );\n\t\t\t\t$( 'li.smush-dir-savings span.wp-smush-stats span' ).hide();\n\t\t\t} else {\n\t\t\t\t//Update the stats\n\t\t\t\tupdate_cummulative_stats( r.data );\n\t\t\t}\n\t\t} );\n\t}\n\t//Close Directory smush modal, if pressed esc\n\t$( document ).keyup( function( e ) {\n\t\tif ( e.keyCode === 27 ) {\n\t\t\tconst modal = $( 'div.dev-overlay.wp-smush-list-dialog, div.dev-overlay.wp-smush-get-pro' );\n\t\t\t//If the Directory dialog is not visible\n\t\t\tif ( ! modal.is( ':visible' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmodal.find( 'div.close' ).click();\n\t\t}\n\t} );\n\n\t//Dismiss Smush recommendation\n\t$( 'span.dismiss-recommendation' ).on( 'click', function( e ) {\n\t\te.preventDefault();\n\t\tconst parent = $( this ).parent();\n\t\t//remove div and save preference in db\n\t\tparent.hide( 'slow', function() {\n\t\t\tparent.remove();\n\t\t} );\n\t\t$.ajax( {\n\t\t\ttype: 'POST',\n\t\t\turl: ajaxurl,\n\t\t\tdata: {\n\t\t\t\taction: 'hide_pagespeed_suggestion',\n\t\t\t},\n\t\t} );\n\t} );\n\n\t//Remove API message\n\t$( 'div.wp-smush-api-message i.icon-fi-close' ).on( 'click', function( e ) {\n\t\te.preventDefault();\n\t\tconst parent = $( this ).parent();\n\t\t//remove div and save preference in db\n\t\tparent.hide( 'slow', function() {\n\t\t\tparent.remove();\n\t\t} );\n\t\t$.ajax( {\n\t\t\ttype: 'POST',\n\t\t\turl: ajaxurl,\n\t\t\tdata: {\n\t\t\t\taction: 'hide_api_message',\n\t\t\t},\n\t\t} );\n\t} );\n\n\t/**\n\t * Scroll to resize settings.\n\t *\n\t * @since 3.3.2\n\t */\n\t$( '#close-resize-update-dialog' ).on( 'click', function( e ) {\n\t\te.preventDefault();\n\n\t\twindow.SUI.dialogs[ 'resizing-update' ].hide();\n\n\t\tgoToByScroll( '#column-wp-smush-resize' );\n\t} );\n\n} );\n","/* global WP_Smush */\n/* global ajaxurl */\n\n/**\n * Bulk Smush functionality.\n *\n * @since 2.9.0 Moved from admin.js\n */\n\nimport Smush from '../smush/smush';\n\n( function( $ ) {\n\t'use strict';\n\n\tWP_Smush.bulk = {\n\t\tinit: () => {\n\t\t\t/**\n\t\t\t * Handle the Bulk Smush/Bulk re-Smush button click.\n\t\t\t */\n\t\t\t$( '.wp-smush-all' ).on( 'click', function( e ) {\n\t\t\t\te.preventDefault();\n\n\t\t\t\t$( '.sui-notice-top.sui-notice-success' ).remove();\n\n\t\t\t\tconst bulkWarning = document.getElementById( 'bulk_smush_warning' );\n\t\t\t\tbulkWarning.classList.add( 'sui-hidden' );\n\n\t\t\t\t// Remove limit exceeded styles.\n\t\t\t\tconst progress = $( '.wp-smush-bulk-progress-bar-wrapper' );\n\t\t\t\tprogress.removeClass( 'wp-smush-exceed-limit' );\n\t\t\t\tprogress.find( '.sui-progress-block .wp-smush-all' ).addClass( 'sui-hidden' );\n\t\t\t\tprogress.find( '.sui-progress-block .wp-smush-cancel-bulk' ).removeClass( 'sui-hidden' );\n\t\t\t\tif ( bulkWarning ) {\n\t\t\t\t\tdocument.getElementById( 'bulk-smush-resume-button' ).classList.add( 'sui-hidden' );\n\t\t\t\t}\n\n\t\t\t\t// Disable re-Smush and scan button.\n\t\t\t\t// TODO: refine what is disabled.\n\t\t\t\t$( '.wp-resmush.wp-smush-action, .wp-smush-scan, .wp-smush-all:not(.sui-progress-close), a.wp-smush-lossy-enable, button.wp-smush-resize-enable, button#wp-smush-save-settings' ).attr( 'disabled', 'disabled' );\n\n\t\t\t\t// Check for IDs, if there is none (unsmushed or lossless), don't call Smush function.\n\t\t\t\t/** @param {Array} wp_smushit_data.unsmushed */\n\t\t\t\tif ( 'undefined' === typeof window.wp_smushit_data ||\n\t\t\t\t\t( 0 === window.wp_smushit_data.unsmushed.length && 0 === window.wp_smushit_data.resmush.length )\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t$( '.wp-smush-remaining' ).hide();\n\n\t\t\t\t// Show loader.\n\t\t\t\tprogress.find( 'i.sui-icon-info' ).removeClass( 'sui-icon-info' )\n\t\t\t\t\t.addClass( 'sui-loading' )\n\t\t\t\t\t.addClass( 'sui-icon-loader' );\n\n\t\t\t\tnew Smush( $( this ), true );\n\t\t\t} );\n\n\t\t\t/**\n\t\t\t * Ignore file from bulk Smush.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t */\n\t\t\t$( 'body' ).on( 'click', '.smush-ignore-image', function( e ) {\n\t\t\t\te.preventDefault();\n\n\t\t\t\tconst self = $( this );\n\n\t\t\t\tself.attr( 'disabled', true );\n\t\t\t\tself.attr( 'data-tooltip' );\n\t\t\t\tself.removeClass( 'sui-tooltip' );\n\t\t\t\t$.post( ajaxurl, {\n\t\t\t\t\taction: 'ignore_bulk_image',\n\t\t\t\t\tid: self.attr( 'data-id' ),\n\t\t\t\t} )\n\t\t\t\t\t.done( () => {\n\t\t\t\t\t\tif ( self.is( 'a' ) ) {\n\t\t\t\t\t\t\te.target.classList.remove( 'smush-ignore-image' );\n\t\t\t\t\t\t\te.target.classList.add( 'wp-smush-remove-skipped' );\n\t\t\t\t\t\t\te.target.text = window.wp_smush_msgs.bulkShow;\n\t\t\t\t\t\t\tself.parent().find( '.smush-status' ).text( window.wp_smush_msgs.ignored );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t} );\n\t\t},\n\n\t};\n\n\tWP_Smush.bulk.init();\n}( jQuery ) );\n","/* global WP_Smush */\n/* global ajaxurl */\n\n/**\n * Modals JavaScript code.\n */\n( function() {\n\t'use strict';\n\n\t/**\n\t * Onboarding modal.\n\t *\n\t * @since 3.1\n\t */\n\tWP_Smush.onboarding = {\n\t\tmembership: 'free', // Assume free by default.\n\t\tonboardingModal: document.getElementById( 'smush-onboarding-dialog' ),\n\t\tscanFilesModal: document.getElementById( 'checking-files-dialog' ),\n\t\tsettings: {\n\t\t\tfirst: true,\n\t\t\tlast: false,\n\t\t\tslide: 'start',\n\t\t\tvalue: false,\n\t\t},\n\t\tselection: {\n\t\t\tauto: true,\n\t\t\tlossy: true,\n\t\t\tstrip_exif: true,\n\t\t\toriginal: false,\n\t\t\tlazy_load: true,\n\t\t\tusage: false,\n\t\t},\n\t\tcontentContainer: document.getElementById( 'smush-onboarding-content' ),\n\t\t//onboardingSlides: [ 'start', 'auto', 'lossy', 'strip_exif', 'original', 'lazy_load', 'usage' ],\n\t\tonboardingSlides: [ 'start', 'auto', 'lossy', 'strip_exif', 'original', 'lazy_load' ],\n\t\ttouchX: null,\n\t\ttouchY: null,\n\n\t\t/**\n\t\t * Init module.\n\t\t */\n\t\tinit() {\n\t\t\tif ( ! this.onboardingModal ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.membership = document.getElementById( 'smush-onboarding' ).dataset.type;\n\n\t\t\tif ( 'pro' !== this.membership ) {\n\t\t\t\tthis.onboardingSlides = [ 'start', 'auto', 'strip_exif', 'lazy_load', 'usage' ];\n\t\t\t\tthis.selection.lossy = false;\n\t\t\t}\n\n\t\t\tthis.renderTemplate();\n\n\t\t\t// Skip setup.\n\t\t\tconst skipButton = this.onboardingModal.querySelector( '.smush-onboarding-skip-link' );\n\t\t\tif ( skipButton ) {\n\t\t\t\tskipButton.addEventListener( 'click', this.skipSetup );\n\t\t\t}\n\n\t\t\t// Show the modal.\n\t\t\twindow.SUI.openModal( 'smush-onboarding-dialog', 'checking-files-dialog', undefined, false );\n\t\t},\n\n\t\t/**\n\t\t * Get swipe coordinates.\n\t\t *\n\t\t * @param {Object} e\n\t\t */\n\t\thandleTouchStart( e ) {\n\t\t\tconst firstTouch = e.touches[ 0 ];\n\t\t\tthis.touchX = firstTouch.clientX;\n\t\t\tthis.touchY = firstTouch.clientY;\n\t\t},\n\n\t\t/**\n\t\t * Process swipe left/right.\n\t\t *\n\t\t * @param {Object} e\n\t\t */\n\t\thandleTouchMove( e ) {\n\t\t\tif ( ! this.touchX || ! this.touchY ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst xUp = e.touches[ 0 ].clientX,\n\t\t\t\tyUp = e.touches[ 0 ].clientY,\n\t\t\t\txDiff = this.touchX - xUp,\n\t\t\t\tyDiff = this.touchY - yUp;\n\n\t\t\tif ( Math.abs( xDiff ) > Math.abs( yDiff ) ) {\n\t\t\t\tif ( xDiff > 0 ) {\n\t\t\t\t\tif ( false === WP_Smush.onboarding.settings.last ) {\n\t\t\t\t\t\tWP_Smush.onboarding.next( null, 'next' );\n\t\t\t\t\t}\n\t\t\t\t} else if ( false === WP_Smush.onboarding.settings.first ) {\n\t\t\t\t\tWP_Smush.onboarding.next( null, 'prev' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.touchX = null;\n\t\t\tthis.touchY = null;\n\t\t},\n\n\t\t/**\n\t\t * Update the template, register new listeners.\n\t\t *\n\t\t * @param {string} directionClass Accepts: fadeInRight, fadeInLeft, none.\n\t\t */\n\t\trenderTemplate( directionClass = 'none' ) {\n\t\t\t// Grab the selected value.\n\t\t\tconst input = this.onboardingModal.querySelector( 'input[type=\"checkbox\"]' );\n\t\t\tif ( input ) {\n\t\t\t\tthis.selection[ input.id ] = input.checked;\n\t\t\t}\n\n\t\t\tconst template = WP_Smush.onboarding.template( 'smush-onboarding' );\n\t\t\tconst content = template( this.settings );\n\n\t\t\tif ( content ) {\n\t\t\t\tthis.contentContainer.innerHTML = content;\n\n\t\t\t\tif ( 'none' === directionClass ) {\n\t\t\t\t\tthis.contentContainer.classList.add( 'loaded' );\n\t\t\t\t} else {\n\t\t\t\t\tthis.contentContainer.classList.remove( 'loaded' );\n\t\t\t\t\tthis.contentContainer.classList.add( directionClass );\n\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\tthis.contentContainer.classList.add( 'loaded' );\n\t\t\t\t\t\tthis.contentContainer.classList.remove( directionClass );\n\t\t\t\t\t}, 600 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.onboardingModal.addEventListener( 'touchstart', this.handleTouchStart, false );\n\t\t\tthis.onboardingModal.addEventListener( 'touchmove', this.handleTouchMove, false );\n\n\t\t\tthis.bindSubmit();\n\t\t},\n\n\t\t/**\n\t\t * Catch \"Finish setup wizard\" button click.\n\t\t */\n\t\tbindSubmit() {\n\t\t\tconst submitButton = this.onboardingModal.querySelector( 'button[type=\"submit\"]' );\n\t\t\tconst self = this;\n\n\t\t\tif ( submitButton ) {\n\t\t\t\tsubmitButton.addEventListener( 'click', function( e ) {\n\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\t// Because we are not rendering the template, we need to update the last element value.\n\t\t\t\t\tconst input = self.onboardingModal.querySelector( 'input[type=\"checkbox\"]' );\n\t\t\t\t\tif ( input ) {\n\t\t\t\t\t\tself.selection[ input.id ] = input.checked;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst _nonce = document.getElementById( '_wpnonce' );\n\n\t\t\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\t\t\txhr.open( 'POST', ajaxurl + '?action=smush_setup', true );\n\t\t\t\t\txhr.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );\n\t\t\t\t\txhr.onload = () => {\n\t\t\t\t\t\tif ( 200 === xhr.status ) {\n\t\t\t\t\t\t\tWP_Smush.onboarding.showScanDialog();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twindow.console.log( 'Request failed. Returned status of ' + xhr.status );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\txhr.send( 'smush_settings=' + JSON.stringify( self.selection ) + '&_ajax_nonce=' + _nonce.value );\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle navigation.\n\t\t *\n\t\t * @param {Object} e\n\t\t * @param {null|string} whereTo\n\t\t */\n\t\tnext( e, whereTo = null ) {\n\t\t\tconst index = this.onboardingSlides.indexOf( this.settings.slide );\n\t\t\tlet newIndex = 0;\n\n\t\t\tif ( ! whereTo ) {\n\t\t\t\tnewIndex = null !== e && e.classList.contains( 'next' ) ? index + 1 : index - 1;\n\t\t\t} else {\n\t\t\t\tnewIndex = 'next' === whereTo ? index + 1 : index - 1;\n\t\t\t}\n\n\t\t\tconst directionClass = null !== e && e.classList.contains( 'next' ) ? 'fadeInRight' : 'fadeInLeft';\n\n\t\t\tthis.settings = {\n\t\t\t\tfirst: 0 === newIndex,\n\t\t\t\tlast: newIndex + 1 === this.onboardingSlides.length, // length !== index\n\t\t\t\tslide: this.onboardingSlides[ newIndex ],\n\t\t\t\tvalue: this.selection[ this.onboardingSlides[ newIndex ] ],\n\t\t\t};\n\n\t\t\tthis.renderTemplate( directionClass );\n\t\t},\n\n\t\t/**\n\t\t * Handle circle navigation.\n\t\t *\n\t\t * @param {string} target\n\t\t */\n\t\tgoTo( target ) {\n\t\t\tconst newIndex = this.onboardingSlides.indexOf( target );\n\n\t\t\tthis.settings = {\n\t\t\t\tfirst: 0 === newIndex,\n\t\t\t\tlast: newIndex + 1 === this.onboardingSlides.length, // length !== index\n\t\t\t\tslide: target,\n\t\t\t\tvalue: this.selection[ target ],\n\t\t\t};\n\n\t\t\tthis.renderTemplate();\n\t\t},\n\n\t\t/**\n\t\t * Skip onboarding experience.\n\t\t */\n\t\tskipSetup: () => {\n\t\t\tconst _nonce = document.getElementById( '_wpnonce' );\n\n\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\txhr.open( 'POST', ajaxurl + '?action=skip_smush_setup&_ajax_nonce=' + _nonce.value );\n\t\t\txhr.onload = () => {\n\t\t\t\tif ( 200 === xhr.status ) {\n\t\t\t\t\tWP_Smush.onboarding.showScanDialog();\n\t\t\t\t} else {\n\t\t\t\t\twindow.console.log( 'Request failed. Returned status of ' + xhr.status );\n\t\t\t\t}\n\t\t\t};\n\t\t\txhr.send();\n\t\t},\n\n\t\t/**\n\t\t * Show checking files dialog.\n\t\t */\n\t\tshowScanDialog() {\n\t\t\twindow.SUI.closeModal();\n\t\t\twindow.SUI.openModal( 'checking-files-dialog', 'wpbody-content', undefined, false );\n\n\t\t\tconst nonce = document.getElementById( 'wp_smush_options_nonce' );\n\n\t\t\tsetTimeout( () => {\n\t\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\t\txhr.open( 'POST', ajaxurl + '?action=scan_for_resmush', true );\n\t\t\t\txhr.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );\n\t\t\t\txhr.onload = () => {\n\t\t\t\t\tconst elem = document.querySelector( '#smush-onboarding-dialog' );\n\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t\twindow.SUI.closeModal();\n\n\t\t\t\t\tif ( 200 === xhr.status ) {\n\t\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t\t}, 1000 );\n\t\t\t\t\t} else {\n\t\t\t\t\t\twindow.console.log( 'Request failed. Returned status of ' + xhr.status );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\txhr.send( 'type=media&get_ui=false&process_settings=false&wp_smush_options_nonce=' + nonce.value );\n\t\t\t}, 3000 );\n\t\t},\n\t};\n\n\t/**\n\t * Template function (underscores based).\n\t *\n\t * @type {Function}\n\t */\n\tWP_Smush.onboarding.template = _.memoize( ( id ) => {\n\t\tlet compiled;\n\t\tconst options = {\n\t\t\tevaluate: /<#([\\s\\S]+?)#>/g,\n\t\t\tinterpolate: /{{{([\\s\\S]+?)}}}/g,\n\t\t\tescape: /{{([^}]+?)}}(?!})/g,\n\t\t\tvariable: 'data',\n\t\t};\n\n\t\treturn ( data ) => {\n\t\t\t_.templateSettings = options;\n\t\t\tcompiled = compiled || _.template( document.getElementById( id ).innerHTML );\n\t\t\treturn compiled( data );\n\t\t};\n\t} );\n\n\twindow.addEventListener( 'load', () => WP_Smush.onboarding.init() );\n}() );\n","/*! jQuery UI - v1.12.1 - 2018-05-20\n* http://jqueryui.com\n* Includes: widget.js, position.js, keycode.js, scroll-parent.js, unique-id.js\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\n\n;(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\" ], factory );\n\t} else if ( typeof module === \"object\" && module.exports ) {\n\t\t// Node/CommonJS\n\t\tmodule.exports = factory(require(\"jquery\"));\n\t} else {\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.ui = $.ui || {};\n\nvar version = $.ui.version = \"1.12.1\";\n\n\n/*!\n * jQuery UI Widget 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Widget\n//>>group: Core\n//>>description: Provides a factory for creating stateful widgets with a common API.\n//>>docs: http://api.jqueryui.com/jQuery.widget/\n//>>demos: http://jqueryui.com/widget/\n\n\n\nvar widgetUuid = 0;\nvar widgetSlice = Array.prototype.slice;\n\n$.cleanData = $.cleanData || ( function( orig ) {\n\treturn function( elems ) {\n\t\tvar events, elem, i;\n\t\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\ttry {\n\n\t\t\t\t// Only trigger remove when necessary to save time\n\t\t\t\tevents = $._data( elem, \"events\" );\n\t\t\t\tif ( events && events.remove ) {\n\t\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t\t}\n\n\t\t\t// Http://bugs.jquery.com/ticket/8235\n\t\t\t} catch ( e ) {}\n\t\t}\n\t\torig( elems );\n\t};\n} )( $.cleanData );\n\n$.widget = $.widget || function( name, base, prototype ) {\n\tvar existingConstructor, constructor, basePrototype;\n\n\t// ProxiedPrototype allows the provided prototype to remain unmodified\n\t// so that it can be used as a mixin for multiple widgets (#8876)\n\tvar proxiedPrototype = {};\n\n\tvar namespace = name.split( \".\" )[ 0 ];\n\tname = name.split( \".\" )[ 1 ];\n\tvar fullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\tif ( $.isArray( prototype ) ) {\n\t\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\n\t}\n\n\t// Create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\n\t\t// Allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// Allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\n\t// Extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\n\t\t// Copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\n\t\t// Track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t} );\n\n\tbasePrototype = new base();\n\n\t// We need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = ( function() {\n\t\t\tfunction _super() {\n\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t}\n\n\t\t\tfunction _superApply( args ) {\n\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t}\n\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super;\n\t\t\t\tvar __superApply = this._superApply;\n\t\t\t\tvar returnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t} )();\n\t} );\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t} );\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// Redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor,\n\t\t\t\tchild._proto );\n\t\t} );\n\n\t\t// Remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = widgetSlice.call( arguments, 1 );\n\tvar inputIndex = 0;\n\tvar inputLength = input.length;\n\tvar key;\n\tvar value;\n\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\";\n\t\tvar args = widgetSlice.call( arguments, 1 );\n\t\tvar returnValue = this;\n\n\t\tif ( isMethodCall ) {\n\n\t\t\t// If this is an empty collection, we need to have the instance method\n\t\t\t// return undefined instead of the jQuery instance\n\t\t\tif ( !this.length && options === \"instance\" ) {\n\t\t\t\treturnValue = undefined;\n\t\t\t} else {\n\t\t\t\tthis.each( function() {\n\t\t\t\t\tvar methodValue;\n\t\t\t\t\tvar instance = $.data( this, fullName );\n\n\t\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\t\treturnValue = instance;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !instance ) {\n\t\t\t\t\t\treturn $.error( \"cannot call methods on \" + name +\n\t\t\t\t\t\t\t\" prior to initialization; \" +\n\t\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name +\n\t\t\t\t\t\t\t\" widget instance\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\n\t\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\t\tmethodValue;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Allow multiple hashes to be passed on init\n\t\t\tif ( args.length ) {\n\t\t\t\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\n\t\t\t}\n\n\t\t\tthis.each( function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = $.Widget || function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\n\toptions: {\n\t\tclasses: {},\n\t\tdisabled: false,\n\n\t\t// Callbacks\n\t\tcreate: null\n\t},\n\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = widgetUuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\t\tthis.classesElementLookup = {};\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.document = $( element.style ?\n\n\t\t\t\t// Element within the document\n\t\t\t\telement.ownerDocument :\n\n\t\t\t\t// Element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\n\t\t}\n\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis._create();\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis._setOptionDisabled( this.options.disabled );\n\t\t}\n\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\n\t_getCreateOptions: function() {\n\t\treturn {};\n\t},\n\n\t_getCreateEventData: $.noop,\n\n\t_create: $.noop,\n\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tvar that = this;\n\n\t\tthis._destroy();\n\t\t$.each( this.classesElementLookup, function( key, value ) {\n\t\t\tthat._removeClass( value, key );\n\t\t} );\n\n\t\t// We can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName );\n\t\tthis.widget()\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" );\n\n\t\t// Clean up events and states\n\t\tthis.bindings.off( this.eventNamespace );\n\t},\n\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key;\n\t\tvar parts;\n\t\tvar curOption;\n\t\tvar i;\n\n\t\tif ( arguments.length === 0 ) {\n\n\t\t\t// Don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\n\t\t\t// Handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"classes\" ) {\n\t\t\tthis._setOptionClasses( value );\n\t\t}\n\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._setOptionDisabled( value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOptionClasses: function( value ) {\n\t\tvar classKey, elements, currentElements;\n\n\t\tfor ( classKey in value ) {\n\t\t\tcurrentElements = this.classesElementLookup[ classKey ];\n\t\t\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\n\t\t\t\t\t!currentElements ||\n\t\t\t\t\t!currentElements.length ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We are doing this to create a new jQuery object because the _removeClass() call\n\t\t\t// on the next line is going to destroy the reference to the current elements being\n\t\t\t// tracked. We need to save a copy of this collection so that we can add the new classes\n\t\t\t// below.\n\t\t\telements = $( currentElements.get() );\n\t\t\tthis._removeClass( currentElements, classKey );\n\n\t\t\t// We don't use _addClass() here, because that uses this.options.classes\n\t\t\t// for generating the string of classes. We want to use the value passed in from\n\t\t\t// _setOption(), this is the new value of the classes option which was passed to\n\t\t\t// _setOption(). We pass this value directly to _classes().\n\t\t\telements.addClass( this._classes( {\n\t\t\t\telement: elements,\n\t\t\t\tkeys: classKey,\n\t\t\t\tclasses: value,\n\t\t\t\tadd: true\n\t\t\t} ) );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null, !!value );\n\n\t\t// If the widget is becoming disabled, then nothing is interactive\n\t\tif ( value ) {\n\t\t\tthis._removeClass( this.hoverable, null, \"ui-state-hover\" );\n\t\t\tthis._removeClass( this.focusable, null, \"ui-state-focus\" );\n\t\t}\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions( { disabled: false } );\n\t},\n\n\tdisable: function() {\n\t\treturn this._setOptions( { disabled: true } );\n\t},\n\n\t_classes: function( options ) {\n\t\tvar full = [];\n\t\tvar that = this;\n\n\t\toptions = $.extend( {\n\t\t\telement: this.element,\n\t\t\tclasses: this.options.classes || {}\n\t\t}, options );\n\n\t\tfunction processClassString( classes, checkOption ) {\n\t\t\tvar current, i;\n\t\t\tfor ( i = 0; i < classes.length; i++ ) {\n\t\t\t\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\n\t\t\t\tif ( options.add ) {\n\t\t\t\t\tcurrent = $( $.unique( current.get().concat( options.element.get() ) ) );\n\t\t\t\t} else {\n\t\t\t\t\tcurrent = $( current.not( options.element ).get() );\n\t\t\t\t}\n\t\t\t\tthat.classesElementLookup[ classes[ i ] ] = current;\n\t\t\t\tfull.push( classes[ i ] );\n\t\t\t\tif ( checkOption && options.classes[ classes[ i ] ] ) {\n\t\t\t\t\tfull.push( options.classes[ classes[ i ] ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._on( options.element, {\n\t\t\t\"remove\": \"_untrackClassesElement\"\n\t\t} );\n\n\t\tif ( options.keys ) {\n\t\t\tprocessClassString( options.keys.match( /\\S+/g ) || [], true );\n\t\t}\n\t\tif ( options.extra ) {\n\t\t\tprocessClassString( options.extra.match( /\\S+/g ) || [] );\n\t\t}\n\n\t\treturn full.join( \" \" );\n\t},\n\n\t_untrackClassesElement: function( event ) {\n\t\tvar that = this;\n\t\t$.each( that.classesElementLookup, function( key, value ) {\n\t\t\tif ( $.inArray( event.target, value ) !== -1 ) {\n\t\t\t\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_removeClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, false );\n\t},\n\n\t_addClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, true );\n\t},\n\n\t_toggleClass: function( element, keys, extra, add ) {\n\t\tadd = ( typeof add === \"boolean\" ) ? add : extra;\n\t\tvar shift = ( typeof element === \"string\" || element === null ),\n\t\t\toptions = {\n\t\t\t\textra: shift ? keys : extra,\n\t\t\t\tkeys: shift ? element : keys,\n\t\t\t\telement: shift ? this.element : element,\n\t\t\t\tadd: add\n\t\t\t};\n\t\toptions.element.toggleClass( this._classes( options ), add );\n\t\treturn this;\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement;\n\t\tvar instance = this;\n\n\t\t// No suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// No element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\n\t\t\t\t// Allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// Copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ );\n\t\t\tvar eventName = match[ 1 ] + instance.eventNamespace;\n\t\t\tvar selector = match[ 2 ];\n\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.on( eventName, selector, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.on( eventName, handlerProxy );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = ( eventName || \"\" ).split( \" \" ).join( this.eventNamespace + \" \" ) +\n\t\t\tthis.eventNamespace;\n\t\telement.off( eventName ).off( eventName );\n\n\t\t// Clear the stack to avoid memory leaks (#10056)\n\t\tthis.bindings = $( this.bindings.not( element ).get() );\n\t\tthis.focusable = $( this.focusable.not( element ).get() );\n\t\tthis.hoverable = $( this.hoverable.not( element ).get() );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig;\n\t\tvar callback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\n\t\t// The original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// Copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\n\t\tvar hasOptions;\n\t\tvar effectName = !options ?\n\t\t\tmethod :\n\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\tdefaultEffect :\n\t\t\t\toptions.effect || defaultEffect;\n\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue( function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t} );\n\t\t}\n\t};\n} );\n\nvar widget = $.widget;\n\n\n/*!\n * jQuery UI Position 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/position/\n */\n\n//>>label: Position\n//>>group: Core\n//>>description: Positions elements relative to other elements.\n//>>docs: http://api.jqueryui.com/position/\n//>>demos: http://jqueryui.com/position/\n\n\n( function() {\nvar cachedScrollbarWidth,\n\tmax = Math.max,\n\tabs = Math.abs,\n\trhorizontal = /left|center|right/,\n\trvertical = /top|center|bottom/,\n\troffset = /[\\+\\-]\\d+(\\.[\\d]+)?%?/,\n\trposition = /^\\w+/,\n\trpercent = /%$/,\n\t_position = $.fn.position;\n\nfunction getOffsets( offsets, width, height ) {\n\treturn [\n\t\tparseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),\n\t\tparseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )\n\t];\n}\n\nfunction parseCss( element, property ) {\n\treturn parseInt( $.css( element, property ), 10 ) || 0;\n}\n\nfunction getDimensions( elem ) {\n\tvar raw = elem[ 0 ];\n\tif ( raw.nodeType === 9 ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: 0, left: 0 }\n\t\t};\n\t}\n\tif ( $.isWindow( raw ) ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: elem.scrollTop(), left: elem.scrollLeft() }\n\t\t};\n\t}\n\tif ( raw.preventDefault ) {\n\t\treturn {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\toffset: { top: raw.pageY, left: raw.pageX }\n\t\t};\n\t}\n\treturn {\n\t\twidth: elem.outerWidth(),\n\t\theight: elem.outerHeight(),\n\t\toffset: elem.offset()\n\t};\n}\n\n$.position = $.position || {\n\tscrollbarWidth: function() {\n\t\tif ( cachedScrollbarWidth !== undefined ) {\n\t\t\treturn cachedScrollbarWidth;\n\t\t}\n\t\tvar w1, w2,\n\t\t\tdiv = $( \"<div \" +\n\t\t\t\t\"style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>\" +\n\t\t\t\t\"<div style='height:100px;width:auto;'></div></div>\" ),\n\t\t\tinnerDiv = div.children()[ 0 ];\n\n\t\t$( \"body\" ).append( div );\n\t\tw1 = innerDiv.offsetWidth;\n\t\tdiv.css( \"overflow\", \"scroll\" );\n\n\t\tw2 = innerDiv.offsetWidth;\n\n\t\tif ( w1 === w2 ) {\n\t\t\tw2 = div[ 0 ].clientWidth;\n\t\t}\n\n\t\tdiv.remove();\n\n\t\treturn ( cachedScrollbarWidth = w1 - w2 );\n\t},\n\tgetScrollInfo: function( within ) {\n\t\tvar overflowX = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-x\" ),\n\t\t\toverflowY = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-y\" ),\n\t\t\thasOverflowX = overflowX === \"scroll\" ||\n\t\t\t\t( overflowX === \"auto\" && within.width < within.element[ 0 ].scrollWidth ),\n\t\t\thasOverflowY = overflowY === \"scroll\" ||\n\t\t\t\t( overflowY === \"auto\" && within.height < within.element[ 0 ].scrollHeight );\n\t\treturn {\n\t\t\twidth: hasOverflowY ? $.position.scrollbarWidth() : 0,\n\t\t\theight: hasOverflowX ? $.position.scrollbarWidth() : 0\n\t\t};\n\t},\n\tgetWithinInfo: function( element ) {\n\t\tvar withinElement = $( element || window ),\n\t\t\tisWindow = $.isWindow( withinElement[ 0 ] ),\n\t\t\tisDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,\n\t\t\thasOffset = !isWindow && !isDocument;\n\t\treturn {\n\t\t\telement: withinElement,\n\t\t\tisWindow: isWindow,\n\t\t\tisDocument: isDocument,\n\t\t\toffset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },\n\t\t\tscrollLeft: withinElement.scrollLeft(),\n\t\t\tscrollTop: withinElement.scrollTop(),\n\t\t\twidth: withinElement.outerWidth(),\n\t\t\theight: withinElement.outerHeight()\n\t\t};\n\t}\n};\n\n$.fn.position = function( options ) {\n\tif ( !options || !options.of ) {\n\t\treturn _position.apply( this, arguments );\n\t}\n\n\t// Make a copy, we don't want to modify arguments\n\toptions = $.extend( {}, options );\n\n\tvar atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,\n\t\ttarget = $( options.of ),\n\t\twithin = $.position.getWithinInfo( options.within ),\n\t\tscrollInfo = $.position.getScrollInfo( within ),\n\t\tcollision = ( options.collision || \"flip\" ).split( \" \" ),\n\t\toffsets = {};\n\n\tdimensions = getDimensions( target );\n\tif ( target[ 0 ].preventDefault ) {\n\n\t\t// Force left top to allow flipping\n\t\toptions.at = \"left top\";\n\t}\n\ttargetWidth = dimensions.width;\n\ttargetHeight = dimensions.height;\n\ttargetOffset = dimensions.offset;\n\n\t// Clone to reuse original targetOffset later\n\tbasePosition = $.extend( {}, targetOffset );\n\n\t// Force my and at to have valid horizontal and vertical positions\n\t// if a value is missing or invalid, it will be converted to center\n\t$.each( [ \"my\", \"at\" ], function() {\n\t\tvar pos = ( options[ this ] || \"\" ).split( \" \" ),\n\t\t\thorizontalOffset,\n\t\t\tverticalOffset;\n\n\t\tif ( pos.length === 1 ) {\n\t\t\tpos = rhorizontal.test( pos[ 0 ] ) ?\n\t\t\t\tpos.concat( [ \"center\" ] ) :\n\t\t\t\trvertical.test( pos[ 0 ] ) ?\n\t\t\t\t\t[ \"center\" ].concat( pos ) :\n\t\t\t\t\t[ \"center\", \"center\" ];\n\t\t}\n\t\tpos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : \"center\";\n\t\tpos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : \"center\";\n\n\t\t// Calculate offsets\n\t\thorizontalOffset = roffset.exec( pos[ 0 ] );\n\t\tverticalOffset = roffset.exec( pos[ 1 ] );\n\t\toffsets[ this ] = [\n\t\t\thorizontalOffset ? horizontalOffset[ 0 ] : 0,\n\t\t\tverticalOffset ? verticalOffset[ 0 ] : 0\n\t\t];\n\n\t\t// Reduce to just the positions without the offsets\n\t\toptions[ this ] = [\n\t\t\trposition.exec( pos[ 0 ] )[ 0 ],\n\t\t\trposition.exec( pos[ 1 ] )[ 0 ]\n\t\t];\n\t} );\n\n\t// Normalize collision option\n\tif ( collision.length === 1 ) {\n\t\tcollision[ 1 ] = collision[ 0 ];\n\t}\n\n\tif ( options.at[ 0 ] === \"right\" ) {\n\t\tbasePosition.left += targetWidth;\n\t} else if ( options.at[ 0 ] === \"center\" ) {\n\t\tbasePosition.left += targetWidth / 2;\n\t}\n\n\tif ( options.at[ 1 ] === \"bottom\" ) {\n\t\tbasePosition.top += targetHeight;\n\t} else if ( options.at[ 1 ] === \"center\" ) {\n\t\tbasePosition.top += targetHeight / 2;\n\t}\n\n\tatOffset = getOffsets( offsets.at, targetWidth, targetHeight );\n\tbasePosition.left += atOffset[ 0 ];\n\tbasePosition.top += atOffset[ 1 ];\n\n\treturn this.each( function() {\n\t\tvar collisionPosition, using,\n\t\t\telem = $( this ),\n\t\t\telemWidth = elem.outerWidth(),\n\t\t\telemHeight = elem.outerHeight(),\n\t\t\tmarginLeft = parseCss( this, \"marginLeft\" ),\n\t\t\tmarginTop = parseCss( this, \"marginTop\" ),\n\t\t\tcollisionWidth = elemWidth + marginLeft + parseCss( this, \"marginRight\" ) +\n\t\t\t\tscrollInfo.width,\n\t\t\tcollisionHeight = elemHeight + marginTop + parseCss( this, \"marginBottom\" ) +\n\t\t\t\tscrollInfo.height,\n\t\t\tposition = $.extend( {}, basePosition ),\n\t\t\tmyOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );\n\n\t\tif ( options.my[ 0 ] === \"right\" ) {\n\t\t\tposition.left -= elemWidth;\n\t\t} else if ( options.my[ 0 ] === \"center\" ) {\n\t\t\tposition.left -= elemWidth / 2;\n\t\t}\n\n\t\tif ( options.my[ 1 ] === \"bottom\" ) {\n\t\t\tposition.top -= elemHeight;\n\t\t} else if ( options.my[ 1 ] === \"center\" ) {\n\t\t\tposition.top -= elemHeight / 2;\n\t\t}\n\n\t\tposition.left += myOffset[ 0 ];\n\t\tposition.top += myOffset[ 1 ];\n\n\t\tcollisionPosition = {\n\t\t\tmarginLeft: marginLeft,\n\t\t\tmarginTop: marginTop\n\t\t};\n\n\t\t$.each( [ \"left\", \"top\" ], function( i, dir ) {\n\t\t\tif ( $.ui.position[ collision[ i ] ] ) {\n\t\t\t\t$.ui.position[ collision[ i ] ][ dir ]( position, {\n\t\t\t\t\ttargetWidth: targetWidth,\n\t\t\t\t\ttargetHeight: targetHeight,\n\t\t\t\t\telemWidth: elemWidth,\n\t\t\t\t\telemHeight: elemHeight,\n\t\t\t\t\tcollisionPosition: collisionPosition,\n\t\t\t\t\tcollisionWidth: collisionWidth,\n\t\t\t\t\tcollisionHeight: collisionHeight,\n\t\t\t\t\toffset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],\n\t\t\t\t\tmy: options.my,\n\t\t\t\t\tat: options.at,\n\t\t\t\t\twithin: within,\n\t\t\t\t\telem: elem\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\tif ( options.using ) {\n\n\t\t\t// Adds feedback as second argument to using callback, if present\n\t\t\tusing = function( props ) {\n\t\t\t\tvar left = targetOffset.left - position.left,\n\t\t\t\t\tright = left + targetWidth - elemWidth,\n\t\t\t\t\ttop = targetOffset.top - position.top,\n\t\t\t\t\tbottom = top + targetHeight - elemHeight,\n\t\t\t\t\tfeedback = {\n\t\t\t\t\t\ttarget: {\n\t\t\t\t\t\t\telement: target,\n\t\t\t\t\t\t\tleft: targetOffset.left,\n\t\t\t\t\t\t\ttop: targetOffset.top,\n\t\t\t\t\t\t\twidth: targetWidth,\n\t\t\t\t\t\t\theight: targetHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\telement: {\n\t\t\t\t\t\t\telement: elem,\n\t\t\t\t\t\t\tleft: position.left,\n\t\t\t\t\t\t\ttop: position.top,\n\t\t\t\t\t\t\twidth: elemWidth,\n\t\t\t\t\t\t\theight: elemHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\thorizontal: right < 0 ? \"left\" : left > 0 ? \"right\" : \"center\",\n\t\t\t\t\t\tvertical: bottom < 0 ? \"top\" : top > 0 ? \"bottom\" : \"middle\"\n\t\t\t\t\t};\n\t\t\t\tif ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {\n\t\t\t\t\tfeedback.horizontal = \"center\";\n\t\t\t\t}\n\t\t\t\tif ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {\n\t\t\t\t\tfeedback.vertical = \"middle\";\n\t\t\t\t}\n\t\t\t\tif ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {\n\t\t\t\t\tfeedback.important = \"horizontal\";\n\t\t\t\t} else {\n\t\t\t\t\tfeedback.important = \"vertical\";\n\t\t\t\t}\n\t\t\t\toptions.using.call( this, props, feedback );\n\t\t\t};\n\t\t}\n\n\t\telem.offset( $.extend( position, { using: using } ) );\n\t} );\n};\n\n$.ui.position = {\n\tfit: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\touterWidth = within.width,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = withinOffset - collisionPosLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,\n\t\t\t\tnewOverRight;\n\n\t\t\t// Element is wider than within\n\t\t\tif ( data.collisionWidth > outerWidth ) {\n\n\t\t\t\t// Element is initially over the left side of within\n\t\t\t\tif ( overLeft > 0 && overRight <= 0 ) {\n\t\t\t\t\tnewOverRight = position.left + overLeft + data.collisionWidth - outerWidth -\n\t\t\t\t\t\twithinOffset;\n\t\t\t\t\tposition.left += overLeft - newOverRight;\n\n\t\t\t\t// Element is initially over right side of within\n\t\t\t\t} else if ( overRight > 0 && overLeft <= 0 ) {\n\t\t\t\t\tposition.left = withinOffset;\n\n\t\t\t\t// Element is initially over both left and right sides of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overLeft > overRight ) {\n\t\t\t\t\t\tposition.left = withinOffset + outerWidth - data.collisionWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Too far left -> align with left edge\n\t\t\t} else if ( overLeft > 0 ) {\n\t\t\t\tposition.left += overLeft;\n\n\t\t\t// Too far right -> align with right edge\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tposition.left -= overRight;\n\n\t\t\t// Adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.left = max( position.left - collisionPosLeft, position.left );\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\touterHeight = data.within.height,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = withinOffset - collisionPosTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,\n\t\t\t\tnewOverBottom;\n\n\t\t\t// Element is taller than within\n\t\t\tif ( data.collisionHeight > outerHeight ) {\n\n\t\t\t\t// Element is initially over the top of within\n\t\t\t\tif ( overTop > 0 && overBottom <= 0 ) {\n\t\t\t\t\tnewOverBottom = position.top + overTop + data.collisionHeight - outerHeight -\n\t\t\t\t\t\twithinOffset;\n\t\t\t\t\tposition.top += overTop - newOverBottom;\n\n\t\t\t\t// Element is initially over bottom of within\n\t\t\t\t} else if ( overBottom > 0 && overTop <= 0 ) {\n\t\t\t\t\tposition.top = withinOffset;\n\n\t\t\t\t// Element is initially over both top and bottom of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overTop > overBottom ) {\n\t\t\t\t\t\tposition.top = withinOffset + outerHeight - data.collisionHeight;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Too far up -> align with top\n\t\t\t} else if ( overTop > 0 ) {\n\t\t\t\tposition.top += overTop;\n\n\t\t\t// Too far down -> align with bottom edge\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tposition.top -= overBottom;\n\n\t\t\t// Adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.top = max( position.top - collisionPosTop, position.top );\n\t\t\t}\n\t\t}\n\t},\n\tflip: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.left + within.scrollLeft,\n\t\t\t\touterWidth = within.width,\n\t\t\t\toffsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = collisionPosLeft - offsetLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,\n\t\t\t\tmyOffset = data.my[ 0 ] === \"left\" ?\n\t\t\t\t\t-data.elemWidth :\n\t\t\t\t\tdata.my[ 0 ] === \"right\" ?\n\t\t\t\t\t\tdata.elemWidth :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 0 ] === \"left\" ?\n\t\t\t\t\tdata.targetWidth :\n\t\t\t\t\tdata.at[ 0 ] === \"right\" ?\n\t\t\t\t\t\t-data.targetWidth :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 0 ],\n\t\t\t\tnewOverRight,\n\t\t\t\tnewOverLeft;\n\n\t\t\tif ( overLeft < 0 ) {\n\t\t\t\tnewOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -\n\t\t\t\t\touterWidth - withinOffset;\n\t\t\t\tif ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tnewOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +\n\t\t\t\t\tatOffset + offset - offsetLeft;\n\t\t\t\tif ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.top + within.scrollTop,\n\t\t\t\touterHeight = within.height,\n\t\t\t\toffsetTop = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = collisionPosTop - offsetTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,\n\t\t\t\ttop = data.my[ 1 ] === \"top\",\n\t\t\t\tmyOffset = top ?\n\t\t\t\t\t-data.elemHeight :\n\t\t\t\t\tdata.my[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\tdata.elemHeight :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 1 ] === \"top\" ?\n\t\t\t\t\tdata.targetHeight :\n\t\t\t\t\tdata.at[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\t-data.targetHeight :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 1 ],\n\t\t\t\tnewOverTop,\n\t\t\t\tnewOverBottom;\n\t\t\tif ( overTop < 0 ) {\n\t\t\t\tnewOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -\n\t\t\t\t\touterHeight - withinOffset;\n\t\t\t\tif ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tnewOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +\n\t\t\t\t\toffset - offsetTop;\n\t\t\t\tif ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tflipfit: {\n\t\tleft: function() {\n\t\t\t$.ui.position.flip.left.apply( this, arguments );\n\t\t\t$.ui.position.fit.left.apply( this, arguments );\n\t\t},\n\t\ttop: function() {\n\t\t\t$.ui.position.flip.top.apply( this, arguments );\n\t\t\t$.ui.position.fit.top.apply( this, arguments );\n\t\t}\n\t}\n};\n\n} )();\n\nvar position = $.ui.position;\n\n\n/*!\n * jQuery UI Keycode 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Keycode\n//>>group: Core\n//>>description: Provide keycodes as keynames\n//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/\n\n\nvar keycode = $.ui.keyCode = {\n\tBACKSPACE: 8,\n\tCOMMA: 188,\n\tDELETE: 46,\n\tDOWN: 40,\n\tEND: 35,\n\tENTER: 13,\n\tESCAPE: 27,\n\tHOME: 36,\n\tLEFT: 37,\n\tPAGE_DOWN: 34,\n\tPAGE_UP: 33,\n\tPERIOD: 190,\n\tRIGHT: 39,\n\tSPACE: 32,\n\tTAB: 9,\n\tUP: 38\n};\n\n\n/*!\n * jQuery UI Scroll Parent 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: scrollParent\n//>>group: Core\n//>>description: Get the closest ancestor element that is scrollable.\n//>>docs: http://api.jqueryui.com/scrollParent/\n\n\n\nvar scrollParent = $.fn.scrollParent = function( includeHidden ) {\n\tvar position = this.css( \"position\" ),\n\t\texcludeStaticParent = position === \"absolute\",\n\t\toverflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,\n\t\tscrollParent = this.parents().filter( function() {\n\t\t\tvar parent = $( this );\n\t\t\tif ( excludeStaticParent && parent.css( \"position\" ) === \"static\" ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn overflowRegex.test( parent.css( \"overflow\" ) + parent.css( \"overflow-y\" ) +\n\t\t\t\tparent.css( \"overflow-x\" ) );\n\t\t} ).eq( 0 );\n\n\treturn position === \"fixed\" || !scrollParent.length ?\n\t\t$( this[ 0 ].ownerDocument || document ) :\n\t\tscrollParent;\n};\n\n\n/*!\n * jQuery UI Unique ID 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: uniqueId\n//>>group: Core\n//>>description: Functions to generate and remove uniqueId's\n//>>docs: http://api.jqueryui.com/uniqueId/\n\n\n\nvar uniqueId = $.fn.extend( {\n\tuniqueId: ( function() {\n\t\tvar uuid = 0;\n\n\t\treturn function() {\n\t\t\treturn this.each( function() {\n\t\t\t\tif ( !this.id ) {\n\t\t\t\t\tthis.id = \"ui-id-\" + ( ++uuid );\n\t\t\t\t}\n\t\t\t} );\n\t\t};\n\t} )(),\n\n\tremoveUniqueId: function() {\n\t\treturn this.each( function() {\n\t\t\tif ( /^ui-id-\\d+$/.test( this.id ) ) {\n\t\t\t\t$( this ).removeAttr( \"id\" );\n\t\t\t}\n\t\t} );\n\t}\n} );\n\n\n}));\n","/* global WP_Smush */\n/* global ajaxurl */\n\n/**\n * CDN functionality.\n *\n * @since 3.0\n */\n( function() {\n\t'use strict';\n\n\tWP_Smush.CDN = {\n\t\tcdnEnableButton: document.getElementById( 'smush-enable-cdn' ),\n\t\tcdnDisableButton: document.getElementById( 'smush-cancel-cdn' ),\n\t\tcdnStatsBox: document.querySelector( '.smush-cdn-stats' ),\n\n\t\tinit() {\n\t\t\t/**\n\t\t\t * Handle \"Get Started\" button click on disabled CDN page.\n\t\t\t */\n\t\t\tif ( this.cdnEnableButton ) {\n\t\t\t\tthis.cdnEnableButton.addEventListener( 'click', ( e ) => {\n\t\t\t\t\te.currentTarget.classList.add( 'sui-button-onload' );\n\n\t\t\t\t\t// Force repaint of the spinner.\n\t\t\t\t\tconst loader = e.currentTarget.querySelector( '.sui-icon-loader' );\n\t\t\t\t\tloader.style.display = 'none';\n\t\t\t\t\tloader.style.display = 'flex';\n\n\t\t\t\t\tthis.toggle_cdn( true );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Handle \"Deactivate' button click on CDN page.\n\t\t\t */\n\t\t\tif ( this.cdnDisableButton ) {\n\t\t\t\tthis.cdnDisableButton.addEventListener( 'click', ( e ) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.toggle_cdn( false );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tthis.updateStatsBox();\n\t\t},\n\n\t\t/**\n\t\t * Toggle CDN.\n\t\t *\n\t\t * @since 3.0\n\t\t *\n\t\t * @param {boolean} enable\n\t\t */\n\t\ttoggle_cdn( enable ) {\n\t\t\tconst nonceField = document.getElementsByName( 'wp_smush_options_nonce' );\n\n\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\txhr.open( 'POST', ajaxurl + '?action=smush_toggle_cdn', true );\n\t\t\txhr.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );\n\t\t\txhr.onload = () => {\n\t\t\t\tif ( 200 === xhr.status ) {\n\t\t\t\t\tconst res = JSON.parse( xhr.response );\n\t\t\t\t\tif ( 'undefined' !== typeof res.success && res.success ) {\n\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t} else if ( 'undefined' !== typeof res.data.message ) {\n\t\t\t\t\t\tthis.showNotice( res.data.message );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.showNotice( 'Request failed. Returned status of ' + xhr.status );\n\t\t\t\t}\n\t\t\t};\n\t\t\txhr.send( 'param=' + enable + '&_ajax_nonce=' + nonceField[ 0 ].value );\n\t\t},\n\n\t\t/**\n\t\t * Show message (notice).\n\t\t *\n\t\t * @since 3.0\n\t\t *\n\t\t * @param {string} message\n\t\t */\n\t\tshowNotice( message ) {\n\t\t\tif ( 'undefined' === typeof message ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst notice = document.getElementById( 'wp-smush-ajax-notice' );\n\n\t\t\tnotice.classList.add( 'sui-notice-error' );\n\t\t\tnotice.innerHTML = `<p>${ message }</p>`;\n\n\t\t\tif ( this.cdnEnableButton ) {\n\t\t\t\tthis.cdnEnableButton.classList.remove( 'sui-button-onload' );\n\t\t\t}\n\n\t\t\tnotice.style.display = 'block';\n\t\t\tsetTimeout( () => {\n\t\t\t\tnotice.style.display = 'none';\n\t\t\t}, 5000 );\n\t\t},\n\n\t\t/**\n\t\t * Update the CDN stats box in summary meta box. Only fetch new data when on CDN page.\n\t\t *\n\t\t * @since 3.0\n\t\t */\n\t\tupdateStatsBox() {\n\t\t\tif ( 'undefined' === typeof this.cdnStatsBox || ! this.cdnStatsBox ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Only fetch the new stats, when user is on CDN page.\n\t\t\tif ( ! window.location.search.includes( 'view=cdn' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.toggleElements();\n\n\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\txhr.open( 'POST', ajaxurl + '?action=get_cdn_stats', true );\n\t\t\txhr.onload = () => {\n\t\t\t\tif ( 200 === xhr.status ) {\n\t\t\t\t\tconst res = JSON.parse( xhr.response );\n\t\t\t\t\tif ( 'undefined' !== typeof res.success && res.success ) {\n\t\t\t\t\t\tthis.toggleElements();\n\t\t\t\t\t} else if ( 'undefined' !== typeof res.data.message ) {\n\t\t\t\t\t\tthis.showNotice( res.data.message );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.showNotice( 'Request failed. Returned status of ' + xhr.status );\n\t\t\t\t}\n\t\t\t};\n\t\t\txhr.send();\n\t\t},\n\n\t\t/**\n\t\t * Show/hide elements during status update in the updateStatsBox()\n\t\t *\n\t\t * @since 3.1 Moved out from updateStatsBox()\n\t\t */\n\t\ttoggleElements() {\n\t\t\tconst spinner = this.cdnStatsBox.querySelector( '.sui-icon-loader' );\n\t\t\tconst elements = this.cdnStatsBox.querySelectorAll( '.wp-smush-stats > :not(.sui-icon-loader)' );\n\n\t\t\tfor ( let i = 0; i < elements.length; i++ ) {\n\t\t\t\telements[ i ].classList.toggle( 'sui-hidden' );\n\t\t\t}\n\n\t\t\tspinner.classList.toggle( 'sui-hidden' );\n\t\t},\n\n\t};\n\n\tWP_Smush.CDN.init();\n}() );\n","/* global WP_Smush */\n/* global ajaxurl */\n\n/**\n * Lazy loading functionality.\n *\n * @since 3.0\n */\n( function() {\n\t'use strict';\n\n\tWP_Smush.Lazyload = {\n\t\tlazyloadEnableButton: document.getElementById( 'smush-enable-lazyload' ),\n\t\tlazyloadDisableButton: document.getElementById( 'smush-cancel-lazyload' ),\n\n\t\tinit() {\n\t\t\tconst self = this;\n\n\t\t\t/**\n\t\t\t * Handle \"Activate\" button click on disabled Lazy load page.\n\t\t\t */\n\t\t\tif ( this.lazyloadEnableButton ) {\n\t\t\t\tthis.lazyloadEnableButton.addEventListener( 'click', ( e ) => {\n\t\t\t\t\te.currentTarget.classList.add( 'sui-button-onload' );\n\n\t\t\t\t\t// Force repaint of the spinner.\n\t\t\t\t\tconst loader = e.currentTarget.querySelector( '.sui-icon-loader' );\n\t\t\t\t\tloader.style.display = 'none';\n\t\t\t\t\tloader.offsetHeight;\n\t\t\t\t\tloader.style.display = 'flex';\n\n\t\t\t\t\tthis.toggle_lazy_load( true );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Handle \"Deactivate' button click on Lazy load page.\n\t\t\t */\n\t\t\tif ( this.lazyloadDisableButton ) {\n\t\t\t\tthis.lazyloadDisableButton.addEventListener( 'click', ( e ) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.toggle_lazy_load( false );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Handle \"Remove icon\" button click on Lazy load page.\n\t\t\t *\n\t\t\t * This removes the image from the upload placeholder.\n\t\t\t *\n\t\t\t * @since 3.2.2\n\t\t\t */\n\t\t\tconst removeSpinner = document.getElementById( 'smush-remove-spinner' );\n\t\t\tif ( removeSpinner ) {\n\t\t\t\tremoveSpinner.addEventListener( 'click', ( e ) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.removeLoaderIcon();\n\t\t\t\t} );\n\t\t\t}\n\t\t\tconst removePlaceholder = document.getElementById( 'smush-remove-placeholder' );\n\t\t\tif ( removePlaceholder ) {\n\t\t\t\tremovePlaceholder.addEventListener( 'click', ( e ) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.removeLoaderIcon( 'placeholder' );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Handle \"Remove\" icon click.\n\t\t\t *\n\t\t\t * This removes the select icon from the list (not same as above functions).\n\t\t\t *\n\t\t\t * @since 3.2.2\n\t\t\t */\n\t\t\tconst items = document.querySelectorAll( '.smush-ll-remove' );\n\t\t\tif ( items && 0 < items.length ) {\n\t\t\t\titems.forEach( function( el ) {\n\t\t\t\t\tel.addEventListener( 'click', ( e ) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.target.closest( 'li' ).style.display = 'none';\n\t\t\t\t\t\tself.remove( e.target.dataset.id, e.target.dataset.type );\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Toggle lazy loading.\n\t\t *\n\t\t * @since 3.2.0\n\t\t *\n\t\t * @param {string} enable\n\t\t */\n\t\ttoggle_lazy_load( enable ) {\n\t\t\tconst nonceField = document.getElementsByName( 'wp_smush_options_nonce' );\n\n\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\txhr.open( 'POST', ajaxurl + '?action=smush_toggle_lazy_load', true );\n\t\t\txhr.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );\n\t\t\txhr.onload = () => {\n\t\t\t\tif ( 200 === xhr.status ) {\n\t\t\t\t\tconst res = JSON.parse( xhr.response );\n\t\t\t\t\tif ( 'undefined' !== typeof res.success && res.success ) {\n\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t} else if ( 'undefined' !== typeof res.data.message ) {\n\t\t\t\t\t\tthis.showNotice( res.data.message );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\twindow.console.log( 'Request failed. Returned status of ' + xhr.status );\n\t\t\t\t}\n\t\t\t};\n\t\t\txhr.send( 'param=' + enable + '&_ajax_nonce=' + nonceField[ 0 ].value );\n\t\t},\n\n\t\t/**\n\t\t * Show message (notice).\n\t\t *\n\t\t * @since 3.0\n\t\t *\n\t\t * @param {string} message\n\t\t */\n\t\tshowNotice( message ) {\n\t\t\tif ( 'undefined' === typeof message ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst notice = document.getElementById( 'wp-smush-ajax-notice' );\n\n\t\t\tnotice.classList.add( 'sui-notice-error' );\n\t\t\tnotice.innerHTML = `<p>${ message }</p>`;\n\n\t\t\tif ( this.cdnEnableButton ) {\n\t\t\t\tthis.cdnEnableButton.classList.remove( 'sui-button-onload' );\n\t\t\t}\n\n\t\t\tnotice.style.display = 'block';\n\t\t\tsetTimeout( () => {\n\t\t\t\tnotice.style.display = 'none';\n\t\t\t}, 5000 );\n\t\t},\n\n\t\t/**\n\t\t * Add lazy load spinner icon.\n\t\t *\n\t\t * @since 3.2.2\n\t\t * @param {string} type Accepts: spinner, placeholder.\n\t\t */\n\t\taddLoaderIcon( type = 'spinner' ) {\n\t\t\tlet frame;\n\n\t\t\t// If the media frame already exists, reopen it.\n\t\t\tif ( frame ) {\n\t\t\t\tframe.open();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Create a new media frame\n\t\t\tframe = wp.media( {\n\t\t\t\ttitle: 'Select or upload an icon',\n\t\t\t\tbutton: {\n\t\t\t\t\ttext: 'Select icon',\n\t\t\t\t},\n\t\t\t\tmultiple: false, // Set to true to allow multiple files to be selected\n\t\t\t} );\n\n\t\t\t// When an image is selected in the media frame...\n\t\t\tframe.on( 'select', function() {\n\t\t\t\t// Get media attachment details from the frame state\n\t\t\t\tconst attachment = frame.state().get( 'selection' ).first().toJSON();\n\n\t\t\t\t// Send the attachment URL to our custom image input field.\n\t\t\t\tconst imageIcon = document.getElementById( 'smush-' + type + '-icon-preview' );\n\t\t\t\timageIcon.style.backgroundImage = 'url(\"' + attachment.url + '\")';\n\t\t\t\timageIcon.style.display = 'block';\n\n\t\t\t\t// Send the attachment id to our hidden input\n\t\t\t\tdocument.getElementById( 'smush-' + type + '-icon-file' ).setAttribute( 'value', attachment.id );\n\n\t\t\t\t// Hide the add image link\n\t\t\t\tdocument.getElementById( 'smush-upload-' + type ).style.display = 'none';\n\n\t\t\t\t// Unhide the remove image link\n\t\t\t\tconst removeDiv = document.getElementById( 'smush-remove-' + type );\n\t\t\t\tremoveDiv.querySelector( 'span' ).innerHTML = attachment.filename;\n\t\t\t\tremoveDiv.style.display = 'block';\n\t\t\t} );\n\n\t\t\t// Finally, open the modal on click\n\t\t\tframe.open();\n\t\t},\n\n\t\t/**\n\t\t * Remove lazy load spinner icon.\n\t\t *\n\t\t * @since 3.2.2\n\t\t * @param {string} type Accepts: spinner, placeholder.\n\t\t */\n\t\tremoveLoaderIcon: ( type = 'spinner' ) => {\n\t\t\t// Clear out the preview image\n\t\t\tconst imageIcon = document.getElementById( 'smush-' + type + '-icon-preview' );\n\t\t\timageIcon.style.backgroundImage = '';\n\t\t\timageIcon.style.display = 'none';\n\n\t\t\t// Un-hide the add image link\n\t\t\tdocument.getElementById( 'smush-upload-' + type ).style.display = 'block';\n\n\t\t\t// Hide the delete image link\n\t\t\tdocument.getElementById( 'smush-remove-' + type ).style.display = 'none';\n\n\t\t\t// Delete the image id from the hidden input\n\t\t\tdocument.getElementById( 'smush-' + type + '-icon-file' ).setAttribute( 'value', '' );\n\t\t},\n\n\t\t/**\n\t\t * Remove item.\n\t\t *\n\t\t * @param {number} id Image ID.\n\t\t * @param {string} type Accepts: spinner, placeholder.\n\t\t */\n\t\tremove: ( id, type = 'spinner' ) => {\n\t\t\tconst nonceField = document.getElementsByName( 'wp_smush_options_nonce' );\n\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\txhr.open( 'POST', ajaxurl + '?action=smush_remove_icon', true );\n\t\t\txhr.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );\n\t\t\txhr.send( 'id=' + id + '&type=' + type + '&_ajax_nonce=' + nonceField[ 0 ].value );\n\t\t},\n\t};\n\n\tWP_Smush.Lazyload.init();\n}() );\n","/* global WP_Smush */\n/* global ajaxurl */\n\n/**\n * Bulk restore JavaScript code.\n *\n * @since 3.2.2\n */\n( function() {\n\t'use strict';\n\n\t/**\n\t * Bulk restore modal.\n\t *\n\t * @since 3.2.2\n\t */\n\tWP_Smush.restore = {\n\t\tmodal: document.getElementById( 'smush-restore-images-dialog' ),\n\t\tcontentContainer: document.getElementById( 'smush-bulk-restore-content' ),\n\t\tsettings: {\n\t\t\tslide: 'start', // start, progress or finish.\n\t\t\tsuccess: 0,\n\t\t\terrors: [],\n\t\t},\n\t\titems: [], // total items, 1 item = 1 step.\n\t\tsuccess: [], // successful items restored.\n\t\terrors: [], // failed items.\n\t\tcurrentStep: 0,\n\t\ttotalSteps: 0,\n\n\t\t/**\n\t\t * Init module.\n\t\t */\n\t\tinit() {\n\t\t\tif ( ! this.modal ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.settings = {\n\t\t\t\tslide: 'start',\n\t\t\t\tsuccess: 0,\n\t\t\t\terrors: [],\n\t\t\t};\n\n\t\t\tthis.renderTemplate();\n\n\t\t\t// Show the modal.\n\n\t\t\twindow.SUI.openModal( 'smush-restore-images-dialog', 'wpbody-content', undefined, false );\n\t\t},\n\n\t\t/**\n\t\t * Update the template, register new listeners.\n\t\t */\n\t\trenderTemplate() {\n\t\t\tconst template = WP_Smush.onboarding.template( 'smush-bulk-restore' );\n\t\t\tconst content = template( this.settings );\n\n\t\t\tif ( content ) {\n\t\t\t\tthis.contentContainer.innerHTML = content;\n\t\t\t}\n\n\t\t\tthis.bindSubmit();\n\t\t},\n\n\t\t/**\n\t\t * Catch \"Finish setup wizard\" button click.\n\t\t */\n\t\tbindSubmit() {\n\t\t\tconst confirmButton = this.modal.querySelector( 'button[id=\"smush-bulk-restore-button\"]' );\n\t\t\tconst self = this;\n\n\t\t\tif ( confirmButton ) {\n\t\t\t\tconfirmButton.addEventListener( 'click', function( e ) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tself.modal.querySelector( '.sui-box' ).style.maxWidth = '460px';\n\n\t\t\t\t\tself.settings = { slide: 'progress' };\n\t\t\t\t\tself.errors = [];\n\n\t\t\t\t\tself.renderTemplate();\n\t\t\t\t\tself.initScan();\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Cancel the bulk restore.\n\t\t */\n\t\tcancel() {\n\t\t\tif ( 'start' === this.settings.slide || 'finish' === this.settings.slide ) {\n\t\t\t\t// Hide the modal.\n\t\t\t\twindow.SUI.closeModal();\n\t\t\t} else {\n\t\t\t\tthis.updateProgressBar( true );\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Update progress bar during directory smush.\n\t\t *\n\t\t * @param {boolean} cancel Cancel status.\n\t\t */\n\t\tupdateProgressBar( cancel = false ) {\n\t\t\tlet progress = 0;\n\t\t\tif ( 0 < this.currentStep ) {\n\t\t\t\tprogress = Math.min( Math.round( this.currentStep * 100 / this.totalSteps ), 99 );\n\t\t\t}\n\n\t\t\tif ( progress > 100 ) {\n\t\t\t\tprogress = 100;\n\t\t\t}\n\n\t\t\t// Update progress bar\n\t\t\tthis.modal.querySelector( '.sui-progress-text span' ).innerHTML = progress + '%';\n\t\t\tthis.modal.querySelector( '.sui-progress-bar span' ).style.width = progress + '%';\n\n\t\t\tconst statusDiv = this.modal.querySelector( '.sui-progress-state-text' );\n\t\t\tif ( progress >= 90 ) {\n\t\t\t\tstatusDiv.innerHTML = 'Finalizing...';\n\t\t\t} else if ( cancel ) {\n\t\t\t\tstatusDiv.innerHTML = 'Cancelling...';\n\t\t\t} else {\n\t\t\t\tstatusDiv.innerHTML = this.currentStep + '/' + this.totalSteps + ' ' + 'images restored';\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * First step in bulk restore - get the bulk attachment count.\n\t\t */\n\t\tinitScan() {\n\t\t\tconst self = this;\n\t\t\tconst _nonce = document.getElementById( '_wpnonce' );\n\n\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\txhr.open( 'POST', ajaxurl + '?action=get_image_count', true );\n\t\t\txhr.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );\n\t\t\txhr.onload = () => {\n\t\t\t\tif ( 200 === xhr.status ) {\n\t\t\t\t\tconst res = JSON.parse( xhr.response );\n\t\t\t\t\tif ( 'undefined' !== typeof res.data.items ) {\n\t\t\t\t\t\tself.items = res.data.items;\n\t\t\t\t\t\tself.totalSteps = res.data.items.length;\n\t\t\t\t\t\tself.step();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\twindow.console.log( 'Request failed. Returned status of ' + xhr.status );\n\t\t\t\t}\n\t\t\t};\n\t\t\txhr.send( '_ajax_nonce=' + _nonce.value );\n\t\t},\n\n\t\t/**\n\t\t * Execute a scan step recursively\n\t\t */\n\t\tstep() {\n\t\t\tconst self = this;\n\t\t\tconst _nonce = document.getElementById( '_wpnonce' );\n\n\t\t\tif ( 0 < this.items.length ) {\n\t\t\t\tconst item = this.items.pop();\n\t\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\t\txhr.open( 'POST', ajaxurl + '?action=restore_step', true );\n\t\t\t\txhr.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );\n\t\t\t\txhr.onload = () => {\n\t\t\t\t\tthis.currentStep++;\n\n\t\t\t\t\tif ( 200 === xhr.status ) {\n\t\t\t\t\t\tconst res = JSON.parse( xhr.response );\n\t\t\t\t\t\tif ( 'undefined' !== typeof res.data.success && res.data.success ) {\n\t\t\t\t\t\t\tself.success.push( item );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.errors.push( {\n\t\t\t\t\t\t\t\tid: item,\n\t\t\t\t\t\t\t\tsrc: res.data.src,\n\t\t\t\t\t\t\t\tthumb: res.data.thumb,\n\t\t\t\t\t\t\t\tlink: res.data.link,\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tself.updateProgressBar();\n\t\t\t\t\tself.step();\n\t\t\t\t};\n\t\t\t\txhr.send( 'item=' + item + '&_ajax_nonce=' + _nonce.value );\n\t\t\t} else {\n\t\t\t\t// Finish.\n\t\t\t\tthis.settings = {\n\t\t\t\t\tslide: 'finish',\n\t\t\t\t\tsuccess: this.success.length,\n\t\t\t\t\terrors: this.errors,\n\t\t\t\t\ttotal: this.totalSteps,\n\t\t\t\t};\n\n\t\t\t\tself.renderTemplate();\n\t\t\t\tif ( 0 < this.errors.length ) {\n\t\t\t\t\tthis.modal.querySelector( '.sui-box' ).style.maxWidth = '660px';\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n\n\t/**\n\t * Template function (underscores based).\n\t *\n\t * @type {Function}\n\t */\n\tWP_Smush.restore.template = _.memoize( ( id ) => {\n\t\tlet compiled;\n\t\tconst options = {\n\t\t\tevaluate: /<#([\\s\\S]+?)#>/g,\n\t\t\tinterpolate: /{{{([\\s\\S]+?)}}}/g,\n\t\t\tescape: /{{([^}]+?)}}(?!})/g,\n\t\t\tvariable: 'data',\n\t\t};\n\n\t\treturn ( data ) => {\n\t\t\t_.templateSettings = options;\n\t\t\tcompiled = compiled || _.template( document.getElementById( id ).innerHTML );\n\t\t\treturn compiled( data );\n\t\t};\n\t} );\n}() );\n","/* global ajaxurl */\n\n/**\n * @typedef {Object} jQuery\n */\n( function( $ ) {\n\tlet elNotice = $( '.smush-notice' );\n\tconst btnAct = elNotice.find( '.smush-notice-act' );\n\n\telNotice.fadeIn( 500 );\n\n\t// Hide the notice after a CTA button was clicked\n\tfunction removeNotice() {\n\t\telNotice.fadeTo( 100, 0, () => elNotice.slideUp( 100, () => elNotice.remove() ) );\n\t}\n\n\tbtnAct.on( 'click', () => {\n\t\tremoveNotice();\n\t\tnotifyWordpress( btnAct.data( 'msg' ) );\n\t} );\n\n\telNotice.find( '.smush-notice-dismiss' ).on( 'click', () => {\n\t\tremoveNotice();\n\t\tnotifyWordpress( btnAct.data( 'msg' ) );\n\t} );\n\n\t// Notify WordPress about the users choice and close the message.\n\tfunction notifyWordpress( message ) {\n\t\telNotice.attr( 'data-message', message );\n\t\telNotice.addClass( 'loading' );\n\n\t\t//Send a ajax request to save the dismissed notice option\n\t\t$.post( ajaxurl, { action: 'dismiss_upgrade_notice' } );\n\t}\n\n\t// Dismiss the update notice.\n\t$( '.wp-smush-update-info' ).on( 'click', '.notice-dismiss', ( e ) => {\n\t\te.preventDefault();\n\t\telNotice = $( this );\n\t\tremoveNotice();\n\t\t$.post( ajaxurl, { action: 'dismiss_update_info' } );\n\t} );\n\n\t// Dismiss S3 support alert.\n\t$( 'div.wp-smush-s3support-alert' ).on( 'click', '.sui-notice-dismiss > a', () => {\n\t\telNotice = $( this );\n\t\tremoveNotice();\n\t\t$.post( ajaxurl, { action: 'dismiss_s3support_alert' } );\n\t} );\n}( jQuery ) );\n","/* global WP_Smush */\n/* global ajaxurl */\n\n/**\n * Directory Smush module JavaScript code.\n *\n * @since 2.8.1 Separated from admin.js into dedicated file.\n */\n\nimport { createTree } from 'jquery.fancytree';\nimport Scanner from '../smush/directory-scanner';\n\n( function( $ ) {\n\t'use strict';\n\n\tWP_Smush.directory = {\n\t\tselected: [],\n\t\ttree: [],\n\t\twp_smush_msgs: [],\n\n\t\tinit() {\n\t\t\tconst self = this,\n\t\t\t\tprogressDialog = $( '#wp-smush-progress-dialog' );\n\n\t\t\tlet totalSteps = 0,\n\t\t\t\tcurrentScanStep = 0;\n\n\t\t\t// Make sure directory smush vars are set.\n\t\t\tif ( typeof window.wp_smushit_data.dir_smush !== 'undefined' ) {\n\t\t\t\ttotalSteps = window.wp_smushit_data.dir_smush.totalSteps;\n\t\t\t\tcurrentScanStep = window.wp_smushit_data.dir_smush.currentScanStep;\n\t\t\t}\n\n\t\t\t// Init image scanner.\n\t\t\tthis.scanner = new Scanner( totalSteps, currentScanStep );\n\n\t\t\t/**\n\t\t\t * Smush translation strings.\n\t\t\t *\n\t\t\t * @param {Array} wp_smush_msgs\n\t\t\t */\n\t\t\tthis.wp_smush_msgs = window.wp_smush_msgs || {};\n\n\t\t\t/**\n\t\t\t * Folder select: Choose Folder in Directory Smush tab clicked.\n\t\t\t */\n\t\t\t$( 'div.sui-wrap' ).on( 'click', 'button.wp-smush-browse', function( e ) {\n\t\t\t\te.preventDefault();\n\n\t\t\t\t// Hide all the notices.\n\t\t\t\t$( 'div.wp-smush-scan-result div.wp-smush-notice' ).hide();\n\n\t\t\t\t// If disabled, do not process.\n\t\t\t\tif ( $( this ).attr( 'disabled' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Disable buttons.\n\t\t\t\t$( this ).attr( 'disabled', 'disabled' );\n\n\t\t\t\t// Remove notice.\n\t\t\t\t$( 'div.wp-smush-info' ).remove();\n\n\t\t\t\twindow.SUI.openModal( 'wp-smush-list-dialog', 'dialog-close-div', undefined, false );\n\n\t\t\t\t// Display file tree for directory Smush.\n\t\t\t\tself.initFileTree();\n\t\t\t} );\n\n\t\t\t/**\n\t\t\t * Stats section: Directory Link\n\t\t\t */\n\t\t\t$( 'body' ).on( 'click', 'a.wp-smush-dir-link', function( e ) {\n\t\t\t\tif ( $( 'div.sui-wrap button.wp-smush-browse' ).length > 0 ) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\twindow.SUI.openModal( 'wp-smush-list-dialog', 'dialog-close-div', undefined, false );\n\t\t\t\t\t//Display File tree for Directory Smush\n\t\t\t\t\tself.initFileTree();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t/**\n\t\t\t * Smush images: Smush in Choose Directory modal clicked\n\t\t\t */\n\t\t\t$( '.wp-smush-select-dir' ).on( 'click', function( e ) {\n\t\t\t\te.preventDefault();\n\n\t\t\t\t// If disabled, do not process\n\t\t\t\tif ( $( this ).attr( 'disabled' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst button = $( this );\n\n\t\t\t\t$( 'div.wp-smush-list-dialog div.sui-box-body' ).css( { opacity: '0.8' } );\n\t\t\t\t$( 'div.wp-smush-list-dialog div.sui-box-body a' ).unbind( 'click' );\n\n\t\t\t\t// Disable button\n\t\t\t\tbutton.attr( 'disabled', 'disabled' );\n\n\t\t\t\tconst spinner = button.parent().find( '.add-dir-loader' );\n\t\t\t\t// Display the spinner\n\t\t\t\tspinner.addClass( 'sui-icon-loader sui-loading' );\n\n\t\t\t\tconst selectedFolders = self.tree.getSelectedNodes(),\n\t\t\t\t\tabsPath = $( 'input[name=\"wp-smush-base-path\"]' ).val(); // Absolute path.\n\n\t\t\t\tconst paths = [];\n\t\t\t\tselectedFolders.forEach( function( folder ) {\n\t\t\t\t\tpaths.push( absPath + '/' + folder.key );\n\t\t\t\t} );\n\n\t\t\t\t// Send a ajax request to get a list of all the image files\n\t\t\t\tconst param = {\n\t\t\t\t\taction: 'image_list',\n\t\t\t\t\tsmush_path: paths,\n\t\t\t\t\timage_list_nonce: $( 'input[name=\"image_list_nonce\"]' ).val(),\n\t\t\t\t};\n\n\t\t\t\t$.get( ajaxurl, param, function( response ) {\n\t\t\t\t\twindow.SUI.closeModal();\n\n\t\t\t\t\t// TODO: check for errors.\n\t\t\t\t\tself.scanner = new Scanner( response.data, 0 );\n\t\t\t\t\tself.showProgressDialog( response.data );\n\t\t\t\t\tself.scanner.scan();\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\t/**\n\t\t\t * On dialog close make browse button active.\n\t\t\t */\n\t\t\t$( '#wp-smush-list-dialog' ).on( 'click', '.sui-dialog-close', function() {\n\t\t\t\t$( '.wp-smush-browse' ).removeAttr( 'disabled' );\n\n\t\t\t\t// Close the dialog.\n\t\t\t\twindow.SUI.closeModal();\n\n\t\t\t\t$( '.wp-smush-select-dir, button.wp-smush-browse, a.wp-smush-dir-link' ).removeAttr( 'disabled' );\n\n\t\t\t\t// Reset the opacity for content and scan button\n\t\t\t\t$( '.wp-smush-select-dir, .wp-smush-list-dialog .sui-box-body' ).css( { opacity: '1' } );\n\t\t\t} );\n\n\t\t\t/**\n\t\t\t * Cancel scan.\n\t\t\t */\n\t\t\tprogressDialog.on( 'click', '#cancel-directory-smush, .sui-dialog-close, .wp-smush-cancel-dir', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\t// Display the spinner\n\t\t\t\t$( this ).parent().find( '.add-dir-loader' ).addClass( 'sui-icon-loader sui-loading' );\n\t\t\t\tself.scanner.cancel().done( () => window.location.href = self.wp_smush_msgs.directory_url );\n\t\t\t} );\n\n\t\t\t/**\n\t\t\t * Continue scan.\n\t\t\t */\n\t\t\tprogressDialog.on( 'click', '.sui-icon-play, .wp-smush-resume-scan', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tself.scanner.resume();\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Init fileTree.\n\t\t */\n\t\tinitFileTree() {\n\t\t\tconst self = this,\n\t\t\t\tsmushButton = $( 'button.wp-smush-select-dir' ),\n\t\t\t\tajaxSettings = {\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\turl: ajaxurl,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\taction: 'smush_get_directory_list',\n\t\t\t\t\t\tlist_nonce: $( 'input[name=\"list_nonce\"]' ).val(),\n\t\t\t\t\t},\n\t\t\t\t\tcache: false,\n\t\t\t\t};\n\n\t\t\tself.tree = createTree( '.wp-smush-list-dialog .content', {\n\t\t\t\tautoCollapse: true, // Automatically collapse all siblings, when a node is expanded\n\t\t\t\tclickFolderMode: 3, // 1:activate, 2:expand, 3:activate and expand, 4:activate (dblclick expands)\n\t\t\t\tcheckbox: true, // Show checkboxes\n\t\t\t\tdebugLevel: 0, // 0:quiet, 1:errors, 2:warnings, 3:infos, 4:debug\n\t\t\t\tselectMode: 3, // 1:single, 2:multi, 3:multi-hier\n\t\t\t\ttabindex: '0', // Whole tree behaves as one single control\n\t\t\t\tkeyboard: true, // Support keyboard navigation\n\t\t\t\tquicksearch: true, // Navigate to next node by typing the first letters\n\t\t\t\tsource: ajaxSettings,\n\t\t\t\tlazyLoad: ( event, data ) => {\n\t\t\t\t\tdata.result = new Promise( function( resolve, reject ) {\n\t\t\t\t\t\tajaxSettings.data.dir = data.node.key;\n\t\t\t\t\t\t$.ajax( ajaxSettings )\n\t\t\t\t\t\t\t.done( ( response ) => resolve( response ) )\n\t\t\t\t\t\t\t.fail( reject );\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Update the button text.\n\t\t\t\t\tdata.result.then( smushButton.html( self.wp_smush_msgs.add_dir ) );\n\t\t\t\t},\n\t\t\t\tloadChildren: ( event, data ) => data.node.fixSelection3AfterClick(), // Apply parent's state to new child nodes:\n\t\t\t\tselect: () => smushButton.attr( 'disabled', ! +self.tree.getSelectedNodes().length ),\n\t\t\t\tinit: () => smushButton.attr( 'disabled', true ),\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Show progress dialog.\n\t\t *\n\t\t * @param {number} items Number of items in the scan.\n\t\t */\n\t\tshowProgressDialog( items ) {\n\t\t\t// Update items status and show the progress dialog..\n\t\t\t$( '.wp-smush-progress-dialog .sui-progress-state-text' ).html( '0/' + items + ' ' + self.wp_smush_msgs.progress_smushed );\n\n\t\t\twindow.SUI.openModal( 'wp-smush-progress-dialog', 'dialog-close-div', undefined, false );\n\t\t},\n\n\t\t/**\n\t\t * Update progress bar during directory smush.\n\t\t *\n\t\t * @param {number} progress Current progress in percent.\n\t\t * @param {boolean} cancel Cancel status.\n\t\t */\n\t\tupdateProgressBar( progress, cancel = false ) {\n\t\t\tif ( progress > 100 ) {\n\t\t\t\tprogress = 100;\n\t\t\t}\n\n\t\t\t// Update progress bar\n\t\t\t$( '.sui-progress-block .sui-progress-text span' ).text( progress + '%' );\n\t\t\t$( '.sui-progress-block .sui-progress-bar span' ).width( progress + '%' );\n\n\t\t\tif ( progress >= 90 ) {\n\t\t\t\t$( '.sui-progress-state .sui-progress-state-text' ).text( 'Finalizing...' );\n\t\t\t}\n\n\t\t\tif ( cancel ) {\n\t\t\t\t$( '.sui-progress-state .sui-progress-state-text' ).text( 'Cancelling...' );\n\t\t\t}\n\t\t},\n\n\t};\n\n\tWP_Smush.directory.init();\n}( jQuery ) );\n","/* global WP_Smush */\n/* global ajaxurl */\n\n/**\n * Directory scanner module that will Smush images in the Directory Smush modal.\n *\n * @since 2.8.1\n *\n * @param {string|number} totalSteps\n * @param {string|number} currentStep\n * @return {Object} Scan object.\n * @class\n */\nconst DirectoryScanner = ( totalSteps, currentStep ) => {\n\ttotalSteps = parseInt( totalSteps );\n\tcurrentStep = parseInt( currentStep );\n\n\tlet cancelling = false,\n\t\tfailedItems = 0;\n\n\tconst obj = {\n\t\tscan() {\n\t\t\tconst remainingSteps = totalSteps - currentStep;\n\t\t\tif ( currentStep !== 0 ) {\n\t\t\t\t// Scan started on a previous page load.\n\t\t\t\tstep( remainingSteps );\n\t\t\t}
|
|